
- Scikit Learn 教程
- Scikit Learn - 首頁
- Scikit Learn - 簡介
- Scikit Learn - 建模過程
- Scikit Learn - 資料表示
- Scikit Learn - 估計器API
- Scikit Learn - 約定
- Scikit Learn - 線性模型
- Scikit Learn - 擴充套件線性模型
- 隨機梯度下降
- Scikit Learn - 支援向量機
- Scikit Learn - 異常檢測
- Scikit Learn - K近鄰演算法
- Scikit Learn - KNN學習
- 樸素貝葉斯分類
- Scikit Learn - 決策樹
- 隨機決策樹
- Scikit Learn - 整合方法
- Scikit Learn - 聚類方法
- 聚類效能評估
- 使用PCA進行降維
- Scikit Learn 有用資源
- Scikit Learn - 快速指南
- Scikit Learn - 有用資源
- Scikit Learn - 討論
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