2016-04-08 16 views
0

これはどのように行われますか?私はSklearnを使ってSVMをトレーニングしています。私のクラスはアンバランスです。私の問題は、マルチクラスであることに注意してくださいので、私はOneVsRestClassifier使用していますMULTILABEL:バランスクラスにマルチラベルSVMにウェイトを割り当てる

mlb = MultiLabelBinarizer() 
y = mlb.fit_transform(y_train) 

clf = OneVsRestClassifier(svm.SVC(kernel='rbf')) 
clf = clf.fit(x, y) 
pred = clf.predict(x_test) 

私はアンバランスなクラスを説明するためにどこかに「sample_weight」パラメータを追加することはできますか?


私はSVMにclass_weight辞書を追加すると、私はエラーを取得する:

ValueError: Class label 2 not present 

私はMLBを使用してバイナリに私のラベルを変換しているためです。しかし、私はラベルを変換しない場合は、私が取得:

ValueError: You appear to be using a legacy multi-label data representation. Sequence of sequences are no longer supported; use a binary array or sparse matrix instead. 

class_weightは重量にクラスラベルをマッピング、辞書です:{1:1,2:1,3:3 ...}

ここでは、xとyの詳細は次のとおり

print(X[0]) 
[ 0.76625633 0.63062721 0.01954162 ..., 1.1767817 0.249034 0.23544988] 
print(type(X)) 
<type 'numpy.ndarray'> 

print(y[0]) 
print(type(y)) 
[1, 2, 3, 4, 5, 6, 7] 
<type 'numpy.ndarray'> 

なおMLB = MultiLabelBinarizer()。 y = mlb.fit_transform(y_train)は、yをバイナリ配列に変換します。

ValueError: You appear to be using a legacy multi-label data representation. Sequence of sequences are no longer supported; use a binary array or sparse matrix instead. 

したがって、問題は、スパース行列にラベル(np.array)を変換に帰着する:


は推奨的回答は、エラーを生成します。

from scipy import sparse 
y_sp = sparse.csr_matrix(y) 

これはエラーを生成します。

TypeError: no supported conversion for types: (dtype('O'),) 

私はこのための新しいクエリを開きます。

+0

は、あなたが提供できる属性で正常に動作しますxの要素とy? 'print type(x [0])print x [0]'と 'print type(y [0])print y [0]' – dooms

+0

ここで、yはバイナリではありません。 'mlb.classes_'が値2が存在する配列があるかどうかを確認してください。 – dooms

+0

私はラベルをバイナリに変換しようとしました。上記のエラーが生成されます。ValueError:クラスラベル2が存在しません(すべてのラベルがバイナリ形式です)。バイナリに変換しないと、エラーが表示されます。ValueError:従来の複数ラベルのデータ表現を使用しているようです。シーケンスのシーケンスはサポートされなくなりました。代わりに、バイナリ配列またはスパース行列を使用してください。 –

答えて

1

あなたは使用することができます

class_weight : {dict, ‘balanced’}, optional

Set the parameter C of class i to class_weight[i]*C for SVC. If not given, all classes are supposed to have weight one. The “balanced” mode uses the values of y to automatically adjust weights inversely proportional to class frequencies in the input data as n_samples/(n_classes * np.bincount(y))

clf = OneVsRestClassifier(svm.SVC(kernel='rbf', class_weight='balanced')) 

+0

ありがとう、あなたはコードの例を挙げることができますか?私はこれを試してみるとエラーが出ます:ValueError:私のラベルをバイナリに変換したので、クラスラベル2は存在しません。しかし、ラベルを変換しないと、次のようになります。valueError:従来の複数ラベルのデータ表現を使用しているようです。シーケンスのシーケンスはサポートされなくなりました。代わりに、バイナリ配列またはスパース行列を使用してください。 –

+0

エラーメッセージを教えてください。以下は[ランダムな例]です(https://github.com/mstampfer/Equities/blob/2c8e23d4f77c51261fe97ce53cf13d043d9ef8e5/GridSearchParams.py#L16) – Till

+0

このエラーは属性 'class_weight'に関連していますか?これまでにこのエラーがありましたか? – Till

0

このコードは、class_weightの'バランスの取れた'

>>> from sklearn.preprocessing import MultiLabelBinarizer 
>>> from sklearn.svm import SVC 
>>> from sklearn.multiclass import OneVsRestClassifier 

>>> mlb = MultiLabelBinarizer() 
>>> x = [[0,1,1,1],[1,0,0,1]] 
>>> y = mlb.fit_transform([['sci-fi', 'thriller'], ['comedy']]) 

>>> print y 
>>> print mlb.classes_ 
[[0 1 1] 
[1 0 0]] 
['comedy' 'sci-fi' 'thriller'] 

>>> OneVsRestClassifier(SVC(random_state=0, class_weight='balanced')).fit(x, y).predict(x) 
array([[0, 1, 1], 
    [1, 0, 0]]) 
+0

私はバランスを取っていますが、カスタムウェイトを指定したいと思います。 –

関連する問題