都是片泛的featuer处理措施,记录下

日前抽出时间,用python在kaggle上试试了几乎独project,有点体会,记录下。

经验

作者: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和视频

特点工程视频详解

Step1: Exploratory Data Analysis

EDA,也就是是对数码举行批判性的辨析,一般就用到pandas和matplotlib就够用了。EDA一般包括:

  1. 每个feature的意义,feature的档次,相比较实惠之代码如下
    df.describe()
    df[‘Category’].unique()
  2. 扣押是否在missing value
    df.loc[df.Dates.isnull(),’Dates’]
  3. 每个特征下之数据分布,可以据此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))
  4. 若果想看几乎独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)

于当时步成功后,要对以下几点有大体通晓

  • 喻每个特征的意义
  • 假定解什么特点是可行的,这一个特色哪些是直可以据此的,哪些需要通过变换才能够为此,为未来的性状工程做准备

kaggle竞技各样源码

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

http://blog.csdn.net/han\_xiaoyang/article/details/52665396

Step2: Data Preprocessing

数据预处理,就是将数据处理下,为模型输入做准备,其中囊括:

  • 处理missing
    value:这里学问有硌特别,要是各位有好之经验得以同自家沟通下。以自身浅薄的阅历来说我一般会分情状处理

    1. 假设missing value占总体的百分比很小,那么间接填入平均值或者众数
    2. 如若missing
      value所占比例不到底多少也不到底很,那么得考虑它同任何特色的干,假诺提到明确,那么直接冲外特色填入;也可以建立简单的模子,比如线性回归,随机森林等。
    3. 若missing value所占比重相当,那么直接用miss
      value当做一栽奇特之情事,另取一个价值填入
  • 处理Outlier:这么些就是事先EDA的意图了,通过打图,找有老值
  • 拍卖categorical feature:一般就是通过dummy
    variable的主意化解,也叫one hot
    encode,可以因此pandas.get_dummies()或者
    sklearn中preprocessing.OneHotEncoder(),
    我个人倾向被用pandas的get_dummies()
    圈个例吧,
dummy variable



将一列的month数据展开为了12列,用0、1代表类别。  
另外在处理categorical feature有两点值得注意:

1.  如果特征中包含大量需要做dummy
    variable处理的,那么很可能导致得到一个**稀疏**的dataframe,这时候最好用下**PCA**做降维处理。
2.  如果某个特征有好几万个取值,那么用dummy
    variable就并不现实了,这时候可以用[**Count-Based
    Learning**](https://link.jianshu.com?t=https://msdn.microsoft.com/en-us/library/azure/dn913056.aspx).
  1. (更新)近日于kaggle成功之案例中发觉,对于项目特征,在模型中入tf-idf总是有意义的。
  2. 尚发出只办法为“Leave-one-out”
    encoding,也得处理项目特征连串过多的题目,实测效果不错。

进入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 为专业继续开拓进取。

Step 3: Feature Engineering

答辩及来说,特征工程应吗归入于上一致步,可是它太重大了,所以将她独自将出来。kaggle社区对特色工程的基本点都达成了共识,可以说最终结果的上下,大部分就是由于特色工程支配的,剩下有该是调参Ensemble控制。特征工程的高低借使由于domain
knowledge
控制的,可是大部分人口或连无备这种知识,那么只可以尽量多之基于本feature生成新的feature,然后于范拔取之中最首要之feature。那里就是同时涉及到feature
selection
,
生不少方,比如backward,forward selection等等。我个人倾向于用random
forest的feature
importance
这里来舆论介绍了这种措施。

Kaggle 首战拿银总结 | 指引 (长文、干货)(分享自微博网)https://zhuanlan.zhihu.com/p/26645088?iam=cb63279559dabb602297bfcbd1f38a50&utm\_source=com.miui.notes&utm\_medium=social

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]))

机械上系列(3)_逻辑回归下之Kaggle泰坦Nick之灾 – 寒小阳 – CSDN博客 –

http://blog.csdn.net/han\_xiaoyang/article/details/49797143?utm\_source=com.jianshu.haruki&utm\_medium=social

回想中AndrewNg先生似乎以coursera上说罢,应用机器上,千万不要同上来尽管准备就完美,先撸一个baseline的model出来,再举办延续之辨析步骤,一步步增高,所谓继承手续可能包括『分析model现在的状态(欠/过拟合),分析大家应用的feature的企图大小,进行feature
selection,以及大家模型下之bad case和生的由』等等。

Kaggle上之大神们,也享受过局部experience,说几长我回想的哈:

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

『数据遭到之非凡点/离群点的辨析与处理极其重要了!』

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

『要举办模型融合(model ensemble)啊什么什么

得基本音讯

data_train.info()

.describe()

泰坦Nick号的呢发出少失值

设若缺值的样书占总额比例最高,大家也许就是直接抛弃了,作为特色插足吧,可能反倒带入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)很首要!』

图片 1

当那里自己介绍一下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

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

如何学kaggle

Step 6: Two Little Tips

末段是我之有限沾胸得吧

  • 安random seed,使得你的范reproduce,以Random Foreset举例:
    seed=0
    clf=RandomForestClassifier(random_state=seed)
  • 每个project社团好文件层次与布局,既好与其旁人交换,也方便温馨。比如以一个project下,分设3独文件夹,一个凡input,放训练多少、测试数据,一个model,放模型文件,最终一个submission文件,放你变要交的结果文件。
    切实的可参照这里

a2 Mia姐 – Kaggle入门,看就等同篇就丰富了(分享自网易网)https://zhuanlan.zhihu.com/p/25686876?iam=cb63279559dabb602297bfcbd1f38a50&utm\_source=com.miui.notes&utm\_medium=social

终极之记忆和展望

随即篇著作是到kaggle之后的率先次等总计,描述了产kaggle的步骤,通用的知识点和技术。希望于将来一个月份被,能管xgboost和stacking研讨下下,然后还来update。希望我们有啊想法还是可以跟自己互换下~~

update:
更新了关于项目特征的处理模式以及Boosting和Bagging的意,还有stacking的情节。

Human Learning – Kaggle 入门指南(分享自新浪网)https://zhuanlan.zhihu.com/p/25742261?iam=cb63279559dabb602297bfcbd1f38a50&utm\_source=com.miui.notes&utm\_medium=social