Kaggle 比賽項目總結(項目流程)


 一、EDA(Exploratory Data Analysis)

  • EDA:也就是探索性的分析數據

  • 目的
  1. 理解每個特征的意義;
  2. 知道哪些特征是有用的,這些特征哪些是直接可以用的,哪些需要經過變換才能用,為之后的特征工程做准備;

 

  • 1)每個特征的意義、特征的類型:

    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')
  1. 如果變量是categorical的,想看distribution,則可以:
    df.PdDistrict.value_counts().plot(kind='bar', figsize=(8,10))

     

  • 4)看一些 特征之間的聯立情況,用 pandas 的  groupby:

    temp = pd.crosstab([df.Pclass, df.Sex], df.Survived.astype(bool))
    temp.plot(kind='bar', stacked=True, color=['red','blue'], grid=False)

 

 

二、Data Preprocessing(數據預處理)

  • 目的:將數據處理下,為模型輸入做准備

 1)處理  missing  value(缺失值)

  • 查看數據集中,所有的特征數據有沒有缺失;
  1. 如果 missing value 占總體的比例非常小,那么直接填入平均值或者眾數;
  2. 如果 missing value 所占比例不算小也不算大,那么可以考慮它跟其他特征的關系,如果關系明顯,那么直接根據其他特征填入;也可以建立簡單的模型,比如線性回歸,隨機森林等。
  3. 如果 missing value 所占比例大,那么直接將 miss value 當做一種特殊的情況,另取一個值填入處理;

 

 2)處理 Outlier (異常值)

  • 這個就是 EDA 的作用,通過畫圖,找出異常值

 

 3)categorical feature (類別特征)

  • Categorical 特征常被稱為離散特征、分類特征,數據類型通常是 object 類型

  • 機器學習模型通常只能處理數值數據,所以需要對 Categorical 數據轉換成 Numeric 特征

 

  • categorical  feature 有兩種分類:

  1. Ordinal 類型:這種類型的Categorical存在着自然的順序結構,如果你對Ordinal 類型數據進行排序的話,可以是增序或者降序,比如在學習成績這個特征中具體的值可能有:A、B、C、D四個等級,但是根據成績的優異成績進行排序的話有A>B>C>D
  2. Nominal 類型:這種是常規的Categorical類型,不能對Nominal類型數據進行排序。比如血型特征可能的值有:A、B、O、AB,但你不能得出A>B>O>AB的結論。

 

  • 對於Ordinal 和 Nominal 類型數據有不同的方法將它們轉換成數字:

  • Ordinal 類型數據:使用 LabelEncoder 進行編碼處理;
  1. 例如成績的A、B、C、D四個等級進行 LabelEncoder 處理后會映射成1、2、3、4,這樣數據間的自然大小關系也會保留下來。
  • Nominal 類型數據:使用 OneHotEncoder 進行編碼處理;
  1. Pandas 的 get_dummies() 方法,對應每一個虛擬變量,都返回一包含一個新的一列的 DataFrame;
  2. Use the concat() method to add these dummy columns back to the original DataFrame
  3. Then drop the original columns entirely using the drop method

 

 4)處理 categorical feature

  • 一般就是通過dummy variable的方式解決,也叫one hot encode:
  1. pandas.get_dummies()
  2. sklearn 中 preprocessing.OneHotEncoder()

 

  • 將一列的 month 數據展開為了12列,用0、1代表類別

  • 另外在處理 categorical feature 有兩點值得注意:

 

  1. 如果特征中包含大量需要做 dummy variable(虛擬變量)處理的,那么很可能導致得到一個稀疏的dataframe,這時候最好用下PCA做降維處理。
  2. 如果某個特征有好幾萬個取值,那么用 dummy variable 就並不現實了,這時候可以用Count-Based Learning.

 

 

  • 對於類別特征,在模型中加入tf-idf 有好的效果;
  • “Leave-one-out” encoding:可以處理類別特征種類過多的問題;

 

 

 

三、Feature Engineering(特征工程)

  • 理論上來說,“特征工程” 屬於數據預測。
  • 特征工程非常重要,可以說最后結果的好壞,大部分就是由特征工程決定的,剩下部分應該是調參Ensemble(集成學習) 決定。
  • 特征工程的好壞主要是由 domain knowledge 決定的,但是大部分人可能並不具備這種知識,那么只能盡可能多的根據原來 feature 生成新的 feature ,然后讓模型選擇其中重要的feature。這里就又涉及到 feature selection(特征選擇);
  • feature selection 的方法:backward、forward selection 等有很多。我個人傾向於用 random forestfeature importance這里有論文介紹了這種方法。

 

 

四、Model Selection and Training

 1)Model Selection(模型選擇)

 

  • 最常用的模型是 Ensemble Model(集成學習),比如 Random Forest、Gradient Boosting
  • Kaggle 上的項目,開始可以用點簡單的模型,一方面是可以作為底線 threshold,另一方面也可以在最后作為Ensemble Model。xgboost

 

 2)Model Training(模型訓練)

 

  • 訓練模型主要就是調參,每種模型都有自己最關鍵的幾個參數,在 sklearn 中

  1. GridSearchCV (網格搜索)設置需要比較的幾種參數組合;

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

 

 

五、Model Ensemble(模型集成)

  • Model Ensemble  的方法:PastingBagging、Boosting(增強學習)、Stacking(堆疊);其中 BaggingBoosting 都算是 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:訓練一個模型來組合其他各個模型。

 

  1. 首先先訓練多個不同的模型;
  2. 然后再以之前訓練的各個模型的輸出為輸入來訓練一個模型,以得到一個最終的輸出。
  • 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

     

     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM