【耿直哥机器学习】11-3-集成学习代码实现
·
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_moons | sklearn.datasets | 生成月牙形二分类数据集,常用于分类算法测试 | n_samples:样本数;noise:噪声程度;random_state:随机种子 |
train_test_split | sklearn.model_selection | 划分训练集/测试集 | random_state:保证划分结果可复现;test_size:测试集比例(默认0.25) |
plt.scatter | matplotlib.pyplot | 绘制散点图 | c:颜色(可按标签赋值);s:点大小;x/y:坐标轴数据 |
2. 基分类器相关
| 分类器 | 所属库 | 核心原理 | 适用场景 |
|---|---|---|---|
KNeighborsClassifier | sklearn.neighbors | 基于距离的分类:新样本的类别由最近的k个邻居的类别决定 | 数据量小、特征维度低的分类任务 |
LogisticRegression | sklearn.linear_model | 基于线性回归+Sigmoid函数:输出类别概率,阈值0.5划分类别 | 二分类任务,可解释性强 |
GaussianNB | sklearn.naive_bayes | 贝叶斯定理+高斯分布假设:假设特征服从高斯分布,计算后验概率 | 特征独立、数据量小的分类任务 |
3. 集成学习核心概念
| 概念 | 定义 | 实现方式 | 优缺点 |
|---|---|---|---|
| 硬投票(Hard Voting) | 多个分类器预测类别,少数服从多数 | 1. 手动累加预测结果,按票数判定;2. VotingClassifier(voting='hard') | 优点:简单易实现;缺点:未利用概率信息,对所有分类器平等对待 |
| 软投票(Soft Voting) | 多个分类器预测类别概率,按概率加权求和后取最大值对应的类别 | VotingClassifier(voting='soft') | 优点:利用概率信息,准确率更高;缺点:要求基分类器支持概率预测 |
| 集成学习核心思想 | 组合多个弱分类器,形成一个强分类器 | 投票法、Bagging、Boosting等 | 优点:降低过拟合风险,提升模型泛化能力;缺点:计算成本略高 |
4. 模型评估相关
| 函数 | 所属库 | 作用 | 计算方式 |
|---|---|---|---|
score() | 所有sklearn分类器 | 默认识别准确率(分类正确的样本数/总样本数) | 正确预测数 / 总样本数 |
accuracy_score | sklearn.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)
总结
- 集成学习核心:通过组合多个不同的基分类器(KNN、逻辑回归、朴素贝叶斯),利用投票法(硬/软)提升模型准确率,其效果通常优于单个分类器。
- 投票方式区别:硬投票基于类别投票(少数服从多数),软投票基于概率加权投票(更合理,准确率更高)。
- 关键工具函数:
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

更多推荐
所有评论(0)