溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python中怎么利用Stacking實(shí)現(xiàn)機(jī)器學(xué)習(xí)

發(fā)布時(shí)間:2021-06-15 10:45:24 來源:億速云 閱讀:389 作者:Leah 欄目:編程語言

這篇文章給大家介紹Python中怎么利用Stacking實(shí)現(xiàn)機(jī)器學(xué)習(xí),內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

堆疊概括

堆疊通用化或簡(jiǎn)稱“堆疊”是一種集成的機(jī)器學(xué)習(xí)算法。它涉及在同一數(shù)據(jù)集上組合來自多個(gè)機(jī)器學(xué)習(xí)模型的預(yù)測(cè),例如裝袋和提升。堆疊解決了這個(gè)問題:給定多個(gè)熟練解決問題的機(jī)器學(xué)習(xí)模型,但是以不同的方式,您如何選擇要使用的模型(信任)?解決此問題的方法是使用另一個(gè)機(jī)器學(xué)習(xí)模型,該模型學(xué)習(xí)何時(shí)使用或信任集合中的每個(gè)模型。

  •  與Bagging不同,在堆疊中,模型通常是不同的(例如,并非所有決策樹)并且適合于同一數(shù)據(jù)集(例如,而不是訓(xùn)練數(shù)據(jù)集的樣本)。

  •  與Boosting不同,在堆疊中,使用單個(gè)模型來學(xué)習(xí)如何最佳地組合來自貢獻(xiàn)模型的預(yù)測(cè)(例如,而不是校正先前模型的預(yù)測(cè)的一系列模型)。

堆棧模型的體系結(jié)構(gòu)涉及兩個(gè)或多個(gè)基本模型(通常稱為0級(jí)模型)和一個(gè)將基本模型的預(yù)測(cè)結(jié)合在一起的元模型(稱為1級(jí)模型)。

  •  0級(jí)模型(基本模型):模型適合訓(xùn)練數(shù)據(jù),并會(huì)編譯其預(yù)測(cè)。

  •  1級(jí)模型(元模型):學(xué)習(xí)如何最好地組合基礎(chǔ)模型的預(yù)測(cè)的模型。

元模型是根據(jù)基本模型對(duì)樣本外數(shù)據(jù)所做的預(yù)測(cè)進(jìn)行訓(xùn)練的。也就是說,將不用于訓(xùn)練基本模型的數(shù)據(jù)饋送到基本模型,進(jìn)行預(yù)測(cè),并且這些預(yù)測(cè)與預(yù)期輸出一起提供用于擬合元模型的訓(xùn)練數(shù)據(jù)集的輸入和輸出對(duì)。來自基本模型的輸出(用作元模型的輸入)在回歸的情況下可以是真實(shí)值,而在概率分類的情況下,概率值,類似概率的值或類別標(biāo)簽可以是真實(shí)值。為元模型準(zhǔn)備訓(xùn)練數(shù)據(jù)集的最常見方法是通過基本模型的k折交叉驗(yàn)證,其中不合時(shí)宜的預(yù)測(cè)用作元模型訓(xùn)練數(shù)據(jù)集的基礎(chǔ)。

元模型的訓(xùn)練數(shù)據(jù)還可以包括基本模型的輸入,例如基本模型的輸入。訓(xùn)練數(shù)據(jù)的輸入元素。這可以向元模型提供關(guān)于如何最佳地組合來自元模型的預(yù)測(cè)的附加上下文。一旦為元模型準(zhǔn)備了訓(xùn)練數(shù)據(jù)集,就可以在該數(shù)據(jù)集上單獨(dú)訓(xùn)練元模型,并且可以在整個(gè)原始訓(xùn)練數(shù)據(jù)集上訓(xùn)練基本模型。

當(dāng)多個(gè)不同的機(jī)器學(xué)習(xí)模型在數(shù)據(jù)集上具有技能但以不同的方式具有技能時(shí),堆疊是合適的。另一種說法是,模型做出的預(yù)測(cè)或模型做出的預(yù)測(cè)中的誤差不相關(guān)或具有較低的相關(guān)性。基本模型通常是復(fù)雜而多樣的。因此,通常最好使用一系列關(guān)于如何解決預(yù)測(cè)建模任務(wù)的不同假設(shè)的模型,例如線性模型,決策樹,支持向量機(jī),神經(jīng)網(wǎng)絡(luò)等。其他集成算法也可以用作基本模型,例如隨機(jī)森林?;灸P停菏褂酶鞣N模型,這些模型對(duì)預(yù)測(cè)任務(wù)有不同的假設(shè)。元模型通常很簡(jiǎn)單,可以對(duì)基本模型做出的預(yù)測(cè)進(jìn)行平滑的解釋。這樣,線性模型通常用作元模型,例如用于回歸任務(wù)的線性回歸(預(yù)測(cè)數(shù)值)和用于分類任務(wù)的邏輯回歸(預(yù)測(cè)類標(biāo)簽)。盡管這很普遍,但這不是必需的。

  •  回歸元模型:線性回歸。

  •  分類元模型:邏輯回歸。

使用簡(jiǎn)單的線性模型作為元模型通常會(huì)堆疊口語名稱“ blending”。與預(yù)測(cè)中一樣,是基礎(chǔ)模型所做的預(yù)測(cè)的加權(quán)平均或混合。超級(jí)學(xué)習(xí)者可以被認(rèn)為是一種特殊的堆疊方式。堆棧旨在提高建模性能,盡管不能保證在所有情況下都能改進(jìn)。實(shí)現(xiàn)性能上的改進(jìn)取決于問題的復(fù)雜性,以及培訓(xùn)數(shù)據(jù)是否足夠好地表示問題以及是否足夠復(fù)雜,以至于可以通過組合預(yù)測(cè)來學(xué)習(xí)更多。它還取決于基本模型的選擇以及它們?cè)陬A(yù)測(cè)(或錯(cuò)誤)方面是否足夠熟練和足夠不相關(guān)。如果基本模型的性能優(yōu)于或優(yōu)于堆疊集成,則應(yīng)使用基本模型,因?yàn)樗膹?fù)雜度較低(例如,描述,訓(xùn)練和維護(hù)更簡(jiǎn)單)。

堆疊Scikit-Learn API

堆疊可以從頭開始實(shí)現(xiàn),盡管這對(duì)初學(xué)者可能具有挑戰(zhàn)性。scikit-learn Python機(jī)器學(xué)習(xí)庫提供了用于機(jī)器學(xué)習(xí)的堆棧實(shí)現(xiàn)。它在庫的0.22版和更高版本中可用。首先,通過運(yùn)行以下腳本來確認(rèn)您正在使用現(xiàn)代版本的庫:

# check scikit-learn version  import sklearn  print(sklearn.__version__)

運(yùn)行腳本將打印您的scikit-learn版本。您的版本應(yīng)該相同或更高。如果不是,則必須升級(jí)scikit-learn庫的版本。

0.22.1

堆棧是通過StackingRegressor和StackingClassifier類提供的。兩種模型以相同的方式操作并采用相同的參數(shù)。使用模型要求您指定一個(gè)估算器列表(0級(jí)模型)和一個(gè)最終估算器(1級(jí)或元模型)。級(jí)別0模型或基本模型的列表通過“ estimators”參數(shù)提供。這是一個(gè)Python列表,其中列表中的每個(gè)元素都是一個(gè)具有模型名稱和配置的模型實(shí)例的元組。例如,下面定義了兩個(gè)0級(jí)模型:

models = [('lr',LogisticRegression()),('svm',SVC())  stacking = StackingClassifier(estimators=models)

列表中的每個(gè)模型也可以是管道,包括在將模型擬合到訓(xùn)練數(shù)據(jù)集之前模型所需的任何數(shù)據(jù)準(zhǔn)備。例如:

models = [('lr',LogisticRegression()),('svm',make_pipeline(StandardScaler(),SVC()))  stacking = StackingClassifier(estimators=models)

通過“ final_estimator”參數(shù)提供1級(jí)模型或元模型。默認(rèn)情況下,將其設(shè)置為用于回歸的LinearRegression和用于分類的LogisticRegression,并且這些是您可能不希望更改的明智的默認(rèn)值。使用交叉驗(yàn)證準(zhǔn)備元模型的數(shù)據(jù)集。默認(rèn)情況下,使用5折交叉驗(yàn)證,盡管可以通過“ cv”自變量進(jìn)行更改,并將其設(shè)置為數(shù)字(例如10折交叉驗(yàn)證為10)或交叉驗(yàn)證對(duì)象(例如StratifiedKFold) 。有時(shí),如果為元模型準(zhǔn)備的數(shù)據(jù)集還包含0級(jí)模型的輸入(例如, 輸入的訓(xùn)練數(shù)據(jù)。這可以通過將“ passthrough”參數(shù)設(shè)置為True來實(shí)現(xiàn),并且默認(rèn)情況下未啟用。現(xiàn)在,我們已經(jīng)熟悉了scikit-learn中的stacking API,下面讓我們來看一些可行的示例。

堆疊分類

在本節(jié)中,我們將研究使用堆疊解決分類問題。首先,我們可以使用make_classification()函數(shù)創(chuàng)建具有1,000個(gè)示例和20個(gè)輸入功能的綜合二進(jìn)制分類問題。下面列出了完整的示例。

# test classification dataset  from sklearn.datasets import make_classification  # define dataset  X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=1)  # summarize the dataset  print(X.shape, y.shape)

運(yùn)行示例將創(chuàng)建數(shù)據(jù)集并總結(jié)輸入和輸出組件的形狀。

(1000, 20) (1000,)

接下來,我們可以在數(shù)據(jù)集上評(píng)估一套不同的機(jī)器學(xué)習(xí)模型。

具體來說,我們將評(píng)估以下五種算法:

  •  邏輯回歸。

  •  k最近鄰居。

  •  決策樹。

  •  支持向量機(jī)。

  •  天真貝葉斯。

每種算法將使用默認(rèn)模型超參數(shù)進(jìn)行評(píng)估。下面的函數(shù)get_models()創(chuàng)建我們要評(píng)估的模型。

# get a list of models to evaluate  def get_models():   models = dict()   models['lr'] = LogisticRegression()   models['knn'] = KNeighborsClassifier()   models['cart'] = DecisionTreeClassifier()  models['svm'] = SVC()   models['bayes'] = GaussianNB()   return models

每個(gè)模型將使用重復(fù)的k倍交叉驗(yàn)證進(jìn)行評(píng)估。下面的valuate_model()函數(shù)采用一個(gè)模型實(shí)例,并從分層的10倍交叉驗(yàn)證的三個(gè)重復(fù)中返回分?jǐn)?shù)列表。

# evaluate a given model using cross-validation  def evaluate_model(model, X, y):   cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)   scores = cross_val_score(model, X, y, scoring='accuracy', cvcv=cv, n_jobs=-1, error_score='raise')   return scores

然后,我們可以報(bào)告每種算法的平均性能,還可以創(chuàng)建箱形圖和晶須圖,以比較每種算法的準(zhǔn)確性得分的分布。結(jié)合在一起,下面列出了完整的示例。

# compare standalone models for binary classification  from numpy import mean  from numpy import std  from sklearn.datasets import make_classification  from sklearn.model_selection import cross_val_score  from sklearn.model_selection import RepeatedStratifiedKFold  from sklearn.linear_model import LogisticRegression from sklearn.neighbors import KNeighborsClassifier  from sklearn.tree import DecisionTreeClassifier from sklearn.svm import SVC  from sklearn.naive_bayes import GaussianNB  from matplotlib import pyplot  # get the dataset  def get_dataset():   X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=1)   return X, y  # get a list of models to evaluate  def get_models():   models = dict()   models['lr'] = LogisticRegression()   models['knn'] = KNeighborsClassifier()   models['cart'] = DecisionTreeClassifier()   models['svm'] = SVC()   models['bayes'] = GaussianNB()   return models  # evaluate a given model using cross-validation  def evaluate_model(model, X, y):   cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)   scores = cross_val_score(model, X, y, scoring='accuracy', cvcv=cv, n_jobs=-1, error_score='raise')   return scores  # define dataset  X, y = get_dataset()  # get the models to evaluate  models = get_models()  # evaluate the models and store results  results, names = list(), list()  for name, model in models.items():   scores = evaluate_model(model, X, y)   results.append(scores)   names.append(name)   print('>%s %.3f (%.3f)' % (name, mean(scores), std(scores)))  # plot model performance for comparison  pyplot.boxplot(results, labels=names, showmeans=True)  pyplot.show()

首先運(yùn)行示例將報(bào)告每個(gè)模型的均值和標(biāo)準(zhǔn)差準(zhǔn)確性。注意:由于算法或評(píng)估程序的隨機(jī)性,或者數(shù)值精度的差異,您的結(jié)果可能會(huì)有所不同??紤]運(yùn)行該示例幾次并比較平均結(jié)果。我們可以看到,在這種情況下,SVM以約95.7%的平均準(zhǔn)確度表現(xiàn)最佳。

>lr 0.866 (0.029)  >knn 0.931 (0.025)  >cart 0.821 (0.050)  >svm 0.957 (0.020)  >bayes 0.833 (0.031)

首先運(yùn)行示例將報(bào)告每個(gè)模型的均值和標(biāo)準(zhǔn)差準(zhǔn)確性。注意:由于算法或評(píng)估程序的隨機(jī)性,或者數(shù)值精度的差異,您的結(jié)果可能會(huì)有所不同??紤]運(yùn)行該示例幾次并比較平均結(jié)果。我們可以看到,在這種情況下,SVM以約95.7%的平均準(zhǔn)確度表現(xiàn)最佳。

Python中怎么利用Stacking實(shí)現(xiàn)機(jī)器學(xué)習(xí)

在這里,我們有五種不同的算法運(yùn)行良好,大概在此數(shù)據(jù)集上的表現(xiàn)方式不同。接下來,我們可以嘗試使用堆棧將這五個(gè)模型合并為一個(gè)整體模型。我們可以使用邏輯回歸模型來學(xué)習(xí)如何最好地結(jié)合來自五個(gè)單獨(dú)模型的預(yù)測(cè)。下面的get_stacking()函數(shù)通過首先為五個(gè)基本模型定義一個(gè)元組列表,然后定義邏輯回歸元模型以使用5倍交叉驗(yàn)證組合來自基本模型的預(yù)測(cè)來定義StackingClassifier模型。

# get a stacking ensemble of models  def get_stacking():   # define the base models   level0 = list()   level0.append(('lr', LogisticRegression()))   level0.append(('knn', KNeighborsClassifier()))   level0.append(('cart', DecisionTreeClassifier()))   level0.append(('svm', SVC()))  level0.append(('bayes', GaussianNB()))   # define meta learner model   level1 = LogisticRegression()   # define the stacking ensemble   model = StackingClassifier(estimators=level0, final_estimator=level1, cv=5)   return model

我們可以將堆棧集成與獨(dú)立模型一起包括在要評(píng)估的模型列表中。

# get a list of models to evaluate  def get_models():   models = dict()   models['lr'] = LogisticRegression()   models['knn'] = KNeighborsClassifier()   models['cart'] = DecisionTreeClassifier()   models['svm'] = SVC()   models['bayes'] = GaussianNB()   models['stacking'] = get_stacking()   return models

我們的期望是,堆疊集成的性能將優(yōu)于任何單個(gè)基本模型。并非總是如此,如果不是這種情況,則應(yīng)使用基礎(chǔ)模型,以支持集成模型。下面列出了評(píng)估堆疊集成模型和獨(dú)立模型的完整示例。

# compare ensemble to each baseline classifier  from numpy import mean  from numpy import std  from sklearn.datasets import make_classification  from sklearn.model_selection import cross_val_score  from sklearn.model_selection import RepeatedStratifiedKFold  from sklearn.linear_model import LogisticRegression  from sklearn.neighbors import KNeighborsClassifier  from sklearn.tree import DecisionTreeClassifier  from sklearn.svm import SVC  from sklearn.naive_bayes import GaussianNB  from sklearn.ensemble import StackingClassifier  from matplotlib import pyplot   # get the dataset  def get_dataset():   X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=1)   return X, y  # get a stacking ensemble of models def get_stacking():   # define the base models   level0 = list()   level0.append(('lr', LogisticRegression()))   level0.append(('knn', KNeighborsClassifier()))   level0.append(('cart', DecisionTreeClassifier()))   level0.append(('svm', SVC()))  level0.append(('bayes', GaussianNB()))   # define meta learner model   level1 = LogisticRegression()   # define the stacking ensemble   model = StackingClassifier(estimators=level0, final_estimator=level1, cv=5)   return model  # get a list of models to evaluate  def get_models():   models = dict()   models['lr'] = LogisticRegression()   models['knn'] = KNeighborsClassifier()   models['cart'] = DecisionTreeClassifier()   models['svm'] = SVC()   models['bayes'] = GaussianNB()   models['stacking'] = get_stacking()   return models  # evaluate a give model using cross-validation  def evaluate_model(model, X, y):   cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)   scores = cross_val_score(model, X, y, scoring='accuracy', cvcv=cv, n_jobs=-1, error_score='raise')   return scores  # define dataset  X, y = get_dataset()  # get the models to evaluate  models = get_models()  # evaluate the models and store results  results, names = list(), list()  for name, model in models.items():   scores = evaluate_model(model, X, y)  results.append(scores)   names.append(name)   print('>%s %.3f (%.3f)' % (name, mean(scores), std(scores)))  # plot model performance for comparison  pyplot.boxplot(results, labels=names, showmeans=True)  pyplot.show()

首先運(yùn)行示例將報(bào)告每個(gè)模型的性能。這包括每個(gè)基本模型的性能,然后是堆疊合奏。

注意:由于算法或評(píng)估程序的隨機(jī)性,或者數(shù)值精度的差異,您的結(jié)果可能會(huì)有所不同。考慮運(yùn)行該示例幾次并比較平均結(jié)果。在這種情況下,我們可以看到堆疊集成的平均性能似乎比任何單個(gè)模型都要好,達(dá)到了約96.4%的精度。

>lr 0.866 (0.029)  >knn 0.931 (0.025)  >cart 0.820 (0.044)  >svm 0.957 (0.020)  >bayes 0.833 (0.031)  >stacking 0.964 (0.019)

將創(chuàng)建一個(gè)箱形圖,以顯示模型分類精度的分布。在這里,我們可以看到堆疊模型的均值和中值準(zhǔn)確性比SVM模型要高一些。

Python中怎么利用Stacking實(shí)現(xiàn)機(jī)器學(xué)習(xí)

如果我們選擇堆疊集成作為最終模型,則可以像其他任何模型一樣擬合并使用它對(duì)新數(shù)據(jù)進(jìn)行預(yù)測(cè)。首先,將堆棧集合適合所有可用數(shù)據(jù),然后可以調(diào)用predict()函數(shù)對(duì)新數(shù)據(jù)進(jìn)行預(yù)測(cè)。下面的示例在我們的二進(jìn)制分類數(shù)據(jù)集中展示了這一點(diǎn)。

# make a prediction with a stacking ensemble  from sklearn.datasets import make_classification  from sklearn.ensemble import StackingClassifier  from sklearn.linear_model import LogisticRegression  from sklearn.neighbors import KNeighborsClassifier  from sklearn.tree import DecisionTreeClassifier from sklearn.svm import SVC  from sklearn.naive_bayes import GaussianNB  # define dataset  X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=1 # define the base models  level0 = list()  level0.append(('lr', LogisticRegression()))  level0.append(('knn', KNeighborsClassifier()))  level0.append(('cart', DecisionTreeClassifier()))  level0.append(('svm', SVC()))  level0.append(('bayes', GaussianNB()))  # define meta learner model  level1 = LogisticRegression()  # define the stacking ensemble  model = StackingClassifier(estimators=level0, final_estimator=level1, cv=5)  # fit the model on all available data  model.fit(X, y)  # make a prediction for one example  data = [[2.47475454,0.40165523,1.68081787,2.88940715,0.91704519,-3.07950644,4.39961206,0.72464273,-4.86563631,-6.06338084,-1.22209949,-0.4699618,1.01222748,-0.6899355,-0.53000581,6.86966784,-3.27211075,-6.59044146,-2.21290585,-3.139579]] yhat = model.predict(data)  print('Predicted Class: %d' % (yhat))

運(yùn)行示例適合整個(gè)數(shù)據(jù)集上的堆疊集成模型,然后像在應(yīng)用程序中使用模型一樣,將其用于對(duì)新數(shù)據(jù)行進(jìn)行預(yù)測(cè)。

Predicted Class: 0

堆疊回歸

在本節(jié)中,我們將研究如何使用堆疊來解決回歸問題。首先,我們可以使用make_regression()函數(shù)創(chuàng)建具有1000個(gè)示例和20個(gè)輸入要素的綜合回歸問題。下面列出了完整的示例。

# test regression dataset  from sklearn.datasets import make_regression  # define dataset  X, y = make_regression(n_samples=1000, n_features=20, n_informative=15, noise=0.1, random_state=1)  # summarize the dataset  print(X.shape, y.shape)

運(yùn)行示例將創(chuàng)建數(shù)據(jù)集并總結(jié)輸入和輸出組件的形狀。

(1000, 20) (1000,)

接下來,我們可以在數(shù)據(jù)集上評(píng)估一套不同的機(jī)器學(xué)習(xí)模型。

具體來說,我們將評(píng)估以下三種算法:

  •  k近鄰

  •  決策樹

  •  支持向量回歸

注意:可以使用線性回歸模型對(duì)測(cè)試數(shù)據(jù)集進(jìn)行簡(jiǎn)單求解,因?yàn)樵摂?shù)據(jù)集是在封面下使用線性模型創(chuàng)建的。因此,我們將把該模型放在示例之外,以便我們可以證明堆疊集成方法的好處。

每種算法將使用默認(rèn)的模型超參數(shù)進(jìn)行評(píng)估。下面的函數(shù)get_models()創(chuàng)建我們要評(píng)估的模型。

# get a list of models to evaluate  def get_models():   models = dict()   models['knn'] = KNeighborsRegressor()   models['cart'] = DecisionTreeRegressor()   models['svm'] = SVR()   return models

每個(gè)模型將使用重復(fù)的k倍交叉驗(yàn)證進(jìn)行評(píng)估。下面的valuate_model()函數(shù)采用一個(gè)模型實(shí)例,并從三個(gè)重復(fù)的10倍交叉驗(yàn)證中返回分?jǐn)?shù)列表。

# evaluate a given model using cross-validation  def evaluate_model(model, X, y):  cv = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1)   scores = cross_val_score(model, X, y, scoring='neg_mean_absolute_error', cvcv=cv, n_jobs=-1, error_score='raise')   return scores

然后,我們可以報(bào)告每種算法的平均性能,還可以創(chuàng)建箱形圖和晶須圖,以比較每種算法的準(zhǔn)確性得分的分布。在這種情況下,將使用平均絕對(duì)誤差(MAE)報(bào)告模型性能。scikit-learn庫會(huì)將此錯(cuò)誤的符號(hào)反轉(zhuǎn)以使其最大化,從-infinity到0以獲取最佳分?jǐn)?shù)。結(jié)合在一起,下面列出了完整的示例。

# compare machine learning models for regression  from numpy import mean  from numpy import std  from sklearn.datasets import make_regression  from sklearn.model_selection import cross_val_score  from sklearn.model_selection import RepeatedKFold  from sklearn.linear_model import LinearRegression  from sklearn.neighbors import KNeighborsRegressor from sklearn.tree import DecisionTreeRegressor  from sklearn.svm import SVR  from matplotlib import pyplot  # get the dataset  def get_dataset():   X, y = make_regression(n_samples=1000, n_features=20, n_informative=15, noise=0.1, random_state=1)   return X, y  # get a list of models to evaluate  def get_models():   models = dict()   models['knn'] = KNeighborsRegressor()   models['cart'] = DecisionTreeRegressor()   models['svm'] = SVR()   return models  # evaluate a given model using cross-validation  def evaluate_model(model, X, y):   cv = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1)   scores = cross_val_score(model, X, y, scoring='neg_mean_absolute_error', cvcv=cv, n_jobs=-1, error_score='raise')   return scores  # define dataset  X, y = get_dataset()  # get the models to evaluate  models = get_models()  # evaluate the models and store results  results, names = list(), list()  for name, model in models.items():   scores = evaluate_model(model, X, y)   results.append(scores)   names.append(name)   print('>%s %.3f (%.3f)' % (name, mean(scores), std(scores)))  # plot model performance for comparison  pyplot.boxplot(results, labels=names, showmeans=True)  pyplot.show()

首先運(yùn)行示例,報(bào)告每個(gè)模型的均值和標(biāo)準(zhǔn)差MAE。注意:由于算法或評(píng)估程序的隨機(jī)性,或者數(shù)值精度的差異,您的結(jié)果可能會(huì)有所不同??紤]運(yùn)行該示例幾次并比較平均結(jié)果。我們可以看到,在這種情況下,KNN的最佳表現(xiàn)為平均負(fù)MAE約為-100。

>knn -101.019 (7.161)  >cart -148.100 (11.039)  >svm -162.419 (12.565)

然后創(chuàng)建箱型圖,比較每個(gè)模型的分布負(fù)MAE得分。

Python中怎么利用Stacking實(shí)現(xiàn)機(jī)器學(xué)習(xí)

在這里,我們有三種不同的算法可以很好地運(yùn)行,大概在此數(shù)據(jù)集上以不同的方式運(yùn)行。

接下來,我們可以嘗試使用堆棧將這三個(gè)模型合并為一個(gè)整體模型。

我們可以使用線性回歸模型來學(xué)習(xí)如何最佳地組合來自三個(gè)模型的預(yù)測(cè)。

下面的get_stacking()函數(shù)通過首先為三個(gè)基本模型定義一個(gè)元組列表,然后定義線性回歸元模型以使用5倍交叉驗(yàn)證組合來自基本模型的預(yù)測(cè)來定義StackingRegressor模型。

# get a stacking ensemble of models  def get_stacking():   # define the base models   level0 = list()   level0.append(('knn', KNeighborsRegressor()))   level0.append(('cart', DecisionTreeRegressor()))   level0.append(('svm', SVR()))   # define meta learner model   level1 = LinearRegression()   # define the stacking ensemble   model = StackingRegressor(estimators=level0, final_estimator=level1, cv=5)   return model

我們可以將堆棧集成與獨(dú)立模型一起包括在要評(píng)估的模型列表中。

# get a list of models to evaluate  def get_models():   models = dict()   models['knn'] = KNeighborsRegressor()   models['cart'] = DecisionTreeRegressor()   models['svm'] = SVR()   models['stacking'] = get_stacking()   return models

我們的期望是,堆疊集成的性能將優(yōu)于任何單個(gè)基本模型。情況并非總是如此,如果不是這種情況,則應(yīng)使用基礎(chǔ)模型以支持集成模型。下面列出了評(píng)估堆疊集成模型和獨(dú)立模型的完整示例。

# compare ensemble to each standalone models for regression  from numpy import mean  from numpy import std  from sklearn.datasets import make_regression  from sklearn.model_selection import cross_val_score  from sklearn.model_selection import RepeatedKFold  from sklearn.linear_model import LinearRegression  from sklearn.neighbors import KNeighborsRegressor  from sklearn.tree import DecisionTreeRegressor  from sklearn.svm import SVR  from sklearn.ensemble import StackingRegressor  from matplotlib import pyplot   # get the dataset  def get_dataset():   X, y = make_regression(n_samples=1000, n_features=20, n_informative=15, noise=0.1, random_state=1)   return X, y  # get a stacking ensemble of models  def get_stacking():   # define the base models   level0 = list()   level0.append(('knn', KNeighborsRegressor()))   level0.append(('cart', DecisionTreeRegressor()))   level0.append(('svm', SVR()))   # define meta learner model   level1 = LinearRegression()   # define the stacking ensemble   model = StackingRegressor(estimators=level0, final_estimator=level1, cv=5)   return model  # get a list of models to evaluate  def get_models():   models = dict()   models['knn'] = KNeighborsRegressor()   models['cart'] = DecisionTreeRegressor()   models['svm'] = SVR()   models['stacking'] = get_stacking()   return models  # evaluate a given model using cross-validation  def evaluate_model(model, X, y):   cv = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1)   scores = cross_val_score(model, X, y, scoring='neg_mean_absolute_error', cvcv=cv, n_jobs=-1, error_score='raise')   return scores  # define dataset  X, y = get_dataset()  # get the models to evaluate  models = get_models()  # evaluate the models and store results  results, names = list(), list()  for name, model in models.items():   scores = evaluate_model(model, X, y)   results.append(scores)   names.append(name)   print('>%s %.3f (%.3f)' % (name, mean(scores), std(scores)))  # plot model performance for comparison  pyplot.boxplot(results, labels=names, showmeans=True)  pyplot.show()

首先運(yùn)行示例將報(bào)告每個(gè)模型的性能。這包括每個(gè)基本模型的性能,然后是堆疊合奏。注意:由于算法或評(píng)估程序的隨機(jī)性,或者數(shù)值精度的差異,您的結(jié)果可能會(huì)有所不同??紤]運(yùn)行該示例幾次并比較平均結(jié)果。在這種情況下,我們可以看到堆疊集成的平均表現(xiàn)要好于任何單個(gè)模型,平均負(fù)MAE約為-56。

>knn -101.019 (7.161)  >cart -148.017 (10.635)  >svm -162.419 (12.565)  >stacking -56.893 (5.253)

將創(chuàng)建一個(gè)箱形圖,以顯示模型錯(cuò)誤分?jǐn)?shù)的分布。在這里,我們可以看到堆疊模型的平均得分和中位數(shù)得分遠(yuǎn)高于任何單個(gè)模型。

Python中怎么利用Stacking實(shí)現(xiàn)機(jī)器學(xué)習(xí)

如果我們選擇堆疊集成作為最終模型,則可以像其他任何模型一樣擬合并使用它對(duì)新數(shù)據(jù)進(jìn)行預(yù)測(cè)。首先,將堆棧集合適合所有可用數(shù)據(jù),然后可以調(diào)用predict()函數(shù)對(duì)新數(shù)據(jù)進(jìn)行預(yù)測(cè)。下面的示例在我們的回歸數(shù)據(jù)集中展示了這一點(diǎn)。

# make a prediction with a stacking ensemble  from sklearn.datasets import make_regression  from sklearn.linear_model import LinearRegression  from sklearn.neighbors import KNeighborsRegressor  from sklearn.tree import DecisionTreeRegressor  from sklearn.svm import SVR  from sklearn.ensemble import StackingRegressor  # define dataset  X, y = make_regression(n_samples=1000, n_features=20, n_informative=15, noise=0.1, random_state=1)  # define the base models  level0 = list()  level0.append(('knn', KNeighborsRegressor()))  level0.append(('cart', DecisionTreeRegressor()))  level0.append(('svm', SVR()))  # define meta learner model level1 = LinearRegression()  # define the stacking ensemble  model = StackingRegressor(estimators=level0, final_estimator=level1, cv=5)  # fit the model on all available data  model.fit(X, y)  # make a prediction for one example data = [[0.59332206,-0.56637507,1.34808718,-0.57054047,-0.72480487,1.05648449,0.77744852,0.07361796,0.88398267,2.02843157,1.01902732,0.11227799,0.94218853,0.26741783,0.91458143,-0.72759572,1.08842814,-0.61450942,-0.69387293,1.69169009]] yhat = model.predict(data)  print('Predicted Value: %.3f' % (yhat))

運(yùn)行示例適合整個(gè)數(shù)據(jù)集上的堆疊集成模型,然后像在應(yīng)用程序中使用模型一樣,將其用于對(duì)新數(shù)據(jù)行進(jìn)行預(yù)測(cè)。

Predicted Value: 556.264

關(guān)于Python中怎么利用Stacking實(shí)現(xiàn)機(jī)器學(xué)習(xí)就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI