收集链接&经验

经验

作者:Alex Hsu

链接:https://www.zhihu.com/question/24533374/answer/34649594

来源:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

kaggle winner = feature engineering + ensemble + good machine + domain knowledge。

同意@Naiyan Wang的观点,大部分kaggle比赛和machine learning关系不大。大部分比赛还是很brute force的方法,个人看法能拿到10%并不是很困难,都是一些常见的featuer处理方法(Hash, BOW, TFIDF, Categorization, Normalization),加几个常见模型(RF, GBDT, LR)cross-validation调参数,最后ensemble一下。最好有很好的机器(主要是ram,以及tree-based model并行),这样就不用太担心online training的问题,大部分的lib也能用了。

不过如果想拿top10还是有一定难度,大部分冠军得主其实都有相关领域从业经验,有一些domain knowledge,对问题的思考也会更本质一点。

总体而言,我觉得参加kaggle还是很不错的体验,有一些帮助,特别是比赛结束后大家解法的分享和探讨可以学到一些东西(贴一个地址Kaggle Competition Past Solutions。)但honestly,我觉得kaggle更适合机器学习入门者,对这个领域有兴趣的同学们来产生兴趣,锻炼实际能力,感受一下实际的数据集(虽然仍然有些不一样),对从业者或者researcher们而言帮助不是很大。

天池历届答辩PPT和视频

特征工程视频详解

kaggle比赛各种源码

http://suanfazu.com/t/kaggle/230

http://blog.csdn.net/han_xiaoyang/article/details/52665396

进入5%

https://dnc1994.com/2016/04/rank-10-percent-in-first-kaggle-competition/

有人总结 Kaggle 比赛是 “Feature 为主,调参和 Ensemble 为辅”,

Feature Selection 最实用的方法也就是看 Random Forest 训练完以后得到的 Feature Importance 了。

看 Feature Importance 对于某些数据经过脱敏处理的比赛尤其重要。这可以免得你浪费大把时间在琢磨一个不重要的变量的意义上。

这里要重点讲一下 Xgboost 的调参。通常认为对它性能影响较大的参数有:

eta:每次迭代完成后更新权重时的步长。越小训练越慢。

num_round:总共迭代的次数。

subsample:训练每棵树时用来训练的数据占全部的比例。用于防止 Overfitting。

colsample_bytree:训练每棵树时用来训练的特征的比例,类似 RandomForestClassifier 的 max_features。

max_depth:每棵树的最大深度限制。与 Random Forest 不同,Gradient Boosting 如果不对深度加以限制,最终是会 Overfit 的。

early_stopping_rounds:用于控制在 Out Of Sample 的验证集上连续多少个迭代的分数都没有提高后就提前终止训练。用于防止 Overfitting。

一般的调参步骤是:

将训练数据的一部分划出来作为验证集。

先将 eta 设得比较高(比如 0.1),num_round 设为 300 ~ 500。

用 Grid Search 对其他参数进行搜索

逐步将 eta 降低,找到最佳值。

以验证集为 watchlist,用找到的最佳参数组合重新在训练集上训练。注意观察算法的输出,看每次迭代后在验证集上分数的变化情况,从而得到最佳的 early_stopping_rounds。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

X_dtrain, X_deval, y_dtrain, y_deval = cross_validation.train_test_split(X_train, y_train, random_state=1026, test_size=0.3)

dtrain = xgb.DMatrix(X_dtrain, y_dtrain)

deval = xgb.DMatrix(X_deval, y_deval)

watchlist = [(deval, 'eval')]

params = {

    'booster': 'gbtree',

    'objective': 'reg:linear',

    'subsample': 0.8,

    'colsample_bytree': 0.85,

    'eta': 0.05,

    'max_depth': 7,

    'seed': 2016,

    'silent': 0,

    'eval_metric': 'rmse'

}

clf = xgb.train(params, dtrain, 500, watchlist, early_stopping_rounds=50)

pred = clf.predict(xgb.DMatrix(df_test))

最后要提一点,所有具有随机性的 Model 一般都会有一个 seed 或是 random_state 参数用于控制随机种子。得到一个好的 Model 后,在记录参数时务必也记录下这个值,从而能够在之后重现 Model。

在数据的分布比较随机均衡的情况下,5-Fold CV 一般就足够了。

由于被很多前辈教导过要相信自己的 CV,我的决定是将 5-Fold 提到 10-Fold,然后以 CV 为标准继续前进。

Kaggle 首战拿银总结 | 指导 (长文、干货)(分享自知乎网)https://zhuanlan.zhihu.com/p/26645088?iam=cb63279559dabb602297bfcbd1f38a50&utm_source=com.miui.notes&utm_medium=social

机器学习系列(3)_逻辑回归应用之Kaggle泰坦尼克之灾 - 寒小阳 - CSDN博客 -

http://blog.csdn.net/han_xiaoyang/article/details/49797143?utm_source=com.jianshu.haruki&utm_medium=social

印象中Andrew Ng老师似乎在coursera上说过,应用机器学习,千万不要一上来就试图做到完美,先撸一个baseline的model出来,再进行后续的分析步骤,一步步提高,所谓后续步骤可能包括『分析model现在的状态(欠/过拟合),分析我们使用的feature的作用大小,进行feature selection,以及我们模型下的bad case和产生的原因』等等。

Kaggle上的大神们,也分享过一些experience,说几条我记得的哈:

『对数据的认识太重要了!』

『数据中的特殊点/离群点的分析和处理太重要了!』

『特征工程(feature engineering)太重要了!在很多Kaggle的场景下,甚至比model本身还要重要』

『要做模型融合(model ensemble)啊啊啊

获得基本信息

data_train.info()

.describe()

泰坦尼克号的也有缺失值

如果缺值的样本占总数比例极高,我们可能就直接舍弃了,作为特征加入的话,可能反倒带入noise,影响最后的结果了

如果缺值的样本适中,而该属性非连续值特征属性(比如说类目属性),那就把NaN作为一个新类别,加到类别特征中

如果缺值的样本适中,而该属性为连续值特征属性,有时候我们会考虑给定一个step(比如这里的age,我们可以考虑每隔2/3岁为一个步长),然后把它离散化,之后把NaN作为一个type加到属性类目中。

有些情况下,缺失的值个数并不是特别多,那我们也可以试着根据已有的值,拟合一下数据,补充上。

我们通常会先对类目型的特征因子化,我们使用pandas的”get_dummies”来完成这个工作,并拼接在原来的”data_train”之上,

将对收敛速度造成几万点伤害值!甚至不收敛! (╬▔皿▔)…所以我们先用scikit-learn里面的preprocessing模块对这俩货做一个scaling,所谓scaling,其实就是将一些变化幅度较大的特征化到[-1,1]之内。

看过Andrew Ng老师的machine Learning课程的同学们,知道,我们应该分析分析模型现在的状态了,是过/欠拟合?,以确定我们需要更多的特征还是更多数据,或者其他操作。我们有一条很著名的learning curves对吧。

不过在现在的场景下,先不着急做这个事情,我们这个baseline系统还有些粗糙,先再挖掘挖掘。

重点又来了:

『要做交叉验证(cross validation)!』

『要做交叉验证(cross validation)!』

『要做交叉验证(cross validation)!』

强迫症患者』打算继续喊喊口号…

『模型融合(model ensemble)很重要!』

『模型融合(model ensemble)很重要!』

『模型融合(model ensemble)很重要!』

图片发自简书App

在这里我介绍一下plot方法的函数的使用。

Series.plot方法的函数:

参数说明

label用于图例的标签

ax要在其上进行绘制的matplotlib subplot对象。如果没有设置,则使用当前matplotlib subplot

style将要传给matplotlib的风格字符串(for example: ‘ko–’)

alpha图表的填充不透明(0-1)

kind可以是’line’, ‘bar’, ‘barh’, ‘kde’

logy在Y轴上使用对数标尺

use_index将对象的索引用作刻度标签

rot旋转刻度标签(0-360)

xticks用作X轴刻度的值

yticks用作Y轴刻度的值

xlimX轴的界限

ylimY轴的界限

grid显示轴网格线

在这里强调一下 kind参数——'line', 'bar', 'barh', 'kde':

直方图:是一种可以对值频率离散化显示的柱状图。通过调用Series.hist()方法即可创建。

密度图:与直方图相关的一种类型图,是通过计算“可能会产生观测数据的连续概率分布的估计”而产生的,通过给plot传入参数kind = 'kde' 即可。

散布图:是观测两个一维数据序列之间关系的有效手段,使用pd.scatter_matrix()即可建立。

部分代码:

[python] view plain copy

import matplotlib.pyplot as plt  

fig = plt.figure()  

fig.set(alpha=0.2)  # 设定图表颜色alpha参数  

plt.subplot2grid((2,3),(0,0))             # 在一张大图里分列几个小图,位置是(0,0)  

data_train.Survived.value_counts().plot(kind='bar')# plots a bar graph of those who surived vs those who did not.   

plt.title(u"获救情况 (1为获救)") # puts a title on our graph  

plt.ylabel(u"人数")    

plt.subplot2grid((2,3),(0,1))             # 在一张大图(2 * 3)中的位置是(0,1)   

data_train.Pclass.value_counts().plot(kind="bar")  

plt.ylabel(u"人数")  

plt.title(u"乘客等级分布")  

plt.subplot2grid((2,3),(0,2))             # 在一张大图(2 * 3)中的位置是(0, 2)  

plt.scatter(data_train.Survived, data_train.Age)# 找出存活人数和年龄的散点图  

plt.ylabel(u"年龄")                        # sets the y axis lable  

plt.grid(b=True, which='major', axis='y') # formats the grid line style of our graphs  

plt.title(u"按年龄看获救分布 (1为获救)")  

plt.subplot2grid((2,3),(1,0), colspan=2)  # colspan = 2 表示横向跨度是 2  

# plots a kernel desity estimate(核密度估计) of the subset of the 1st class passanges's age  

data_train.Age[data_train.Pclass ==1].plot(kind='kde')     

data_train.Age[data_train.Pclass ==2].plot(kind='kde')  

data_train.Age[data_train.Pclass ==3].plot(kind='kde')  

plt.xlabel(u"年龄")# plots an axis lable  

plt.ylabel(u"密度")   

plt.title(u"各等级的乘客年龄分布")  

plt.legend((u'头等舱', u'2等舱',u'3等舱'),loc='best') # sets our legend for our graph. 显示图示  

plt.subplot2grid((2,3),(1,2))  

data_train.Embarked.value_counts().plot(kind='bar')  

plt.title(u"各登船口岸上船人数")  

plt.ylabel(u"人数")    

plt.show()  

https://www.kaggle.com/sudalairajkumar/simple-exploration-notebook-zillow-prize/notebook

如何学kaggle

a2 Mia姐 - Kaggle入门,看这一篇就够了(分享自知乎网)https://zhuanlan.zhihu.com/p/25686876?iam=cb63279559dabb602297bfcbd1f38a50&utm_source=com.miui.notes&utm_medium=social

Human Learning - Kaggle 入门指南(分享自知乎网)https://zhuanlan.zhihu.com/p/25742261?iam=cb63279559dabb602297bfcbd1f38a50&utm_source=com.miui.notes&utm_medium=social

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: SurveyJS是一款功能强大的在线调查工具,具有简单易用的界面和丰富多样的调查问卷设计功能。我在使用SurveyJS进行调查时,有一些经验分享。 首先,我发现SurveyJS的用户界面非常直观和易于操作。在创建调查问卷时,我可以轻松地添加问题、设置选项和规则。它还提供了许多预定义的题型和模板,使我能够快速构建出符合需求的问卷。对于没有太多调查设计经验的人来说,这是一个很大的优势。 其次,SurveyJS提供了多种发布和分享问卷的方式。我可以选择将问卷直接嵌入到网页中,或者生成一个链接分享给其他人。此外,SurveyJS还支持将问卷导出为PDF、Word或Excel格式,方便了我对问卷结果的整理和分析。 另外,SurveyJS还有一些高级功能,比如逻辑跳转和题目随机化。逻辑跳转功能可以根据参与者之前的回答,自动跳转到后续相关的问题,使问卷更具个性化。而题目随机化功能可以让每位参与者看到的问题的顺序都不一样,减少因顺序带来的偏差。这些功能对于设计复杂和精确的调查问卷非常有帮助。 总的来说,SurveyJS是一款非常强大和方便的调查工具。它的界面简单直观,功能丰富多样,适用于各种不同类型的调查研究。在我的使用中,SurveyJS帮助我轻松地创建、发布和分析调查问卷,提高了我的工作效率。 ### 回答2: SurveyJS是一个用于创建调查和问卷的开源JavaScript库。使用SurveyJS可以轻松地构建出现场调查、用户反馈、市场调研、投票等应用。我在使用SurveyJS时有以下经验分享。 首先,SurveyJS提供了丰富的题型和选项,使得创建调查问卷变得非常灵活和便捷。它支持单选题、多选题、滑块题等多种题型,还可以根据需要添加逻辑跳转和条件显示,增强了问卷的交互性和个性化。 其次,SurveyJS提供了可定制的主题和样式,可以根据自己的需求进行风格设计,使得问卷在外观上更加符合品牌形象或个人喜好。 另外,SurveyJS支持实时数据收集和分析,可以实时监控问卷的填写情况,统计结果并生成报告。这为用户提供了快速直观的数据分析和决策支持。 此外,SurveyJS还提供了多种导出格式,可以将问卷结果导出为文本、Excel、PDF等格式,方便用户进一步处理和使用。 最后,SurveyJS的文档和社区非常丰富。官方提供了详细的文档和示例,用户可以根据需要查看和学习,解决问题。而社区中有许多讨论和分享,用户可以与其他开发者交流经验,寻求帮助。 总的来说,使用SurveyJS可以快速、灵活地创建各种类型的调查问卷,提供了丰富的题型和选项、定制化和数据分析功能,同时还有完善的文档和社区支持。我在使用SurveyJS时获得了很好的体验,推荐给需要创建调查问卷的开发者。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值