用python参加Kaggle的些许经验总结(收藏)
Step1: Exploratory Data Analysis
EDA,也就是对数据进行探索性的分析,一般就用到pandas和matplotlib就够了。EDA一般包括:
- 每个feature的意义,feature的类型,比较有用的代码如下
df.describe()
df['Category'].unique() - 看是否存在missing value
df.loc[df.Dates.isnull(),'Dates'] - 每个特征下的数据分布,可以用boxplot或者hist来看
%matplotlib inline
import matplotlib.pyplot as plt
df.boxplot(column='Fare', by = 'Pclass')
plt.hist(df['Fare'], bins = 10, range =(df['Fare'].min(),df['Fare'].max()))
plt.title('Fare >distribution')
plt.xlabel('Fare')
plt.ylabel('Count of Passengers')
#如果变量是categorical的,想看distribution,则可以:
df.PdDistrict.value_counts().plot(kind='bar', figsize=(8,10)) - 如果想看几个feature之间的联立情况,则可以用pandas的groupby,
temp = pd.crosstab([df.Pclass, df.Sex], df.Survived.astype(bool))
temp.plot(kind='bar', stacked=True, color=['red','blue'], grid=False)
在这步完成之后,要对以下几点有大致了解
- 理解每个特征的意义
- 要知道哪些特征是有用的,这些特征哪些是直接可以用的,哪些需要经过变换才能用,为之后的特征工程做准备
Step2: Data Preprocessing
数据预处理,就是将数据处理下,为模型输入做准备,其中包括:
- 处理missing value:这里学问有点深,如果各位有好的经验可以跟我交流下。以我浅薄的经验来说我一般会分情况处理
- 如果missing value占总体的比例非常小,那么直接填入平均值或者众数
- 如果missing value所占比例不算小也不算大,那么可以考虑它跟其他特征的关系,如果关系明显,那么直接根据其他特征填入;也可以建立简单的模型,比如线性回归,随机森林等。
- 如果missing value所占比例大,那么直接将miss value当做一种特殊的情况,另取一个值填入
- 处理Outlier:这个就是之前EDA的作用了,通过画图,找出异常值
处理categorical feature:一般就是通过dummy variable的方式解决,也叫one hot encode,可以通过pandas.get_dummies()或者 sklearn中preprocessing.OneHotEncoder(), 我个人倾向于用pandas的get_dummies()
将一列的month数据展开为了12列,用0、1代表类别。
另外在处理categorical feature有两点值得注意:
- 如果特征中包含大量需要做dummy variable处理的,那么很可能导致得到一个稀疏的dataframe,这时候最好用下PCA做降维处理。
- 如果某个特征有好几万个取值,那么用dummy variable就并不现实了,这时候可以用Count-Based Learning.
- (更新)近期在kaggle成功的案例中发现,对于类别特征,在模型中加入tf-idf总是有效果的。
- 还有个方法叫“Leave-one-out” encoding,也可以处理类别特征种类过多的问题,实测效果不错。
Step 3: Feature Engineering
理论上来说,特征工程应该也归属于上一步,但是它太重要了,所以将它单独拿出来。kaggle社区对特征工程的重要性已经达成了共识,可以说最后结果的好坏,大部分就是由特征工程决定的,剩下部分应该是调参和Ensemble决定。特征工程的好坏主要是由domain knowledge决定的,但是大部分人可能并不具备这种知识,那么只能尽可能多的根据原来feature生成新的feature,然后让模型选择其中重要的feature。这里就又涉及到feature selection,
有很多方法,比如backward,forward selection等等。我个人倾向于用random forest的feature importance,这里有论文介绍了这种方法。
Step 4: Model Selection and Training
- 最常用的模型是Ensemble Model,比如 Random Forest,Gradient Boosting。当然在开始的时候,可以用点简单的模型,一方面是可以作为底线threshold,另一方面也可以在最后作为Ensemble Model。
当然还有大名鼎鼎的xgboost,这个我也没有深入的研究,只是简单的用python调用了下,接下来如果有时间,要好好深入研究下。 - 选择完模型之后,就是要训练模型,主要就是调参,每种模型都有自己最关键的几个参数,sklearn中GridSearchCV可以设置需要比较的几种参数组合,然后用cross validation来选出最优秀的参数组合。大概用法为:
from sklearn.grid_search import GridSearchCV
from pprint import pprint
clf=RandomForestClassifier(random_state=seed)
parameters = {'n_estimators': [300, 500], 'max_features':[4,5,'auto']}
grid_search = GridSearchCV(estimator=clf,param_grid=parameters, cv=10, scoring='accuracy')
print("parameters:")
pprint(parameters)
grid_search.fit(train_x,train_y)
print("Best score: %0.3f" % grid_search.best_score_)
print("Best parameters set:")
best_parameters=grid_search.best_estimator_.get_params()
for param_name in sorted(parameters.keys()):
print("\t%s: %r" % (param_name, best_parameters[param_name]))
Step 5: Model Ensemble
Model Ensemble有Bagging,Boosting,Stacking,其中Bagging和Boosting都算是Bootstraping的应用。Bootstraping的概念是对样本每次有放回的抽样,抽样K个,一共抽N次。
- Bagging:每次从总体样本中随机抽取K个样本来训练模型,重复N次,得到N个模型,然后将各个模型结果合并,分类问题投票方式结合,回归则是取平均值,e.g.Random Forest。
- Boosting:一开始给每个样本取同样的权重,然后迭代训练,每次对训练失败的样本调高其权重。最后对多个模型用加权平均来结合,e.g. GBDT。
- Bagging与Boosting的比较:在深入理解Bagging和Boosting后发现,bagging其实是用相同的模型来训练随机抽样的数据,这样的结果是各个模型之间的bias差不多,variance也差不多,通过平均,使得variance降低(由算平均方差的公式可知),从而提高ensemble model的表现。而Boosting其实是一种贪心算法,不断降低bias。
- Stacking: 训练一个模型来组合其他各个模型。首先先训练多个不同的模型,然后再以之前训练的各个模型的输出为输入来训练一个模型,以得到一个最终的输出。使用过stacking之后,发现其实stacking很像神经网络,通过很多模型的输出,构建中间层,最后用逻辑回归讲中间层训练得到最后的结果。这里贴一个例子供参考。
def single_model_stacking(clf):
skf = list(StratifiedKFold(y, 10))
dataset_blend_train = np.zeros((Xtrain.shape[0],len(set(y.tolist()))))
# dataset_blend_test = np.zeros((Xtest.shape[0],len(set(y.tolist()))))
dataset_blend_test_list=[]
loglossList=[]
for i, (train, test) in enumerate(skf):
# dataset_blend_test_j = []
X_train = Xtrain[train]
y_train =dummy_y[train]
X_val = Xtrain[test]
y_val = dummy_y[test]
if clf=='NN_fit':
fold_pred,pred=NN_fit(X_train, y_train,X_val,y_val)
if clf=='xgb_fit':
fold_pred,pred=xgb_fit(X_train, y_train,X_val,y_val)
if clf=='lr_fit':
fold_pred,pred=lr_fit(X_train, y_train,X_val,y_val)
print('Fold %d, logloss:%f '%(i,log_loss(y_val,fold_pred)))
dataset_blend_train[test, :] = fold_pred
dataset_blend_test_list.append( pred )
loglossList.append(log_loss(y_val,fold_pred))
dataset_blend_test = np.mean(dataset_blend_test_list,axis=0)
print('average log loss is :',np.mean(log_loss(y_val,fold_pred)))
print ("Blending.")
clf = LogisticRegression(multi_class='multinomial',solver='lbfgs')
clf.fit(dataset_blend_train, np.argmax(dummy_y,axis=1))
pred = clf.predict_proba(dataset_blend_test)
return pred
Step 6: Two Little Tips
最后两点心得
- 设置random seed,使得你的模型reproduce,以Random Foreset举例:
seed=0
clf=RandomForestClassifier(random_state=seed) - 每个project组织好文件层次和布局,既方便与其他人交流,也方便自己。比如在一个project下,分设3个文件夹,一个是input,放训练数据、测试数据,一个model,放模型文件,最后一个submission文件,放你生成要提交的结果文件。
具体的可以参考这里
参考文献:
用python参加Kaggle的些许经验总结(收藏)的更多相关文章
- 用python参加Kaggle的经验总结【转】
用python参加Kaggle的经验总结 转载自:http://www.jianshu.com/p/32def2294ae6,作者 JxKing 最近挤出时间,用python在kaggle上试了 ...
- iOS安全些许经验和学习笔记
http://bbs.pediy.com/showthread.php?t=209014 标题: [原创]iOS安全些许经验和学习笔记作者: MonkeyKey时间: 2016-03-30,16:32 ...
- 如何使用Python在Kaggle竞赛中成为Top15
如何使用Python在Kaggle竞赛中成为Top15 Kaggle比赛是一个学习数据科学和投资时间的非常的方式,我自己通过Kaggle学习到了很多数据科学的概念和思想,在我学习编程之后的几个月就开始 ...
- twisted高并发库transport函数处理数据包的些许问题
还是在学校时间比较多, 能够把时间更多的花在学习上, 尽管工作对人的提升更大, 但是总是没什么时间学习, 而且工作的气氛总是很紧凑, 忙碌, 少了些许激情吧.适应就好了.延续着之前对twisted高并 ...
- 使用Graphlab参加Kaggle比赛(2017-08-20 发布于知乎)
之前用学生证在graphlab上申了一年的graphlab使用权(华盛顿大学机器学习课程需要)然后今天突然想到完全可以用这个东东来参加kaggle. 下午参考了一篇教程,把notebook上面的写好了 ...
- 多线程的些许理解(平台x86,具体考虑linux,windows)
多线程的些许理解 一.体系架构 1.原子操作 1) 定义 不可中断的一个或者一系列操作,也就是不会被线程调度机制打断的操作,在运行期间不会有任何的上下文切换(context switch). 2) 我 ...
- Android CodeReview 些许总结
CodeReview些许总结 1:使用Handler的时候,使用handler.post(Runnable);,hanler与类尽量保持弱引用关系,或者使用静态的handler对象 public Ha ...
- python+sklearn+kaggle机器学习
python+sklearn+kaggle机器学习 系列教程 0.kaggle 1. 初级线性回归模型机器学习过程 a. 提取数据 b.数据预处理 c.训练模型 d.根据数据预测 e.验证 今天是10 ...
- Kaggle竞赛顶尖选手经验汇总
What is your first plan of action when working on a new competition? 理解竞赛,数据,评价标准. 建立交叉验证集. 制定.更新计划. ...
随机推荐
- 使用 github Pages 服务建立个人独立博客全过程
你是否有这样子的需求,只是想简单的写写文章,记录下自己的学习心得.成长经历等,都是些文字内容,不需要配置使用数据库.不想购买服务器自己搭建站点,只是想安安静静的用比较舒服的方式来写篇文章. 静态博客就 ...
- 告知你不为人知的UDP-连接性和负载均衡
版权声明:本文由黄日成原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/812444001486438028 来源:腾云阁 h ...
- @components问题
场景:在引入组件的时候,希望解决"../components/page/member"这样的引入: 希望:像vue的项目中用@components/page/member引入组件 ...
- vue Element动态设置el-menu导航当前选中项
1,npm install vuex --save 2,在src下新建vuex文件夹,新建store.js文件: store.js import Vue from 'vue' import Vuex ...
- C语言程序设计--指针基础
指针 指针是一种特殊变量(存储内存地址).当然它本身也是占用内存的,所以会带来一个问题,那就是指针存在以下概念:指针的类型(int* 一个整型指针),指针指向的类型(int* p = 5, 说明指针p ...
- httpWebRequest获取流和WebClient的文件抓取
httpWebRequest获取流和WebClient的文件抓取 昨天写一个抓取,遇到了一个坑,就是在获取网络流的时候,人为的使用了stream.Length来获取流的长度,获取的时候会抛出错误,查了 ...
- MassTransit
http://stackoverflow.com/questions/15485317/newbie-is-a-consumer-queue-necessary-in-order-for-publis ...
- eclipse使用maven打包时去掉测试类
eclipse使用maven打包时去掉测试类 在pom.xml文件中增加如下配置: <plugin> <groupId>org.apache.maven.plugins< ...
- java常用数据格式转化,类似数据库group by cube rollup
java常用数据格式转化,类似数据库group by cube rollup单循环一条sql返回格式如:List<Map<String, List<Record>>> ...
- 3种方法教你PS快速去掉水印
方法一:使用选框工具 勾选水印部分: 按住Shift+f5选择内容识别: 然后 ctrl+d 取消选择,水印就去掉了 PS:其实这个方法有个快捷办法,直接使用选框工具选中之后,按Delete就可以弹出 ...