使用 scikit-learn 进行集成建模

发布日期:2026-07-11 11:52:05   来源 : 杭州电子商务研究院    浏览量 :17
杭州电子商务研究院 发布日期:2026-07-11 11:52:05  
17

介绍

集成方法是一种先进的技术,通常用于解决复杂的机器学习问题。简而言之,这是一个将不同的独立模型(也称为“弱学习器”)组合在一起以产生结果的过程。假设组合多个模型可以通过减少泛化误差来产生更好的结果。集成建模最流行的三种方法是 Bagging、Boosting 和 Voting。

在本指南中,您将学习如何使用 scikit-learn 实现以下集成建模技术:

  1. 袋装决策树
  2. 随机森林
  3. 自适应增强算法
  4. 随机梯度提升
  5. 表决

我们将从了解问题陈述和数据开始。

问题陈述

在本指南中,我们将尝试识别字母,这是机器学习最早的应用之一。在这个问题中,我们将建立一个模型,使用罗马字母表中四个字母(A、B、P 和 R)的图像统计数据来预测图像对应的字母。

数据来自UCI机器学习库,包含17个变量的3116条记录:

  1. 字母 - 图像对应的字母(A、B、P 或 R)。这是目标变量。
  2. xbox——覆盖字母形状的最小框的开始水平位置。
  3. ybox - 覆盖字母形状的最小框的开始垂直位置。
  4. 宽度——最小框的宽度。
  5. 高度——最小盒子的高度。
  6. onpix - 字符图像中“on”像素的总数。
  7. xbar - 所有“开”像素的平均水平位置。
  8. ybar - 所有“开启”像素的平均垂直位置。
  9. x2bar - 图像中所有“开”像素的平均平方水平位置。
  10. y2bar - 图像中所有“开启”像素的平均平方垂直位置。
  11. xybar - 图像中所有“开”像素的水平和垂直位置乘积的平均值。
  12. x2ybar - 所有“开启”像素的水平位置平方与垂直位置乘积的平均值。
  13. xy2bar - 所有“开”像素的水平位置与垂直位置平方的乘积的平均值。
  14. xedge - 沿图像的整个垂直长度从左到右扫描图像时边缘的平均数(“关闭”像素后面跟着“打开”像素的次数,或击中图像边界的次数)。
  15. xedgeycor - 每个垂直位置的水平边数与垂直位置的乘积的平均值。
  16. yedge - 沿图像的整个水平长度从上到下扫描图像时的边缘平均数。
  17. 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

以上内容来自杭州电子商务研究院推送
关注
关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
Copyright © 2025-2027 ToB产业网址导航 公安备案 浙公网安备33010602013138号 浙ICP备16025413号-9
支持 反馈 关注 数据