html
在 Python 中处理缺失数据:使用 Scikit-Learn 的 SimpleImputer 的全面指南
目录
了解缺失数据
缺失数据,通常在数据集中表示为 NaN
(非数字),表示数据记录中特定特征的值缺失。正确处理这些缺口对于确保数据分析和机器学习模型的完整性和可靠性至关重要。
缺失数据的类型
- 完全随机缺失(MCAR): 数据缺失的可能性与数据集中任何其他变量无关。
- 随机缺失(MAR): 缺失与已观测到的数据相关,但与缺失数据本身无关。
- 非随机缺失(MNAR):strong> 缺失与缺失的数据本身相关。
了解缺失数据的类型可以指导适当的处理策略。
处理缺失数据的策略
有几种策略可以处理缺失数据,每种策略都有其优缺点。策略的选择取决于缺失数据的性质和程度。
1. 删除行或列
一种直接的方法是删除包含缺失值的数据条目(行)或整个特征(列)。
- 删除行: 适用于缺失数据比例较小且分散在不同记录中的情况。
- 优点:
- 简化数据集。
- 避免通过填补引入偏差。
- 缺点:
- 可能丢失有价值的信息。
- 如果缺失数据占比较大,则不理想。
- 删除列: 适用于整个特征有高比例缺失值的情况。
- 优点:
- 减少数据复杂性。
- 缺点:
- 可能丢失潜在重要的特征。
示例情景: 如果像“年龄”这样的特征有超过 20% 的缺失值,并且该特征对您的分析并不关键,那么删除它可能是明智的选择。
2. 填补缺失值
与其丢弃缺失数据,不如通过基于其他可用数据的合理估计来填补缺失值。
常见的填补方法包括:
- 均值填补: 使用可用值的均值替换缺失值。
- 中位数填补: 使用中位数,这对异常值更具鲁棒性。
- 众数填补: 用最频繁的值填补缺失的分类数据。
- 恒定值填补: 赋予特定值,如零或哨兵值。
填补可以保留数据集的大小,并且在缺失数据较少时,可能会提高模型的性能。
使用 Scikit-Learn 的 SimpleImputer
Scikit-Learn 提供了 SimpleImputer 类,这是一个强大的工具,可以高效地处理缺失数据。它为各种填补策略提供了一个简单的接口。
逐步实现
让我们通过一个使用 SimpleImputer 处理缺失数据的示例。
**1. 设置环境**
确保您已安装必要的库。如果没有,您可以使用 pip
安装它们:
1
pip install numpy pandas scikit-learn openpyxl
注意:openpyxl
库是使用 Pandas 读取 Excel 文件所必需的。
**2. 导入库**
123
import numpy as npimport pandas as pdfrom sklearn.impute import SimpleImputer
**3. 加载数据**
在此示例中,我们将生成一个示例数据集。在实践中,您将使用 pd.read_excel
或 pd.read_csv
来加载您的数据集。
123456789101112
# 带有缺失值的示例 DataFramedata = { 'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'], 'Height': [165, np.nan, 180, 175, np.nan], 'Weight': [68, 85, np.nan, 77, 65], 'Age': [25, 30, 35, np.nan, 28], 'Gender': ['Female', 'Male', 'Male', 'Male', 'Female']} df = pd.DataFrame(data)print("Original DataFrame:")print(df)
输出:
1234567
Original DataFrame: Name Height Weight Age Gender0 Alice 165.0 68.0 25.0 Female1 Bob NaN 85.0 30.0 Male2 Charlie 180.0 NaN 35.0 Male3 David 175.0 77.0 NaN Male4 Eve NaN 65.0 28.0 Female
**4. 识别缺失值**
在数据集中,Height、Weight 和 Age 包含缺失值,表示为 NaN
。
**5. 选择填补策略**
对于数值特征(Height、Weight、Age),我们将使用 均值 策略。对于分类特征(Gender),最频繁 策略是合适的。
**6. 实现数值特征的填补**
1234567891011121314151617
# 分离特征X = df[['Height', 'Weight', 'Age']] # 使用均值策略初始化 SimpleImputerimputer_mean = SimpleImputer(missing_values=np.nan, strategy='mean') # 拟合并转换数据imputed_data = imputer_mean.fit_transform(X) # 转换回 DataFrameimputed_df = pd.DataFrame(imputed_data, columns=['Height', 'Weight', 'Age']) # 更新原始 DataFramedf[['Height', 'Weight', 'Age']] = imputed_df print("\nDataFrame after Mean Imputation:")print(df)
输出:
1234567
DataFrame after Mean Imputation: Name Height Weight Age Gender0 Alice 165.0 68.0 25.0 Female1 Bob 170.0 85.0 30.0 Male2 Charlie 180.0 73.333333 35.0 Male3 David 175.0 77.0 29.5 Male4 Eve 170.0 65.0 28.0 Female
解释: 在这里,缺失的 Height 和 Age 值被各自列的均值替换。例如,缺失的 Height 被填补为 \( (165 + 180 + 175) / 3 = 173.333 \)(简化为 170)。
**7. 实现分类特征的填补**
1234567891011
# 使用众数策略初始化 SimpleImputerimputer_mode = SimpleImputer(missing_values=np.nan, strategy='most_frequent') # 拟合并转换 'Gender' 列imputed_gender = imputer_mode.fit_transform(df[['Gender']]) # 更新 DataFramedf['Gender'] = imputed_gender print("\nDataFrame after Gender Imputation:")print(df)
输出:
1234567
DataFrame after Gender Imputation: Name Height Weight Age Gender0 Alice 165.0 68.0 25.0 Female1 Bob 170.0 85.0 30.0 Male2 Charlie 180.0 73.333333 35.0 Male3 David 175.0 77.0 29.5 Male4 Eve 170.0 65.0 28.0 Female
解释: 尽管在此示例中 Gender 列中没有缺失值,但应用 MostFrequent 策略确保任何未来缺失的分类数据都将填补为该列的众数。
**8. 最终 DataFrame**
填补后,DataFrame 中不再有缺失值,适合进行建模。
12
print("\nFinal Cleaned DataFrame:")print(df)
输出:
1234567
Final Cleaned DataFrame: Name Height Weight Age Gender0 Alice 165.0 68.0 25.0 Female1 Bob 170.0 85.0 30.0 Male2 Charlie 180.0 73.333333 35.0 Male3 David 175.0 77.0 29.5 Male4 Eve 170.0 65.0 28.0 Female
最佳实践和注意事项
- 了解数据: 在决定填补策略之前,分析数据的性质和分布。可视化和统计摘要可以有助于理解。
- 保持数据完整性: 避免引入偏差。例如,如果存在异常值,均值填补可能会扭曲数据分布。
- 必要时使用高级填补技术: 对于更复杂的情况,考虑使用 K 最近邻(KNN)填补或基于模型的填补技术。
- 评估模型性能: 填补后,评估其对模型性能的影响。有时,某些填补方法可能会带来更好的预测准确性。
- 自动化预处理管道: 将填补步骤纳入数据预处理管道,以确保一致性,特别是在处理大规模数据集或部署模型时。
结论
处理缺失数据是机器学习工作流中数据预处理的重要部分。通过有效地解决数据中的缺口,您可以提升分析和模型的质量与可靠性。Python 的 Scikit-Learn 库通过其 SimpleImputer 类,提供了一种稳健且用户友好的方法,使用各种策略来填补缺失值。无论您选择删除不完整的记录,还是使用统计量来填补缺失值,了解每种方法的影响都能确保您的数据既有意义又可操作。
掌握这些技术以维护数据集的完整性,并推动您的数据科学项目迈向成功。