Scikit-learn 中文教程

第二部分:Scikit-learn 核心基础
第 3 章 Scikit-learn 核心设计与 API 体系
第 4 章 数据集模块与数据划分
第三部分:数据预处理与特征工程
第 5 章 数据预处理核心模块(sklearn.preprocessing)
第 6 章 特征工程:提取、选择与构建
第四部分:模型评估与验证
第 7 章 模型评估指标(按任务类型划分)
第 8 章 模型验证与超参数调优
第五部分:Scikit-learn 核心算法模块
第 9 章 有监督学习:分类算法
第 10 章 有监督学习:回归算法
第 11 章 无监督学习:聚类与密度算法
第 12 章 半监督学习与其他常用算法
第八部分:性能优化与问题解决
第 18 章 Scikit-learn 性能优化
第 19 章 Scikit-learn 常见问题与解决方案

5.1 缺失值处理

Scikit-learn缺失值处理教程 | 检测与填充方法详解

Scikit-learn 中文教程

本教程为Scikit-learn新手提供全面指南,介绍缺失值处理的步骤,包括使用Pandas检测缺失值,SimpleImputer进行数值型和类别型填充,以及KNNImputer和IterativeImputer高级填充方法。通过代码示例和易懂解释,帮助快速掌握缺失值处理技巧。

推荐工具
PyCharm专业版开发必备

功能强大的Python IDE,提供智能代码补全、代码分析、调试和测试工具,提高Python开发效率。特别适合处理列表等数据结构的开发工作。

了解更多

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官方文档。

开发工具推荐
Python开发者工具包

包含虚拟环境管理、代码格式化、依赖管理、测试框架等Python开发全流程工具,提高开发效率。特别适合处理复杂数据结构和算法。

获取工具包