特征工程之特征预处理

在前面咱们分别讨论了特征工程中的特征选择与特征表达,本文咱们来讨论特征预处理的相关问题。主要包括特征的归一化和标准化,异常特征样本清洗与样本数据不平衡问题的处理。算法

1、特征的标准化和归一化

     因为标准化和归一化这两个词常常混用,因此本文再也不区别标准化和归一化,而经过具体的标准化和归一化方法来区别具体的预处理操做。微信

    z-score标准化:这是最多见的特征预处理方式,基本全部的线性模型在拟合的时候都会作 z-score标准化。具体的方法是求出样本特征x的均值mean和标准差std,而后用(x-mean)/std来代替原特征。这样特征就变成了均值为0,方差为1了。在sklearn中,咱们能够用StandardScaler来作z-score标准化。固然,若是咱们是用pandas作数据预处理,能够本身在数据框里面减去均值,再除以方差,本身作z-score标准化。    机器学习

    max-min标准化:也称为离差标准化,预处理后使特征值映射到[0,1]之间。具体的方法是求出样本特征x的最大值max和最小值min,而后用(x-min)/(max-min)来代替原特征。若是咱们但愿将数据映射到任意一个区间[a,b],而不是[0,1],那么也很简单。用(x-min)(b-a)/(max-min)+a来代替原特征便可。在sklearn中,咱们能够用MinMaxScaler来作max-min标准化。这种方法的问题就是若是测试集或者预测数据里的特征有小于min,或者大于max的数据,会致使max和min发生变化,须要从新计算。因此实际算法中, 除非你对特征的取值区间有需求,不然max-min标准化没有 z-score标准化好用。学习

    L1/L2范数标准化:若是咱们只是为了统一量纲,那么经过L2范数总体标准化也是能够的,具体方法是求出每一个样本特征向量\(\vec{x}\)的L2范数\(||\vec{x}||_2\),而后用\(\vec{x}/||\vec{x}||_2\)代替原样本特征便可。固然L1范数标准化也是能够的,即用\(\vec{x}/||\vec{x}||_1\)代替原样本特征。一般状况下,范数标准化首选L2范数标准化。在sklearn中,咱们能够用Normalizer来作L1/L2范数标准化。测试

    此外,常常咱们还会用到中心化,主要是在PCA降维的时候,此时咱们求出特征x的平均值mean后,用x-mean代替原特征,也就是特征的均值变成了0, 可是方差并不改变。这个很好理解,由于PCA就是依赖方差来降维的。spa

    虽然大部分机器学习模型都须要作标准化和归一化,也有很多模型能够不作作标准化和归一化,主要是基于几率分布的模型,好比决策树你们族的CART,随机森林等。固然此时使用标准化也是能够的,大多数状况下对模型的泛化能力也有改进。rest

2、异常特征样本清洗

    咱们在实际项目中拿到的数据每每有很多异常数据,有时候不筛选出这些异常数据极可能让咱们后面的数据分析模型有很大的误差。那么若是咱们没有专业知识,如何筛选出这些异常特征样本呢?经常使用的方法有两种。orm

    第一种是聚类,好比咱们能够用KMeans聚类将训练样本分红若干个簇,若是某一个簇里的样本数不多,并且簇质心和其余全部的簇都很远,那么这个簇里面的样本极有多是异常特征样本了。咱们能够将其从训练集过滤掉。数据分析

    第二种是异常点检测方法,主要是使用iForest或者one class SVM,使用异常点检测的机器学习算法来过滤全部的异常点。pandas

    固然,某些筛选出来的异常样本是否真的是不须要的异常特征样本,最好找懂业务的再确认一下,防止咱们将正常的样本过滤掉了。

3、处理不平衡数据

    这个问题其实不算特征预处理的部分,不过其实它的实质仍是训练集中各个类别的样本的特征分布不一致的问题,因此这里咱们一块儿讲。

    咱们作分类算法训练时,若是训练集里的各个类别的样本数量不是大约相同的比例,就须要处理样本不平衡问题。也许你会说,不处理会怎么样呢?若是不处理,那么拟合出来的模型对于训练集中少样本的类别泛化能力会不好。举个例子,咱们是一个二分类问题,若是训练集里A类别样本占90%,B类别样本占10%。 而测试集里A类别样本占50%, B类别样本占50%, 若是不考虑类别不平衡问题,训练出来的模型对于类别B的预测准确率会很低,甚至低于50%。

    如何解决这个问题呢?通常是两种方法:权重法或者采样法。

    权重法是比较简单的方法,咱们能够对训练集里的每一个类别加一个权重class weight。若是该类别的样本数多,那么它的权重就低,反之则权重就高。若是更细致点,咱们还能够对每一个样本加权重sample weight,思路和类别权重也是同样,即样本数多的类别样本权重低,反之样本权重高。sklearn中,绝大多数分类算法都有class weight和 sample weight可使用。

    若是权重法作了之后发现预测效果还很差,能够考虑采样法。

    采样法经常使用的也有两种思路,一种是对类别样本数多的样本作子采样, 好比训练集里A类别样本占90%,B类别样本占10%。那么咱们能够对A类的样本子采样,直到子采样获得的A类样本数和B类别现有样本一致为止,这样咱们就只用子采样获得的A类样本数和B类现有样本一块儿作训练集拟合模型。第二种思路是对类别样本数少的样本作过采样, 仍是上面的例子,咱们对B类别的样本作过采样,直到过采样获得的B类别样本数加上B类别原来样本一块儿和A类样本数一致,最后再去拟合模型。

    上述两种经常使用的采样法很简单,可是都有个问题,就是采样后改变了训练集的分布,可能致使泛化能力差。因此有的算法就经过其余方法来避免这个问题,好比SMOTE算法经过人工合成的方法来生成少类别的样本。方法也很简单,对于某一个缺乏样本的类别,它会随机找出几个该类别的样本,再找出最靠近这些样本的若干个该类别样本,组成一个候选合成集合,而后在这个集合中不停的选择距离较近的两个样本,在这两个样本之间,好比中点,构造一个新的该类别样本。举个例子,好比该类别的候选合成集合有两个样本\((x_1,y),(x_2,y)\),那么SMOTE采样后,能够获得一个新的训练样本\((\frac{x_1+x_2}{2},y)\),经过这种方法,咱们能够获得不改变训练集分布的新样本,让训练集中各个类别的样本数趋于平衡。咱们能够用imbalance-learn这个Python库中的SMOTEENN类来作SMOTE采样。

4、结语

    特征工程系列终于写完了,这个系列的知识比较零散,更偏向工程方法,因此不像算法那么紧凑,写的也不是很好,但愿你们批评指正。若是有其余好的特征工程方法须要补充的,欢迎留言评论。

 

(欢迎转载,转载请注明出处。欢迎沟通交流: 微信:nickchen121)

相关文章
相关标签/搜索