使用 scikit-learn 进行集成建模
介绍
集成方法是一种先进的技术,通常用于解决复杂的机器学习问题。简而言之,这是一个将不同的独立模型(也称为“弱学习器”)组合在一起以产生结果的过程。假设组合多个模型可以通过减少泛化误差来产生更好的结果。集成建模最流行的三种方法是 Bagging、Boosting 和 Voting。
在本指南中,您将学习如何使用 scikit-learn 实现以下集成建模技术:
- 袋装决策树
- 随机森林
- 自适应增强算法
- 随机梯度提升
- 表决
我们将从了解问题陈述和数据开始。
问题陈述
在本指南中,我们将尝试识别字母,这是机器学习最早的应用之一。在这个问题中,我们将建立一个模型,使用罗马字母表中四个字母(A、B、P 和 R)的图像统计数据来预测图像对应的字母。
数据来自UCI机器学习库,包含17个变量的3116条记录:
- 字母 - 图像对应的字母(A、B、P 或 R)。这是目标变量。
- xbox——覆盖字母形状的最小框的开始水平位置。
- ybox - 覆盖字母形状的最小框的开始垂直位置。
- 宽度——最小框的宽度。
- 高度——最小盒子的高度。
- onpix - 字符图像中“on”像素的总数。
- xbar - 所有“开”像素的平均水平位置。
- ybar - 所有“开启”像素的平均垂直位置。
- x2bar - 图像中所有“开”像素的平均平方水平位置。
- y2bar - 图像中所有“开启”像素的平均平方垂直位置。
- xybar - 图像中所有“开”像素的水平和垂直位置乘积的平均值。
- x2ybar - 所有“开启”像素的水平位置平方与垂直位置乘积的平均值。
- xy2bar - 所有“开”像素的水平位置与垂直位置平方的乘积的平均值。
- xedge - 沿图像的整个垂直长度从左到右扫描图像时边缘的平均数(“关闭”像素后面跟着“打开”像素的次数,或击中图像边界的次数)。
- xedgeycor - 每个垂直位置的水平边数与垂直位置的乘积的平均值。
- yedge - 沿图像的整个水平长度从上到下扫描图像时的边缘平均数。
- yedgexcor = 每个水平位置的垂直边缘数量与水平位置的乘积的平均值。
步骤
在本指南中,我们将遵循以下步骤:
步骤 1——加载所需的库和模块。
第 2 步——加载数据并执行基本数据检查。
步骤 3-为特征和响应变量创建数组。
步骤4-构建和评估单一算法。
第 5 步-构建、预测和评估各种集成模型。
以下部分将介绍这些步骤。
步骤 1 - 加载所需的库和模块
# Import required libraries
import pandas as pd
import numpy as np
# Import necessary modules
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix, classification_report
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
from sklearn.ensemble import VotingClassifier
from sklearn import model_selection
from sklearn.ensemble import BaggingClassifier
from sklearn.ensemble import RandomForestClassifier
第 2 步 - 读取数据并执行基本数据检查
第一行代码将数据读入为 pandas 数据框,而第二行打印形状 - 17 个变量的 3116 个观测值。第三行给出数据的前 10 条记录。请注意,这是一个多类分类问题,有 4 个类别或字母需要预测 - A、B、R 和 P。
# Load data
df = pd.read_csv('letters.csv')
print(df.shape)
df.head(10)
输出:
(3116, 17)
| | letter | xbox | ybox | width | height | onpix | xbar | ybar | x2bar | y2bar | xybar | x2ybar | xy2bar | xedge | xedgeycor | yedge | yedgexcor |
|--- |-------- |------ |------ |------- |-------- |------- |------ |------ |------- |------- |------- |-------- |-------- |------- |----------- |------- |----------- |
| 0 | B | 4 | 2 | 5 | 4 | 4 | 8 | 7 | 6 | 6 | 7 | 6 | 6 | 2 | 8 | 7 | 10 |
| 1 | A | 1 | 1 | 3 | 2 | 1 | 8 | 2 | 2 | 2 | 8 | 2 | 8 | 1 | 6 | 2 | 7 |
| 2 | R | 5 | 9 | 5 | 7 | 6 | 6 | 11 | 7 | 3 | 7 | 3 | 9 | 2 | 7 | 5 | 11 |
| 3 | B | 5 | 9 | 7 | 7 | 10 | 9 | 8 | 4 | 4 | 6 | 8 | 6 | 6 | 11 | 8 | 7 |
| 4 | P | 3 | 6 | 4 | 4 | 2 | 4 | 14 | 8 | 1 | 11 | 6 | 3 | 0 | 10 | 4 | 8 |
| 5 | R | 8 | 10 | 8 | 6 | 6 | 7 | 7 | 3 | 5 | 8 | 4 | 8 | 6 | 6 | 7 | 7 |
| 6 | R | 2 | 6 | 4 | 4 | 3 | 6 | 7 | 5 | 5 | 6 | 5 | 7 | 3 | 7 | 5 | 8 |
| 7 | A | 3 | 7 | 5 | 5 | 3 | 12 | 2 | 3 | 2 | 10 | 2 | 9 | 2 | 6 | 3 | 8 |
| 8 | P | 8 | 14 | 7 | 8 | 4 | 5 | 10 | 6 | 3 | 12 | 5 | 4 | 4 | 10 | 4 | 8 |
| 9 | P | 6 | 10 | 8 | 8 | 7 | 8 | 5 | 7 | 5 | 7 | 6 | 6 | 3 | 9 | 8 | 9 |
步骤 3 - 为特征和响应变量创建数组
第一行代码创建了目标变量“y”的对象。第二行给出了除目标变量“letter”之外的所有特征的列表。
# Create arrays for the features and the response variable
y = df['letter'].values
x = df.drop('letter', axis=1).values
步骤 4 - 构建和评估单一算法
集成建模的目标是通过组合多个模型来提高单个模型的性能。因此,我们将从一种算法开始设置基准性能指标。在我们的例子中,我们将构建逻辑回归算法。
第一行代码创建训练和测试集,其中“test_size”参数指定要保留在测试数据中的数据百分比。第二行实例化 Logistic 回归算法,而第三行在训练数据集上拟合模型。第四行在测试数据上生成预测,而第五至第七行代码打印输出。
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state=10)
logreg = LogisticRegression()
logreg.fit(X_train, y_train)
y_pred = logreg.predict(X_test)
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
(216+221+214+219)/(227+244+224+240)
输出:
[216 3 1 7]
[ 0 221 0 23]
[ 2 4 214 4]
[ 0 21 0 219]]
precision recall f1-score support
A 0.99 0.95 0.97 227
B 0.89 0.91 0.90 244
P 1.00 0.96 0.97 224
R 0.87 0.91 0.89 240
avg / total 0.93 0.93 0.93 935
0.93048128342246
我们看到单个模型的准确率为 93%。现在我们将构建各种集成模型,看看它是否能提高性能。
装袋
Bagging 或 Bootstrap Aggregation 是一种集成方法,它涉及使用从训练数据中抽取的不同子集多次训练相同的算法。然后对所有子模型的预测取最终输出预测的平均值。两种最流行的 bagging 集成技术是 Bagged 决策树和随机森林。
装袋分类器
此方法最适合方差较大的算法,例如决策树。在 scikit-learn 中,bagging 方法作为统一的 BaggingClassifier 元估计器提供。
第一行代码创建了 kfold 交叉验证框架。第二行实例化 BaggingClassifier() 模型,以决策树作为基本估计器,树的数量为 100。第三行生成数据的交叉验证分数,而第四行打印平均交叉验证准确度分数。
# Bagged Decision Trees for Classification
kfold = model_selection.KFold(n_splits=10, random_state=10)
model_1 = BaggingClassifier(base_estimator=DecisionTreeClassifier(), n_estimators=100, random_state=10)
results_1 = model_selection.cross_val_score(model_1, x, y, cv=kfold)
print(results_1.mean())
输出:
0.971121897931
BaggingClassifier 集成的准确率为 97.11%,比单一逻辑回归模型有显著的提高。
随机森林
随机森林是袋装决策树的扩展,其中训练数据集的样本是随机取的。构建树的目的是减少各个决策树之间的相关性。在 scikit-learn 中,使用 RandomForestClassifier 类构建随机森林模型。
第一行代码创建 kfold 交叉验证对象。第二行实例化 RandomForestClassifier() 集成。第三行生成数据的交叉验证分数,而第四行打印平均交叉验证准确度分数。
# Random Forest Classification
kfold_rf = model_selection.KFold(n_splits=10, random_state=10)
model_rf = RandomForestClassifier(n_estimators=100, max_features=5)
results_rf = model_selection.cross_val_score(model_rf, x, y, cv=kfold_rf)
print(results_rf.mean())
输出:
0.9890943194
RandomForestClassifier 集成的准确率为 98.90%,比其他模型有显著的提高。
提升
在 Boosting 中,多个模型会按顺序进行训练,每个模型都会从其前辈的错误中学习。在本指南中,我们将实现 AdaBoost 和 Gradient Boosting 两种增强技术。
自适应增强或 AdaBoost
AdaBoost 是“自适应增强”的缩写,是 Freund 和 Schapire 于 1996 年提出的第一个实用的增强算法。它专注于分类问题,旨在将一组弱分类器转换为强分类器。
在 scikit-learn 中,使用 AdaBoostClassifier 类构建 adaboost 模型。第一行代码创建 kfold 交叉验证对象。第二行实例化 AdaBoostClassifier() 集成。第三行生成数据的交叉验证分数,而第四行打印平均交叉验证准确度分数。
from sklearn.ensemble import AdaBoostClassifier
kfold_ada = model_selection.KFold(n_splits=10, random_state=10)
model_ada = AdaBoostClassifier(n_estimators=30, random_state=10)
results_ada = model_selection.cross_val_score(model_ada, x, y, cv=kfold_ada)
print(results_ada.mean())
输出:
0.848199563031
AdaBoostClassifier 集成的准确率为 84.82%,低于其他模型。
随机梯度提升
在 scikit-learn 中,使用 GradientBoostingClassifier 类构建随机梯度提升模型。执行此集成技术的步骤几乎与上面讨论的步骤完全相同,除了<font style="vertical-align: i
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~