python-machine-learning-book实战:用Pandas处理缺失值
python-machine-learning-book实战:用Pandas处理缺失值
在机器学习项目中,缺失值是数据预处理阶段最常见的挑战之一。不合理的缺失值处理可能导致模型性能下降或得出错误结论。本文基于python-machine-learning-book项目,详细介绍如何使用Pandas(Python数据分析库)识别和处理缺失值,帮助你构建更可靠的训练数据。项目中完整的缺失值处理理论可参考官方文档。
缺失值的识别与分析
在处理缺失值前,首先需要准确识别数据中的缺失值位置和数量。Pandas提供了直观的方法来检测缺失值。
1. 加载数据与初步检查
使用Pandas读取数据后,可以通过isnull().sum()方法统计各列缺失值数量:
import pandas as pd
from io import StringIO
# 示例CSV数据(含缺失值)
csv_data = '''A,B,C,D
1.0,2.0,3.0,4.0
5.0,6.0,,8.0
10.0,11.0,12.0,'''
df = pd.read_csv(StringIO(csv_data))
print(df.isnull().sum()) # 输出各列缺失值数量
上述代码来自项目中的数据预处理示例,执行后会显示每列的缺失值计数,例如:
A 0
B 0
C 1
D 1
dtype: int64
2. 缺失值可视化分析
虽然项目中未直接提供缺失值可视化工具,但可以结合Pandas和Matplotlib绘制缺失值分布热力图(需自行实现)。对于大型数据集,建议先通过统计方法定位缺失值集中的特征,再决定处理策略。
删除法:快速处理缺失值
删除法是最简单直接的缺失值处理方式,适用于数据量较大且缺失比例较低的场景。Pandas提供了dropna()方法实现删除操作。
1. 删除含缺失值的行
使用df.dropna()删除所有包含缺失值的行:
# 删除所有含缺失值的行
df_drop_rows = df.dropna()
print(df_drop_rows)
执行结果会保留完整样本:
A B C D
0 1.0 2.0 3.0 4.0
2. 删除含缺失值的列
当某列缺失值比例过高(如超过50%),可考虑删除整列:
# 删除所有含缺失值的列
df_drop_cols = df.dropna(axis=1)
print(df_drop_cols)
执行结果会保留无缺失值的特征列:
A B
0 1.0 2.0
1 5.0 6.0
2 10.0 11.0
3. 高级删除策略
Pandas还支持更灵活的删除条件,例如:
# 仅删除全为缺失值的行
df.dropna(how='all')
# 保留至少有4个非缺失值的行
df.dropna(thresh=4)
# 仅删除指定列(如'C')含缺失值的行
df.dropna(subset=['C'])
这些方法在项目的数据预处理章节中有详细演示,可根据实际数据特征选择合适的策略。
填充法:保留数据的完整性
填充法通过统计值或模型预测来填补缺失值,能最大程度保留原始数据分布。python-machine-learning-book中推荐了多种填充策略,以下是基于Pandas的实现方法。
1. 均值/中位数填充
使用特征列的均值或中位数填充缺失值,适用于数值型数据:
# 均值填充
df_fill_mean = df.fillna(df.mean())
# 中位数填充
df_fill_median = df.fillna(df.median())
项目中使用Scikit-learn的Imputer类实现类似功能(见代码示例),但Pandas的fillna()方法更简洁:
from sklearn.preprocessing import Imputer
imr = Imputer(missing_values='NaN', strategy='mean', axis=0)
imputed_data = imr.fit_transform(df.values)
2. 前向/后向填充
对于时序数据,可使用相邻样本的值填充:
# 前向填充(使用上一行值)
df_fill_ffill = df.fillna(method='ffill')
# 后向填充(使用下一行值)
df_fill_bfill = df.fillna(method='bfill')
3. 自定义值填充
根据业务逻辑填充特定值,例如用0填充订单金额缺失值:
df_fill_custom = df.fillna({'C': 0, 'D': 999})
实战案例:房价数据集缺失值处理
以项目中的房价数据集(datasets/housing目录)为例,完整演示缺失值处理流程:
- 加载数据:
df_housing = pd.read_csv('datasets/housing/housing.csv')
- 分析缺失值:
missing_count = df_housing.isnull().sum()
missing_ratio = missing_count / len(df_housing)
missing_df = pd.DataFrame({'count': missing_count, 'ratio': missing_ratio})
print(missing_df[missing_df['count'] > 0])
- 选择处理策略:
- 对于少量缺失的数值列(如
total_bedrooms),使用中位数填充:
df_housing['total_bedrooms'].fillna(df_housing['total_bedrooms'].median(), inplace=True)
- 对于缺失比例高的类别列,可创建"缺失值"类别:
df_housing['ocean_proximity'].fillna('missing', inplace=True)
总结与最佳实践
处理缺失值需遵循"具体问题具体分析"原则,根据数据特点选择合适方法:
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 删除法 | 简单快速 | 丢失数据信息 | 数据量大、缺失率低 |
| 均值填充 | 计算简单 | 改变数据分布 | 近似正态分布的数值特征 |
| 中位数填充 | 抗异常值干扰 | 忽略特征相关性 | 含异常值的数值特征 |
| 模型预测填充 | 精度高 | 计算复杂 | 缺失率高且重要的特征 |
项目中更多缺失值处理技巧可参考官方FAQ。实际应用中,建议结合多种方法并通过交叉验证评估处理效果,确保模型对缺失值处理的鲁棒性。
通过本文介绍的Pandas方法,你可以高效处理python-machine-learning-book及实际项目中的缺失值问题,为后续模型训练奠定坚实的数据基础。
更多推荐



所有评论(0)