📜  Scikit学习-增强方法

📅  最后修改于: 2020-12-10 05:56:41             🧑  作者: Mango


在本章中,我们将学习Sklearn中的增强方法,该方法可以构建集成模型。

Boosting方法以增量方式构建集成模型。主要原理是通过顺序地训练每个基本模型估计量来逐步构建模型。为了建立强大的整体,这些方法基本上结合了几个星期的学习者,这些学习者在训练数据的多次迭代中被顺序训练。 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)。从根本上讲,它是推广到任意微分损失函数的一般化。它以周预测模型的集合的形式生成预测模型。它可以用于回归和分类问题。它们的主要优点在于它们自然地处理混合类型数据。

使用梯度树增强进行分类

为了创建Gradient Tree Boost分类器,Scikit-learn模块提供了sklearn.ensemble.GradientBoostingClassifier 。在构建此分类器时,此模块使用的主要参数是“损失”。在此,“损失”是要优化的损失函数的值。如果我们选择损失=偏差,则它是指偏差与概率输出的分类。

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

实施实例

在以下示例中,我们通过使用sklearn.ensemble.GradientBoostingClassifier构建一个Gradient Boosting分类。我们正在为这个分类器配备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数据集通过Gradient Boosting分类器构建分类器。如以下示例所示,我们使用的是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

用梯度树增强进行回归

为了使用Gradient Tree Boost方法创建回归器,Scikit-learn库提供了sklearn.ensemble.GradientBoostingRegressor 。它可以通过参数名称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