模型融合 - 第二課

kaggle比賽中,單個(gè)模型或粮,基本上已經(jīng)不能取得好成績滩届,需要多個(gè)模型集合。本文是一個(gè)非潮惶洌基本和簡單的入門教程帜消,來介紹集成(組合)基礎(chǔ)學(xué)習(xí)模型的方法,特別是稱為堆疊的集成變體浓体。簡而言之泡挺,堆疊用作第一級(jí)(基礎(chǔ)),預(yù)測幾個(gè)基本分類器命浴,然后在第二級(jí)使用另一個(gè)模型來預(yù)測早期第一級(jí)預(yù)測的輸出娄猫。
示例數(shù)據(jù)集使用泰坦尼克數(shù)據(jù)集。此外生闲,盡管Stacking已經(jīng)成為許多團(tuán)隊(duì)贏得Kaggle比賽的原因媳溺,但似乎很少有資料介紹如何進(jìn)行Stacking。

# Load in our libraries
import pandas as pd
import numpy as np
import re
import sklearn
import xgboost as xgb
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline

import plotly.offline as py
py.init_notebook_mode(connected=True)
import plotly.graph_objs as go
import plotly.tools as tls

import warnings
warnings.filterwarnings('ignore')

# Going to use these 5 base models for the stacking
from sklearn.ensemble import (RandomForestClassifier, AdaBoostClassifier, 
                              GradientBoostingClassifier, ExtraTreesClassifier)
from sklearn.svm import SVC
from sklearn.cross_validation import KFold

特征工程碍讯,數(shù)據(jù)清洗

現(xiàn)在我們將繼續(xù)討論大多數(shù)內(nèi)核的結(jié)構(gòu)悬蔽,即首先探索現(xiàn)有數(shù)據(jù),識(shí)別可能的特征工程以及對(duì)任何分類特征進(jìn)行數(shù)字編碼捉兴。

# Load in the train and test datasets
train = pd.read_csv('../input/train.csv')
test = pd.read_csv('../input/test.csv')

# Store our passenger ID for easy access
PassengerId = test['PassengerId']
train.head(3)

關(guān)于如何探索數(shù)據(jù)蝎困,可以參考我們的第一課

full_data = [train, test]

# Some features of my own that I have added in
# Gives the length of the name
train['Name_length'] = train['Name'].apply(len)
test['Name_length'] = test['Name'].apply(len)
# Feature that tells whether a passenger had a cabin on the Titanic
train['Has_Cabin'] = train["Cabin"].apply(lambda x: 0 if type(x) == float else 1)
test['Has_Cabin'] = test["Cabin"].apply(lambda x: 0 if type(x) == float else 1)

# Feature engineering steps taken from Sina
# Create new feature FamilySize as a combination of SibSp and Parch
for dataset in full_data:
    dataset['FamilySize'] = dataset['SibSp'] + dataset['Parch'] + 1
# Create new feature IsAlone from FamilySize
for dataset in full_data:
    dataset['IsAlone'] = 0
    dataset.loc[dataset['FamilySize'] == 1, 'IsAlone'] = 1
# Remove all NULLS in the Embarked column
for dataset in full_data:
    dataset['Embarked'] = dataset['Embarked'].fillna('S')
# Remove all NULLS in the Fare column and create a new feature CategoricalFare
for dataset in full_data:
    dataset['Fare'] = dataset['Fare'].fillna(train['Fare'].median())
train['CategoricalFare'] = pd.qcut(train['Fare'], 4)
# Create a New feature CategoricalAge
for dataset in full_data:
    age_avg = dataset['Age'].mean()
    age_std = dataset['Age'].std()
    age_null_count = dataset['Age'].isnull().sum()
    age_null_random_list = np.random.randint(age_avg - age_std, age_avg + age_std, size=age_null_count)
    dataset['Age'][np.isnan(dataset['Age'])] = age_null_random_list
    dataset['Age'] = dataset['Age'].astype(int)
train['CategoricalAge'] = pd.cut(train['Age'], 5)
# Define function to extract titles from passenger names
def get_title(name):
    title_search = re.search(' ([A-Za-z]+)\.', name)
    # If the title exists, extract and return it.
    if title_search:
        return title_search.group(1)
    return ""
# Create a new feature Title, containing the titles of passenger names
for dataset in full_data:
    dataset['Title'] = dataset['Name'].apply(get_title)
# Group all non-common titles into one single grouping "Rare"
for dataset in full_data:
    dataset['Title'] = dataset['Title'].replace(['Lady', 'Countess','Capt', 'Col','Don', 'Dr', 'Major', 'Rev', 'Sir', 'Jonkheer', 'Dona'], 'Rare')

    dataset['Title'] = dataset['Title'].replace('Mlle', 'Miss')
    dataset['Title'] = dataset['Title'].replace('Ms', 'Miss')
    dataset['Title'] = dataset['Title'].replace('Mme', 'Mrs')

for dataset in full_data:
    # Mapping Sex
    dataset['Sex'] = dataset['Sex'].map( {'female': 0, 'male': 1} ).astype(int)
    
    # Mapping titles
    title_mapping = {"Mr": 1, "Miss": 2, "Mrs": 3, "Master": 4, "Rare": 5}
    dataset['Title'] = dataset['Title'].map(title_mapping)
    dataset['Title'] = dataset['Title'].fillna(0)
    
    # Mapping Embarked
    dataset['Embarked'] = dataset['Embarked'].map( {'S': 0, 'C': 1, 'Q': 2} ).astype(int)
    
    # Mapping Fare
    dataset.loc[ dataset['Fare'] <= 7.91, 'Fare']                               = 0
    dataset.loc[(dataset['Fare'] > 7.91) & (dataset['Fare'] <= 14.454), 'Fare'] = 1
    dataset.loc[(dataset['Fare'] > 14.454) & (dataset['Fare'] <= 31), 'Fare']   = 2
    dataset.loc[ dataset['Fare'] > 31, 'Fare']                                  = 3
    dataset['Fare'] = dataset['Fare'].astype(int)
    
    # Mapping Age
    dataset.loc[ dataset['Age'] <= 16, 'Age']                          = 0
    dataset.loc[(dataset['Age'] > 16) & (dataset['Age'] <= 32), 'Age'] = 1
    dataset.loc[(dataset['Age'] > 32) & (dataset['Age'] <= 48), 'Age'] = 2
    dataset.loc[(dataset['Age'] > 48) & (dataset['Age'] <= 64), 'Age'] = 3
    dataset.loc[ dataset['Age'] > 64, 'Age'] = 4 ;


# Feature selection
drop_elements = ['PassengerId', 'Name', 'Ticket', 'Cabin', 'SibSp']
train = train.drop(drop_elements, axis = 1)
train = train.drop(['CategoricalAge', 'CategoricalFare'], axis = 1)
test  = test.drop(drop_elements, axis = 1)

好了录语,現(xiàn)在已經(jīng)清理了部分功能并提取了相關(guān)信息,并刪除了分類列禾乘,都是數(shù)字澎埠,這種格式適合我們的機(jī)器學(xué)習(xí)模型。 然而始藕,在我們繼續(xù)之前蒲稳,讓我們生成一些簡單的變換數(shù)據(jù)集的相關(guān)和分布圖來觀察

可視化

** Pearson相關(guān)熱圖**

讓我們生成一些特征的相關(guān)圖,以查看一個(gè)特征與下一個(gè)特征的相關(guān)性伍派。 為此弟塞,我們將利用Seaborn繪圖軟件包,使我們能夠非常方便地繪制熱圖拙已,如下所示

colormap = plt.cm.RdBu
plt.figure(figsize=(14,12))
plt.title('Pearson Correlation of Features', y=1.05, size=15)
sns.heatmap(train.astype(float).corr(),linewidths=0.1,vmax=1.0, 
            square=True, cmap=colormap, linecolor='white', annot=True)
image.png

Pearson Correlation圖可以告訴我們的一件事是决记,沒有太多的特征彼此強(qiáng)烈相關(guān)。 從將這些特征提供到學(xué)習(xí)模型中的觀點(diǎn)來看倍踪,這是很好的系宫,因?yàn)檫@意味著我們的訓(xùn)練集中沒有太多冗余或多余的數(shù)據(jù),我們很高興每個(gè)特征都帶有一些獨(dú)特的信息建车。 這里有兩個(gè)最相關(guān)的特征是家庭大小和Parch(父母和孩子)扩借。 為了本練習(xí)的目的,我仍然會(huì)將這兩個(gè)功能都保留下來缤至。
最后讓我們生成一些配對(duì)圖來觀察從一個(gè)特征到另一個(gè)特征的數(shù)據(jù)分布潮罪。 我們再次使用Seaborn來幫助我們。

g = sns.pairplot(train[[u'Survived', u'Pclass', u'Sex', u'Age', u'Parch', u'Fare', u'Embarked',
       u'FamilySize', u'Title']], hue='Survived', palette = 'seismic',size=1.2,diag_kind = 'kde',diag_kws=dict(shade=True),plot_kws=dict(s=10) )
g.set(xticklabels=[])
image.png

Stacking模型

最后领斥,在關(guān)于特征工程和格式化后嫉到,我們終于開始本文的主旨。
創(chuàng)建堆疊合奏月洛!
在這里何恶,我們調(diào)用Python的類。 對(duì)于任何新的編程人員嚼黔,通常會(huì)聽到與面向?qū)ο缶幊蹋∣OP)結(jié)合使用的類细层。 簡而言之,類有助于擴(kuò)展一些代碼/程序來創(chuàng)建對(duì)象(舊學(xué)校窺視的變量)以及實(shí)現(xiàn)特定于該類的函數(shù)和方法唬涧。

在下面的代碼部分中疫赎,我們基本上編寫了一個(gè)類SklearnHelper,它允許擴(kuò)展所有Sklearn分類器共有的內(nèi)置方法(例如訓(xùn)練碎节,預(yù)測和擬合)捧搞。 因此,如果我們想要調(diào)用五個(gè)不同的分類器,這將消除冗余实牡,因?yàn)椴恍枰帉懴嗤姆椒ㄎ宕巍?/p>

Out-of-Fold Predictions

現(xiàn)在如上文在介紹部分中所提到的陌僵,堆疊使用基礎(chǔ)分類器的預(yù)測作為對(duì)第二級(jí)模型的訓(xùn)練的輸入轴合。 然而创坞,不能簡單地在完整訓(xùn)練數(shù)據(jù)上訓(xùn)練基礎(chǔ)模型,在完整測試集上生成預(yù)測受葛,然后將這些預(yù)測輸出到第二級(jí)訓(xùn)練题涨。 這會(huì)冒你的基礎(chǔ)模型預(yù)測已經(jīng)“看到”測試集并因此在提供這些預(yù)測時(shí)過度擬合的風(fēng)險(xiǎn)。

#生成我們的基礎(chǔ)一級(jí)模型

所以現(xiàn)在讓我們準(zhǔn)備五個(gè)學(xué)習(xí)模型作為我們的第一級(jí)分類总滩。 這些模型都可以通過Sklearn庫方便地調(diào)用纲堵,如下所示:

1.隨機(jī)森林分類器
2.額外的樹木分類器

  1. AdaBoost分類
  2. Gradient Boosting classifer
    5.支持向量機(jī)

862/5000
****參數(shù)

只是我們將在此列出的完整性參數(shù)的解釋,

** n_jobs **:用于培訓(xùn)過程的核心數(shù)闰渔。 如果設(shè)置為-1席函,則使用所有核心。
** n_estimators **:學(xué)習(xí)模型中的分類樹數(shù)量(默認(rèn)設(shè)置為10)
** max_depth **:樹的最大深度冈涧,或節(jié)點(diǎn)應(yīng)擴(kuò)展的程度茂附。 請注意,如果設(shè)置得太高督弓,則數(shù)字會(huì)冒著過度擬合的風(fēng)險(xiǎn)营曼,因?yàn)槿藗儠?huì)過長地生長樹
** verbose **:控制是否要在學(xué)習(xí)過程中輸出任何文本。 值0將抑制所有文本愚隧,而值3則在每次迭代時(shí)輸出樹學(xué)習(xí)過程蒂阱。
請通過Sklearn官方網(wǎng)站查看完整說明。 在那里你會(huì)發(fā)現(xiàn)你可以使用其他許多有用的參數(shù)狂塘。

# Put in our parameters for said classifiers
# Random Forest parameters
rf_params = {
    'n_jobs': -1,
    'n_estimators': 500,
     'warm_start': True, 
     #'max_features': 0.2,
    'max_depth': 6,
    'min_samples_leaf': 2,
    'max_features' : 'sqrt',
    'verbose': 0
}

# Extra Trees Parameters
et_params = {
    'n_jobs': -1,
    'n_estimators':500,
    #'max_features': 0.5,
    'max_depth': 8,
    'min_samples_leaf': 2,
    'verbose': 0
}

# AdaBoost parameters
ada_params = {
    'n_estimators': 500,
    'learning_rate' : 0.75
}

# Gradient Boosting parameters
gb_params = {
    'n_estimators': 500,
     #'max_features': 0.2,
    'max_depth': 5,
    'min_samples_leaf': 2,
    'verbose': 0
}

# Support Vector Classifier parameters 
svc_params = {
    'kernel' : 'linear',
    'C' : 0.025
    }

現(xiàn)在讓我們通過我們之前定義的Helper Sklearn類創(chuàng)建5個(gè)對(duì)象录煤,這些對(duì)象代表我們的5個(gè)學(xué)習(xí)模型。

# Create 5 objects that represent our 4 models
rf = SklearnHelper(clf=RandomForestClassifier, seed=SEED, params=rf_params)
et = SklearnHelper(clf=ExtraTreesClassifier, seed=SEED, params=et_params)
ada = SklearnHelper(clf=AdaBoostClassifier, seed=SEED, params=ada_params)
gb = SklearnHelper(clf=GradientBoostingClassifier, seed=SEED, params=gb_params)
svc = SklearnHelper(clf=SVC, seed=SEED, params=svc_params)

從我們的訓(xùn)練和測試數(shù)據(jù)集中創(chuàng)建NumPy陣列

在準(zhǔn)備好我們的第一層基礎(chǔ)模型之后荞胡,我們現(xiàn)在可以通過從原始數(shù)據(jù)幀生成NumPy數(shù)組辐赞,來準(zhǔn)備訓(xùn)練和測試測試數(shù)據(jù),以輸入到我們的分類器中硝训,如下所示

# Create Numpy arrays of train, test and target ( Survived) dataframes to feed into our models
y_train = train['Survived'].ravel()
train = train.drop(['Survived'], axis=1)
x_train = train.values # Creates an array of the train data
x_test = test.values # Creats an array of the test data

第一級(jí)預(yù)測的輸出**

我們現(xiàn)在將訓(xùn)練和測試數(shù)據(jù)提供給我們的5個(gè)基本分類器响委,并使用我們之前定義的Out-of-Fold預(yù)測函數(shù)來生成我們的第一級(jí)預(yù)測。 允許少數(shù)幾分鐘運(yùn)行下面的代碼塊窖梁。

# Create our OOF train and test predictions. These base results will be used as new features
et_oof_train, et_oof_test = get_oof(et, x_train, y_train, x_test) # Extra Trees
rf_oof_train, rf_oof_test = get_oof(rf,x_train, y_train, x_test) # Random Forest
ada_oof_train, ada_oof_test = get_oof(ada, x_train, y_train, x_test) # AdaBoost 
gb_oof_train, gb_oof_test = get_oof(gb,x_train, y_train, x_test) # Gradient Boost
svc_oof_train, svc_oof_test = get_oof(svc,x_train, y_train, x_test) # Support Vector Classifier

print("Training is complete")

不同分類器生成的特征重要性

現(xiàn)在我們已經(jīng)學(xué)習(xí)了第一級(jí)分類器赘风,我們可以利用Sklearn模型的一個(gè)非常漂亮的功能,即通過一行非常簡單的代碼輸出訓(xùn)練和測試集中各種功能的重要性纵刘。

根據(jù)Sklearn文檔邀窃,大多數(shù)分類器都內(nèi)置了一個(gè)屬性,只需鍵入**。feature_importances _ **即可返回要素重要性瞬捕。 因此鞍历,我們將通過我們的函數(shù)earliand調(diào)用這個(gè)非常有用的屬性來繪制特征重要性

rf_feature = rf.feature_importances(x_train,y_train)
et_feature = et.feature_importances(x_train, y_train)
ada_feature = ada.feature_importances(x_train, y_train)
gb_feature = gb.feature_importances(x_train,y_train)

這個(gè)結(jié)果包含輸入數(shù)據(jù)的重要性,先打包成一個(gè)數(shù)據(jù)結(jié)構(gòu)肪虎,下面我們通過Plotly包進(jìn)行簡單的繪圖劣砍。

cols = train.columns.values
# Create a dataframe with features
feature_dataframe = pd.DataFrame( {'features': cols,
     'Random Forest feature importances': rf_feature,
     'Extra Trees  feature importances': et_feature,
      'AdaBoost feature importances': ada_feature,
    'Gradient Boost feature importances': gb_feature
    })

交互式散點(diǎn)圖繪制

使用交互式Plotly包,通過調(diào)用“Scatter”扇救,通過繪圖散點(diǎn)圖可視化不同分類器的要素重要性值刑枝,如下所示:

# Scatter plot 
trace = go.Scatter(
    y = feature_dataframe['Random Forest feature importances'].values,
    x = feature_dataframe['features'].values,
    mode='markers',
    marker=dict(
        sizemode = 'diameter',
        sizeref = 1,
        size = 25,
#       size= feature_dataframe['AdaBoost feature importances'].values,
        #color = np.random.randn(500), #set color equal to a variable
        color = feature_dataframe['Random Forest feature importances'].values,
        colorscale='Portland',
        showscale=True
    ),
    text = feature_dataframe['features'].values
)
data = [trace]

layout= go.Layout(
    autosize= True,
    title= 'Random Forest Feature Importance',
    hovermode= 'closest',
#     xaxis= dict(
#         title= 'Pop',
#         ticklen= 5,
#         zeroline= False,
#         gridwidth= 2,
#     ),
    yaxis=dict(
        title= 'Feature Importance',
        ticklen= 5,
        gridwidth= 2
    ),
    showlegend= False
)
fig = go.Figure(data=data, layout=layout)
py.iplot(fig,filename='scatter2010')

# Scatter plot 
trace = go.Scatter(
    y = feature_dataframe['Extra Trees  feature importances'].values,
    x = feature_dataframe['features'].values,
    mode='markers',
    marker=dict(
        sizemode = 'diameter',
        sizeref = 1,
        size = 25,
#       size= feature_dataframe['AdaBoost feature importances'].values,
        #color = np.random.randn(500), #set color equal to a variable
        color = feature_dataframe['Extra Trees  feature importances'].values,
        colorscale='Portland',
        showscale=True
    ),
    text = feature_dataframe['features'].values
)
data = [trace]

layout= go.Layout(
    autosize= True,
    title= 'Extra Trees Feature Importance',
    hovermode= 'closest',
#     xaxis= dict(
#         title= 'Pop',
#         ticklen= 5,
#         zeroline= False,
#         gridwidth= 2,
#     ),
    yaxis=dict(
        title= 'Feature Importance',
        ticklen= 5,
        gridwidth= 2
    ),
    showlegend= False
)
fig = go.Figure(data=data, layout=layout)
py.iplot(fig,filename='scatter2010')

# Scatter plot 
trace = go.Scatter(
    y = feature_dataframe['AdaBoost feature importances'].values,
    x = feature_dataframe['features'].values,
    mode='markers',
    marker=dict(
        sizemode = 'diameter',
        sizeref = 1,
        size = 25,
#       size= feature_dataframe['AdaBoost feature importances'].values,
        #color = np.random.randn(500), #set color equal to a variable
        color = feature_dataframe['AdaBoost feature importances'].values,
        colorscale='Portland',
        showscale=True
    ),
    text = feature_dataframe['features'].values
)
data = [trace]

layout= go.Layout(
    autosize= True,
    title= 'AdaBoost Feature Importance',
    hovermode= 'closest',
#     xaxis= dict(
#         title= 'Pop',
#         ticklen= 5,
#         zeroline= False,
#         gridwidth= 2,
#     ),
    yaxis=dict(
        title= 'Feature Importance',
        ticklen= 5,
        gridwidth= 2
    ),
    showlegend= False
)
fig = go.Figure(data=data, layout=layout)
py.iplot(fig,filename='scatter2010')

# Scatter plot 
trace = go.Scatter(
    y = feature_dataframe['Gradient Boost feature importances'].values,
    x = feature_dataframe['features'].values,
    mode='markers',
    marker=dict(
        sizemode = 'diameter',
        sizeref = 1,
        size = 25,
#       size= feature_dataframe['AdaBoost feature importances'].values,
        #color = np.random.randn(500), #set color equal to a variable
        color = feature_dataframe['Gradient Boost feature importances'].values,
        colorscale='Portland',
        showscale=True
    ),
    text = feature_dataframe['features'].values
)
data = [trace]

layout= go.Layout(
    autosize= True,
    title= 'Gradient Boosting Feature Importance',
    hovermode= 'closest',
#     xaxis= dict(
#         title= 'Pop',
#         ticklen= 5,
#         zeroline= False,
#         gridwidth= 2,
#     ),
    yaxis=dict(
        title= 'Feature Importance',
        ticklen= 5,
        gridwidth= 2
    ),
    showlegend= False
)
fig = go.Figure(data=data, layout=layout)
py.iplot(fig,filename='scatter2010')

現(xiàn)在讓我們計(jì)算所有要素重要性的平均值,并將其存儲(chǔ)為要素重要性數(shù)據(jù)框中的新列迅腔。

# Create the new column containing the average of values

feature_dataframe['mean'] = feature_dataframe.mean(axis= 1) # axis = 1 computes the mean row-wise
feature_dataframe.head(3)

**平均特征重要性的Plotly Barplot **

獲得所有分類器的平均特征重要性后装畅,我們可以將它們繪制成Plotly條形圖,如下所示:

y = feature_dataframe['mean'].values
x = feature_dataframe['features'].values
data = [go.Bar(
            x= x,
             y= y,
            width = 0.5,
            marker=dict(
               color = feature_dataframe['mean'].values,
            colorscale='Portland',
            showscale=True,
            reversescale = False
            ),
            opacity=0.6
        )]

layout= go.Layout(
    autosize= True,
    title= 'Barplots of Mean Feature Importance',
    hovermode= 'closest',
#     xaxis= dict(
#         title= 'Pop',
#         ticklen= 5,
#         zeroline= False,
#         gridwidth= 2,
#     ),
    yaxis=dict(
        title= 'Feature Importance',
        ticklen= 5,
        gridwidth= 2
    ),
    showlegend= False
)
fig = go.Figure(data=data, layout=layout)
py.iplot(fig, filename='bar-direct-labels')

#第一級(jí)輸出的二級(jí)預(yù)測

作為新功能的第一級(jí)輸出

現(xiàn)在已經(jīng)獲得了我們的第一級(jí)預(yù)測沧烈,可以將其視為一組數(shù)據(jù)掠兄,用作下一個(gè)分類器的訓(xùn)練數(shù)據(jù)。 根據(jù)下面的代碼锌雀,我們創(chuàng)建新列作為我們之前的分類器中的第一級(jí)預(yù)測蚂夕,并在此基礎(chǔ)上訓(xùn)練下一個(gè)分類器。

base_predictions_train = pd.DataFrame( {'RandomForest': rf_oof_train.ravel(),
     'ExtraTrees': et_oof_train.ravel(),
     'AdaBoost': ada_oof_train.ravel(),
      'GradientBoost': gb_oof_train.ravel()
    })
base_predictions_train.head()

二級(jí)訓(xùn)練集的相關(guān)熱圖

data = [
    go.Heatmap(
        z= base_predictions_train.astype(float).corr().values ,
        x=base_predictions_train.columns.values,
        y= base_predictions_train.columns.values,
          colorscale='Viridis',
            showscale=True,
            reversescale = True
    )
]
py.iplot(data, filename='labelled-heatmap')

已經(jīng)有不少文章和Kaggle比賽獲獎(jiǎng)?wù)哧P(guān)于訓(xùn)練模型的優(yōu)點(diǎn)汤锨,這些模型彼此之間更不相關(guān)双抽,產(chǎn)生更好的分?jǐn)?shù)。

x_train = np.concatenate(( et_oof_train, rf_oof_train, ada_oof_train, gb_oof_train, svc_oof_train), axis=1)
x_test = np.concatenate(( et_oof_test, rf_oof_test, ada_oof_test, gb_oof_test, svc_oof_test), axis=1)

現(xiàn)在已經(jīng)連接并加入了第一級(jí)輸出和測試預(yù)測x_train和x_test闲礼,我們現(xiàn)在可以訓(xùn)練二級(jí)學(xué)習(xí)模型牍汹。

通過XGBoost的二級(jí)學(xué)習(xí)模型

在這里,我們選擇了極其著名的XGBoost柬泽,用于提升樹木學(xué)習(xí)模型慎菲,XGBoost。 它的構(gòu)建是為了優(yōu)化大規(guī)模的提升樹算法锨并。 有關(guān)該算法的更多信息露该,請查看[官方文檔] [1]。
[1]:https://xgboost.readthedocs.io/en/latest/
無論如何第煮,我們稱之為XGBC分類器并將其與第一級(jí)訓(xùn)練和目標(biāo)數(shù)據(jù)相匹配解幼,并使用學(xué)習(xí)模型預(yù)測測試數(shù)據(jù),如下所示:

gbm = xgb.XGBClassifier(
    #learning_rate = 0.02,
 n_estimators= 2000,
 max_depth= 4,
 min_child_weight= 2,
 #gamma=1,
 gamma=0.9,                        
 subsample=0.8,
 colsample_bytree=0.8,
 objective= 'binary:logistic',
 nthread= -1,
 scale_pos_weight=1).fit(x_train, y_train)
predictions = gbm.predict(x_test)

只需快速了解模型中使用的XGBoost參數(shù):
** max_depth **:你想要樹的深度包警。 請注意撵摆,如果設(shè)置得太高,則數(shù)字可能存在過度擬合的風(fēng)險(xiǎn)害晦。
** gamma **:在樹的葉節(jié)點(diǎn)上進(jìn)行進(jìn)一步分區(qū)所需的最小損失減少量特铝。 算法越大,越保守。
** eta **:每個(gè)增壓步驟中使用的步長收縮鲫剿,以防止過度擬合

制作提交文件
最后鳄逾,我們已經(jīng)訓(xùn)練并適應(yīng)了所有的一級(jí)和二級(jí)模型,現(xiàn)在我們可以將預(yù)測輸出到適當(dāng)?shù)母袷搅榱员闾峤唤o泰坦尼克號(hào)競賽如下:

# Generate Submission File 
StackingSubmission = pd.DataFrame({ 'PassengerId': PassengerId,
                            'Survived': predictions })
StackingSubmission.to_csv("StackingSubmission.csv", index=False)

進(jìn)一步改進(jìn)的步驟**

作為結(jié)束語雕凹,必須注意的是,上面采取的步驟只是展示了一種生成整體Stacking機(jī)的非常簡單的方法笆呆。 你會(huì)聽到在最高級(jí)別的Kaggle比賽中創(chuàng)造的Ensembling请琳,其中涉及Stacking分類器的怪異組合以及達(dá)到2級(jí)以上的Stacking等級(jí)粱挡。

可以采取一些額外步驟來提高一個(gè)人的分?jǐn)?shù):

1.在訓(xùn)練模型時(shí)實(shí)施良好的交叉驗(yàn)證策略以找到最佳參數(shù)值
2.引入更多種類的學(xué)習(xí)基礎(chǔ)模型赠幕。 結(jié)果越不相關(guān),最終得分越高询筏。

結(jié)論

這個(gè)筆記本介紹的關(guān)于Stacking學(xué)習(xí)模型的工作腳本榕堰,對(duì)您有所幫助。

有關(guān)Stacking或整理的其他優(yōu)秀材料嫌套,請參閱MLWave網(wǎng)站上的事實(shí)必讀文章:[Kaggle Ensembling Guide] [1]逆屡。

直到下一次,Peace Out
[1]:http://mlwave.com/kaggle-ensembling-guide/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末踱讨,一起剝皮案震驚了整個(gè)濱河市魏蔗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌痹筛,老刑警劉巖莺治,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異帚稠,居然都是意外死亡谣旁,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門滋早,熙熙樓的掌柜王于貴愁眉苦臉地迎上來榄审,“玉大人,你說我怎么就攤上這事杆麸「榻” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵昔头,是天一觀的道長饼问。 經(jīng)常有香客問我,道長减细,這世上最難降的妖魔是什么匆瓜? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上驮吱,老公的妹妹穿的比我還像新娘茧妒。我一直安慰自己,他們只是感情好左冬,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布桐筏。 她就那樣靜靜地躺著,像睡著了一般拇砰。 火紅的嫁衣襯著肌膚如雪梅忌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天除破,我揣著相機(jī)與錄音牧氮,去河邊找鬼。 笑死瑰枫,一個(gè)胖子當(dāng)著我的面吹牛踱葛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播光坝,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼尸诽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了盯另?” 一聲冷哼從身側(cè)響起性含,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鸳惯,沒想到半個(gè)月后商蕴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡悲敷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年究恤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片后德。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡部宿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出瓢湃,到底是詐尸還是另有隱情理张,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布绵患,位于F島的核電站雾叭,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏落蝙。R本人自食惡果不足惜织狐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一暂幼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧移迫,春花似錦旺嬉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至荡陷,卻和暖如春雨效,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背废赞。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來泰國打工徽龟, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蛹头。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓顿肺,卻偏偏與公主長得像戏溺,于是被迫代替她去往敵國和親渣蜗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348