マルチラベル分類子として機能する SVM が必要なので、OneVsRestClassifier ラッパーを使用することにしました。ただし、トレーニング セットが非常に不均衡になるという問題が発生します。特定のクラスでは、正の例よりも負の例の方がはるかに多くなります。これは class_weight パラメーターで解決できますが、OneVsRestClassifier でラップされた分類子で使用すると、エラーが発生します。
from sklearn.svm import LinearSVC
from sklearn.multiclass import OneVsRestClassifier
weights = {'ham': 1, 'eggs': 2}
svm = OneVsRestClassifier(LinearSVC(class_weight=weights))
X = [[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]]
Y = [['ham'], [], ['eggs', 'spam'], ['spam'], ['eggs']]
svm.fit(X, Y)
Traceback (most recent call last):
File "", line 1, in
File "/usr/local/lib/python2.7/site-packages/sklearn/multiclass.py", line 197, in fit
n_jobs=self.n_jobs)
File "/usr/local/lib/python2.7/site-packages/sklearn/multiclass.py", line 87, in fit_ovr
for i in range(Y.shape[1]))
File "/usr/local/lib/python2.7/site-packages/sklearn/externals/joblib/parallel.py", line 514, in __call__
self.dispatch(function, args, kwargs)
File "/usr/local/lib/python2.7/site-packages/sklearn/externals/joblib/parallel.py", line 311, in dispatch
job = ImmediateApply(func, args, kwargs)
File "/usr/local/lib/python2.7/site-packages/sklearn/externals/joblib/parallel.py", line 135, in __init__
self.results = func(*args, **kwargs)
File "/usr/local/lib/python2.7/site-packages/sklearn/multiclass.py", line 56, in _fit_binary
estimator.fit(X, y)
File "/usr/local/lib/python2.7/site-packages/sklearn/svm/base.py", line 681, in fit
self.classes_, y)
File "/usr/local/lib/python2.7/site-packages/sklearn/utils/class_weight.py", line 49, in compute_class_weight
if classes[i] != c:
IndexError: index 2 is out of bounds for axis 0 with size 2