机器学习的特征工程

Posted 河南骏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了机器学习的特征工程相关的知识,希望对你有一定的参考价值。

机器学习流程:

收据收集----->数据清洗------->特征工程-------->数据建模

特征=>数据抽取出来的对结果预测有用的信息

特征工程师使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程。

特征工程的意味着更强的灵活度,不需复杂的模型,得到更好的结果。

现实中,复杂模型的算法精进都是数据科学家在做,大部分童靴是跑数据,清洗数据,分析业务,分析case,找特征,一招LR打天下。



数据采集:需要思考那些数据有用?

那些数据对最后的结果预测有帮助?

数据我们能够采集到吗?

线上实时计算的时候获取是否快捷?

数据格式化确定存储格式,大多数情况下,需要关联非常多的hive表和集群文件

数据清洗:去掉脏数据;花费很多时间,有助于对业务的理解;

思考角度:1、简单的impossible,离谱不可信的;

                  2、组合或统计属性判定

                  3、补齐可对应的缺失值(不可信的样本丢掉,缺省值极多的字段考虑不用)

数据采样:很多情况下,正负样本是不均衡的。

大多数模型对正负样本比是敏感的(比如LR),可以使用随机采样和分层抽样

正负样本不平衡处理办法:

正样本>>负样本,且量都挺大=>下采样

正样本>>负样本,量不大=>采集更多的数据;过采样;修改损失函数/loss function


特征处理:

数值型:幅度调整(preprocessing.MinMaxScaler())/归一化(preprocessing.scale()/StandardScaler());对数指数变化;统计值max,min,mean,std;离散化(连续值切段)(pd.cut());Hash分桶;每个类别下对应的变量统计值分布状况(pd.Series().describe());试试 数值型=>类别型

类别型:one-hot编码(preprocessing.OneHotEncoder()/pd.get_dummies());哑变量;Hash与聚类处理;统计每个类别变量下各个target比例,转成数值型

时间型:既可以看做连续值,也可以看做离散值。

连续值:持续时间;间隔时间

离散值:一天中哪个时间段;一周中星期几;一年中哪个星期;一年中哪个季度;工作日、周末

文本型:词袋:文本数据预处理后,去掉停用词,剩下的词组成list,在词库中的映射系数向量.(from sklearn.feature_extraction.text import CountVectorizer   

verctorizer=CountVectorizer(min_df=1)     

corpus=['This is the first document.','The third one',...] 

x=verctorizer.fit_transform(corpus)

词袋中的词扩充到n-gram:

biagram_verctorizer=CountVectorizer(ngram_range=(1,2),token_pattern=r'\\b\\w+\\b',min_df=1)

analyze=biagram_verctorizer.build_analyzer()

analyze('Bi-grams are cool !')==(['bi','grams','are','cool','bi grams','grams are','are cool'])

使用tf-idf特征

TF-IDF是一种统计方法,用以评估一字词对于一个文件集火一个语料库的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。

TF(t)=词t在当前文本中出现的次数/词t在全部文档中出现的次数

IDF(t)=ln(总文档数/含t的文档数)

TF-IDF权重=TF(t)*IDF(t)

词袋=>Word2vec(gensim)

统计特征:

加减平均:商品价格、品类消费、连续登陆天数超过平均多少;

分位线:商品属于售出商品价格的多少分位线处

次序型:排在第几位

比例类:好中差比例

组合特征:

简单组合特征:拼接型

模型特征组合:

用GBDT产出特征组合路径

组合特征和原始特征一起放进LR训练


特征选择:

原因:冗余--部分特征的相关度太高了,消耗计算性能

            噪声--部分特征是对结果有负影响

特征选择  VS 降维

前者只踢掉原本特征里和结果关系不大的,后者做特征的计算组合构成新特征

SVD或PCA确实也能解决一定的高维度问题

特征选择之过滤型

评估单个特征和结果值之间的相关程度,排序留下TOP相关的特征部分

pearson相关系数,互信息,距离相关度

缺点:没有考虑到特征之间的关联作用,可能把有用的关联特征误踢掉。

sklearn.feature_selection import SelectKSize,SelectPercentile,GenericUnivariateSelect

特征选择之包裹型

把特征选择看做一个特征子集搜索问题,筛选各种特征子集,用模型评估效果。

典型的包裹型算法为“递归特征删除算法”(RFE)

如果用LR,首先用全量特征跑一个模型,再根据线性模型的系数(体现相关性),删掉5-10%的弱特征,观察准确率/auc的变化,最后逐步进行,直至准确率/auc出现大的下滑停止。

特征选择之嵌入型

根据模型来分析特征的重要性(有别于上面的方式,是从生产的模型权重等)

最常见的方式为用正则化方式来做特征选择

举例,最早在电商用LR做CTR预估,在3-5亿维的系数特征上用L1正则化的LR模型。剩余2-3千万的feature,意味着其他的feature重要度不够。

from sklearn.svm import LinearSVC

from sklearn.feature_selection import SelectFromModel

lsvc=LinearSVC(C=0.01,penalty='l1',dual=False).fit(x,y)

model=SelectFromModel(lsvc,predit=True)

x_new=model.transform(x)

以上是关于机器学习的特征工程的主要内容,如果未能解决你的问题,请参考以下文章

机器学习实战基础(十七):sklearn中的数据预处理和特征工程特征选择 之 Embedded嵌入法

特征选择问题

AlgorithmStar机器学习AS机器学习库特征工程使用说明文档

机器学习特征筛选:相关系数法(correlation)

如何使用机器学习模型(或其特征系数)来解释该特征是不是与特定类别相关?

系统学习机器学习之特征工程--多重共线性