赞
踩
注:本期的删除或插补方法主要针对连续数据,时间序列数据的插补在后续关于时间序列的博客中讲明。参考鸢尾花丛书,链接如下:
参考书籍及源代码链接https://github.com/Visualize-ML
博客是选出自己感觉用的到的精炼部分加自己的理解,代码结果也是自己实操,部分还在学习过程增加了注释,算是笔记,科研时参考方便!!
承接上一节的代码,继续进行处理!
一般情况的数据集,每行代表一个样本,每列代表一个特征。处理缺失值的基本策略是舍弃包含缺失值的整行或整列,但会丢失有价值的数据。
dropna(axis = 0, how = 'any')方法,具有如下特征:
- X_NaN_drop = X_NaN.dropna(axis=0) #默认删除方式,按行any
-
- iris_df_NaN_drop = pd.DataFrame(X_NaN_drop, columns=X_NaN.columns, index=X_NaN.index)
- iris_df_NaN_drop['species'] = y
- sns.pairplot(iris_df_NaN_drop, hue='species', palette = "dark")
数据减少了很多,不管是删除缺失值所在的行或 列,都会浪费大量有价值的信息。
删除策略可能会丢失有价值的数据,更好的策略是估算缺失值,即从数据的已知部分推断出缺失值,这种方法统称插补。
仅使用缺失值所在特征维度的非缺失值来插补,函数方法SimpleImputer()——可以使用缺失值所在的行/列中的统计数据平均值 ('mean')、中位数 ('median') 或者众数 ('most_frequent') 来填充,也可以使用指定的常数 'constant'。
连续数据常用平均值或中位数,分类数据常用众数来填充!如用中位数填充上述缺失数据集:
- #单变量插补
- from sklearn.impute import SimpleImputer
-
- # The imputation strategy:
- # 'mean', replace missing values using the mean along each column
- # 'median', replace missing values using the median along each column
- # 'most_frequent', replace missing using the most frequent value along each column
- # 'constant', replace missing values with fill_value
-
- si = SimpleImputer(strategy='median')
- # impute training data
- X_NaN_median = si.fit_transform(X_NaN)
-
- iris_df_NaN_median = pd.DataFrame(X_NaN_median,
- columns=X_NaN.columns,
- index=X_NaN.index)
-
- iris_df_NaN_median['species'] = y
- sns.pairplot(iris_df_NaN_median, hue='species', palette = "dark")
- plt.show()

中位数插补数据呈”十字状“,插补方法也可以通过替换注释中的字符实现。
- ## kNN插补
- from sklearn.impute import KNNImputer
-
- knni = KNNImputer(n_neighbors=5) #创建KNN实例化对象
- X_NaN_kNN = knni.fit_transform(X_NaN) #开始插补
-
- iris_df_NaN_kNN = pd.DataFrame(X_NaN_kNN,
- columns=X_NaN.columns,
- index=X_NaN.index)
- iris_df_NaN_kNN['species'] = y
-
- sns.pairplot(iris_df_NaN_kNN,
- hue='species', palette = "dark")
- plt.show()
对比单变量插补,不用缺失值所在特征的数据,而是使用其他特征数据来填充该缺失值(缺失值建模为其他特征的函数),考虑了不同特征数据的联系!!
函数方法IterativeImputer(),整个过程用迭代循环的方式进行!
- ## 多变量插补
- from sklearn.experimental import enable_iterative_imputer
- from sklearn.impute import IterativeImputer
- from sklearn.ensemble import RandomForestRegressor
-
- rf_imp = IterativeImputer(estimator=
- RandomForestRegressor(random_state=0),
- max_iter=20)
- X_NaN_RF = rf_imp.fit_transform(X_NaN)
-
- iris_df_NaN_RF = pd.DataFrame(X_NaN_RF,
- columns=X_NaN.columns,
- index=X_NaN.index)
- iris_df_NaN_RF['species'] = y
- sns.pairplot(iris_df_NaN_RF, hue='species',
- palette = "dark")
- plt.show()

IterativeImputer()多变量插补方法很灵活,也可以与决策树回归、贝叶斯岭回归等估算器联合使用:
参考资料1https://scikit-learn.org/stable/modules/impute.html参考资料2
https://scikit-learn.org/stable/auto_examples/impute/plot_iterative_imputer_variants_comparison
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。