【发布时间】:2018-09-07 03:18:27
【问题描述】:
当我使用线性 SVM 在 scikit-learn 中处理分类问题时,我可以将自定义权重应用于每个训练样本,如下所示:
from sklearn.linear_model import SGDClassifier
X = [[0.0, 0.0], [1.0, 1.0]]
y = [0, 1]
sample_weight = [1.0, 0.5]
clf = SGDClassifier(loss="hinge")
clf.fit(X, y, sample_weight=sample_weight)
现在,当我有一个多标签分类任务时,我需要转换标签,SGDClassifier 必须包装在像 OneVsRestClassifier 这样的元估计器中:
from sklearn.preprocessing import MultiLabelBinarizer
from sklearn.multiclass import OneVsRestClassifier
from sklearn.linear_model import SGDClassifier
X = [[0.0, 0.0], [1.0, 1.0], [1.0, 0.0]]
y = [[0], [1], [0, 1]]
y_mlb = MultiLabelBinarizer().fit_transform(y)
sample_weight = [1.0, 0.5, 0.8]
clf = OneVsRestClassifier(SGDClassifier(loss="hinge"))
clf.fit(X, y_mlb) # unable to pass `sample_weight`
但是,OneVsRestClassifier 不允许我向fit 方法传递除X 和y 之外的任何参数,因此我无法像以前那样应用样本权重。在这种情况下如何应用我自己的样本权重?
【问题讨论】:
-
我尝试通过 hack 解决这个问题:将
SGDClassifier实例的fit方法替换为自定义实现,该实现引用我的样本权重列表,但是:原来OneVsRestClassifier克隆了估计器。当然,不是使用标准的 Python 工具,而是通过使用从get_params方法检索到的参数来实例化同一类的新估计器。因此猴子补丁没有被保留,我回到第一方...... -
所以现在我可以继承
SGDClassifier,添加样本权重作为实例参数,修补get_params方法并修补fit方法以使用存储在类中的样本权重...这太可怕了????
标签: python scikit-learn classification