特征工程
-
特征工程
-
数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。那特征工程到底是什么呢?顾名思义,其本质是一项工程活动,目的是最大限度地从原始数据中提取特征以供算法和模型使用。
- 作用:筛选、处理选择一些合适的特征
- 特征抽取
特征预处理
特征降维
-
数据集的组成:
- 特征值:事物的一些特征(特点)
- 目标值:最终要预测的结果
-
特征抽取
- 特征来源:在做数据分析的时候,特征的来源一般有两块,一块是业务已经整理好各种特征数据,我们需要去找出适合我们问题需要的特征;另一块是我们从业务特征中自己去寻找高级数据特征。
- 将任意数据(如文本或图像,类别特征)转换为可用于机器学习的数字特征
- sklearn.feature_extraction
-
字段数据特征抽取
- 目的:对特征当中有类别的信息做处理———>one-hot编码
- dictvectorizer:默认返回sparse矩阵,sparse=False
- DictVectorizer(sparse=False)
- [‘city=上海’, ‘city=北京’, ‘city=深圳’, ‘temperature’]
- [[ 0. 1. 0. 100.]
[ 1. 0. 0. 60.]
[ 0. 0. 1. 30.]]
-
文本特征抽取
- get_feature_names() 返回值:单词列表
- CountVectorizer(stop_words):
- 单词列表:将所有文章的单词统计到一个列表当中(重复的词只当做一次),默认会过滤掉单个字母
- 对于单个字母,对文章主题没有影响。单词可以有影响
- 对每篇文章在词的列表:[‘dislike’, ‘is’, ‘life’, ‘like’, ‘long’, ‘python’, ‘short’, ‘too’], 统计出现额次数
- 对于中文来讲:也不统计单个汉字,只能以符号隔开每个词语
- stop_words:停止词
- 这些词不能放映文章主题,词语性质比较中性
- 因为、所以等等
- 为了处理这种同一个词在很多篇文章当中出现的次数都比较多
- Tf-idf文本特征提取:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度
- tf * idf
- tf:词频(term frequency,tf)指的是某一个给定的词语在该文件中出现的频率
- idf 由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到
- 5/100=0.05 * lg(1千万/1万)= 3 = 0.15
- 对每篇文章的重要性排序,找到每篇前N个重要的词
使用独热编码
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.preprocessing import OneHotEncoder
X, y = make_classification(n_samples=10)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5)
gbc = GradientBoostingClassifier(n_estimators=2)
one_hot = OneHotEncoder()
gbc.fit(X_train, y_train)
X_train_new = one_hot.fit_transform(gbc.apply(X_train)[:, :, 0])
print (X_train_new.todense())
-
特征预处理:
-
通过特征提取,我们能得到未经处理的特征,这时的特征可能有以下问题:
-
不属于同一量纲:即特征的规格不一样,不能够放在一起比较。无量纲化可以解决这一问题。
-
信息冗余:对于某些定量特征,其包含的有效信息为区间划分,例如学习成绩,假若只关心“及格”或不“及格”,那么需要将定量的考分,转换成“1”和“0”表示及格和未及格。二值化可以解决这一问题。
-
定性特征不能直接使用:某些机器学习算法和模型只能接受定量特征的输入,那么需要将定性特征转换为定量特征。最简单的方式是为每一种定性值指定一个定量值,但是这种方式过于灵活,增加了调参的工作。通常使用哑编码的方式将定性特征转换为定量特征:假设有N种定性值,则将这一个特征扩展为N种特征,当原始特征值为第i种定性值时,第i个扩展特征赋值为1,其他扩展特征赋值为0。哑编码的方式相比直接指定的方式,不用增加调参的工作,对于线性模型来说,使用哑编码后的特征可达到非线性的效果。
-
存在缺失值:缺失值需要补充。
-
信息利用率低:不同的机器学习算法和模型对数据中信息的利用是不同的,之前提到在线性模型中,使用对定性特征哑编码可以达到非线性的效果。类似地,对定量变量多项式化,或者进行其他的转换,都能达到非线性的效果。
-
基本的处理-缺失值处理(pandas)
-
数值型数据:一些转换函数将特征数据转换成更加适合算法模型的特征数据过程
-
特征预处理:sklearn.preprocessing
-
原因:无量纲化: 特征的单位或者大小相差较大,或者某特征的方差相比其他的特征要大出几个数量级,容易影响(支配)目标结果,使得一些算法无法学习到其它的特征
-
无量纲化最终结果:使不同规格的数据转换到同一规格
-
归一化
- 标准化需要计算特征的均值和标准差,公式表达为:
- 通过对原始数据进行变换把数据映射到(默认为[0,1])之间
- sklearn.preprocessing.MinMaxScaler (feature_range=(0,1)… )
- 归一化容易受到异常数据影响,每个特征的最大值和最小值容易变化
-
标准化
- 平均值、标准差
- 对于归一化来说:如果出现异常点,影响了最大值和最小值,那么结果显然会发生改变
对于标准化来说:如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小。 - 作用:每列特征数据都聚集在均值0, 标准差为1范围
-
使用preproccessing库的Normalizer类对数据进行归一化的代码如下:
-
from sklearn.preprocessing import Normalizer
#归一化,返回值为归一化后的数据
Normalizer().fit_transform(iris.data)
-
特征降维
-当特征选择完成后,可以直接训练模型了,但是可能由于特征矩阵过大,导致计算量大,训练时间长的问题,因此降低特征矩阵维度也是必不可少的。常见的降维方法除了以上提到的基于L1惩罚项的模型以外,另外还有主成分分析法(PCA)和线性判别分析(LDA),线性判别分析本身也是一个分类模型。PCA和LDA有很多的相似点,其本质是要将原始的样本映射到维度更低的样本空间中,但是PCA和LDA的映射目标不一样:PCA是为了让映射后的样本具有最大的发散性;而LDA是为了让映射后的样本有最好的分类性能。所以说PCA是一种无监督的降维方法,而LDA是一种有监督的降维方法。
- 维度:特征的数量
- 降低特征数量, 得到一些不相关的特征
- 相关特征(correlated feature):湿度与降雨量
-
特征选择
- Filter(过滤式):主要探究特征本身特点、特征与特征和目标值之间关联
- 方差选择法:低方差特征过滤
- 方差很小:所有样本的某个特征值基本上一样
- 方差很大:所有样本的某个特征值的差异性比较大
- 不太好选择这个方差的值,作为明显一些特征处理
- 相关系数:皮尔逊相关系数(衡量两个特征之间的相关性)
- 系数的值:[-1, 1]
- |r|<0.4为低度相关;0.4≤|r|<0.7为显著性相关;0.7≤|r|<1为高度线性相关
- from scipy.stats import pearsonr
- 相关的特征必须做一些相应的处理(删掉其中一些,合成一个新的)
- 方差选择法:低方差特征过滤
- Filter(过滤式):主要探究特征本身特点、特征与特征和目标值之间关联
-
主成分分析(PCA)
- 高维数据转化为低维数据的过程,在此过程中可能会舍弃原有数据、创造新的变量(特征)
- 场景:
- 特征数量非常大的时候(上百个特征):PCA去压缩,相关的、冗余的信息,防止高维度特征的计算量大
- 创造新的变量(新的特征):revenue与指标total_expense压缩成一个特征
- ‘revenue’, 'total_expense’这两个指标合成到一个 新的指标(特征)
- 用户跟物品类别降维:
- 合并表,使得user_id与aisle在一张表当中 pd.merge
- 进行交叉表变换 pd.crosstab
- 进行降维 PCA
- 特征降维(选择、主成分分析):
- 1、删除一些无用特征
- **2、找到特征之间相关的(删除,合成)**ß
- 3、寻找特征与 目标值关系比较大
使用decomposition库的PCA类选择特征的代码如下:
from sklearn.decomposition import PCA
#主成分分析法,返回降维后的数据
#参数n_components为主成分数目
PCA(n_components=2).fit_transform(iris.data)
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
#线性判别分析法,返回降维后的数据
#参数n_components为降维后的维数
LDA(n_components=2).fit_transform(iris.data, iris.target)
使用sklearn进行数据挖掘
- 通过分析sklearn源码,我们可以看到除训练,预测和评估以外,处理其他工作的类都实现了3个方法:fit、transform和fit_transform。从命名中可以看到,fit_transform方法是先调用fit然后调用transform,我们只需要关注fit方法和transform方法即可。
- transform方法主要用来对特征进行转换。从可利用信息的角度来说,转换分为无信息转换和有信息转换。无信息转换是指不利用任何其他信息进行转换,比如指数、对数函数转换等。有信息转换从是否利用目标值向量又可分为无监督转换和有监督转换。无监督转换指只利用特征的统计信息的转换,统计信息包括均值、标准差、边界等等,比如标准化、PCA法降维等。有监督转换指既利用了特征信息又利用了目标值信息的转换,比如通过模型选择特征、LDA法降维等。
- 特征处理是特征工程的核心部分,sklearn提供了较为完整的特征处理方法,包括数据预处理,特征选择,降维等。首次接触到sklearn,通常会被其丰富且方便的算法模型库吸引,但是这里介绍的特征处理库也十分强大!