记一次失败的kaggle比赛(2):构造新特征、特征筛选


接第一篇:http://blog.csdn.net/mmc2015/article/details/51095446


第一篇中提到的主要问题:

第一:暴力搜索特征的方式在特征数较多的情况下不可取;较少的情况下能够考虑(<200)

第二:sklearn中的这几个模型,ExtraTreesClassifier效果最差。RandomForestClassifier效果较好且速度比較快,GradientBoostingClassifier结果最好但速度很慢(由于不能并行)

第三:当某一个模型(GradientBoostingClassifier)比其它模型效果好非常多时,不要使用blending的方法(尤其是特征空间一样,分类器类似的情况,比方这里的五个分类器都在同一组特征上建模,并且都是基于树的分类器),由于blending往往会使总体效果低于单独使用最好的一个模型

第四:对于AUC,实际上关心的是样本间的排名,而不是详细数值的大小。所以结果不是必需做归一化处理。关于这个结论。自行搜索资料理解



这篇解决第一个问题:特征选取。

常见的【特征筛选方法】包含:

1)第一篇中介绍的暴力搜索(事实上是一种【前向】贪心搜索,greedyADD),适合特征数较少的情况(<200)

2)还有一种暴力搜索(事实上是一种【后向】贪心搜索,greedyElimination),适合特征数较少的情况(<200)

代码与第一篇类似,只是能够使用sklearn中的工具:

selectorRFECV=feature_selection.RFECV(estimator=model, step=1, cv=5, scoring='roc_auc')
selectorRFECV.fit(trainX, trainY) #take me three days(24*2+12 hours) to fit the selector
joblib.dump(selectorRFECV, 'modelPersistence/selectorRFECV.pkl')
#selectorRFECV=joblib.load('modelPersistence/selectorRFECV.pkl') 
print selectorRFECV.n_features_ #144
print selectorRFECV.support_

3)依据树的featureImportance选择特征,适合特征数较多的情况

4)依据特征与label之间的皮尔曼相关系数(或其它指标)筛选特征

corr=stats.pearsonr(data[:,feaI]+data[:,feaJ], label)
print abs(corr[0])
if abs(corr[0])<eps:
	continue
else:
	feaPairCorr=(feaI, feaJ, corr[0])
	feaPairCorrList.append(feaPairCorr)

常见的【新特征】构造方法包含:

1)构造多项式特征(一般为二项式,最多三项式)。本质是特征间的乘法运算

2)构造线性组合特征。比方fea1+fea2、fea1-fea2等

3)构造其它特征,比方(fea1+fea2)*fea3等

4)先使用PCA、在使用上面的三种方法。该方法适合原始特征比較稀疏的情况,由于对于多数entry是0的情况,上面的三种方法基本不怎么起作用(想一想为什么???)。而有了PCA,就能把矩阵变稠密了

5)其它一些方法,比方NMF(Non-negative matrix factorization


这些方法的代码实现很easy,就不贴了,否则显得水平搓。。




posted @ 2017-08-15 16:04  jzdwajue  阅读(542)  评论(0编辑  收藏  举报