zoukankan      html  css  js  c++  java
  • 机器学习 特征工程

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

  • 相关阅读:
    javaweb登录验证码的实现
    jQuery Ajax 简单的实现跨域请求
    Java Socket长连接示例代码
    Java socket长连接代码实现
    带日期的bean转为json(bean->JSON)
    函数迭代器、生成器、递归
    闭包函数和装饰器
    函数名称空间与作用域
    函数基础
    基本的文件操作
  • 原文地址:https://www.cnblogs.com/mengnan/p/9307598.html
Copyright © 2011-2022 走看看