- Scikit 学习教程
- 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 - Boosting 方法
- Scikit Learn - 聚类方法
- 集群性能评估
- 使用 PCA 降维
- Scikit Learn 有用资源
- Scikit Learn - 快速指南
- Scikit Learn - 有用的资源
- Scikit Learn - 讨论
Scikit Learn - Boosting 方法
在本章中,我们将学习 Sklearn 中的 boosting 方法,它可以构建集成模型。
Boosting 方法以增量方式构建集成模型。主要原理是通过顺序训练每个基本模型估计器来增量构建模型。为了构建强大的集成,这些方法基本上结合了几周的学习器,这些学习器在训练数据的多次迭代上顺序训练。sklearn.ensemble 模块具有以下两种增强方法。
阿达助推器
它是最成功的增强集成方法之一,其主要关键在于它们为数据集中的实例赋予权重的方式。这就是为什么算法在构建后续模型时需要较少关注实例。
使用 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。在构建这个分类器时,该模块使用的主要参数是“损失”。这里,“loss”是要优化的损失函数的值。如果我们选择损失=偏差,它指的是概率输出分类的偏差。
另一方面,如果我们选择该参数的值为指数,那么它将恢复 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
梯度树增强回归
为了使用 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