Как передать class_weight в качестве ввода в hyperopt, который является вводом словарного типа - PullRequest
0 голосов
/ 27 февраля 2020

В библиотеке hyperopt, Как перебрать ввод словарного типа? В sklearn class_weight - это параметр словаря, который я хочу повторить. Я пытался использовать выбор для другого списка словарей. Вывод предполагает, что он не работает, как я подозревал, что он должен работать, какие-либо предложения?

import numpy as np
from hyperopt import fmin, tpe, hp, STATUS_OK, Trials
from sklearn.model_selection import cross_val_score
from sklearn.datasets import load_breast_cancer

bdata = load_breast_cancer()
X = bdata.data
y = bdata.target


def objective(params):
    '''
    X and y are global parameters
    '''
    clf = RandomForestClassifier(n_jobs = -1, **params)
    roc_auc = cross_val_score(clf, X, y, scoring='roc_auc').mean()
    return {'loss': -roc_auc, 'status': STATUS_OK}

class_weight = [{1: 0.9, 0: 0.09999999999999998},
 {1: 0.9450000000000001, 0: 0.05499999999999994},
 {1: 0.99, 0: 0.010000000000000009}]

sample_space = {
  'class_weight': hp.choice('class_weight', class_weight), #problem: list of dictionary as choice input
  'n_estimators': hp.choice('n_estimators', [1, 2, 4, 8, 16, 32, 64, 100]),
  'max_depth': hp.quniform('max_depth', 30, 50, 12)
}

trials = Trials()
best = fmin(objective,
    space=sample_space,
    algo=tpe.suggest,
    max_evals=100,
    trials=trials)

Лучшая производительность была при

{'class_weight': 0, 'max_depth': 36.0, 'n_estimators': 7}

, это даже не был выбор .. Кроме того, потеря не колебалась вообще. Я бы ожидал, что потери несколько уменьшатся с n_estimators и max_depth и не останутся постоянными на уровне -0,9774

...