2016-04-08 21 views
0

Bu nasıl yapılır? SVM'yi eğitmek için Sklearn kullanıyorum. Derslerim dengesiz. bu yüzden OneVsRestClassifier kullanıyorum multilabel, sorunum çok sınıflı olduğunu unutmayın:Sınıfları dengelemek için çok bantlı bir SVM'ye ağırlık atama

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

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

ben dengesiz sınıflar için hesap için bir yere bir 'sample_weight' parametresini ekleyebilir miyim? Ben MLB kullanarak ikiliye Etiketlerime dönüştürülür çünkü

ValueError: Class label 2 not present 

budur: Ben SVM'e bir class_weight dicti eklediğinizde


hatası alıyorum. Ancak etiketleri dönüştürmek yoksa, alıyorum:

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 ağırlığına sınıf etiketleri haritalama, dict şöyledir: {1: 1, 2: 1, 3: 3 ...}

Burada x ve y detayları aşağıda sunulmuştur:

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'> 

Not bu mLB = MultiLabelBinarizer(); y = mlb.fit_transform (y_train), y'yi bir ikili diziye dönüştürür.

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. 

Dolayısıyla, sorun, seyrek bir matris etiket (bir np.array) dönüştürme azaltır:


verilen cevap hatası üretir.

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

Bunun için yeni bir sorgu açılır:

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

Bu hatayı üretir.

+0

bir verebilir misiniz nitelik ile çalışıyor x öğesi ve y? print type (x [0]) print x [0] 've' print type (y [0]) print y [0] ' – dooms

+0

Burada y, ikili değil. Mlb.classes_ değerinin 2 değerinin mevcut olduğu bir dizi olup olmadığını kontrol edin. – dooms

+0

Etiketleri ikiliye dönüştürmeyi denedim. Yukarıda listelenen hatayı üretir: ValueError: Sınıf etiketi 2 mevcut değil (çünkü tüm etiketler daha sonra ikili biçimde). İkiliye dönüştürmezsem, hatayı alıyorum: ValueError: Eski bir çok etiketli veri temsili kullanıyormuşsunuz gibi görünüyor. Dizilerin dizisi artık desteklenmemektedir; bunun yerine bir ikili dizi veya seyrek matris kullanın. –

cevap

1

Sen kullanabilirsiniz:

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

Teşekkürler, bir kod örneği verebilir misiniz? Bunu denediğimde şu hatayı alıyorum: ValueError: Class etiketi 2 mevcut değil, çünkü etiketlerimi ikiliye dönüştürdüm. AMA, etiketleri dönüştürmezsem, şunu elde ederim: valueError: Eski bir çok etiketli veri gösterimi kullanıyor görünüyorsunuz.Dizilerin dizisi artık desteklenmemektedir; bunun yerine bir ikili dizi veya seyrek matris kullanın. –

+0

Bana hata mesajını verebilir misiniz? İşte [rastgele bir örnek] (https://github.com/mstampfer/Equities/blob/2c8e23d4f77c51261fe97ce53cf13d043d9ef8e5/GridSearchParams.py#L16) – Till

+0

Bu hata "class_weight" özniteliğiyle ilişkili midir? Bu hatayı daha önce yaptın mı? – Till

0

Bu kod class_weight ait 'dengeli' değeri

>>> 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

Dengeli kullanıyorum, ancak özel ağırlıklar belirtmek istiyorum. –