机器学习 特征工程

特征和数据决定了机器学习效果的上限,而算法和模型不过是接近这个上限而已,因此特征工程对于机器学习是及其重要的。
一图胜前言[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/ffillbfill/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)

特征选择

当数据预处理后,我们需要选择有意义的特征输入机器学习算法中训练,通常来说,从两个方面选择特征:

  • 特征是否发散。

机器学习基础与实践(一)----数据清洗
使用sklearn做单机特征工程