记一次失败的kaggle比赛(2):构造新特征、特征筛选
2016-04-08 13:08
465 查看
接第一篇:http://blog.csdn.net/mmc2015/article/details/51095446
第一篇中提到的主要问题:
第一:暴力搜索特征的方式在特征数较多的情况下不可取;较少的情况下可以考虑(<200)
第二:sklearn中的这几个模型,ExtraTreesClassifier效果最差,RandomForestClassifier效果较好且速度比较快,GradientBoostingClassifier结果最好但速度非常慢(因为不能并行)
第三:当某一个模型(GradientBoostingClassifier)比其他模型效果好很多时,不要使用blending的方法(尤其是特征空间一样,分类器类似的情况,比如这里的五个分类器都在同一组特征上建模,而且都是基于树的分类器),因为blending往往会使整体效果低于单独使用最好的一个模型
第四:对于AUC,实际上关心的是样本间的排名,而不是具体数值的大小,所以结果没必要做归一化处理;关于这个结论,自行搜索资料理解
这篇解决第一个问题:特征选取。
常见的【特征筛选方法】包括:
1)第一篇中介绍的暴力搜索(其实是一种【前向】贪心搜索,greedyADD),适合特征数较少的情况(<200)
2)另一种暴力搜索(其实是一种【后向】贪心搜索,greedyElimination),适合特征数较少的情况(<200)
代码与第一篇类似,不过可以使用sklearn中的工具:
3)根据树的featureImportance选择特征,适合特征数较多的情况
4)根据特征与label之间的皮尔曼相关系数(或其他指标)筛选特征
常见的【新特征】构造方法包括:
1)构造多项式特征(一般为二项式,最多三项式),本质是特征间的乘法运算
2)构造线性组合特征,比如fea1+fea2、fea1-fea2等
3)构造其他特征,比如(fea1+fea2)*fea3等
4)先使用PCA、在使用上面的三种方法,该方法适合原始特征比较稀疏的情况,因为对于多数entry是0的情况,上面的三种方法基本不怎么起作用(想一想为什么???),而有了PCA,就能把矩阵变稠密了
5)其他一些方法,比如NMF(Non-negative matrix factorization)
这些方法的代码实现非常简单,就不贴了,否则显得水平搓。。。
第一篇中提到的主要问题:
第一:暴力搜索特征的方式在特征数较多的情况下不可取;较少的情况下可以考虑(<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)
这些方法的代码实现非常简单,就不贴了,否则显得水平搓。。。
相关文章推荐
- 记一次失败的kaggle比赛(1):赛题简介与初次尝试
- python中使用超参数估计法结合特征筛选的方法提升决策树的预测性能
- 特征提升之特征筛选
- 记一次失败的kaggle比赛(3):失败在什么地方,贪心筛选特征、交叉验证、blending
- Kaggle入门(Titanic)
- POJ-1149-PIGS(最大流)
- ServletContext基础(还在更新中)
- 汉堡博客
- 关于Android避免按钮重复点击事件
- Activity区分平板和手机加载布局文件
- 队列
- Lambda 表达式的示例-来源(MSDN)
- WebSphere安装、系统部署、连接池
- Nginx/tengine里的那些timeout时间
- 常用SQL查询语句
- zabbix监控nginx连接状态(转)
- Hdoj-1563-Find your present!
- kafka创建topic报错:KeeperException$NoNodeException: KeeperErrorCode = NoNode for /brokers/ids
- java导出Excel通用方法
- Android数据库 SQLite数据库