如何调整加权投票集成方法?

数据挖掘 阶级失衡 集成建模
2022-02-17 13:50:40

我正在处理带有 5 个不平衡标签的肾癌患者数据。这些代码包含在特征工程部分的归一化、过采样。提供了用于分类任务的 9 种普通机器学习方法的列表。然后,我利用了硬投票和加权投票两种集成方法。利用 10 倍 CV 来验证结果。

methods = ['Support Vector Machine', 'Logistic Regression', 'K Neighbors Classifier', 'Random Forest', \
          'Gaussian Naive Bayes', 'Linear Discriminant Analysis', 'Decision Tree', 'Gradient Boosting',\
          'soft_VotingClassifier','hard_VotingClassifier']

我想知道如何调整软投票方法的权重?这是我现在的代码和结果:

from sklearn import preprocessing
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.ensemble import VotingClassifier

if method == 'soft_VotingClassifier':
    cl1 = LogisticRegression()
    cl2 = KNeighborsClassifier(n_neighbors=10)
    cl3 = RandomForestClassifier(max_depth=35)
    cl4 = GaussianNB()
    cl5 = LinearDiscriminantAnalysis()
    cl6 = DecisionTreeClassifier()
    cl7 = SVC(C=0.1, gamma=0.0001, kernel='poly')
    cl8 = GradientBoostingClassifier()
    estimator = [(method[0],cl1), (method[1],cl2), (method[2],cl3), (method[3],cl4),\
                 (method[4],cl5), (method[5],cl6), (method[6],cl7), (method[7],cl8)]
    eclf = VotingClassifier(estimators=estimator,
    voting='soft', weights=[5, 5, 10, 5, 6, 8, 4, 10])

if method == 'hard_VotingClassifier':
    cl1 = LogisticRegression()
    cl2 = KNeighborsClassifier(n_neighbors=10)
    cl3 = RandomForestClassifier(max_depth=35)
    cl4 = GaussianNB()
    cl5 = LinearDiscriminantAnalysis()
    cl6 = DecisionTreeClassifier()
    cl7 = SVC(kernel='linear',gamma='scale')
    cl8 = GradientBoostingClassifier()
    estimator = [(method[0],cl1), (method[1],cl2), (method[2],cl3), (method[3],cl4),\
                 (method[4],cl5), (method[5],cl6), (method[6],cl7), (method[7],cl8)]
    eclf = VotingClassifier(estimators=estimator, voting='hard') 

测试数据的混淆矩阵结果:

[50  5  1  4  2]
[ 0 13  1  0  3]
[ 0  1  2  1  1]
[ 4  0  0  2  0]
[ 0  3  0  0  2]

测试数据的准确度结果:

准确度结果

对于那些想要检查我的代码甚至运行它们的好心人,我会放上存储库链接

1个回答

这个问题是一个经典的优化问题。

为了更简单,假设您有 2 个模型(m1 和 m2)。你想做一个合奏。

第一个想法,是做两者的平均值

(m1.predict(X) + m2.predict(X))/2

然后你想优化这两种模型的最佳组合。

for w in [0,0.25,0.5,0.75,1]:
     (w * m1.predict(X) + (1-w) * predict(X) ) / 2 
     print(evaluate results/MSE/Accuracy...)

您的问题与此问题完全相同,但使用的是投票分类器。

您只需要优化数组。在一个 for 循环中。

weights=[5, 5, 10, 5, 6, 8, 4, 10]

在这种情况下,您的数组未标准化,并且具有更多模型。所以需要更长的时间。投票分类器也适合每次模型,所以我会花很长时间。自己编写代码更容易。