在scikit-learn中结合两个不同分类器的结果

1 投票
2 回答
10122 浏览
提问于 2025-04-17 22:30

我有一些数据集,像下面这样:

patient id-1

心率模式-82 82 87 87 89 90 89 89 89 89

Blood pressure-110 71

Body temperature-37.2

SPO2-94

Sex-0

Age-8

Hereditary-1

Smoking-0

Alcohol Intake-0

Physical Activity-1

Diabetes-0

Blood Cholesterol-0

Obesity BMI-17.5

Status-0

(1=坏的(对),0=好的(错))

关于心率模式

>>>est = AdaBoostClassifier()
>>>est.fit(X_train,y_train)
>>>predictions = est.predict(X_test)
>>>r2_score(y_test,predictions)
0.46999999999999997

关于其他数据

>>>est = RandomForestClassifier(verbose=2)
>>>est.fit(X_train,y_train)
>>>predictions = est.predict(X_test)
>>>r2_score(y_test,predictions)
0.9

我只有264个测试数据用于训练和测试。通过使用sklearn中的AdaBoostClassifier()只分析心率模式,我得到了大约0.47的准确率。而对于其他数据集,我使用RandomForestClassifier(verbose=2)得到了0.9的准确率。

现在我需要把这两个结果合成一个单一的预测结果。由于心率是一个时间序列,我不能直接把这两个结果结合在一起。有什么好的方法可以把这两个结果连接起来呢?

2 个回答

7

你还可以使用sklearn中的VotingClassifier来自动化这个过程,它可以把不同的机器学习分类器结合起来,然后预测出“最多人投票”的结果。

在你的例子中:

from sklearn.ensemble import VotingClassifier

est_AB = AdaBoostClassifier()
score_AB=est_AB.fit(X_train,y_train).score(X_test,y_test)

est_RF = RandomForestClassifier()
score_RF=est_RF.fit(X_train,y_train).score(X_test,y_test)

est_Ensemble = VotingClassifier(estimators=[('AB', est_AB), ('RF', est_RF)],
                        voting='soft',
                        weights=[1, 1])

score_Ensemble=est_Ensemble.fit(X_train,y_train).score(X_test,y_test)

voting='soft'会根据所有模型的预测结果,计算出每个标签的最大概率来进行预测。而voting='hard'则是根据多数投票的规则来预测标签,也就是选择模型预测中出现次数最多的那个标签。

想了解更多,可以查看这里 http://scikit-learn.org/stable/modules/ensemble.html#voting-classifier 和这里 http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.VotingClassifier.html

7

如果你有两个分类器,它们可以输出每个类别的概率(通过 predict_proba 方法),你可以把这两个分类器的概率进行平均(可以加一些权重),然后对平均后的概率使用 argmax 方法来得到最终的预测结果。

注意:predict_proba 输出的列的顺序是根据分类器的 classes_ 属性来决定的。

撰写回答