5.1 缺失值处理
Scikit-learn缺失值处理教程 | 检测与填充方法详解
本教程为Scikit-learn新手提供全面指南,介绍缺失值处理的步骤,包括使用Pandas检测缺失值,SimpleImputer进行数值型和类别型填充,以及KNNImputer和IterativeImputer高级填充方法。通过代码示例和易懂解释,帮助快速掌握缺失值处理技巧。
Scikit-learn缺失值处理教程
缺失值是数据分析和机器学习中常见的问题,如果不处理,可能导致模型性能下降或错误。本教程将引导您学习如何使用Scikit-learn结合Pandas处理缺失值,从检测到填充,适合初学者入门。
为什么需要处理缺失值?
在真实世界数据中,缺失值可能由各种原因导致,如数据收集错误、用户未响应等。如果忽略缺失值,Scikit-learn的许多算法可能无法运行或给出不准确结果。因此,处理缺失值是数据预处理的关键步骤。
缺失值检测(Pandas 结合 Scikit-learn)
在Scikit-learn中处理缺失值前,通常先用Pandas检测缺失值,因为Pandas提供了简便的数据操作功能。
使用Pandas检测缺失值
首先,导入必要的库并加载数据。
import pandas as pd
import numpy as np
# 示例数据:创建一个包含缺失值的DataFrame
data = {
'age': [25, np.nan, 30, 35, np.nan],
'gender': ['M', 'F', np.nan, 'M', 'F'],
'income': [50000, 60000, np.nan, 70000, 80000]
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
# 检测缺失值:使用isnull()方法
print("\n缺失值检测:")
print(df.isnull())
print("\n缺失值数量:")
print(df.isnull().sum())
输出显示缺失值位置和数量,为后续处理提供基础。
结合Scikit-learn
Scikit-learn的缺失值处理工具如SimpleImputer依赖于Pandas DataFrame或NumPy数组。检测后,您可以将数据转换为适合Scikit-learn的格式,例如使用Pandas的to_numpy()方法。
from sklearn.impute import SimpleImputer
# 将DataFrame转换为NumPy数组以使用Scikit-learn
X = df.to_numpy() # 这是一个2D数组
print("转换后的数据:")
print(X)
现在,数据已准备好用于Scikit-learn的填充方法。
数值型缺失值填充(SimpleImputer:均值 / 中位数 / 固定值)
对于数值型变量,SimpleImputer是Scikit-learn中最简单的填充工具。它允许您使用均值、中位数或固定值填充缺失值。
使用SimpleImputer
假设我们只处理数值型列'age'和'income'。
# 提取数值型列(索引0和2)
X_numeric = X[:, [0, 2]] # 'age'和'income'列
print("数值型数据:")
print(X_numeric)
# 初始化SimpleImputer,使用均值填充
imputer_mean = SimpleImputer(strategy='mean') # 策略可以是'mean', 'median', 'constant'
X_filled_mean = imputer_mean.fit_transform(X_numeric)
print("\n使用均值填充后:")
print(X_filled_mean)
# 使用中位数填充
imputer_median = SimpleImputer(strategy='median')
X_filled_median = imputer_median.fit_transform(X_numeric)
print("\n使用中位数填充后:")
print(X_filled_median)
# 使用固定值填充,例如0
imputer_constant = SimpleImputer(strategy='constant', fill_value=0)
X_filled_constant = imputer_constant.fit_transform(X_numeric)
print("\n使用固定值0填充后:")
print(X_filled_constant)
解释:
strategy='mean':用该列的均值填充缺失值。strategy='median':用中位数填充,对异常值更稳健。strategy='constant':用指定的固定值(如0)填充。
填充后,数据不再有缺失值,可以直接用于模型训练。
类别型缺失值填充(SimpleImputer:最频繁值 / 固定值)
类别型变量(如性别、颜色)的缺失值处理与数值型类似,但SimpleImputer支持不同的策略。
使用SimpleImputer填充类别型数据
对于示例中的'gender'列,它是字符串类型。
# 提取类别型列(索引1)
X_categorical = X[:, [1]] # 'gender'列
print("类别型数据:")
print(X_categorical)
# 初始化SimpleImputer,使用最频繁值填充(mode)
imputer_most_frequent = SimpleImputer(strategy='most_frequent') # 策略可以是'most_frequent', 'constant'
X_filled_most_frequent = imputer_most_frequent.fit_transform(X_categorical)
print("\n使用最频繁值填充后:")
print(X_filled_most_frequent)
# 使用固定值填充,例如'Unknown'
imputer_constant_cat = SimpleImputer(strategy='constant', fill_value='Unknown')
X_filled_constant_cat = imputer_constant_cat.fit_transform(X_categorical)
print("\n使用固定值'Unknown'填充后:")
print(X_filled_constant_cat)
注意:SimpleImputer默认处理数值型数据,但对于类别型,使用strategy='most_frequent'或strategy='constant'可以处理字符串。确保数据类型一致。
高级缺失值填充(KNNImputer/IterativeImputer)
对于更复杂的场景,Scikit-learn提供了高级填充方法,如KNNImputer和IterativeImputer,它们考虑数据的结构和关系。
KNNImputer
KNNImputer使用k-最近邻算法填充缺失值,基于相似样本的值来估计缺失值。
from sklearn.impute import KNNImputer
# 使用KNNImputer,例如k=2(最近邻的数量)
imputer_knn = KNNImputer(n_neighbors=2)
X_filled_knn = imputer_knn.fit_transform(X_numeric) # 假设使用数值型数据
print("使用KNNImputer填充后:")
print(X_filled_knn)
优点:对于有相关性的数据,KNNImputer可能比简单填充更准确。
IterativeImputer
IterativeImputer使用迭代方法,如多元插补,估计缺失值。它基于其他变量的值来建模缺失值。
from sklearn.experimental import enable_iterative_imputer # 需要启用实验性功能
from sklearn.impute import IterativeImputer
# 使用IterativeImputer,默认基于线性回归
imputer_iterative = IterativeImputer()
X_filled_iterative = imputer_iterative.fit_transform(X_numeric) # 假设使用数值型数据
print("使用IterativeImputer填充后:")
print(X_filled_iterative)
注意:IterativeImputer是Scikit-learn的实验性功能,使用时可能需要导入enable_iterative_imputer。它适用于数值型数据,并能捕获变量间的复杂关系。
总结
在处理缺失值时,选择合适的方法取决于数据类型和场景:
- 简单场景:使用SimpleImputer进行均值、中位数或固定值填充,适合新手快速上手。
- 类别型数据:使用SimpleImputer的最频繁值或固定值策略。
- 复杂数据:考虑KNNImputer或IterativeImputer,以提高填充准确性,尤其是当变量间有相关性时。
在实践中,建议先从简单方法开始,如均值填充,然后根据模型性能调整到更高级的方法。始终结合Pandas进行数据检测和准备,确保数据质量。
通过学习本教程,您应该能够自信地处理Scikit-learn中的缺失值,为进一步的机器学习项目打下基础。如果有更多疑问,请参考Scikit-learn官方文档。