使用NN插值填充泰坦尼克号数据集年龄时仍存在两个NaN值的原因
泰坦尼克号数据集最近邻填充年龄仍有缺失的原因分析
你用的不是基于特征的最近邻填充:pandas的
interpolate(method='nearest')是按数据的索引顺序找最近的非缺失值,不是根据样本的pclass、sex等特征匹配相似样本。它只看当前NaN在序列中的位置,找前后最近的有值的行来填充,和机器学习里的KNN完全是两回事。这两个缺失值处于无有效邻居的位置:索引416、417的age没被填充,大概率是因为它们属于连续的缺失段,且前后都没有非NaN的age值。比如如果测试集的age列从某一行开始全是NaN,那最后这两个就找不到可填充的邻居,只能保留缺失。你可以执行
print(titanic_Test['age'].notna().tail(10)),看看这两个样本前后的age是否都是缺失的。如果要做特征匹配的近邻填充:应该用sklearn的
KNNImputer,它会根据样本的特征相似度找邻居来填充缺失值,示例代码如下:from sklearn.impute import KNNImputer from sklearn.preprocessing import StandardScaler # 选取用于匹配的特征(包含age,因为要填充它) cols = ['pclass', 'sex', 'age', 'sibsp', 'parch', 'fare'] df_for_impute = titanic_Test[cols].copy() # KNN对特征尺度敏感,先标准化 scaler = StandardScaler() df_scaled = scaler.fit_transform(df_for_impute) # 初始化填充器,设置邻居数 imputer = KNNImputer(n_neighbors=3) df_imputed = imputer.fit_transform(df_scaled) # 将填充后的数据转换回原尺度,更新age列 titanic_Test['age'] = scaler.inverse_transform(df_imputed)[:, cols.index('age')]
内容的提问来源于stack exchange,提问作者Mare
相关产品推荐
相关产品推荐

