Scikit-learn Python机器学习 - 特征预处理 - 处理缺失值:SimpleImputer
锋哥原创的Scikit-learn Python机器学习视频教程:
2026版 Scikit-learn Python机器学习 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili
课程介绍
本课程主要讲解基于Scikit-learn的Python机器学习知识,包括机器学习概述,特征工程(数据集,特征抽取,特征预处理,特征降维等),分类算法(K-临近算法,朴素贝叶斯算法,决策树等),回归与聚类算法(线性回归,欠拟合,逻辑回归与二分类,K-means算法)等。
Scikit-learn Python机器学习 - 特征预处理 - 处理缺失值:SimpleImputer
特征预处理就是将原始数据转换为一组更具代表性、更适合模型训练的特征的过程。
真实世界的数据通常存在以下问题,直接影响机器学习模型的性能:
1. 量纲不同:特征的单位和尺度差异巨大(如年龄范围 0-100 vs. 薪资范围 0-100000)。很多模型(如 SVM、KNN、线性回归)基于距离计算,量纲不统一会使得大尺度的特征主导模型,导致小尺度的特征失效。
2. 分布异常:数据可能存在偏差(Skew),不符合模型假设的正态分布,影响模型性能。
3. 信息冗余:定性特征(如国家、品牌)无法直接被模型使用,需要转换为数值。
4. 存在缺失值:数据集中某些特征的值可能缺失,需要处理。
我们处理缺失值,建议使用pandas。
pip install pandas==2.2.3 -i https://pypi.tuna.tsinghua.edu.cn/simple
推荐学习下锋哥的课程。python数据处理与分析Pandas2:2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili
Scikit-learn也提供了一些处理缺失值的方案。比如SimpleImputer
我们看一个示例:
import numpy as np
import pandas as pd
from sklearn import preprocessing
from sklearn.model_selection import train_test_split
from sklearn.impute import SimpleImputer
# 创建示例数据,包含不同类型的问题
data = {'age': [25, 30, np.nan, 45, 60, 30, 15], # 数值,含缺失值'salary': [50000, 54000, 60000, np.nan, 100000, 40000, 20000], # 数值,尺度大,含缺失值'country': ['USA', 'UK', 'China', 'USA', 'India', 'China', 'UK'], # 分类型'gender': ['M', 'F', 'F', 'M', 'M', 'F', 'F'] # 分类型
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
# 策略通常为 mean(均值), median(中位数), most_frequent(众数), constant(固定值)
imputer = SimpleImputer(strategy='mean')
# 我们只对数值列进行填充
numeric_features = ['age', 'salary']
df_numeric = df[numeric_features]
# fit 计算用于填充的值(这里是均值),transform 应用填充
imputer.fit(df_numeric)
df[numeric_features] = imputer.transform(df_numeric)
print("\n处理缺失值后:")
print(df)
运行结果:
原始数据:age salary country gender
0 25.0 50000.0 USA M
1 30.0 54000.0 UK F
2 NaN 60000.0 China F
3 45.0 NaN USA M
4 60.0 100000.0 India M
5 30.0 40000.0 China F
6 15.0 20000.0 UK F
处理缺失值后:age salary country gender
0 25.000000 50000.0 USA M
1 30.000000 54000.0 UK F
2 34.166667 60000.0 China F
3 45.000000 54000.0 USA M
4 60.000000 100000.0 India M
5 30.000000 40000.0 China F
6 15.000000 20000.0 UK F
Process finished with exit code 0