Scikit Learn - 整合方法



本章,我們將學習Sklearn中的整合方法,它可以構建整合模型。

整合方法以增量方式構建整合模型。其主要原理是透過依次訓練每個基礎模型估計器來增量地構建模型。為了構建強大的整合,這些方法基本上結合了幾個弱學習器,這些弱學習器在多次訓練資料迭代中依次訓練。sklearn.ensemble模組包含以下兩種整合方法。

AdaBoost

它是最成功的整合方法之一,其主要關鍵在於賦予資料集中例項權重的方式。這就是為什麼該演算法在構建後續模型時需要較少關注這些例項的原因。

AdaBoost分類

為了建立AdaBoost分類器,Scikit-learn模組提供了sklearn.ensemble.AdaBoostClassifier。在構建此分類器時,此模組使用的主要引數是base_estimator。這裡,base_estimator是從其構建增強整合的基礎估計器的值。如果我們將此引數的值選擇為None,則基礎估計器將為DecisionTreeClassifier(max_depth=1)

實現示例

在下面的示例中,我們使用sklearn.ensemble.AdaBoostClassifier構建AdaBoost分類器,並預測並檢查其分數。

from sklearn.ensemble import AdaBoostClassifier
from sklearn.datasets import make_classification
X, y = make_classification(n_samples = 1000, n_features = 10,n_informative = 2, n_redundant = 0,random_state = 0, shuffle = False)
ADBclf = AdaBoostClassifier(n_estimators = 100, random_state = 0)
ADBclf.fit(X, y)

輸出

AdaBoostClassifier(algorithm = 'SAMME.R', base_estimator = None,
learning_rate = 1.0, n_estimators = 100, random_state = 0)

示例

擬合後,我們可以如下預測新值:

print(ADBclf.predict([[0, 2, 3, 0, 1, 1, 1, 1, 2, 2]]))

輸出

[1]

示例

現在我們可以如下檢查分數:

ADBclf.score(X, y)

輸出

0.995

示例

我們還可以使用sklearn資料集使用Extra-Tree方法構建分類器。例如,在下面給出的示例中,我們使用Pima-Indian資料集。

from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import AdaBoostClassifier
path = r"C:\pima-indians-diabetes.csv"
headernames = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names = headernames)
array = data.values
X = array[:,0:8]
Y = array[:,8]
seed = 5
kfold = KFold(n_splits = 10, random_state = seed)
num_trees = 100
max_features = 5
ADBclf = AdaBoostClassifier(n_estimators = num_trees, max_features = max_features)
results = cross_val_score(ADBclf, X, Y, cv = kfold)
print(results.mean())

輸出

0.7851435406698566

AdaBoost迴歸

為了使用Ada Boost方法建立迴歸器,Scikit-learn庫提供了sklearn.ensemble.AdaBoostRegressor。在構建迴歸器時,它將使用與sklearn.ensemble.AdaBoostClassifier相同的引數。

實現示例

在下面的示例中,我們使用sklearn.ensemble.AdaBoostRegressor構建AdaBoost迴歸器,並使用predict()方法預測新值。

from sklearn.ensemble import AdaBoostRegressor
from sklearn.datasets import make_regression
X, y = make_regression(n_features = 10, n_informative = 2,random_state = 0, shuffle = False)
ADBregr = RandomForestRegressor(random_state = 0,n_estimators = 100)
ADBregr.fit(X, y)

輸出

AdaBoostRegressor(base_estimator = None, learning_rate = 1.0, loss = 'linear',
n_estimators = 100, random_state = 0)

示例

擬合後,我們可以從迴歸模型中進行如下預測:

print(ADBregr.predict([[0, 2, 3, 0, 1, 1, 1, 1, 2, 2]]))

輸出

[85.50955817]

梯度提升樹

它也稱為梯度提升迴歸樹(GRBT)。它基本上是將提升推廣到任意可微損失函式。它以弱預測模型集合的形式生成預測模型。它可用於迴歸和分類問題。它們的主要優點在於它們自然地處理混合型別資料。

梯度提升樹分類

為了建立梯度提升樹分類器,Scikit-learn模組提供了sklearn.ensemble.GradientBoostingClassifier。在構建此分類器時,此模組使用的主要引數是“loss”。這裡,“loss”是要最佳化的損失函式的值。如果我們選擇loss = deviance,則它指的是具有機率輸出的分類的偏差。

另一方面,如果我們將此引數的值選擇為exponential,則它將恢復AdaBoost演算法。引數n_estimators將控制弱學習器的數量。名為learning_rate的超引數(範圍為(0.0, 1.0])將透過收縮來控制過擬合。

實現示例

在下面的示例中,我們使用sklearn.ensemble.GradientBoostingClassifier構建梯度提升分類器。我們用50個弱學習器擬合此分類器。

from sklearn.datasets import make_hastie_10_2
from sklearn.ensemble import GradientBoostingClassifier
X, y = make_hastie_10_2(random_state = 0)
X_train, X_test = X[:5000], X[5000:]
y_train, y_test = y[:5000], y[5000:]

GDBclf = GradientBoostingClassifier(n_estimators = 50, learning_rate = 1.0,max_depth = 1, random_state = 0).fit(X_train, y_train)
GDBclf.score(X_test, y_test)

輸出

0.8724285714285714

示例

我們還可以使用sklearn資料集使用梯度提升分類器構建分類器。在下面的示例中,我們使用Pima-Indian資料集。

from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import GradientBoostingClassifier
path = r"C:\pima-indians-diabetes.csv"
headernames = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names = headernames)
array = data.values
X = array[:,0:8]
Y = array[:,8]
seed = 5
kfold = KFold(n_splits = 10, random_state = seed)
num_trees = 100
max_features = 5
ADBclf = GradientBoostingClassifier(n_estimators = num_trees, max_features = max_features)
results = cross_val_score(ADBclf, X, Y, cv = kfold)
print(results.mean())

輸出

0.7946582356674234

梯度提升樹迴歸

為了使用梯度提升樹方法建立迴歸器,Scikit-learn庫提供了sklearn.ensemble.GradientBoostingRegressor。它可以透過名為loss的引數指定迴歸的損失函式。loss的預設值為“ls”。

實現示例

在下面的示例中,我們使用sklearn.ensemble.GradientBoostingRegressor構建梯度提升迴歸器,並使用mean_squared_error()方法找到均方誤差。

import numpy as np
from sklearn.metrics import mean_squared_error
from sklearn.datasets import make_friedman1
from sklearn.ensemble import GradientBoostingRegressor
X, y = make_friedman1(n_samples = 2000, random_state = 0, noise = 1.0)
X_train, X_test = X[:1000], X[1000:]
y_train, y_test = y[:1000], y[1000:]
GDBreg = GradientBoostingRegressor(n_estimators = 80, learning_rate=0.1,
max_depth = 1, random_state = 0, loss = 'ls').fit(X_train, y_train)

擬合後,我們可以如下找到均方誤差:

mean_squared_error(y_test, GDBreg.predict(X_test))

輸出

5.391246106657164
廣告