Kaggle竞赛优胜者源代码剖析(一)

来源:互联网 发布:淘宝自制食品怎么上架 编辑:程序博客网 时间:2024/04/30 00:44

比赛题目链接:https://www.kaggle.com/c/amazon-employee-access-challenge

优胜者Github:https://github.com/pyduan/amazonaccess

    该题目提供的数据集特征数较少,能拿到比赛的头名足以见得需要利用业务知识不断地进行变量转换创建新变量。作者用到的算法也是Kaggle中很常规的LR、GBDT、RandomForest和ExtraTrees,算法上没有特别新的地方,能拿到头名足以见得特征工程的重大贡献。让我们一起领略作者的特征工程技巧吧。
    共有ben.py、greedy.py、feature_extraction.py、utils.py、ml.py等脚本,最后得到结果需要运行classifier.py

ben.py


    该脚本构建了基础数据集bsfeats,只对原始数据集做了最基本的特征工程。1.对个别变量进行线性组合得到新变量  2.按变量对数据进行分组,计算不同观测在组中出现的次数并取对数 3.计算各部门的资源使用率 4.计算各经理的资源占有量。需要强调的是,这些特征工程都是紧紧围绕业务知识展开的。


greedy.py


     该脚本构建数据集greedy,greedy1,greedy2。分别将各列两两组合生成元组,对元组取哈希得到新的列,这个新的列可以代表之前组合的两列的交互作用,将原始数据集横向合并新生成的列得到了全是新特征的tuples数据集。同理,将各列三个一组进行组合用同样的方法得到全是组合再hash后全是新特征的triples数据集。最后将原始数据集、tuples数据集以及triple数据集横向拼在一起,即把新生成的特征放进去。由于不管是原始数据集还是新生成的tuples、triples数据集,很多都是类别型变量,对它们分别进行One-hot编码得到稀疏矩阵Xts。遍历Xts中的每一个特征,用自编的cv-loop函数分别计算auc得分,依照auc得分筛选出good_features。这里用的是前进法,比如第五个特征符合要求属于good_features,考查第六个特征时,把该特征与前五个特征一起放到函数中计算auc得分,相当于每放一个feature进来就计算一次auc,遍历完所有特征后对auc进行排序。需要注意的是,由于之前进行过one-hot编码,计算得分前要用scipy中的tocsr()将稀疏矩阵转化为压缩形式。


feature_extraction.py


    tuples和triples函数分别对数据集中的变量两两组合和三三组合得到新的变量,至此,数据集的六大框架(bsfeats,greedy,greedy2,greedy3,tuples,triples)都已构建好。create_feature()函数按照基础模型、LR模型、Trees模型(这里指的是GradientBoostingClassifier、RandomForestClassifer和ExtraTreesClassifier)分别构建含有不同特征的数据集。在构建的过程中使用了变量的取平方、取平均、取对数、除总算频率等特征工程方法。其中用于LR模型和Trees的数据集都进行了进一步的预处理过程,包括各特征相互乘除构造新特征(用于表征特征间的相互作用)、去除常数变量、变量标准化处理、变量值加上1取对数、变量取平方、变量取三次方、用One-Hot编码稀疏化处理等。另外,这些特征工程并不是都用上,而是有选择的使用,使用不同的特征工程方法,能得到不同的数据集。


utils.py


  辅助脚本,提供了两个辅助函数stringify()和compute_auc(),前者用正则表达式将模型和该模型用到的数据集的名称进行组合作为一个identifier,而后者是计算auc值的函数

ml.py


  提供了 模型训练的框架,包括AUCRegressor、MLR和StackedClassifier这三个类。其中StackedClassifier是主力,它将几个模型整合到一起以期达到最好的效果(用AUC来衡量),用来计算AUC的模型输出值有三中形式可供选择,mean_preds、stack_preds和fwls_preds,其中mean_preds是模型组合中所有模型输出结果的简单平均值,stack_preds和fwls_preds都是利用RidgeCV选择最佳的参数,fwls相较于stack增加了metafeatures。而find_params()函数利用GridSearchCV()筛选出最优的参数值,该函数的输出结果作为classifier.py中model.set_params(),从而保证能利用到最优参数值。函数fit_predict()用来训练每个模型并输出结果的平均值。
0 0