特征工程
一、特征处理
1. 正负样本不均衡问题
a) Oversampleing
b) 修改损失函数
c) 取n份正样本 与 负样本 分别构建分类器,然后vote
2. 数值特征处理
a) 归一化
b) Log变换
c) 统计max min mean std
d) 离散化
e) HASH分桶
f) 每个类别下对应的变量统计值histogram(分布状况)
3. 分类型特征处理
a) one-hot编码
b) 哑变量
c) Hash与聚类处理(根据先验的背景,分出一些桶,落在每个桶里面的频数不一样;根据用户的行为去做一些款型的聚类)把高维离散化的信息压成低维。
d) 统计每个类别变量 iv值
4. 时间型特征处理
连续值:单页浏览时长/上次购买离现在的时间
离散值:一天中哪个时间段,一周中星期几,一年中哪个季度
Day_of_week=lambda x: datetime.strptime(x, ‘%Y-%m-%d %H:%M:%S’ ).weekday()
Month=lambda x: datetime.strptime(x, ‘%Y-%m-%d %H:%M:%S’ ).month()
Week_number=lambda x:datetime.strptime(x, ‘%Y-%m-%d %H:%M:%S’ ).strftime(‘%v’)
Seasons=[0,0,1,1,2,2,2,3,3,30]
Season=lambda x: seasons[(datetime.strptime(x, ‘%Y-%m-%d %H:%M:%S’ ).month-1
5. 文本特征处理
词袋:文本数据分词后,去掉停用词,剩下的词组成list,在词库中的映射稀疏向量
From sklearn.feature_extraction.text import CountVectorizer
Vectorizer=Countvectorizer(min_df=1)
Corpus=[
‘This is the first document’
‘This is the second second document.’
‘And the third one.’]
X=vectorizer.fit_transform(corpus)
把词袋中的词扩充到n-gram:
使用TF-idf特征:是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时随着它在语料库中出现的频率成反比下降。
TF=(词t在当前文中的出现次数)/(t在全部文档中出现次数)
IDF=ln(总文档数/含t的文档数)
TF-IDF权重=TF(t)* IDF(t)
Word2vec:压缩成稠密矩阵,工具用google的word2vec或者python中gensim
6.特征处理之统计特征
天池比赛往往更加注重特征的处理,常常需要对一些变量做处理,比如加减平均(商品价格超过平均价格多少、用户在某个品类下消费超过平均用户多少),分位线,次序型(排在第几位),比例类(好/中/差评比例,你已经超过全国百分之。。。的同学)
8.特征处理之组合特征
简单组合特征:拼接型
GBDT产生特征组合路径
GBDT+FM/GBDT+LR
二、特征选择
过滤型:
比如LR这种线性模型,考虑变量与结果之间的相关性,排序留下TOP相关的特征部分,皮尔森相关系数,互信息,距离相关度,缺点是没有考虑特征之间的关联作用,可能把有用的关联特征误踢。一般不怎么用,因为大部分不是Liner模型。
From scipy.stats import personr
Print personr(x,y)
或者直接用sklearn中from sklearn.feature_selection import SelectKBest(选出其中K个,K可以指定);from sklearn.feature_selection import chi2
X_new=SelectKBest(chi2, k=2).fit_transform(x,y)
包裹型:
把特征选择看做一个特征子集的搜索问题,筛选各种特征子集,用模型评估效果。
典型的包裹型算法为“递归特征删除算法”
From sklearn.feature_selection import RFE
From sklearn.linear_model import LinearRegression
Lr=linearRegression()
Rfe=RFE(lr, n_feature_to_selection=1)
Rfe.fit(x,y)
Print sorted(zip(map(lambda x :round(x, 4), rfe.ranking_), names))
嵌入型:
最常见的方式是用正则化来做特征选择,L1正则化有截断性效应,有些参数前面系数为0(从而可以达到特征选择);而L2正则化有缩放效应,每个参数前面都有系数,只是整体的系数较小,参数压缩。
From sklearn.feature_selection import SelectFromModel
Lsvc=LinearSVC(C=0.01, penalty=’l1’, dual=False).fit(x, y)
Model=SelectFromModel(lsvc, prefit=True)
X_new=model.transform(x)
降维:
t-sne与PCA类似,但是效果不一样,一般如果维度过大,可以先用PCA降到一定维度后,再用t-sne,因为t-sne速度很慢。t-sne可以指定降低到的维度,sklearn中也已经有包。
http://blog.csdn.net/lzl1663515011/article/details/46328337