«плохая форма ввода» при использовании scikit-learn SVM и optunity

Я пытаюсь использовать optunity package для настройки моего Модель SVM, я напрямую копирую и добавляю обновленный код примера, просто импортирую массив функций и массив данных.

import optunity
import optunity.metrics
import sklearn.svm
import numpy as np

data_path = '/python/Feature'
files = ['A.npy', 'B.npy', 'C.npy']

array = []
labels = []

for i,name in enumerate(files):
    data = np.load('{}/{}'.format(data_path, name))
    for j in range(0,len(data)):
        labels.append(data[j])
        array.append(data)

print len(array)   #=> 1247
print len(labels)  #=> 1247

# score function: twice iterated 10-fold cross-validated accuracy
@optunity.cross_validated(x=data, y=labels, num_folds=10, num_iter=2)
def svm_auc(x_train, y_train, x_test, y_test, C, gamma):
    model = sklearn.svm.SVC(C=C, gamma=gamma).fit(x_train, y_train)
    decision_values = model.decision_function(x_test)
    return optunity.metrics.roc_auc(y_test, decision_values)

# perform tuning
optimal_pars, _, _ = optunity.maximize(svm_auc, num_evals=200, C=[0, 10], gamma=[0, 1])

# train model on the full training set with tuned hyperparameters
optimal_model = sklearn.svm.SVC(**optimal_pars).fit(data, labels)

Однако компилятор выглядит очень недовольным, я просмотрел Документ класса SVM, чтобы дважды проверить формат ввода, однако я не понимаю синтаксис кодирования optunity. Может ли кто-нибудь помочь мне выяснить, что там происходит не так? Очень признателен .. (Я использую ядро ​​​​'rbf', я пытался добавить, но синтаксис идет не так, странно, что в примере с optunity нет выбора ядра ..)

Traceback (most recent call last):
  File "python/SVM_turning.py", line 26, in <module>
    optimal_pars, _, _ = optunity.maximize(svm_auc, num_evals=200, C=[0, 10], gamma=[0, 1])
  File "/lib/python2.7/site-packages/optunity/api.py", line 181, in maximize
    pmap=pmap)
  File "/lib/python2.7/site-packages/optunity/api.py", line 245, in optimize
    solution, report = solver.optimize(f, maximize, pmap=pmap)
  File "/lib/python2.7/site-packages/optunity/solvers/ParticleSwarm.py", line 257, in optimize
    fitnesses = pmap(evaluate, list(map(self.particle2dict, pop)))
  File "/lib/python2.7/site-packages/optunity/solvers/ParticleSwarm.py", line 246, in evaluate
    return f(**d)
  File "/lib/python2.7/site-packages/optunity/functions.py", line 286, in wrapped_f
    value = f(*args, **kwargs)
  File "/lib/python2.7/site-packages/optunity/functions.py", line 341, in wrapped_f
    return f(*args, **kwargs)
  File "/lib/python2.7/site-packages/optunity/constraints.py", line 150, in wrapped_f
    return f(*args, **kwargs)
  File "/lib/python2.7/site-packages/optunity/constraints.py", line 128, in wrapped_f
    return f(*args, **kwargs)
  File "/lib/python2.7/site-packages/optunity/constraints.py", line 265, in func
    return f(*args, **kwargs)
  File "/lib/python2.7/site-packages/optunity/cross_validation.py", line 386, in __call__
    scores.append(self.f(**kwargs))
  File "/python/SVM_turning.py", line 21, in svm_auc
    model = sklearn.svm.SVC(C=C, gamma=gamma).fit(x_train, y_train)
  File "/lib/python2.7/site-packages/sklearn/svm/base.py", line 138, in fit
    y = self._validate_targets(y)
  File "/lib/python2.7/site-packages/sklearn/svm/base.py", line 441, in _validate_targets
    y_ = column_or_1d(y, warn=True)
  File "/lib/python2.7/site-packages/sklearn/utils/validation.py", line 319, in column_or_1d
    raise ValueError("bad input shape {0}".format(shape))
ValueError: bad input shape (428, 600)

person Yank    schedule 29.05.2015    source источник
comment
Код выглядит нормально, в настоящее время мы не можем воспроизвести эту проблему (к сожалению). Я вернусь к этому в ближайшее время. Я также создал проблему GitHub по этому поводу: github.com/claesenm/optunity/issues/43 .   -  person Marc Claesen    schedule 23.06.2015


Ответы (3)


Я думаю, что нашел проблему. Вы подготавливаете списки array и labels при чтении файлов. array последовательно заполняется data. Однако позже вы делаете это:

@optunity.cross_validated(x=data, y=labels, num_folds=10, num_iter=2)

и

optimal_model = sklearn.svm.SVC(**optimal_pars).fit(data, labels)

и, следовательно, используйте data в качестве набора данных, а не array, который вы подготовили. Я не знаю формат того, что вы читаете из файлов, поэтому я не могу точно сказать, что происходит. Однако размеры data и labels почти наверняка не будут совпадать.

Вот игрушечный пример с array и labels, который работает правильно:

import optunity
import optunity.metrics
import sklearn.svm
import numpy as np

#print len(array)   #=> 1247
#print len(labels)  #=> 1247

# make dummy data
array = np.array([[i] for i in range(1247)])
labels = [True] * 100 + [False] * 1147

# score function: twice iterated 10-fold cross-validated accuracy
@optunity.cross_validated(x=array, y=labels, num_folds=10, num_iter=2)
def svm_auc(x_train, y_train, x_test, y_test, C, gamma):
    model = sklearn.svm.SVC(C=C, gamma=gamma).fit(x_train, y_train)
    decision_values = model.decision_function(x_test)
    return optunity.metrics.roc_auc(y_test, decision_values)

# perform tuning
optimal_pars, _, _ = optunity.maximize(svm_auc, num_evals=200, C=[0, 10], gamma=[0, 1])

# train model on the full training set with tuned hyperparameters
optimal_model = sklearn.svm.SVC(**optimal_pars).fit(array, labels)
print(optimal_pars)

Какие выходы (пример):

{'C': 8.0126953125, 'гамма': 0.35791015625}

Извините, что так долго не отвечал.

person Marc Claesen    schedule 10.07.2015

Я не видел, что такое оптимизатор по умолчанию в optunity, но если вы просто используете поиск по сетке, вы можете использовать GridSearchCV в scikit-learn.

Ваш пример очень похож на документацию в optunity. Вы пытались запустить именно тот пример, который там есть?

person Andreas Mueller    schedule 01.06.2015
comment
Оптимизатор Optunity по умолчанию — это оптимизация роя частиц. - person Marc Claesen; 23.06.2015

Не уверен, что это ваша ошибка, но я получил это, когда использовал обычные массивы, когда должен был использовать Numpy.

person programmer12    schedule 30.07.2020