在我们平时进行数据挖掘建模时,一般首先得对数据进行预处理,其中常用的方法包括缺失值处理、共线性处理、异常值处理、数据标准化、数据归一化等。
有时样本的数据获取不全,部分特征可能存在缺失值或无效值。对于这种情况,需要对数据进行缺失值处理,否则可能会导致模型训练失败。
对于缺失值的处理,需要用一个有效的数据来填补上,通常做法是用每一个特征的全局平均值来代替无效值。
在Python/ target=_blank class=infotextkey>Python中,有一个专门的 Imputer 类来处理缺失值。
from sklearn.preprocessing import Imputer
import numpy as np
#导入要进行缺失值处理的数据文件
data = np.genfromtxt('input.csv', skip_header=True, delimiter=',')
#无效值在数据文件中的标识是'NAN', strategy='mean'表示用全局平均值代替无效值,axis=0表示对列进行处理
imp = Imputer(missing_values='NAN', strategy='mean', axis=0)
#训练一个缺失值处理模型
imp.fit(data)
outfile = imp.transform(data)
#存储到本地
np.savetxt('output.csv', outfile, delimiter=',')
数据标准化是将数据按比例缩放,使之落入一个小的特定区间,目的在于去除数据的单位限制,转化为无量纲的纯数值,便于不同单位或量级的指标能够进行比较和加权。归一化处理也是数据标准化处理的一种特殊形式。
下面的代码展示了z-score标准化,preprocessing 模块的 scale() 方法可实现标准化。经过处理后,数据的均值为0,标准差为1。
from sklearn import preprocessing
import numpy as np
data = np.genfromtxt('input.csv', skip_header=True, delimiter=',')
#对一个数据集进行Z标准化
zdata = preprocessing.scale(data)
np.savetxt('z_core_out.txt', zdata, delimiter=',')
数据归一化是把每个特征都缩到0-1之间时,可以用如下代码。
min_max_scale = preprocessing.MinMaxScaler()
min_max_data = min_max_scale.fit_transform(data)
np.savetxt('min_max_out1.csv', min_max_data, delimiter=',')
当自变量之间存在共线性时, 模型的参数会变得极其不稳定, 模型的预测能力会下降。很难确切区分每个自变量对因变量的影响, 因此增加了对于模型结果解释的成本。
导致出现变量间共线性的原因可能包括:
解决共线性问题的常用方法包括:
分类变量是指一个变量只能取到有限数量的值。比如一项关于健身产业的市场调查,日常锻炼的频率提供了四个选项:“从不”、“偶尔”、“每周一次”或“每周多次”。在这种情况下,数据是分类的,因为答案属于一组固定的类别。再如汽车品牌的调查,汽车品牌的数据也是分类的。
如果将分类变量的数据直接输入到机器学习模型而不首先对其进行预处理的话,就会出现错误。处理分类变量数据的常用预处理方法是:序数编码和One-Hot 编码。
序数编码(Ordinal Encoding):将每个唯一值分配给不同的整数。如下例:关于是否吃早餐的调查,包括了每天、从不、偶尔和经常几个不同的类别。
序数编码
这些类别本身具有天然的排序关系,因此可以用序数编码来定义类别:“从不”(0)<“偶尔”(1)<“经常”(2)<“每天”(3)。
One-hot 编码(One-hot Encoding)
对于本身不具有排序关系的分类变量,可以采用One-hot编码。下面举一个One-hot编码的例子。
One-hot编码
在原始数据集中,“颜色”是一个分类变量,具有“红色”、“黄色”和“绿色”三个类别。对应的 one-hot 编码的每一列代表着每个可能值。如果原始值为“红色”,在“红色”列中输入 1,其他列为0;其他颜色的原始值依此类推。
与序数编码相比,one-hot 编码不假设类别的排序。因此,如果分类数据中没有明确的顺序,可以期望one-hot编码是行之有效的。
数据不平衡经常出现在分类问题上,数据不平衡指的是在数据集中不同类别的样本数量差距很大。对于很多实际业务场景,不同类别的样本先天就是不平衡的。
样本类别分布不均衡从数据规模上可以分为大数据分布不均衡和小数据分布不均衡。大数据分布不均衡整体数据规模大,只是小样本类占比比较少,比如1000W:50W,但小样本还是可以覆盖大部分或者全部的特征。小数据分布不均衡是小样本包含特征过少,机器难以取得规律,即使取得也会出现过拟合,模型的准确性和健壮性会很差。对于严重的样本不均衡,也没有合适的解决办法。
对于大数据分布不均衡,可以通过数据预处理或者模型上面想办法解决。在模型上可以通过参数调整,或者集成学习的方法解决。本文主要说下数据预处理的办法。
1. 过采样
对少数数据进行有放回的过采样,使原本的数据变得均衡,这样就是对少数数据进行了复制,容易造成过拟合。
2. 欠采样
对多数数据进行有放回/无放回的欠采样,这样会丢失一些样本,损失信息,模型只学会了整体模式的一部分,容易欠拟合。
3.SMOTE算法
概括来说SMOTE算法是通过“插值”来为少数类合成新的样本,来弥补少数类样本的不足。主要过程如下。
在数据挖掘前的预处理非常重要,会直接影响到模型的训练效果,本文列出了主要的数据预处理要解决的问题以及对应方法,希望大家都能取得好的效果。