4 特征工程-特征预处理
Posted 爱编程
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了4 特征工程-特征预处理相关的知识,希望对你有一定的参考价值。
1 什么是特征预处理
1.1 特征预处理定义
scikit-learn的解释
provides several common utility functions and transformer classes to change raw feature vectors into a representation that is more suitable for the downstream estimators.
翻译过来:通过一些转换函数将特征数据转换成更加适合算法模型的特征数据过程
为什么我们要进行归一化/标准化?
- 特征的单位或者大小相差较大,或者某特征的方差相比其他的特征要大出几个数量级,容易影响(支配)目标结果,使得一些算法无法学习到其它的特征
1.2 包含内容(数值型数据的无量纲化)
- 归一化
- 标准化
1.3 特征预处理API
sklearn.preprocessing
2 归一化
2.1 定义
通过对原始数据进行变换把数据映射到(默认为[0,1])之间
2.2 公式
作用于每一列,max为一列的最大值,min为一列的最小值,那么X’’为最终结果,mx,mi分别为指定区间值默认mx为1,mi为0
那么怎么理解这个过程呢?我们通过一个例子
2.3 API
- sklearn.preprocessing.MinMaxScaler (feature_range=(0,1)… )
- MinMaxScalar.fit_transform(X)
- X:numpy array格式的数据[n_samples,n_features]
- 返回值:转换后的形状相同的array
- MinMaxScalar.fit_transform(X)
2.4 数据计算
- 分析
1、实例化MinMaxScalar
2、通过fit_transform转换
import pandas as pd from sklearn.preprocessing import MinMaxScaler def minmax_demo(): """ 归一化演示 :return: None """ data = pd.read_csv("dating.txt") print(data) # 1、实例化一个转换器类 transfer = MinMaxScaler(feature_range=(2, 3)) # 2、调用fit_transform data = transfer.fit_transform(data[[\'milage\',\'Liters\',\'Consumtime\']]) print("最小值最大值归一化处理的结果:\\n", data) return None
2.5 归一化总结
注意最大值最小值是变化的,另外,最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性较差,只适合传统精确小数据场景。
3 标准化
3.1 定义
通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内
3.2 公式
作用于每一列,mean为平均值,σ为标准差
所以回到刚才异常点的地方,我们再来看看标准化
- 对于归一化来说:如果出现异常点,影响了最大值和最小值,那么结果显然会发生改变
- 对于标准化来说:如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小。
3.3 API
- sklearn.preprocessing.StandardScaler( )
- 处理之后每列来说所有数据都聚集在均值0附近标准差差为1
- StandardScaler.fit_transform(X)
- X:numpy array格式的数据[n_samples,n_features]
- 返回值:转换后的形状相同的array
3.4 数据计算
同样对上面的数据进行处理
- 分析
1、实例化StandardScaler
2、通过fit_transform转换
import pandas as pd from sklearn.preprocessing import StandardScaler def stand_demo(): """ 标准化演示 :return: None """ data = pd.read_csv("dating.txt") print(data) # 1、实例化一个转换器类 transfer = StandardScaler() # 2、调用fit_transform data = transfer.fit_transform(data[[\'milage\',\'Liters\',\'Consumtime\']]) print("标准化的结果:\\n", data) print("每一列特征的平均值:\\n", transfer.mean_) print("每一列特征的方差:\\n", transfer.var_) return None
返回结果
milage Liters Consumtime target 0 40920 8.326976 0.953952 3 1 14488 7.153469 1.673904 2 2 26052 1.441871 0.805124 1 .. ... ... ... ... 997 26575 10.650102 0.866627 3 998 48111 9.134528 0.728045 3 999 43757 7.882601 1.332446 3 [1000 rows x 4 columns] 标准化的结果: [[ 0.33193158 0.41660188 0.24523407] [-0.87247784 0.13992897 1.69385734] [-0.34554872 -1.20667094 -0.05422437] ..., [-0.32171752 0.96431572 0.06952649] [ 0.65959911 0.60699509 -0.20931587] [ 0.46120328 0.31183342 1.00680598]] 每一列特征的平均值: [ 3.36354210e+04 6.55996083e+00 8.32072997e-01] 每一列特征的方差: [ 4.81628039e+08 1.79902874e+01 2.46999554e-01]
3.5 标准化总结
在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。
1. 特征工程之特征预处理
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])
以上是关于4 特征工程-特征预处理的主要内容,如果未能解决你的问题,请参考以下文章
DataScience:数据预处理/特征工程之构造特征—构造日期特征/基于时间序列数据特征的简介(模型提效技巧)代码实现之详细攻略