【问题标题】:SVM model averaging in sklearnsklearn中的SVM模型平均
【发布时间】:2018-08-06 11:27:41
【问题描述】:

我想对在不同样本但相同类别上训练的两个不同 SVM 的分数进行平均

# Data have the smae label x_1[1] has y_1[1] and x_2[1] has y_2[1]
# Where y_2[1] == y_1[1]
Dataset_1=(x_1,y)
Dataset_2=(x_2,y)
test_data=(test_sample,test_labels)

我们有 50 节课。 dataset_1 和 dataset_2 的类相同:

list(set(y_1))=list(set(y_2))

我尝试了什么:

从 sklearn.svm 导入 SVC

clf_1 = SVC(kernel='linear', random_state=42).fit(x_1, y)

clf_2 = SVC(kernel='linear', random_state=42).fit(x_2, y)

如何在做之前平均 clf_1 和 clf_2 分数:

predict(test_sample)

?

我想做什么?

【问题讨论】:

  • 在 predict() 之前平均分数是什么意思
  • 我的意思是平均分数的集成学习。每个 SVM 为每个类输出一个分数,我想将每个类的分数相加并除以 2(得到一个平均值)并在组合两个 SVM 后输出最终结果。具体来说,我的问题是如何平均分数?它可以通过平均或训练结合了两个 svm 分数的第三个 SVM 来完成。我的问题是关于那个(我不熟悉)

标签: python-3.x machine-learning scikit-learn svm ensemble-learning


【解决方案1】:

不确定我是否理解您的问题;要像在典型集成中那样简单地平均分数,您应该首先从每个模型中分别获得预测 probabilities,然后取它们的平均值:

pred1 = clf_1.predict_proba(test_sample)
pred2 = clf_2.predict_proba(test_sample)
pred = (pred1 + pred2)/2

为了获得预测概率而不是硬分类,您应该使用附加参数 probability=True 初始化 SVC。

pred 的每一行将是一个长度为 50 的数组,与您的类别一样多,每个元素代表样本属于相应类别的概率。

平均后,只需取pred 的argmax - 只要确保返回概率的order 是OK 的;根据文档:

列对应于按排序顺序排列的类,因为它们出现在属性类_中_

由于我不确定这意味着什么,请对您的训练集进行一些预测检查,以确保顺序正确。

【讨论】:

  • 我们举个例子 test , test_sample[1] 然后 pred1 = clf_1.predict(test_sample[1]) 返回 pred1 返回第 4 类 pred2 = clf_2.predict(test_sample[1]) 返回第 9 类. pred = (pred1 + pred2)/2 然后 pred 返回类 6.5 !!
猜你喜欢
  • 2013-03-29
  • 2023-03-14
  • 2017-04-21
  • 2016-07-17
  • 2021-03-09
  • 2018-08-11
  • 2018-06-21
  • 2020-05-14
  • 2015-04-25
相关资源
最近更新 更多