特征和数据决定了机器学习效果的上限,而算法和模型不过是接近这个上限而已,因此特征工程
对于机器学习是及其重要的。
一图胜前言[1]:
数据清洗
在实际的应用过程中,数据是十分的杂乱的,可能包含大量的噪音,缺失值等,所以需要通过一些方法,尽可能提高数据质量。一般包括:
- 分析数据
- 缺失值处理
- 异常值处理
- 噪音数据处理
- 去重处理
分析数据
python的pandas包含了一些统计和汇总统计,如:
可参见《利用Python进行数据分析》Wes Mckinney著,P144.
缺失值处理
缺失值在实际数据中不可避免,可以将缺失的数据直接删除,或者赋值为0/NaN,其实有更多的处理方法。
-
判断缺失值:
pd.isnull(DataFrame)
或者pd.notnull(DataFrame)
样例:
-
处理缺失值常用方法:
1.直接删除。适合缺失值数量较小,并且是随机出现的情况,删除它们对整体数据影响不大
2.使用一个全局常量填充。譬如将缺失值用np.nan等填充,但是效果不一定好,因为算法可能会把它识别为一个新的类别,一般很少用
3.使用均值或中位数代替----优点:不会减少样本信息,处理简单。缺点:当缺失数据不是随机数据时会产生偏差.对于正常分布的数据可以使用均值代替,如果数据是倾斜的,使用中位数可能更好。
4.插补法
1)随机插补法----从总体中随机抽取某个样本代替缺失样本
2)多重插补法----通过变量之间的关系对缺失数据进行预测,利用蒙特卡洛方法生成多个完整的数据集,在对这些数据集进行分析,最后对分析结果进行汇总处理
3)热平台插补----指在非缺失数据集中找到一个与缺失值所在样本相似的样本(匹配样本),利用其中的观测值对缺失值进行插补。
优点:简单易行,准去率较高
缺点:变量数量较多时,通常很难找到与需要插补样本完全相同的样本。但我们可以按照某些变量将数据分层,在层中对缺失值实用均值插补
4)拉格朗日差值法和牛顿插值法
5.建模法
可以用回归、使用贝叶斯形式化方法的基于推理的工具或决策树归纳确定。例如,利用数据集中其他数据的属性,可以构造一棵判定树,来预测缺失值的值。
使用python处理示例:
- 直接删除
DataFrame.dropna()
,该方法的how参数可以控制删除存在缺失值还是全部缺失值的行或者列。参见pandas.DataFrame.dropna
使用样例:
- 填充缺失值
DataFrame.fillna
,详细使用参见:pandas.DataFrame.fillna
重要参数: - value:用于填充缺失值的值
- method:可选:
bfill
/backfill
/pad
/ffill
。bfill
/backfill
,后向填充,使用下一个有效值填充‘空洞’。pad
/ffill
,前向填充,使用前一个有效值填充‘空洞’。 - inplace:是否原地操作
- axis:0,按列填充;1,按行填充
异常值处理
异常值也称为“离群点”,如何发现异常值?如何处理?
发现异常值
- 简单的统计分析
可以使用python的describe()
统计分析,如果发现有数据超过的合理范围,如年龄为负数,身高大于400cm,显然是不合理,应该去除的。 - 3∂原则
若数据服从正态分布,在3∂原则下,异常值为:观测值与平均值的偏差超过3倍标准差的数值。若数据不服从正态分布,也可以用远离平均值多少倍标准差的方式描述异常值。 - 箱型图分析
箱型图提供了识别异常值的标准,一个正常的箱型图从上至下分别为:上边缘(最小值),上四分位数(前25%),中位数,下四分位数(后25%)和下边缘,超脱此范围的被视为异常值,使用plt.boxplot()
可以很容易画出箱型图。参见:箱型图
- 基于模型检测
首先建立一个数据模型,异常值是那些无法完美拟合模型的对象。如果模型是簇的集合,异常值就是不显著属于某个簇的对象,如果模型是回归模型,则异常值是远离预测值的对象。 - 基于距离
- 基于密度
- 基于聚类
处理方法
1.删除异常值
2.不处理。如果算法对异常值不敏感,则可以不处理。但如果算法是类似kMeans,knn之类对异常值敏感的,则最好丢弃异常值。
3.按照缺失值处理。将异常值当作缺失值,填充平均值,前向填充等。
噪音处理
噪音和上述的异常值的区别在于,噪音包括错误值,而异常值属于远离正常值的数据。噪音的处理和异常值处理类似。可以使用箱线图和函数拟合方法,加以剔除。
去重处理
利用pandas中的DataFrame.drop_duplicates()
,参见pandas.DataFrame.drop_duplicates
数据预处理
2.1无量纲化
无量纲化使不同规格的数据转换到同一规格。常见的无量纲化方法有标准化和区间缩放法。标准化的前提是特征值服从正态分布,标准化后,其转换成标准正态分布
。区间缩放法利用了边界值信息,将特征的取值区间缩放到某个特定的范围
,例如[0, 1]等。
2.1.1标准化
标准化是需要标准差和平均值。公式表达:
from sklearn.preprocessing import StandardScalar
StandardScalar().fit_transform(X)#标准化,返回值为标准化后的值
2.1.2归一化
标准化和归一化的区别在于:标准化是依照特征矩阵的列处理数据,将样本的特征值转化到同一量纲下。而归一化是依照特征矩阵的行处理数据,其目的在于样本向量在点乘运算或者其他核运算计算相似度是,拥有统一的标准,也即是都转化为“单位向量”。规则为l2 的归一化公式为:
from sklearn.preprocessing import Normalizer
Normalizer().fit_transform(iris.data)
2.1.3区间缩放法
利用两个最值对所有值进行缩放,公式表达:
from sklearn.preprocessing import MinMaxScalar
MinMaxScalar().fit_transform(iris.data)
2.2对定量数据二值化
设定一个阈值,大于阈值赋值为1,小于等于阈值赋值为0,公式表达:
from sklearn.preprocessing import Binarizer
Binarizer(threshold=3).fit_transform(iris.data)#二值化,阈值为3,返回值为二值化后的数据
2.3独热编码One-hot
from sklearn.preprocessing import OneHotEncoder
OneHotEncoder().fit_transform(iris.target.reshape((-1,1)))#One-hot编码,编码后为,样本数*类别数大小的矩阵
2.4数据变换
常见的数据变换有基于多项式
,指数函数
,对数函数
的。
4个特征,度为2的多项式转换公式如下:
from sklearn.preprocessing import PolynomialFeatures
#多项式转化,其中参数degree为“度”,默认值为2
PolynomialFeatures().fit_transform(iris.data)
特征选择
当数据预处理后,我们需要选择有意义的特征输入机器学习算法中训练,通常来说,从两个方面选择特征:
- 特征是否发散。