【问题标题】:Out-of-core multiclass classifier with class probabilities as targets [duplicate]以类概率为目标的核外多类分类器[重复]
【发布时间】:2019-03-06 23:19:20
【问题描述】:

我正在从事一个项目,我想使用 scikit-learn 来训练一个核外多类分类器。预测目标是一个类概率概率数组,例如

Y = [[0.1, 0.5, 0.4],
     [0.8, 0.1, 0.1],
     [0.2, 0.1, 0.7],
     [0.2, 0.2, 0.6], ...]

换句话说,Y 被标准化,使得Y.sum(axis=1) = [1, 1, 1, 1, ...]

我注意到 scikit-learn 有 OneVsRestClassifier 包装类,我认为这可能会有所帮助。只要底层二进制分类器也支持它,它似乎支持partial_fit(我会使用SGDClassifier)。

但是,当我将这个目标 Y 输入分类器时,我收到一些关于在第一次调用 partial_fit 时必须传递类的错误:

from sklearn.multiclass import OneVsRestClassifier
from sklearn.linear_model import SGDClassifier

clf = OneVsRestClassifier(SGDClassifier())
clf.partial_fit(X, Y)  # raises ValueError

错误显示为“必须在第一次调用 partial_fit 时传递类”。所以我尝试传递一个类标签数组:

clf.partial_fit(X, Y, classes=[0, 1, 2])  # raises another ValueError

这会引发另一个错误,指出 [0.1, 0.5, ...] 不在类 [0, 1, 2] 中。

我也尝试了批处理fit 方法,但似乎也没有针对该方法实现。

问题

有谁知道这在 scikit-learn 中是否可行?如果是这样,你会怎么做?

【问题讨论】:

标签: python machine-learning scikit-learn multiclass-classification


【解决方案1】:

这引发了另一个错误,指出 [0.1, 0.5, ...] 不在类 [0, 1, 2] 中

Y 应该是一个形状为 (n_samples,) 的向量。由于您唯一的classes[0,1,2]partial_fit() 预计这些值会出现在Y 中。

如果最大概率决定了您的输出类别,您可以将训练集 Y 修改为 Y = np.amax(Y, axis=1) 并将其传递给 partial_fit()

希望这会有所帮助。

【讨论】:

  • 感谢您的建议。我觉得 argmax 会丢弃太多信息。我要做的是将每个数据点复制 100 次(我的数据集并不大),据此我根据 np.random.choice(classes, p=[0.1, 0.5, 0.4], size=100) 等对目标进行采样。
猜你喜欢
  • 2020-11-16
  • 2012-11-08
  • 2020-05-23
  • 2018-10-12
  • 2019-11-10
  • 2016-01-05
  • 2013-04-21
  • 2013-11-22
  • 2017-06-12
相关资源
最近更新 更多