本节主要介绍数据和特征处理。
https://github.com/liuleigit/ML_tutorial
一 特征处理
(1)数值型
1. 特征缩放
包括标准化和归一化,参看 http://blog.csdn.net/leiting_imecas/article/details/54986045
2. log等变化
特征可能不能通过线性的方式缩放。例如特征符合指数分布,此时可以使用log变化可以将指数域变化到对数域
3.统计值max, min, mean, std
4.离散化(discretization)—–最常见
把连续的值分段,变成离散的值。例如数值在0-100,0-30表示为向量000,30-80表示为001,80-100表示为100.
<1>.有时离散型变量更容易理解; 离散化后方便给不同数值段提供不同的权重
<2>.离散化有不同的方式,常见的有等距切分、等频切分
5.hash分桶
6.每个类别下对应的变量统计值histogram(分布状况)
7. 有时做相反的操作:数值型->类别型
(2)类别型 category
有三种颜色红、蓝、绿
1. one-hot encoding(dummy variabel, 哑变量)
红[0,0,1], 蓝[0,1,0], 绿[1,0,0]
2. hash
NLP中常用。例如对于[体育,娱乐,财经]三个维度,’he likes football、basketball and singing’就可以被映射为[2, 1,0]
3. Histogram映射
(3)时间型
工业上作用非常重要。 时间型即可以看做连续型,也可以看做是离散型
1.连续型
a) 持续时间(单页浏览时常)
b) 间隔时间(上次购买/点击离现在的时间)
2. 离散型
a) 一天中的那个时间段
b)一周中星期几
c)一年中的哪个星期
d)一年哪个季度
e)工作日、周末
(3) 文本型
1. bag of words
可以看下 sklearn.feature_extraction.text CountVectorizer
2. n-gram(n元组)
sklearn.feature_extraction.text CountVectorizer传参ngram_range
3. tf-idf
参考http://blog.csdn.net/leiting_imecas/article/details/52127815
4. word2vec
onehot是稀疏的; word2vec是dense的
gensim中既有word2vec也有doc2vec
(4) 统计型特征
1. 加减平均:商品价格高于平均价格多少;用户在某个商品类下消费超过平均用户多少;用户连续登录天数…
2. 分位数: 商品属于售出商品价格的多少分位线处
3. 次序型: 排在第几位
4. 比例类:电商中,好/中/差评比例; 你超过全国多少的电脑
(5)组合特征
1. 简单拼接
举例a) user_id&&category: 10001&&女裙, 10002&&男士牛仔。 直接使用userid会使特征矩阵十分稀疏,所以经常先对user做聚类,再组合
2. 模型特征组合
GBDT + LR
二 特征选择
1)需要对特征进行选择的原因:
1. 冗余: 部分特征的相关度太高了,消耗计算资源
2. 噪声: 部分特征对预测结果有负影响
2)特征选择 VS 降维
1.前者只踢掉原本特征里和结果预测关系不大的;后者(SVD或者PCA等)做特征的计算组合构成新特征
2.SVD 或者 PCA确实能解决一定的高纬度问题
3)选择方式
1.过滤型——–工业中偏Linear的模型可以使用,非linear的模型不常用
a)评估单个特征和结果之间的相关程度,排序留下top的特征
b)相关度可以使用Pearson相关系数、互信息、距离相关度
c)缺点:没有考虑特征之间的关联作用,可能把有用的关联信息误剔除。例如特征1和特征2单独作用小但组合起来作用大
d) python包:SelectKBest, SelectPercentile, GenericUnivariateSelect
>>> from sklearn.datasets import load_iris >>> from sklearn.feature_selection import SelectKBest >>> from sklearn.feature_selection import chi2 >>> iris = load_iris() >>> X, y=iris.data, iris.target >>> X.shape (150, 4) >>> X_new = SelectKBest(chi2, k=2).fit_transform(X, y) >>> X_new.shape (150, 2)
2.包裹型
a)把特征选择看做一个特征子集搜索问题,筛选各种特征子集,用模型评估效果; 实验性的删除相关性低的特征
b)典型的包裹型算法为”递归特征删除算法” recursive feature elimination algorithm
举例,LR算法计算出各个特征的权重,删除5%权重低的特征,重新训练模型;如果删除后准确率或某个评估值依然达到要求,可以
对新模型再删除5%特征,依次进行,知道评估值低于要求
sklearn.feature_selection.RFE (recursive feature elimination)
3. 嵌入式———纬度超级大时常用。例如5亿纬度-》几千万纬度
a)根据模型来分析特征的重要性
b)最常用的方式是正则化方式做特征选择
c)举例,最早的电商用LR做CTR预估,在3-5亿维的系数特征上用L1正则化的LR模型,生育2-3千万的feature, 意味着其他的feature重要度不高
>>> from sklearn.svm import LinearSVC #一般倾向于使用在线性模型 >>> from sklearn.datasets import load_iris >>> from sklearn.feature_selection import SelectFromModel #借助模型选择 >>> iris = load_iris() >>> X,y=iris.data, iris.target >>> X.shape (150, 4) >>> lsvc = LinearSVC(C=0.01, penalty="l1", dual=False).fit(X,y) >>> model = SelectFromModel(lsvc, prefit=True) >>> X_new=model.transform(X) >>> X_new.shape (150, 3)
原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/9348.html