找回密码
 立即注册
首页 业界区 业界 集成学习中的多样性密码:量化学习器的多样性 ...

集成学习中的多样性密码:量化学习器的多样性

萨瑞饨 7 天前
在集成学习中,多样性是一个关键概念,简单来说,多样性衡量的是各个学习器之间的差异程度。
如果学习器之间差异很大,那么它们的组合就更有可能覆盖更多的情况,从而提高集成模型的性能,
就像足球队需要不同位置的球员配合一样。
下面介绍四种常用的多样性度量方法及其实现。
1. 不合度量(Disagreement Measure)

不合度量是一种非常直观的多样性度量方法。
它通过计算两个学习器在样本上的预测结果不一致的比例来衡量它们之间的差异。
不合度量的值介于0到1之间,值越接近 1,说明两个学习器的预测结果越不一致,多样性越高。
假设我们有两个学习器$ L_1 \(和\) L_2 \(,对于一个数据集中的每个样本\) x_i \(,如果\) L_1 \(和\) L_2 $的预测结果不同,那么就认为它们在这个样本上“不合”
不合度量就是这种“不合”情况的比例。
为了演示如何度量多样性,我们先创建两个不同的决策树模型:
  1. import numpy as np
  2. from sklearn.datasets import make_classification
  3. from sklearn.model_selection import train_test_split
  4. from sklearn.tree import DecisionTreeClassifier
  5. # 生成数据
  6. X, y = make_classification(
  7.     n_samples=100, n_features=20, n_informative=10, n_redundant=10, random_state=42
  8. )
  9. X_train, X_test, y_train, y_test = train_test_split(
  10.     X, y, test_size=0.2, random_state=42
  11. )
  12. # 训练两个不同的决策树
  13. clf1 = DecisionTreeClassifier(random_state=42)
  14. clf2 = DecisionTreeClassifier(random_state=43)
  15. clf1.fit(X_train, y_train)
  16. clf2.fit(X_train, y_train)
  17. # 预测测试集
  18. y_pred1 = clf1.predict(X_test)
  19. y_pred2 = clf2.predict(X_test)
复制代码
然后,我们看看如何计算两个模型的不合度量(Disagreement Measure)。
  1. # 计算不合度量
  2. disagreement = np.mean(y_pred1 != y_pred2)
  3. print(f"不合度量: {disagreement}")
  4. ## 输出结果:
  5. # 不合度量: 0.2
复制代码
2. 相关系数(Correlation Coefficient)

相关系数衡量的是两个学习器预测结果之间的线性相关性
如果两个学习器的预测结果完全一致,相关系数为1;
如果完全相反,相关系数为-1;
如果两者之间没有线性关系,相关系数接近 0。
在集成学习中,我们希望相关系数越低越好,因为这意味着学习器之间的差异更大。
相关系数是通过计算两个学习器预测结果的协方差与它们各自的标准差的比值来得到的。
其公式为:$ \rho=\frac{\text{Cov}(L_1,L_2)}{\sigma{L_1}\sigma{L_2}} $
其中,$ Cov(L_1,L_2) \(是协方差,\) \sigma{L_1} \(和\) \sigma{L_2} \(分别是\) L_1 \(和\) L_2 $的标准差。
使用代码来计算相关系数也很简单,同样使用上面创建的两个决策树模型。
  1. import numpy as np
  2. # 计算相关系数
  3. correlation = np.corrcoef(y_pred1, y_pred2)[0, 1]
  4. print(f"相关系数: {correlation}")
  5. ## 输出结果:
  6. # 相关系数: 0.6637465183030644
复制代码
3. Q-统计量(Q-Statistic)

Q-统计量是另一种衡量学习器之间一致性和差异性的指标。
它通过比较两个学习器在样本上的预测结果来计算。
Q-统计量的值介于-1 到 1 之间,值越接近 1,说明两个学习器的预测结果越一致;
值越接近-1,说明它们的预测结果越不一致。
Q-统计量的计算公式为:$ Q=\frac{a\times d-b\times c}{(a+b)\times(c+d)} $
其中:

  • $ a $是两个学习器都正确预测的样本数
  • $ b $是第一个学习器正确预测,第二个学习器错误预测的样本数
  • $ c $是第一个学习器错误预测,第二个学习器正确预测的样本数
  • $ d $是两个学习器都错误预测的样本数
计算Q-统计量的示例代码如下:
  1. from sklearn.metrics import confusion_matrix
  2. # 计算混淆矩阵
  3. cm = confusion_matrix(y_test, y_pred1, labels=[0, 1])
  4. a = np.sum((y_pred1 == y_test) & (y_pred2 == y_test))
  5. b = np.sum((y_pred1 == y_test) & (y_pred2 != y_test))
  6. c = np.sum((y_pred1 != y_test) & (y_pred2 == y_test))
  7. d = np.sum((y_pred1 != y_test) & (y_pred2 != y_test))
  8. # 计算 Q-统计量
  9. q_statistic = (a * d - b * c) / ((a + b) * (c + d))
  10. print(f"Q-统计量: {q_statistic}")
  11. ## 输出结果:
  12. # Q-统计量: 0.5757575757575758
复制代码
4. k-统计量(Kappa Statistic)

k-统计量是一种衡量分类器性能的指标,它考虑了分类器的正确率和随机猜测的正确率。
在集成学习中,k-统计量可以用来衡量两个学习器之间的多样性。
k-统计量的值介于-1 到 1 之间,值越接近 1,说明两个学习器的预测结果越一致;
值越接近-1,说明它们的预测结果越不一致。
k-统计量的计算公式为:$ \kappa=\frac{P_o-P_e}{1-P_e} $
其中:

  • $ P_o $是两个学习器预测结果一致的比例
  • $ P_e $是随机猜测下两个学习器预测结果一致的比例
计算k统计量的示例代码如下:
  1. from sklearn.metrics import cohen_kappa_score
  2. # 计算 k-统计量
  3. kappa_statistic = cohen_kappa_score(y_pred1, y_pred2)
  4. print(f"Kappa 统计量: {kappa_statistic}")
  5. ## 输出结果:
  6. # Kappa 统计量: 0.6116504854368932
复制代码
5. 指标使用建议

在实际场景中,我们应该如何使用这些指标呢?下面是一些使用建议:

  • 在Bagging中优先关注不合度量
  • 构建Stacking时参考相关系数
  • 使用Q-statistic诊断高相关模型
  • Kappa值过低时考虑增加模型类型差异
各个指标的数值可参考:
[table][tr]指标理想范围应用场景[/tr][tr][td]不合度量[/td][td]0.3-0.7[/td][td]快速评估模型差异度[/td][/tr][tr][td]相关系数[/td][td][-0.5, 0.5][/td][td]分析模型互补性[/td][/tr][tr][td]Q-统计量[/td][td](-0.5, 0.5)[/td][td]研究预测结果关联强度[/td][/tr][tr][td]Kappa统计量[/td][td]
您需要登录后才可以回帖 登录 | 立即注册