开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第8天,点击查看活动详情
数据预处理
数据预处理的重要性:
模型输入数据质量直接影响建模效果,在正式构建模型之前往往需要对数据进行恰当的预处理。
数据预处理在数据挖掘的工作中所占的比重非常大,也非常重要,预处理的质量直接影响接下来的工作。
原始的数据集往往因为样本的来源不同、计量单位不一致;采集设备抗干扰
能力差、人工输入的错误导致噪声数据;问卷填写不完整、采集设备故障导致的
数据缺失等数据质量问题.
在数据挖掘过程中,数据预处理往往占大部分工作量。数据预处理通常包含缺失值处理、异常值检测与处理、数据标准化、特征编码、离散化以及降维等。
常见预处理方法
缺失值处理
对于有缺失值的数据集,不能直接用于模型的训练,需要对缺失的数据进行删除或填充处理。
采用填补法可获得完整的数据集,对于连续型数据通常采用均值填充,离散型数据则采用众数或中位数填充。
采用删除法,根据具体情况删除样本(行)或特征(列)得到一个完整的数据子集。
填补法
对于连续型数据,使用平均值填充缺失值,如某居民信息收集过程中少数样本的收入缺失,数据处理时可以考虑用总体的均值填充,填补后得到完整的数据集。但要注意的是均值填补会使得相应特征的方差变小。
对于离散型数据,可以使用众数填充,如居民信息中少数样本的性别缺失,可以考虑使用数据表中多数样本的性别来填充。但这会加重特征取值的不平衡。
解决方法:
在 sklearn.impute 中提供 SimpleImputer 类实现缺失数据的填补。
SimpleImputer(
missing_values=np.nan, #缺失值的占位符。
strategy=‘mean’, #填补策略
fill_value=None, #策略"constant"的常数
verbose=0, #控制 Imputer 的详细程度
copy=True #True,将创建 X 的副本;False,填补将在 X 上
进行,有例外
)
missing_values 参数指定缺失值的占位符,是指数据集中缺失值的表示方法,如果数据集中缺失值用“X”代替,missing_values=“X”,空通常其占位符用 np.nan(numpy 的属性)表示。
常见 sklearn 和 pandas 预处理模块
| 常见数据预处理方法 | 对于的 sklearn 和 pandas 的类 |
|---|---|
| 缺失值处理 | sklearn.Impute.Simplemputer |
| 离群值检测和处理 | sklearn.neighbors.LocalOutlierFator |
| 标准化 | sklearn.preprocessing.StandarScaler sklearn.preprocessing.MinMaxScaler sklearn.preprocessing.RobustScaler |
| 特征编码 | sklearn.preprocessing.OneHotEncoder pandas.get_dummies sklearn.preprocessing.LabelEncoder |
| 离散化 | pandas.cut pandas.qcut sklearn.preprocessing.Binarizer |
Strategy 参数确定填补策略:
- “mean”表示使用平均值填充缺失值
- “median”表示使用中位数填充缺失值
- “most_frequent”表示使用众数填充缺失值
- “constant”表示使用指定的常数填充缺失值,可用于离散型和连续型的特征。
对于部分特征如缺失较多可以考虑使用单独的类别填充,如性别缺失较多,但特征又不能删除,可以考虑用“中”或者其他某个字符代替缺失部分。策略为常数填充时,fill_value指定填充的值。
pandas 对象的方法 fillna来进行缺失值的处理:
fillna(value=None,method=None,axis=None,inplace=False)
-
method为填充的方法,取值有‘backfill’, ‘bfill’, ‘pad’, ‘ffill’, None, 缺省为None,
- pad / ffill: 表示用缺失值前面的有效值填充。
- backfill / bfill: 表示用缺失值后面的有效值填充。
-
axis指定填充时是按列还是行,0 表示沿行, 1 表示沿列。 -
inplace表示在
原始数据上修改,还是在副本上修改
。原始数据上修改则没有返回值,而副本上修改后会返回修改后的数据。
- False 表示不在副本上修改
- Ture 表示在副本上修改
其他填补方法
- 随机填补:是在均值填补的基础上加上随机项,通过增加缺失值的随机性来改善缺失值分布过于集中的缺陷。
- 基于模型的填补:将缺失特征当作预测目标,使用其余特征作为输入,利用缺失特征非缺失样本构建模型预测。
- 哑变量方法:对于离散型特征,将缺失值作为一个单独的取值进行处理。
- EM 算法填补:根据 EM (expectation and maximization)法则计算含有缺失值数据集的极大似然估计
删除法
删除法通过删除包含缺失值的行或列,来得到一个完整的数据子集。主要通过删除特征或者样本来进行。
- 删除特征: 当某个特征缺失值较多,且该特征对数据分析的目标影响不大时,可以将该特征删除。
- 删除样本: 删除存在数据缺失的样本。该方法适合某些样本有多个特征存在缺失值,且存在缺失值的样本占整个数据集样本数量的比例不高的情形。
注意用来时间序列分析的数据,不能删除样本,删除样本会导致时间序列不连续,需要采用填补法。
#pandas 对象的方法 dropna 可实现样本或特征的删除。
dropna(
axis=0,
how=‘any’,
thresh=None,
inplace=False
)
-
how 通常用于特征的删除。
- 当 how=“any”时,用 thresh 参数指定不被删除的特征的最少有效样本数。
- how= 'all' 时,当某列或行数据全部缺失时删除该列或行。
-
inplace 为 True 时直接修改原始数据,否则不修改原始数据,函数返回修改后的数据。
-
axis 参数同样是表示沿行还是列
标准化
通常确定目标变量的特征会有多个,原始数据中不同特征的数值大小可能差异很大,数值大的特征对目标变量的影响程度将会比数值小的特征对目标变量的影响大,数值小的特征容易被模型忽略。而通过标准化处理,将不同特征的取值 都转换到相同的范围中,消除了特征之间数值量纲的差异。
Z-Score 标准化
Z-Score 标准化首先计算特征的均值与标准差,然后对特征的每一个取值减去该特征的均值并除以其标准差,使得处理后的数据具有固定均值和标准差.
𝑓𝑖′ = (𝑓𝑖−𝜇 )/𝜎
𝑓𝑖′为标准化后各数据点的取值
适用情况:Z-Score 标准化适用于特征的最大值或最小值未知、样本分布比较分散的情况。
#可采用 sklearn.preprocessing 中的 StandardScaler 类来实现。
StandardScaler(
copy=True, # 为 False,尝试避免复制并改为直接替换
with_mean=False, # 为 True,则在缩放之前将数据居中
with_std=False # 为 True,则将数据缩放为单位方差(或单位标准差)
)
Min-Max 标准化
Min-Max 标准化也称为离差标准化或最大-最小值标准化,通过对特征作线性变换,使得转换后特征的取值分布在 [0,1] 区间内 𝑓𝑖′ = \frac{𝑓𝑖−𝑓𝑚𝑖𝑛}{𝑓𝑚𝑎𝑥-𝑓𝑚𝑖𝑛}
𝑓𝑖′=a+(b−a)𝑓𝑖−𝑓𝑚𝑖𝑛𝑓𝑚𝑎𝑥−𝑓𝑚𝑖𝑛
#可采用 sklearn.preprocessing 中的 MinMaxScaler 类来实现。
MinMaxScaler(
feature_range=(0, 1), #期望的转换后数据的取值范围
copy=False #设置为 False 以执行就地标准化并避免复制
)
离群值检测
离群值:
指一个数据集中那些明显偏离数据集的其他样本
统计上的定义:一个观测与其他观测样本偏离太多以致于值得怀疑它是由不同的机制所产生的。
离群值产生的原因:自然变异,数据测量和收集的误差以及人工操作失误等。
离群值检测可以为数据预处理的一个步骤,为数据分析提供高质量的数据
离群值检测也可以直接用来解决很多应用问题:
- 信用诈骗检测
- 电信诈骗检测
- 疾病分析
- 计算机安全诊断等
离群值的影响:
从回归图可以看到:一个离群值会使拟合的直线的发生较大的偏移
从分类图可以看到:离群值会使分类线的划分发生大的变化
离群值检测方法:
基于统计的方法
在上下α分位点之外的值认为是异常值
通过箱线图观察:
分位数:
K分位数:令x是一个值,如果在数据集中,百分之K的数据的值都不 大于x,则称x为该数据集的K分位数。
分位数:Q1(25th percentile),Q3(75th percentile)
中间分位数范围:IQR=Q3-Q1
方差(Variance)和标准差(Standard deviation)
方差:
盒图(boxplot)
也叫做箱线图,盒外的两条线(胡须)分别延伸到最小和最大观测值,直观明了地识别数据集中的离群值,并判断数据集的偏态和尾重
基于进邻的方法:
局部异常因子算法(LOF算法,Local Outlier Factor)
基本想法:
通过比较每个点𝑝和其邻域点的密度来判断该点是否 为异常点,点𝑝的密度越低,越可能被认定是异常点 , 密度通过点之间的距离来计算,点之间距离越远, 密度越低,距离越近,密度越高