Sklearn中双SVM模型得分平均方法咨询:同类别不同样本训练
如何对两个SVM模型的得分进行平均?
嘿,这个问题其实有两种常见的实现思路,取决于你想要的是直接平均两个模型各自的测试得分,还是融合它们的预测结果后计算一个综合得分。我给你详细拆解两种方式的代码实现:
方式一:直接平均两个模型的独立得分
这种思路很直接——先分别算出两个模型在测试集上的表现得分(比如准确率、F1值等),再取算术平均。
假设你已经准备好了测试集X_test和对应的标签y_test,代码可以这么写:
# 计算两个模型各自的准确率得分 score1 = clf_1.score(X_test, y_test) score2 = clf_2.score(X_test, y_test) # 计算平均得分 average_score = (score1 + score2) / 2 print(f"两个模型的平均准确率: {average_score:.4f}")
如果你需要其他评估指标(比如F1分数、召回率),可以用sklearn.metrics里的对应函数来计算后再平均:
from sklearn.metrics import f1_score # 先获取两个模型的预测结果 y_pred1 = clf_1.predict(X_test) y_pred2 = clf_2.predict(X_test) # 计算各自的F1得分(这里用macro平均,适合多分类场景) f1_1 = f1_score(y_test, y_pred1, average='macro') f1_2 = f1_score(y_test, y_pred2, average='macro') average_f1 = (f1_1 + f1_2) / 2 print(f"两个模型的平均F1分数: {average_f1:.4f}")
方式二:融合预测结果后计算综合得分
如果你想要的是通过融合两个模型的预测输出,得到一个更稳健的组合模型得分,可以试试这两种融合方式:
硬投票(多数表决)
简单来说就是让两个模型“投票”,取出现次数最多的类别作为最终预测,再计算这个最终结果的得分:
from sklearn.ensemble import VotingClassifier from sklearn.metrics import accuracy_score # 构建硬投票分类器,传入已训练好的两个模型 voting_clf = VotingClassifier(estimators=[('clf1', clf_1), ('clf2', clf_2)], voting='hard') # 这里调用fit只是让分类器完成初始化,不会重新训练已有的模型 voting_clf.fit(X_test, y_test) # 得到融合后的预测结果 y_pred_vote = voting_clf.predict(X_test) # 计算融合后的准确率得分 vote_score = accuracy_score(y_test, y_pred_vote) print(f"硬投票融合后的得分: {vote_score:.4f}")
软投票(概率平均)
如果你的SVM模型在训练时设置了probability=True(开启概率输出),可以对两个模型输出的类别概率取平均,再根据平均概率确定最终预测,最后计算得分:
from sklearn.metrics import accuracy_score # 注意:训练clf_1和clf_2时必须设置probability=True # 示例:clf_1 = SVC(probability=True, kernel='rbf', ...) # 获取两个模型的类别概率预测 prob1 = clf_1.predict_proba(X_test) prob2 = clf_2.predict_proba(X_test) # 对概率取平均 avg_prob = (prob1 + prob2) / 2 # 根据平均概率得到最终预测(取概率最大的类别) y_pred_avg = avg_prob.argmax(axis=1) # 计算融合后的得分 avg_score = accuracy_score(y_test, y_pred_avg) print(f"概率平均融合后的得分: {avg_score:.4f}")
小提示:如果你的SVM模型训练时没开probability=True,软投票就用不了,这时候硬投票是更稳妥的选择。两种思路各有适用场景——直接平均得分是对单个模型的表现做汇总,融合预测则是构建了一个新的组合模型,你可以根据自己的需求来选~
内容的提问来源于stack exchange,提问作者Joseph
相关产品推荐
相关产品推荐

