找回密码
 会员注册
查看: 33|回复: 0

缺失值处理方法:代数统计机器学习算法补全数据(附Python-sklearn代码&精美可视化绘图)

[复制链接]

1

主题

0

回帖

4

积分

新手上路

积分
4
发表于 2024-9-13 09:00:09 | 显示全部楼层 |阅读模式
注:本期的删除或插补方法主要针对连续数据,时间序列数据的插补在后续关于时间序列的博客中讲明。参考鸢尾花丛书,链接如下:参考书籍及源代码链接https://github.com/Visualize-ML博客是选出自己感觉用的到的精炼部分加自己的理解,代码结果也是自己实操,部分还在学习过程增加了注释,算是笔记,科研时参考方便!!一、删除承接上一节的代码,继续进行处理!1、整行整列删除一般情况的数据集,每行代表一个样本,每列代表一个特征。处理缺失值的基本策略是舍弃包含缺失值的整行或整列,但会丢失有价值的数据。dropna(axis=0,how='any')方法,具有如下特征:axis=0为按行删除,设置axis=1表示按列删除how='any'时,表示某行或列只要有一个缺失值,就删除该行或列how='all',表示该行或列全部都为缺失值时,才删除该行或列默认设置为axis=0,how='any'X_NaN_drop=X_NaN.dropna(axis=0)#默认删除方式,按行anyiris_df_NaN_drop=pd.DataFrame(X_NaN_drop,columns=X_NaN.columns,index=X_NaN.index)iris_df_NaN_drop['species']=ysns.pairplot(iris_df_NaN_drop,hue='species',palette="dark")数据减少了很多,不管是删除缺失值所在的行或列,都会浪费大量有价值的信息。2、成对删除一种特别的删除方式,进行多特征联立时,只删除掉需要执行运算特征包含的缺失数据。例如估算方差协方差矩阵时,计算X1和X3的相关性,只需要删除下面数据点:二、插补删除策略可能会丢失有价值的数据,更好的策略是估算缺失值,即从数据的已知部分推断出缺失值,这种方法统称插补。分类数据和连续数据采用的方法也稍有差别。注意,选取采用插补方法要格外小心,如果填充方法不合理,会引入数据噪音,并造成数据分析结果不准确。时间序列数据采用的插补方法不同于一般数据。Pandas数据帧有基本插补功能,特别是对于时间数据,可以采用插值、向前填充、向后填充。(后续关于时间序列的博客中讲明)1、单变量插补:统计插补仅使用缺失值所在特征维度的非缺失值来插补,函数方法SimpleImputer()——可以使用缺失值所在的行/列中的统计数据平均值('mean')、中位数('median')或者众数('most_frequent')来填充,也可以使用指定的常数'constant'。连续数据常用平均值或中位数,分类数据常用众数来填充!如用中位数填充上述缺失数据集:#单变量插补fromsklearn.imputeimportSimpleImputer#Theimputationstrategy:#'mean',replacemissingvaluesusingthemeanalongeachcolumn#'median',replacemissingvaluesusingthemedianalongeachcolumn#'most_frequent',replacemissingusingthemostfrequentvaluealongeachcolumn#'constant',replacemissingvalueswithfill_valuesi=SimpleImputer(strategy='median')#imputetrainingdataX_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']=ysns.pairplot(iris_df_NaN_median,hue='species',palette="dark")plt.show()中位数插补数据呈”十字状“,插补方法也可以通过替换注释中的字符实现。2、K近邻插补k近邻算法(k-NN)是最基本监督学习方法之一,k-NN中的k指的是“近邻”的数量——“近朱者赤,近墨者黑”。函数方法KNNImputer()——先给定距离缺失值数据最近的k个样本,将这k个值等权重平均或加权平均来插补缺失值。##kNN插补fromsklearn.imputeimportKNNImputerknni=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']=ysns.pairplot(iris_df_NaN_kNN,hue='species',palette="dark")plt.show()3、多变量插补对比单变量插补,不用缺失值所在特征的数据,而是使用其他特征数据来填充该缺失值(缺失值建模为其他特征的函数),考虑了不同特征数据的联系!!函数方法IterativeImputer(),整个过程用迭代循环的方式进行!##多变量插补fromsklearn.experimentalimportenable_iterative_imputerfromsklearn.imputeimportIterativeImputerfromsklearn.ensembleimportRandomForestRegressorrf_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']=ysns.pairplot(iris_df_NaN_RF,hue='species',palette="dark")plt.show()IterativeImputer()多变量插补方法很灵活,也可以与决策树回归、贝叶斯岭回归等估算器联合使用:参考资料1https://scikit-learn.org/stable/modules/impute.html参考资料2https://scikit-learn.org/stable/auto_examples/impute/plot_iterative_imputer_variants_comparison
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2024-12-26 12:54 , Processed in 0.406091 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表