Параметры LinearSVC Байесовская оптимизация - PullRequest
0 голосов
/ 04 мая 2019

Я получаю ошибку ValueError при выполнении байесовской оптимизации для LinearSVC в задаче классификации с несколькими метками.

logger = JSONLogger(path=LOGS_PATH)


lSVC_param = {'C':(0.001, 0.01, 0.1, 1, 10),
                   'penalty':('l1','l2'),
                  'loss':('hinge','squared_hinge')}


def optimise_bayes_opt(X, y):
    def target(C_param,penalty_param,loss_param):       
        clf = LinearSVC(C=C_param,penalty=penalty_param,loss=loss_param)
        text_clf = Pipeline([('tfidf', TfidfVectorizer(ngram_range=(1,1),
                                                      norm='l2',
                                                      min_df=1,
                                                      use_idf=True)), 
                             ('clf', OneVsRestClassifier(clf))])
        cv_results = cross_val_score(text_clf, X_test, y_test, scoring='accuracy',cv=5)        
        print("CV",cv_results,cv_results.mean())
        return cv_results.mean()

    optimizer = BayesianOptimization(
                f=target,
                pbounds={'C_param':lSVC_param['C'],
                         'penalty_param':lSVC_param['penalty'],
                         'loss_param':lSVC_param['loss']},
                verbose=2,
                random_state=1)
    optimizer.subscribe(Events.OPTMIZATION_STEP, logger)
    optimizer.maximize(init_points=2, n_iter=2)
    return optimizer


with warnings.catch_warnings():
    warnings.simplefilter("ignore")
    optimizer = optimise_bayes_opt(X_train,y_train)
    best_params = optimizer.max 

print(best_params)

Ошибка

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-269-dc7962d023ef> in <module>
     34 with warnings.catch_warnings():
     35     warnings.simplefilter("ignore")
---> 36     optimizer = optimise_bayes_opt(X_train,y_train)
     37     best_params = optimizer.max
     38 

<ipython-input-269-dc7962d023ef> in optimise_bayes_opt(X, y)
     26                          'loss_param':lSVC_param['loss']},
     27                 verbose=2,
---> 28                 random_state=1)
     29     optimizer.subscribe(Events.OPTMIZATION_STEP, logger)
     30     optimizer.maximize(init_points=2, n_iter=2)

~/.local/lib/python3.6/site-packages/bayes_opt/bayesian_optimization.py in __init__(self, f, pbounds, random_state, verbose)
     71         # Data structure containing the function to be optimized, the bounds of
     72         # its domain, and a record of the evaluations we have done so far
---> 73         self._space = TargetSpace(f, pbounds, random_state)
     74 
     75         # queue

~/.local/lib/python3.6/site-packages/bayes_opt/target_space.py in __init__(self, target_func, pbounds, random_state)
     47         self._bounds = np.array(
     48             [item[1] for item in sorted(pbounds.items(), key=lambda x: x[0])],
---> 49             dtype=np.float
     50         )
     51 

ValueError: setting an array element with a sequence.

Я понял это значениеError после ссылки на вопрос .Кроме того, в этой строке упоминается, что значения должны иметь тип float.Таким образом, значения C_param верны, а другие не верны.Теперь я не знаю, как оптимизировать параметры с не плавающими значениями, такими как штраф, убыток и т. Д.

1 Ответ

0 голосов
/ 04 мая 2019

, потому что форма списка ввода не является (обобщенным) «прямоугольником», который можно превратить в многомерный массив.Поэтому, вероятно,

  [item[1] for item in sorted(pbounds.items(), key=lambda x: x[0])] 

содержит последовательности различной длины.

попробуйте изменить

lSVC_param = {'C':(0.001, 0.01, 0.1, 1, 10),
                   'penalty':('l1','l2'),
                  'loss':('hinge','squared_hinge')

той же длины, которая отправляется в pbounds

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...