Bootstrap用python参与Kaggle的有些经验总括

末尾的回顾和展望

这篇著作是参与kaggle之后的首先次总结,描述了下kaggle的步调,通用的知识点和技巧。希望在将来一个月尾,能把xgboost和stacking研商选取下,然后再来update。希望我们有怎样想法都能跟自家交换下~~

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

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 3: Feature Engineering

理论上来说,特征工程应该也归属于上一步,可是它太首要了,所以将它独立拿出去。kaggle社区对特色工程的最重要已经达到了共识,可以说最后结果的三六九等,大部分就是由特色工程决定的,剩下部分应该是调参Ensemble操纵。特征工程的三六九等重假如由domain
knowledge
控制的,可是多数人想必并不抱有这种文化,那么只好尽量多的遵照原来feature生成新的feature,然后让模型采纳中间紧要的feature。这里就又涉嫌到feature
selection
,
有很多艺术,比如backward,forward selection等等。我个人倾向于用random
forest的feature
importance
这里有舆论介绍了这种措施。

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)

在这步成功以后,要对以下几点有大致精通

  • 了解每个特征的意思
  • 要明了怎样特点是行得通的,这些特点哪些是直接能够用的,哪些需要经过变换才能用,为之后的表征工程做准备

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,也得以处理项目特征系列过多的问题,实测效果不错。

如今抽出时间,用python在kaggle上试了多少个project,有点体会,记录下。

Step 6: Two Little Tips

最后是本人的两点心得吗

  • 安装random seed,使得你的模子reproduce,以Random Foreset举例:
    seed=0
    clf=RandomForestClassifier(random_state=seed)
  • 各种project协会好文件层次和布局,既方便与其旁人互换,也有利于温馨。比如在一个project下,分设3个文件夹,一个是input,放训练多少、测试数据,一个model,放模型文件,最终一个submission文件,放你转移要提交的结果文件。
    实际的可以参考这里

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

相关文章