特征工程

数据预处理

  1. 缺失值处理

    • 如果缺值的样本占总数比例极高,直接舍弃

    • 如果缺值样本适中,该属性为类别属性,把NaN作为一个新类别加到类别特征中

    • 如果缺失样本适中,该属性为连续属性,给定一个step将数据离散化,把NaN作为一个type加到属性类目中

    • 缺失的值个数并不是特别多,可以根据已有的值,拟合缺失数据进行补全

      如果缺失属性和其他属性无关,则预测结果毫无意义;

      如果预测结果相当准确,则说明缺失属性没必要纳入数据集中。

    • 插值补全缺失值

      • 均值/中位数/众数:平均数(样本属性的距离可度量);众数/中位数(样本属性的距离不可度量)

      • 同类均值/中位数/众数:对样本分类后,根据同类的其他属性补全

      • 固定值补全

      • 高维映射:采用One-hot编码,将包含K个离散取值的属性扩展为K+1个属性,若该属性缺失,扩展后的K+1个属性置为1

        保留了所有信息,未添加任何额外信息;缺点是计算量大,只在样本量非常大时有效果

      • 手动补全:根据对领域问题的理解,手动补全缺失值

      • 最近邻补全:寻找与该样本最接近的样本,使用其该属性数值来补全

  2. 异常值处理:检验数据是否有录入错误和不合理的数据

    • 异常值检测:

      • 简单统计:做散点图观察异常值(pandas.describe()方法观察数据统计描述)

      • 3\sigma:前提是数据需要服从正态分布,异常值如果超出3倍标准差,则视为异常值

        正负3\sigma的概率是99.7\%,则距离平均值3\sigma之外的值出现的概率为P([x-\mu]>3\sigma)\leq0.003

      • 箱型图:利用箱图的四分位矩(IQR)对异常值进行检测,超过上(下)四分位+1.5倍IQR的值

        IQR就是上四分位与下四分位的差值(numpy.percentile()

      • 基于概率模型预测:构造一个概率分布模型,计算对象符合该模型的概率,低概率的对象为异常点

        如果模型是簇的组合,则异常点是不在任何簇的对象;

        如果是回归模型,异常点是远离预测值的对象。

      • 基于聚类的离群点检测:如果该对象不属于任何簇,则该对象属于离群点

      • One class SVMIsolation Forest

    • 异常值处理:

      • 删除含有异常值的记录:直接将含有异常值的记录删除;
      • 视为缺失值:将异常值视为缺失值,利用缺失值处理的方法进行处理;
      • 平均值修正:可用前后两个观测值的平均值修正该异常值;
      • 不处理:直接在具有异常值的数据集上进行数据挖掘;
  3. 不平衡处理

    • 扩充数据集
    • 尝试其他评价指标
      • 混淆矩阵
      • 精准度
      • 召回率
      • ROC曲线
    • 对数据集进行重采样:过采样欠采样
    • 人工生成新样本:对该类下的所有样本每个属性特征的取值空间中随机选取一个组成新的样本,即属性值随机采样。
    • 对模型进行惩罚:对分类器的小类样本数据增加权值,降低大类样本的权值(这种方法其实是产生了新的数据分布,即产生了新的数据集)
  4. 特征缩放

    • 归一化:将特征都缩放到一个指定的大致相同的数值范围内

      • 归一化的原因:

        消除样本数据特征之间的量岗影响(数量级的影响);

        数量级的差异将导致量级较大的属性占据主导地位(LR);

        数量级的差异会导致迭代收敛速度减慢;每一步梯度方向会偏离最小值(等高线中心点)的方向

        所有依赖于样本距离的算法对于数据的数量级都非常敏感(KNN)。

      • 归一化方法:

        线性函数归一化(Min-Max Scaling):x_{norm}=\frac{x-x_{min}}{x_{max}-x_{min}}

        零均值归一化(Z-Score Norm):z=\frac{x-\mu}{\sigma}

    • 正则化:将样本或者特征的某个范数(如 L1、L2 范数)缩放到单位范数

      数据集:D=\{(x_1,y1),…,(x_n,y_n)\},x_i=(x_i^1,x_i^2,…,x_i^d)^T

      计算范数:L_p=(|x_i^1|^p+|x_i^2|^p+…+|x_i^d|^p)^{\frac{1}{p}}

      正则化后:x_i=(\frac{x_i^1}{L_P(x_i)},\frac{x_i^2}{L_p(x_i)},…,\frac{x_i^d}{L_p(x_i)})^T

      正则化针对单个样本;归一化针对单个属性

    • 数据变换:

      • 基于多项式的:preprocessing.PolynomialFeatures
      • 基于指数函数的:preprocessing.FunctionTransformer
      • 基于对数函数的
  5. 特征编码

    • 序号编码

    • 度热编码

    • 二进制编码

    • 二元化:将数值型的属性转换为布尔型的属性(假设属性取值是伯努利分布)

    • 离散化:将连续的数值属性转换为离散的数值属性

      线性模型:海量离散特征+简单模型。模型简答,特征工程较难

      非线性模型:少量连续特征+复杂模型。不需要复杂的特征工程,模型复杂

      • 分桶:将所有样本在连续数值属性 j 的取值从小到大排列,确定桶数量和边界

特征选择

  1. Filter方法

    先对数据集进行特征选择,其过程与后续学习器无关,feature_selection.SelectKBest

    • 卡方检验
    • 信息增益
    • 相关系数
  2. Wrapper方法feature_selection.RFE

    将子集的选择看作是一个搜索寻优问题,生成不同的组合,对组合进行评价,再与其他的组合进行比较。

    这样就将子集的选择看作是一个是一个优化问题。将后续的学习器的性能作为特征子集的评价标准。

  3. Embedded方法feature_selection.SelectFromModel

    在模型既定的情况下学习出对提高模型准确性最好的属性。

    在确定模型的过程中,挑选出那些对模型的训练有重要意义的属性。模型自己选择特征

工程中的特征选择方法

  1. 计算每个特征与响应变量的相关性

    • 皮尔逊系数:p_{X,Y}=\frac{cov(X,Y)}{\sigma_X\sigma_Y}=\frac{E[(X-\mu_X)(Y-\mu_Y)]}{\sigma_X\sigma_Y}衡量线性相关性
    • 互信息系数:I(X;Y)=\sum_{y\in Y}\sum_{x\in X}p(x,y)log(\frac{p(x,y)}{p(x)p(y)})可以度量各种相关性
  2. 构建单个特征的模型,通过模型的准确度为特征排序,借此来选择特征

  3. 通过L1正则化来选择特征

    L1没有选到的特征并不代表不重要,原因是两个具有高相关性的特征可能只保留了一个,如果要确定哪个特征重要应再通过L2正则方法交叉检验

  4. 训练能够对特征打分的预选模型:RF和LR

  5. 通过特征组合后再来选择特征:如对用户id和用户特征组合来获得较大的特征集再来选择特征,这种做法在推荐系统和广告系统中比较常见

步骤

  1. 先挑出一部分特征作为初始特征
  2. 使用交叉验证计算AUC
  3. 一次添加一个特征,如果添加的特征使得AUC上升,那么保留这个特征,如果没有上升,就不添加这个特征。

https://www.jianshu.com/p/6d1e95b47642

Python量化投资网携手4326手游为资深游戏玩家推荐:《《明日之后》:新日程拿160执勤点,他只用了1个小时?

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
XGBoost
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论