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)
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=[])
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.額外的樹木分類器
- AdaBoost分類
- 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/