我正在一个项目中,我想使用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中是否可行吗?如果是这样,您会怎么做?
答案 0 :(得分:0)
这引起了另一个错误,表明类[0、1、2]中缺少[0.1、0.5,...]
Y
应该是形状的矢量(n_samples,)。由于您唯一的classes
是[0,1,2]
,因此partial_fit()
期望这些值出现在Y
中。
如果最大概率确定了输出类别,则可以将训练集Y修改为Y = np.amax(Y, axis=1)
,并将其传递给partial_fit()
。
希望这会有所帮助。