2016-04-08 4 views
0

Как это сделать? Я использую Sklearn для обучения SVM. Мои классы не сбалансированы. Обратите внимание, что моя проблема мультиклассирует, MultiLabel поэтому я использую OneVsRestClassifier:Назначение весов многоквартирным 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» где-то объяснить неуравновешенные классы?


Когда я добавить class_weight Dict к SVM я получаю ошибку:

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

Здесь детали х и у:

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

Заметим, что = MultiLabelBinarizer MLB(); 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 и у? '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

Я использую сбалансированный, но хочу указать пользовательские веса. –

Смежные вопросы