23. 异质集成投票方法应用#

23.1. 介绍#

前面集成学习算法实验中,我们重点介绍了 Bagging 和 Boosting 两类,其中 Bagging 主要是应用了投票法。但无论是 Bagging Tree 还是随机森林,都采用了决策树算法进行同质集成。本次挑战中,我们将学会应用不同算法进行异质集成学习。

23.2. 知识点#

  • CART 决策树分类

  • 网格搜索参数选择

本次挑战我们依旧沿用集成学习实验中的学生成绩数据集。我们先加载数据集并完成训练和测试集切分。

import pandas as pd
from sklearn.model_selection import train_test_split

stu_data = pd.read_csv(
    "https://cdn.huhuhang.com/hands-on-ai/files/course-14-student.csv",
    index_col=0
)

X_train, X_test, y_train, y_test = train_test_split(
    stu_data.iloc[:, :-1], stu_data["G3"], test_size=0.3, random_state=35
)

X_train.shape, X_test.shape, y_train.shape, y_test.shape
((276, 26), (119, 26), (276,), (119,))

23.3. 投票分类器#

下面,我们介绍 scikit-learn 提供的 VotingClassifier 投票分类器 官方文档

sklearn.ensemble.VotingClassifier(estimators, voting='hard')

其中:

  • estimators:可以通过列表套元组的方式 [('name1', model1), ('name2', model2)] 传入多个不同的分类器。

  • voting:可选 hardsoft

voting='hard' 时,相当于前面说过的多数投票法。例如对于某样本判定:

  • 分类器 1 → 类别 1

  • 分类器 2 → 类别 1

  • 分类器 3 → 类别 2

最终预测该样本属于类别 1。

voting='soft' 时,相当于前面说过的加权投票法。例如对于某样本判定,我们预先设定 3 个类别的权重为 \(w_1=1\), \(w_2=1\), \(w_3=1\),那么根据分类器返回的类别概率,就可以得到最终在 3 个类别上的平均概率,示例计算表格如下:

分类器 类别 1 类别 2 类别 3
分类器 1 w1 * 0.2 w1 * 0.5 w1 * 0.3
分类器 2 w2 * 0.6 w2 * 0.3 w2 * 0.1
分类器 3 w3 * 0.3 w3 * 0.4 w3 * 0.3
平均概率 0.37 0.4 0.23

表格中,以分类器 1 为例,分类器返回的 3 个类别概率为 0.2, 0.5, 0.3,需要分别乘以预设权重 w1, w2, w3。最终,因为类别 2 平均加权概率最大,所以判定样本属于类别 2。

Exercise 23.1

挑战:学习并使用 VotingClassifier 完成异质集成投票分类。

规定:比较逻辑回归,决策树,朴素贝叶斯高斯方法等 3 个「个体分类器」与其组成的 VotingClassifier 测试结果,可以自由选定参数。

from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import GaussianNB
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import VotingClassifier

## 代码开始 ### (>5 行代码)

## 代码结束 ###

最终期望得到 3 个分类器与 VotingClassifier 在测试集上的分类准确率。

期望输出

LogisticRegression: 0.76
DecisionTreeClassifier: 0.87
GaussianNB: 0.53
VotingClassifier: 0.78

上面给出的结果仅供参考,数值随着参数可能发生变化。

你可能在完成挑战的过程中会发现 VotingClassifier 的结果不一定优于全部的个体分类器,例如上面参考输出给出的结果一样。实际上这是正常现象,个体学习器往往会对训练数据过拟合,而 VotingClassifier 因为采用多数投票可以很好避免。除此之外 voting='soft' 可能会比 voting='hard' 的结果更为糟糕,原因是不一定能准确把握类别权重的设置。

所以,VotingClassifier 不一定是在单数据集上表现最好的分类器,但应该是能够较好避免过拟合的分类器。