点击下方卡片,关注“小白玩转Python”公众号
在几乎所有的组织中,信息质量的状态都处于同一低水平
- Olson,《数据质量》
数据无处不在!此外,它是许多现实世界问题的核心。作为数据科学家和机器学习工程师,我们大部分时间都在与数据打交道。重要的是我们要掌握它。本文介绍了全面的数据科学指南:从缺失数据到不平衡数据集的预处理成功之路。
概述
通过有效的预处理技术解锁数据的力量
在机器学习中,从原始数据到一个调整良好的模型的路径,是由预处理技术铺就的,这些技术为成功铺平了道路。数据科学家和机器学习工程师花费大量时间准备数据,因为干净、结构良好和经过工程处理的数据会带来更好的模型性能和洞察力。我们都听说过:
Garbage in, garbage out!
这篇博客探讨了每个数据科学家必须掌握的五个关键预处理技术:处理缺失数据、缩放和归一化、编码分类数据、特征工程以及处理不平衡数据。每个主题在将混乱的现实世界数据集转化为机器学习算法真正可以学习的东西方面都是至关重要的。
这份全面的指南将涵盖你需要了解的关于数据预处理的一切,无论是清理数据集、缩放你的特征、编码分类变量,还是对抗类别分布的不平衡。我们将提供理论基础、实践的Python示例、最佳实践和高级策略,确保你可以像专业人士一样处理你的数据预处理。
目录
· 1. 处理缺失数据
· 2. 缩放和归一化
· 3. 编码分类数据
· 4. 特征工程
· 5. 处理不平衡数据
· 结论
· 行动号召
1. 处理缺失数据
缺失数据为什么重要
缺失数据是现实世界机器学习项目中不可避免的挑战。由于传感器故障、人为错误或其他原因,数据集经常有缺失值。如果处理不当,缺失数据可能导致有偏见的模型预测、误导性的洞察力,甚至训练失败。在训练任何模型之前,以一种保留数据集完整性的方式处理缺失值是至关重要的。
这一节将涵盖使用Python、pandas和sklearn处理缺失数据的最常见技术。我们将探索列表删除、均值/众数插补和高级技术,如多变量插补。
缺失数据的类型
1. 完全随机缺失(MCAR):
缺失数据点的概率与任何其他观察到的或未观察到的样本无关。在这种情况下,删除数据可能不会引入偏见,因为它是随机的。
2. 随机缺失(MAR):
数据点的缺失取决于其他观察到的变量,但与缺失值本身无关。这在调查或人口统计数据集中很常见,其中缺失的收入数据可能与教育水平有关。
3. 非随机缺失(MNAR):
缺失与未观察到的数据本身有关。例如,高收入人群可能不太可能披露他们的收入,如果不仔细处理,这可能会对数据集产生偏见。
策略1:列表删除(删除缺失数据)
处理缺失数据的最简单方法是删除包含缺失值的行。虽然这对于少数缺失条目的小数据集有效,但对于缺失数据频繁的大型数据集来说,这远不实用,因为它将导致宝贵信息的丢失。首先,我们模拟一个包含缺失值的小数据集:
import pandas as pd
pd.set_option("display.precision", 2)
# Simulated dataset with missing values
data = {'Price': [200000, 150000, None, 130000, 250000],
'Bedrooms': [3, 2, 4, None, 3],
'SquareFeet': [2000, 1600, 2400, 1800, None]}
df = pd.DataFrame(data)
print("Original DataFrame with Missing Values:")
print(df)
Original DataFrame with Missing Values:
Price Bedrooms SquareFeet
0 200000.0 3.0 2000.0
1 150000.0 2.0 1600.0
2 NaN 4.0 2400.0
3 130000.0 NaN 1800.0
4 250000.0 3.0 NaN
示例:房价数据集
现在,我们将通过删除包含任何缺失值的行来实现列表删除:
# Remove rows with any missing values
df_dropped = df.dropna()
print("\nDataFrame after Listwise Deletion (Removing Missing Values):")
print(df_dropped)
DataFrame after Listwise Deletion (Removing Missing Values):
Price Bedrooms SquareFeet
0 200000.0 3.0 2000.0
1 150000.0 2.0 1600.0
示例:列表删除实现
注意,包含一个或多个缺失值的样本(即行)已从数据集中删除。但是,谨慎使用列表删除。它只适用于MCAR的缺失数据,或者删除行不会显著影响数据集的完整性。
策略2:插补方法(填充缺失数据)
如果删除数据不是一个选项,使用统计量(例如,均值、中位数或众数)插补(即填充)缺失值。插补允许模型使用所有可用信息,确保没有数据被丢弃。
均值/中位数插补
我们通常使用列中观察到的值的均值(或中位数)来插补数值数据。当数据对称分布时,这种方法效果很好,但在偏斜分布中可能会引入偏见。
from sklearn.impute import SimpleImputer
# Impute missing values using the mean for numerical data
imputer_mean = SimpleImputer(strategy='mean')
df_imputed_mean = pd.DataFrame(imputer_mean.fit_transform(df), columns=df.columns)
print("\nDataFrame after Mean Imputation:")
print(df_imputed_mean)
DataFrame after Mean Imputation:
Price Bedrooms SquareFeet
0 200000.0 3.0 2000.0
1 150000.0 2.0 1600.0
2 182500.0 4.0 2400.0
3 130000.0 3.0 1800.0
4 250000.0 3.0 1950.0
在这里,Price和SquareFeet中的缺失值被设置为可用数据的均值替换列。均值插补对数值数据有效,且数据偏斜最小。对于偏斜数据,考虑使用中位数。
策略3:分类数据的众数插补
我们不能使用均值来插补分类数据(例如,性别或国家)。相反,我们使用众数。因此,我们用每个列中出现频率最高的类别来填充缺失值。
import pandas as pd
import numpy as np
from sklearn.impute import SimpleImputer
# Simulated dataset with categorical missing values
data_cat = {'Name': ['John', 'Emily', 'Michael', None, 'Jessica'],
'Country': ['USA', 'UK', None, 'USA', 'Canada']}
df_cat = pd.DataFrame(data_cat)
print("\nOriginal Categorical DataFrame with Missing Values:")
print(df_cat)
# Replace None with np.nan for proper handling of missing values
df_cat.replace({None: np.nan}, inplace=True)
# Impute missing values using the mode (most frequent value) for categorical data
imputer_mode = SimpleImputer(strategy='most_frequent')
df_cat_imputed = pd.DataFrame(imputer_mode.fit_transform(df_cat), columns=df_cat.columns)
print("\nDataFrame after Mode Imputation:")
print(df_cat_imputed)
Original Categorical DataFrame with Missing Values:
Name Country
0 John USA
1 Emily UK
2 Michael None
3 None USA
4 Jessica Canada
DataFrame after Mode Imputation:
Name Country
0 John USA
1 Emily UK
2 Michael USA
3 Emily USA
4 Jessica Canada
示例:分类数据插补
在上面,Name和Country列中的缺失值已经用每个列中出现最频繁的值填充。众数插补适用于分类数据,特别是对于像性别或国家这样的特征,其中最常见的值是有意义的。
策略4:高级技术 - 链式方程的多变量插补(MICE)
像均值或众数这样的简单插补方法可能会引入偏见,特别是在复杂数据集中。在这种情况下,我们可以使用链式方程的多变量插补(MICE)。这种技术基于多个特征之间的关系预测缺失值。MICE迭代地将具有缺失值的每个特征建模为其他特征的函数,使用回归或其他预测模型。这种方法更准确,更好地考虑了数据的结构。
from sklearn.experimental import enable_iterative_imputer # noqa
from sklearn.impute import IterativeImputer
# Use Iterative Imputer (MICE) for advanced imputation
mice_imputer = IterativeImputer(max_iter=10, random_state=0)
df_mice_imputed = pd.DataFrame(mice_imputer.fit_transform(df), columns=df.columns)
print("\nDataFrame after MICE Imputation:")
print(f"{df_mice_imputed}")
DataFrame after MICE Imputation:
Price Bedrooms SquareFeet
0 200000.00 3.00 2000.00
1 150000.00 2.00 1600.00
2 254096.39 4.00 2400.00
3 130000.00 5.97 1800.00
4 250000.00 3.00 2305.46
示例:MICE实现
最佳实践:对于特征之间存在复杂相互依赖的数据集,主要当简单的插补可能会引入偏见时,使用MICE。
结论:选择正确的插补策略
处理缺失数据是预处理流程中的关键步骤。虽然列表删除在某些情况下可能有用,但插补缺失值通常是保留数据集中有价值信息所必需的。根据你的数据的性质,你可以选择简单的技术,如均值/众数插补,或者更高级的方法,如MICE,以获得更好的准确性。
关键要点:
对于缺失值较少的小数据集,使用列表删除。
均值/中位数插补适用于数值数据;众数插补非常适合分类数据。
对于更复杂的数据集,考虑使用高级技术(例如,MICE)。
正确的插补策略保留了你的数据集的完整性,并为构建健壮的ML模型奠定了坚实的基础。
· END ·
🌟 想要变身计算机视觉小能手?快来「小白玩转Python」公众号!
回复“Python视觉实战项目”,解锁31个超有趣的视觉项目大礼包!🎁
本文仅供学习交流使用,如有侵权请联系作者删除