Scikit Learn 简明教程

Scikit Learn - Boosting Methods

在本章中,我们将了解 Sklearn 中的提升方法,它能够构建集成模型。

提升方法以增量方式构建集成模型。其主要原则是逐步构建模型,通过顺序训练每个基础模型估计器。为了构建强大的集成,这些方法在基本上结合了多个弱学习器,并在训练数据的多轮迭代中对它们进行顺序训练。sklearn.ensemble 模块具有以下两种提升方法。

AdaBoost

它是其中一种最成功的提升集成方法,其主要原理是它为数据集中的实例赋予权重的方式。这是算法在构建后续模型时为什么需要较少关注实例的原因。

Classification with AdaBoost

为了创建 AdaBoost 分类器,Scikit-learn 模块提供 sklearn.ensemble.AdaBoostClassifier 。在构建此分类器时,此模块使用 base_estimator 作为主要参数。在此处,base_estimator 是 base estimator 的值,它用于构建提升集成。如果我们将此参数的值选择为“none”,则基础估计器将为 DecisionTreeClassifier(max_depth=1)

Implementation example

在以下示例中,我们将通过使用 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)

Output

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

Example

拟合完成后,可以预测新值,如下所示:

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

Output

[1]

Example

现在,可以检查分数,如下所示:

ADBclf.score(X, y)

Output

0.995

Example

我们还可使用 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())

Output

0.7851435406698566

Regression with AdaBoost

为了使用 Ada Boost 方法创建回归器,Scikit-learn 库提供了 sklearn.ensemble.AdaBoostRegressor 。在构建回归器时,它将使用 sklearn.ensemble.AdaBoostClassifier 使用的相同参数。

Implementation example

在以下示例中,我们将通过使用 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)

Output

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

Example

拟合完成后,可以预测回归模型,如下所示:

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

Output

[85.50955817]

Gradient Tree Boosting

它也称为 Gradient Boosted Regression Trees (GRBT)。它基本上是任意可微损失函数的提升的概括。它以弱预测模型集成体的形式生成预测模型。它可用于回归和分类问题。它们的优势主要在于它们自然地处理混合类型数据。

Classification with Gradient Tree Boost

为了创建梯度树提升分类器,Scikit-learn 模块提供了 sklearn.ensemble.GradientBoostingClassifier 。在构建此分类器时,此模块使用 n_estimators 作为主要参数。在此处,“损失”是需要优化的损失函数的值。如果我们选择 loss = deviance,则它指的是针对具有概率输出的分类的偏差。

另一方面,如果我们将此参数的值选择为指数,则它将恢复 AdaBoost 算法。参数 n_estimators 将控制弱学习器的数量。名为 learning_rate (在 (0.0, 1.0] 范围内)的超参数将通过收缩控制过拟合。

Implementation example

在以下示例中,我们将通过使用 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)

Output

0.8724285714285714

Example

我们还可以使用 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())

Output

0.7946582356674234

Regression with Gradient Tree Boost

为了通过梯度树提升方法创建回归器,Scikit-learn library 提供了 sklearn.ensemble.GradientBoostingRegressor 。它可以通过参数名称 loss 指定用于回归的损失函数。loss 的默认值为“ls”。

Implementation example

在下例中,我们通过使用 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))

Output

5.391246106657164