11-3-集成学习代码实现(详细注释版)

一、完整注释版代码(Jupyter Notebook格式)

数据集

# 导入numpy库,用于数值计算(数组操作、矩阵运算等)
import numpy as np
# 导入matplotlib.pyplot库,用于数据可视化(绘制散点图、折线图等)
import matplotlib.pyplot as plt
# 从sklearn的数据集模块导入make_moons函数,用于生成月牙形的二分类数据集
from sklearn.datasets import make_moons
# 生成月牙形数据集
x, y = make_moons(
    n_samples=1000,    # 生成的样本总数为1000个
    noise=0.4,         # 数据的噪声程度,0.4表示有一定程度的噪声(噪声越大,数据越分散)
    random_state=20    # 随机种子,设置为20保证每次运行生成的数据集完全相同,便于复现结果
)
# 查看特征矩阵x和标签数组y的形状
# x.shape输出(1000, 2)表示1000个样本,每个样本有2个特征;y.shape输出(1000,)表示1000个样本对应的标签
x.shape, y.shape
# 绘制散点图可视化数据集
# x[:, 0]:所有样本的第一个特征(x轴);x[:, 1]:所有样本的第二个特征(y轴)
# c = y:根据标签y设置点的颜色(不同类别不同颜色);s = 10:点的大小为10
plt.scatter(x[:, 0], x[:, 1], c = y, s = 10)
# 显示绘制的图形
plt.show()
# 图例说明:图中两种颜色的点分别代表月牙形数据集中的两个类别,噪声使得类别边界不是完全清晰的
# 从sklearn的模型选择模块导入train_test_split函数,用于划分训练集和测试集
from sklearn.model_selection import train_test_split
# 划分数据集:将x和y按默认比例(75%训练集,25%测试集)划分为训练集(x_train, y_train)和测试集(x_test, y_test)
# random_state = 0:设置随机种子,保证划分结果可复现
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state = 0)

集成学习

# 导入3个不同的分类器,用于后续集成学习
# KNeighborsClassifier:K近邻分类器(基于距离的分类方法)
from sklearn.neighbors import KNeighborsClassifier
# LogisticRegression:逻辑回归分类器(基于线性回归的二分类方法)
from sklearn.linear_model import LogisticRegression
# GaussianNB:高斯朴素贝叶斯分类器(基于贝叶斯定理+高斯分布假设的分类方法)
from sklearn.naive_bayes import GaussianNB
# 创建分类器列表,包含3个初始化后的分类器实例
clf = [
    KNeighborsClassifier(n_neighbors=3),  # K近邻分类器,设置邻居数为3
    LogisticRegression(),                 # 逻辑回归分类器,使用默认参数
    GaussianNB()                          # 高斯朴素贝叶斯分类器,使用默认参数
]
# 遍历分类器列表,训练每个分类器并评估其在测试集上的准确率
for i in range(len(clf)):
    # 用训练集数据训练第i个分类器(拟合模型)
    clf[i].fit(x_train, y_train)
    # 计算并打印第i个分类器在测试集上的准确率(score方法默认返回准确率)
    print(clf[i].score(x_test, y_test))
# 输出说明:三个数字分别是KNN、逻辑回归、高斯朴素贝叶斯的测试集准确率,约0.83-0.85之间
# 手动实现硬投票(多数投票)集成学习:
# 1. 创建与测试集标签形状相同的全0数组,用于存储投票结果
y_pred = np.zeros_like(y_test)
# 2. 遍历每个分类器,将其预测结果累加到y_pred中
for i in range(len(clf)):
    # 用第i个分类器对测试集进行预测,并将预测结果加到y_pred中
    y_pred += clf[i].predict(x_test)
# 3. 投票规则:3个分类器中,预测为1的票数<2则最终预测为0,≥2则最终预测为1
y_pred[y_pred < 2] = 0    # 票数不足2票(0或1票),最终类别为0
y_pred[y_pred >= 2] = 1   # 票数≥2票(2或3票),最终类别为1
# 输出最终的集成投票预测结果
y_pred
# 从sklearn的度量模块导入accuracy_score函数,用于计算准确率
from sklearn.metrics import accuracy_score
# 计算集成学习结果的准确率:对比测试集真实标签y_test和集成预测标签y_pred
accuracy_score(y_test, y_pred)
# 输出说明:集成后的准确率略高于单个分类器,体现了集成学习的优势

sklearn中的集成学习

# 从sklearn的集成模块导入VotingClassifier,这是sklearn内置的投票集成分类器
from sklearn.ensemble import VotingClassifier
# 重新创建分类器列表(与之前一致,保证对比性)
clf = [
    KNeighborsClassifier(n_neighbors=3),
    LogisticRegression(),
    GaussianNB()
]
# 初始化硬投票集成分类器
vclf = VotingClassifier(
    estimators=[
        ('knn', clf[0]),    # 第一个基分类器:命名为knn,对应K近邻分类器
        ('lr', clf[1]),     # 第二个基分类器:命名为lr,对应逻辑回归分类器
        ('gnb', clf[2])     # 第三个基分类器:命名为gnb,对应高斯朴素贝叶斯分类器
    ],
    voting='hard',          # 投票方式:hard(硬投票,基于预测类别投票)
    n_jobs=-1               # 并行运行的CPU核心数:-1表示使用所有可用核心
)
# 训练硬投票集成分类器
vclf.fit(x_train, y_train)
# 评估硬投票集成分类器在测试集上的准确率
vclf.score(x_test, y_test)
# 输出说明:结果与手动实现的硬投票一致,约0.852
# 初始化软投票集成分类器
vclf = VotingClassifier(
    estimators=[
        ('knn', clf[0]),
        ('lr', clf[1]),
        ('gnb', clf[2])
    ],
    voting='soft',          # 投票方式:soft(软投票,基于预测概率加权投票)
    n_jobs=-1
)
# 训练软投票集成分类器
vclf.fit(x_train, y_train)
# 评估软投票集成分类器在测试集上的准确率
vclf.score(x_test, y_test)
# 输出说明:软投票准确率(约0.868)高于硬投票,因为软投票利用了概率信息,更合理

二、核心知识点梳理

1. 数据集相关

函数/类所属库作用关键参数说明
make_moonssklearn.datasets生成月牙形二分类数据集,常用于分类算法测试n_samples:样本数;noise:噪声程度;random_state:随机种子
train_test_splitsklearn.model_selection划分训练集/测试集random_state:保证划分结果可复现;test_size:测试集比例(默认0.25)
plt.scattermatplotlib.pyplot绘制散点图c:颜色(可按标签赋值);s:点大小;x/y:坐标轴数据

2. 基分类器相关

分类器所属库核心原理适用场景
KNeighborsClassifiersklearn.neighbors基于距离的分类:新样本的类别由最近的k个邻居的类别决定数据量小、特征维度低的分类任务
LogisticRegressionsklearn.linear_model基于线性回归+Sigmoid函数:输出类别概率,阈值0.5划分类别二分类任务,可解释性强
GaussianNBsklearn.naive_bayes贝叶斯定理+高斯分布假设:假设特征服从高斯分布,计算后验概率特征独立、数据量小的分类任务

3. 集成学习核心概念

概念定义实现方式优缺点
硬投票(Hard Voting)多个分类器预测类别,少数服从多数1. 手动累加预测结果,按票数判定;2. VotingClassifier(voting='hard')优点:简单易实现;缺点:未利用概率信息,对所有分类器平等对待
软投票(Soft Voting)多个分类器预测类别概率,按概率加权求和后取最大值对应的类别VotingClassifier(voting='soft')优点:利用概率信息,准确率更高;缺点:要求基分类器支持概率预测
集成学习核心思想组合多个弱分类器,形成一个强分类器投票法、Bagging、Boosting等优点:降低过拟合风险,提升模型泛化能力;缺点:计算成本略高

4. 模型评估相关

函数所属库作用计算方式
score()所有sklearn分类器默认识别准确率(分类正确的样本数/总样本数)正确预测数 / 总样本数
accuracy_scoresklearn.metrics计算分类准确率score(),更通用(可手动传入真实值和预测值)

三、可直接运行的代码版本

版本1:Jupyter Notebook版(已在上方完整给出,可直接复制到Jupyter运行)

版本2:PyCharm版(无if name == ‘main’,可直接复制运行)

# 导入基础库
import numpy as np
import matplotlib.pyplot as plt

# 1. 生成并可视化数据集
from sklearn.datasets import make_moons
# 生成月牙形二分类数据集
x, y = make_moons(
    n_samples=1000,    # 1000个样本
    noise=0.4,         # 噪声0.4
    random_state=20    # 随机种子保证复现
)
# 打印数据形状
print("数据集形状:", x.shape, y.shape)

# 绘制数据集散点图
plt.scatter(x[:, 0], x[:, 1], c = y, s = 10)
plt.title("月牙形数据集可视化")  # 添加标题
plt.show()  # 显示图形

# 划分训练集和测试集
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state = 0)

# 2. 初始化单个基分类器
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import GaussianNB
# 创建分类器列表
clf = [
    KNeighborsClassifier(n_neighbors=3),  # KNN(k=3)
    LogisticRegression(),                 # 逻辑回归
    GaussianNB()                          # 高斯朴素贝叶斯
]

# 训练并评估单个分类器
print("\n单个分类器测试集准确率:")
for i in range(len(clf)):
    clf[i].fit(x_train, y_train)  # 训练分类器
    acc = clf[i].score(x_test, y_test)  # 计算准确率
    print(f"分类器{i+1}{clf[i].__class__.__name__}):{acc:.3f}")

# 3. 手动实现硬投票集成学习
y_pred = np.zeros_like(y_test)  # 初始化投票结果数组
for i in range(len(clf)):
    y_pred += clf[i].predict(x_test)  # 累加每个分类器的预测结果
# 投票规则:<2票为0,≥2票为1
y_pred[y_pred < 2] = 0
y_pred[y_pred >= 2] = 1
# 计算手动集成的准确率
from sklearn.metrics import accuracy_score
manual_acc = accuracy_score(y_test, y_pred)
print("\n手动硬投票集成准确率:", manual_acc)

# 4. 使用sklearn内置的VotingClassifier
from sklearn.ensemble import VotingClassifier
# 重新初始化分类器列表(保证独立性)
clf_sklearn = [
    KNeighborsClassifier(n_neighbors=3),
    LogisticRegression(),
    GaussianNB()
]

# 硬投票
vclf_hard = VotingClassifier(
    estimators=[('knn', clf_sklearn[0]), ('lr', clf_sklearn[1]), ('gnb', clf_sklearn[2])],
    voting='hard',
    n_jobs=-1
)
vclf_hard.fit(x_train, y_train)
hard_acc = vclf_hard.score(x_test, y_test)
print("sklearn硬投票集成准确率:", hard_acc)

# 软投票
vclf_soft = VotingClassifier(
    estimators=[('knn', clf_sklearn[0]), ('lr', clf_sklearn[1]), ('gnb', clf_sklearn[2])],
    voting='soft',
    n_jobs=-1
)
vclf_soft.fit(x_train, y_train)
soft_acc = vclf_soft.score(x_test, y_test)
print("sklearn软投票集成准确率:", soft_acc)

总结

  1. 集成学习核心:通过组合多个不同的基分类器(KNN、逻辑回归、朴素贝叶斯),利用投票法(硬/软)提升模型准确率,其效果通常优于单个分类器。
  2. 投票方式区别:硬投票基于类别投票(少数服从多数),软投票基于概率加权投票(更合理,准确率更高)。
  3. 关键工具函数make_moons生成测试数据集、train_test_split划分数据集、VotingClassifier实现集成投票、accuracy_score评估分类准确率。

这份笔记覆盖了集成学习的基础实现和核心概念,小白可直接运行代码并结合注释理解每一步的意义,也可直接发布到CSDN作为学习参考。

运行结果

数据集形状: (1000, 2) (1000,)

单个分类器测试集准确率:
分类器1(KNeighborsClassifier):0.832
分类器2(LogisticRegression):0.848
分类器3(GaussianNB):0.848

手动硬投票集成准确率: 0.852
sklearn硬投票集成准确率: 0.852
sklearn软投票集成准确率: 0.868

进程已结束,退出代码为 0

在这里插入图片描述

更多推荐