记一次失败的kaggle比赛(3):失败在什么地方,贪心筛选特征、交叉验证、blending

本文作者分享了一次kaggle比赛的经验,指出过度拟合问题普遍存在,强调选择正确方法的重要性。文中提到了从public到private排名大幅波动的现象,提出开始时建立简单模型作为基准,谨慎使用复杂模型,信任交叉验证但要注意fold间的差异,处理噪声和零值,以及在特征筛选和模型融合策略上的思考。并给出了部分关键代码示例。
摘要由CSDN通过智能技术生成


今天这个比赛结束了,结果可以看:https://www.kaggle.com/c/santander-customer-satisfaction/leaderboard

public结果:



private结果:





首先对比private和public的结果,可以发现:

1)几乎所有的人都overfitting了;或者说private的另一半测试数据比public的那一半测试数据更不规律。

2)private的前十名有5个是在public中排不进前几百,有四个甚至排在1000名到2000名之间;说明使用一个正确的方法比一味地追求public上的排名更重要!!!

3)我自己从public的第2323名调到private的1063名,提高了1260个名次;作为第一次参加这种比赛的人,作为一个被各种作业困扰的人,能在有5236个队伍中、5831个选手中取得这样的成绩,个人还比较满意,毕竟经验不足,做了很多冤枉工作。

4)说回最关键的,什么叫做“一个正确的方法”???这也是我想探讨的失败之处:

1、选择正确的模型:因为对数据不了解,所以直接尝试了以下模型:

models=[
    RandomForestClassifier(n_estimators=1999, criterion='gini', n_jobs=-1, random_state=SEED),
    RandomForestClassifier(n_estimators=1999, criterion='entropy', n_jobs=-1, random_state=SEED),
    ExtraTreesClassifier(n_estimators=1999, criterion='gini', n_jobs=-1, random_state=SEED),
    ExtraTreesClassifier(n_estimators=1999, criterion='entropy', n_jobs=-1, random_state=SEED),
    GradientBoostingClassifier(learning_rate=0.1, n_estimators=101, subsample=0.6, max_depth=8, random_state=SEED)
]
实际上,我这里想说的是,这些模型的速度都非常慢!最开始,我觉得方便就一直没有配置xgBoost,这种选择实际上浪费了非常多的时间;后来使用了xgBoost,才得到了最终的这个结果。所以说,不了解数据时,选择一个速度快的、泛化能力强的模型很重要,xgBoost是首选。

2、上来不经过任何思考就开始使用各种复杂的模型,甚至连一个baseline都没有:对,我就是这样,因为第一次,确实缺乏经验;因为复杂的模型容易过拟合,所以你越比陷得越深;而且复杂模型一般花费时间比较多,真是浪费青春;这一点我是在快要没时间的时候才意识到的;另外,我的最终结果确实是通过一个非常简单的模型得到的。所以说,开始时先鲁一个简单的模型,以此为参照构建之后的模型。什么是简单的模型:原始数据集(或者稍微做了一点处理的数据集,比如去常数列、补缺失值、归一化等)、logistic regression或者简单的svm、xgBoost。

3、相信交叉验证的结果:不要只将数据集划分成两份,因为交叉验证时你会发现有些fold效果非常好,AUC可以到0.85左右,而有些fold则非常差,0.82都不到。

4、关于noise的问题:一直没找到好的处理办法,所以最终效果不是很好也正常。

5、关于一堆零的处理办法:归一化特征,这个非常有必要!否则你之后的特征工程都会发现效果很差,因为0+k=k、0*k=0、0^2=0;具体怎么归一化,我就不多说了,点到为止。

6、另外还有一些小细节,比如筛选特征时,因为你的最终模型是GBDT,那你筛选特征时就使用GBDT,否则你使用LR筛选的有效特征可能对GBDT模型来说并不是有效的;还有很多很多,真的是在实践中才能意识到,比如特征处理是在train+test上还是单独在train上这些问题,理论上只应该在train上,因为我们认为test数据集是不知道的,但是对于这种比赛,你知道了test,那还是用上的好。。。。不多说了,大家还是多实践好;科研再忙,一学期玩一个比赛还是有时间的。。。。。。。。

7、说了这么多没用的,给大家上一点代码,主要包括贪心筛选特征、交叉验证、blending三部分关键点,但是整个代码是完整的:

#!usr/bin/env python
#-*- coding:utf-8 -*-

import pandas as pd
import numpy as np

from sklearn import preprocessing, cross_validation, metrics
from sklearn.ensemble import RandomForestClassifier, ExtraTreesClassifier, GradientBoostingClassifier
from sklearn.cross_validation import StratifiedKFold
from sklearn.linear_model import LogisticRegression
from sklearn.externals import joblib





SEED=1126
nFold=5





def SaveFile(submitID, testSubmit, fileName="submit.csv"):
    content="ID,TARGET";
    for i in range(submitID.shape[0]):
        content+="\n"+str(submitID[i])+","+str(testSu
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值