在集成学习中,多样性是一个关键概念,简单来说,多样性衡量的是各个学习器之间的差异程度。
如果学习器之间差异很大,那么它们的组合就更有可能覆盖更多的情况,从而提高集成模型的性能,
就像足球队需要不同位置的球员配合一样。
下面介绍四种常用的多样性度量方法及其实现。
1. 不合度量(Disagreement Measure)
不合度量是一种非常直观的多样性度量方法。
它通过计算两个学习器在样本上的预测结果不一致的比例来衡量它们之间的差异。
不合度量的值介于0到1之间,值越接近 1
,说明两个学习器的预测结果越不一致,多样性越高。
假设我们有两个学习器和,对于一个数据集中的每个样本,如果和的预测结果不同,那么就认为它们在这个样本上**“不合”**。
不合度量就是这种**“不合”**情况的比例。
为了演示如何度量多样性,我们先创建两个不同的决策树模型:
import numpy as npfrom sklearn.datasets import make_classificationfrom sklearn.model_selection import train_test_splitfrom sklearn.tree import DecisionTreeClassifier# 生成数据X, y = make_classification( n_samples=100, n_features=20, n_informative=10, n_redundant=10, random_state=42)X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42)# 训练两个不同的决策树clf1 = DecisionTreeClassifier(random_state=42)clf2 = DecisionTreeClassifier(random_state=43)clf1.fit(X_train, y_train)clf2.fit(X_train, y_train)# 预测测试集y_pred1 = clf1.predict(X_test)y_pred2 = clf2.predict(X_test)
然后,我们看看如何计算两个模型的不合度量(Disagreement Measure
)。
# 计算不合度量disagreement = np.mean(y_pred1 != y_pred2)print(f"不合度量: {disagreement}")## 输出结果:# 不合度量: 0.2
2. 相关系数(Correlation Coefficient)
相关系数衡量的是两个学习器预测结果之间的线性相关性。
如果两个学习器的预测结果完全一致,相关系数为1
;
如果完全相反,相关系数为-1
;
如果两者之间没有线性关系,相关系数接近 0
。
在集成学习中,我们希望相关系数越低越好,因为这意味着学习器之间的差异更大。
相关系数是通过计算两个学习器预测结果的协方差与它们各自的标准差的比值来得到的。
其公式为:
其中,是协方差,和分别是和的标准差。
使用代码来计算相关系数也很简单,同样使用上面创建的两个决策树模型。
import numpy as np# 计算相关系数correlation = np.corrcoef(y_pred1, y_pred2)[0, 1]print(f"相关系数: {correlation}")## 输出结果:# 相关系数: 0.6637465183030644
3. Q-统计量(Q-Statistic)
Q-统计量是另一种衡量学习器之间一致性和差异性的指标。
它通过比较两个学习器在样本上的预测结果来计算。
Q-统计量的值介于**-1 到 1 之间**,值越接近 1
,说明两个学习器的预测结果越一致;
值越接近-1
,说明它们的预测结果越不一致。
Q-统计量的计算公式为:
其中:
- 是两个学习器都正确预测的样本数是第一个学习器正确预测,第二个学习器错误预测的样本数是第一个学习器错误预测,第二个学习器正确预测的样本数是两个学习器都错误预测的样本数
计算Q-统计量的示例代码如下:
from sklearn.metrics import confusion_matrix# 计算混淆矩阵cm = confusion_matrix(y_test, y_pred1, labels=[0, 1])a = np.sum((y_pred1 == y_test) & (y_pred2 == y_test))b = np.sum((y_pred1 == y_test) & (y_pred2 != y_test))c = np.sum((y_pred1 != y_test) & (y_pred2 == y_test))d = np.sum((y_pred1 != y_test) & (y_pred2 != y_test))# 计算 Q-统计量q_statistic = (a * d - b * c) / ((a + b) * (c + d))print(f"Q-统计量: {q_statistic}")## 输出结果:# Q-统计量: 0.5757575757575758
4. k-统计量(Kappa Statistic)
k-统计量是一种衡量分类器性能的指标,它考虑了分类器的正确率和随机猜测的正确率。
在集成学习中,k-统计量可以用来衡量两个学习器之间的多样性。
k-统计量的值介于**-1 到 1 之间**,值越接近 1
,说明两个学习器的预测结果越一致;
值越接近-1
,说明它们的预测结果越不一致。
k-统计量的计算公式为:
其中:
- 是两个学习器预测结果一致的比例是随机猜测下两个学习器预测结果一致的比例
计算k统计量的示例代码如下:
from sklearn.metrics import cohen_kappa_score# 计算 k-统计量kappa_statistic = cohen_kappa_score(y_pred1, y_pred2)print(f"Kappa 统计量: {kappa_statistic}")## 输出结果:# Kappa 统计量: 0.6116504854368932
5. 指标使用建议
在实际场景中,我们应该如何使用这些指标呢?下面是一些使用建议:
- 在
Bagging
中优先关注不合度量构建Stacking
时参考相关系数使用Q-statistic
诊断高相关模型Kappa
值过低时考虑增加模型类型差异各个指标的数值可参考:
指标 | 理想范围 | 应用场景 |
---|---|---|
不合度量 | 0.3-0.7 | 快速评估模型差异度 |
相关系数 | [-0.5, 0.5] | 分析模型互补性 |
Q-统计量 | (-0.5, 0.5) | 研究预测结果关联强度 |
Kappa统计量 | <0.4 | 综合评估一致性水平 |
6. 总结
在集成学习中,度量学习器的多样性是非常重要的。
通过计算不合度量、相关系数、Q-统计量和 k-统计量,我们可以更好地了解学习器之间的差异。
这些指标可以帮助我们选择合适的集成策略,从而提高集成模型的性能。
在实际应用中,可以根据具体问题选择合适的多样性度量指标,并结合scikit-learn
等工具进行计算和分析。