1. 前言
“数据决定了机器学习的上限,而算法只是尽可能逼近这个上限”,这里的数据指的就是经过特征工程得到的数据。特征工程指的是把原始数据转变为模型的训练数据的过程,它的目的就是获取更好的训练数据特征,使得机器学习模型逼近这个上限。特征工程能使得模型的性能得到提升,有时甚至在简单的模型上也能取得不错的效果。特征工程在机器学习中占有非常重要的作用,主要包括数据与特征预处理、特征选择和数据的降维三部分。接下去会通过3篇文章对这三方面进行介绍。今天首先讲讲数据与特征的预处理。
2. 数据与特征预处理
数据与特征预处理也成为特征提取,主要是从会结构化的数据中金链的提取出有用的特征,数据与特征的预处理包括:
- 数据选择、清洗、采样
- 特征预选择,去掉类似ID的相关度为0的特征。
- 数据清洗,填充缺失值、去掉异常值(离群点、脏数据),缺省值极多的字段考虑不用。
- 采样:针对正负样本不平衡的情况,可以通过上下采样,和改变权重来处理。
- 数据格式化,比如文本处理的时候,去掉文本不相关的,符号和标点,处理大小写,字体编码问题。
- 特征的扩充,例如,可以加入天气温度等特征,有时序性的问题,可以shift联系前后几天,增加时序特征,还有特征重新组合,特征的拆分,one-hot编码。
- 不同类型数据的特征处理
- 数值型:幅度调整/归一化、log等变化、统计值(例如max、min、mean、std)、离散化、分桶等
- 类别型:one-hot编码,复杂的多字段合并成精简的少字段等
- 时间型:提取出连续值的持续时间和间隔时间;提取出离散值的“年”、“月”、“日”、“一年中哪个星期/季度”、“一周中的星期几”、“工作日/周末”等信息
- 文本型:使用TF-IDF特征
- 统计型:加减平均、分位线、次序、比例
- 对数据进行预处理,可提高数据质量,提高挖掘质量。对数据进行清洗可填充缺失值、光滑噪声数据,识别和删除离群点数据,保证数据的一致性;
- 使用正确的采样方法可解决因数据不平衡带来的预测偏差;
- 对不同的数据类型进行不同的特征处理有助于提高特征的可用性,例如对数值型数据进行归一化可将数据转化到统一量纲下;对类别型数据,可用one-hot编码方法将类别数据数字化,数字化特征之后可更用来计算距离、相似性等;可从时间型数据当中提取中更多的时间特征,例如年、月和日等,这些特征对于业务场景以及模型的预测往往有很大的帮助。统计型特征处理有助于从业务场景中挖掘更丰富的信息。
3. 处理不平衡数据
之前的处理不平衡数据已经进行了详细的介绍,本文在简单的描述下。
处理不平衡数据一般是两种方法:权重法或者采样法
权重法:是比较简单的方法,我们可以对训练集里的每个类别加一个权重class weight。如果该类别的样本数多,那么它的权重就低,反之则权重就高。如果更细致点,我们还可以对每个样本加权重sample weight,思路和类别权重也是一样,即样本数多的类别样本权重低,反之样本权重高。sklearn中,绝大多数分类算法都有class weight和 sample weight可以使用。
采样法常用的也有两种思路,
- 第一种是对类别样本数多的样本做子采样, 比如训练集里A类别样本占90%,B类别样本占10%。那么我们可以对A类的样本子采样,直到子采样得到的A类样本数和B类别现有样本一致为止,这样我们就只用子采样得到的A类样本数和B类现有样本一起做训练集拟合模型。
- 第二种思路是对类别样本数少的样本做过采样, 还是上面的例子,我们对B类别的样本做过采样,直到过采样得到的B类别样本数加上B类别原来样本一起和A类样本数一致,最后再去拟合模型。
4. 异常值清洗
- 是基于统计学的方法来处理异常数据,这种方法一般会构建一个概率分布模型,并计算对象符合该模型的概率,把具有低概率的对象视为异常点。Q1=25%,Q3=75%,IQ=Q3-Q
1,Q1-1.5IQ,Q1-3IQ,Q3+1.5IQ,Q3+3IQ算成离群点 - 是基于聚类的方法来做异常点检测。这个很好理解,由于大部分聚类算法是基于数据特征的分布来做的,通常如果我们聚类后发现某些聚类簇的数据样本量比其他簇少很多,而且这个簇里数据的特征均值分布之类的值和其他簇也差异很大,这些簇里的样本点大部分时候都是异常点。比如我之前讲到的BIRCH聚类算法原理和DBSCAN密度聚类算法都可以在聚类的同时做异常点的检测。
- 是基于专门的异常点检测算法来做。这类算法的代表是One Class SVM和Isolation Forest.
5. 数据预处理
5.1 无量纲化
5.1.1 标准化
标准化需要计算特征的均值和标准差
5.1.2 区间缩放法
区间缩放法的思路有多种,常见的一种为利用两个最值进行缩放
5.1.3 标准化与归一化的区别
标准化:是依照特征矩阵的列处理数据,其通过求z-score的方法,将样本的特征值转换到同一量纲下。
归一化:是依照特征矩阵的行处理数据,其目的在于样本向量在点乘运算或其他核函数计算相似性时,拥有统一的标准,也就是说都转化为“单位向量”。
5.2 对定量特征二值化
定量特征二值化的核心在于设定一个阈值,大于阈值的赋值为1,小于等于阈值的赋值为0。
5.3 对定性特征哑编码
OneHotEncoder,假设有N种定性值,则将这一个特征扩展为N种特征,当原始特征值为第i种定性值时,第i个扩展特征赋值为1,其他扩展特征赋值为0。哑编码的方式相比直接指定的方式,不用增加调参的工作,对于线性模型来说,使用哑编码后的特征可达到非线性的效果。
5.4 缺失值计算
使用preproccessing库的Imputer类对数据进行缺失值计算
- 缺失值比例超过50%直接丢弃
- 如果是连续值,那么一般有两种选择,一是选择所有有该特征值的样本,然后取平均值,来填充缺失值,另一种是取中位数来填充缺失值
- 如果是离散值,则一般会选择所有有该特征值的样本中最频繁出现的类别值,来填充缺失值。
5.5 数据变换
常见的数据变换有基于多项式的、基于指数函数的、基于对数函数的
6. 特征工程的Roadmap
7. 总结
简单的说,特征工程是能够将数据像艺术一样展现的技术。因为好的特征工程很好的混合了专业领域知识、直觉和基本的数学能力。但是最有效的数据呈现其实并不涉及任何的数据运算。
本质上来说,呈现给算法的数据应该能拥有基本数据的相关结构或属性。当你做特征工程时,其实是将数据属性转换为数据特征的过程,属性代表了数据的所有维度,在数据建模时,如果对原始数据的所有属性进行学习,并不能很好的找到数据的潜在趋势,而通过特征工程对你的数据进行预处理的话,你的算法模型能够减少受到噪声的干扰,这样能够更好的找出趋势。事实上,好的特征甚至能够帮你实现使用简单的模型达到很好的效果。
(欢迎转载,转载请注明出处。欢迎沟通交流: [email protected])
原文地址:https://www.cnblogs.com/huangyc/p/9961058.html