2015-12-17 1 views
1

Я новичок в пакете hyperopt. Теперь я хочу оптимизировать модель LDA, которая реализована в gensim. Модель LDA оптимизирована, чтобы максимизировать силуэт по сравнению с данными тренировки.Как передать объекты в функцию, которая оптимизирована с помощью hyperopt?

Теперь мой вопрос: «Как передать данные обучения (numpy.ndarray) объектной функции, вызываемой из hyperopt?» Я посмотрел учебники и некоторые example codes. Они устанавливают данные обучения как глобальную переменную. Но в моей ситуации трудно установить данные обучения как глобальную переменную, как они.

Я написал следующий код для оптимизации LDA с помощью hyoeropt. Я укладываюсь в путь, чтобы передать данные обучения функции gensim_objective_function, потому что я собираюсь положить gensim_lda_optimaze в систему, которая вызывает функцию gensim_lda_optimaze.

Как это реализовать?

# I want to pass training data to this function! 
# gensim_lda_tuning_training_corpus, gensim_lda_tuning_num_topic, gensim_lda_tuning_word2id is what I wanna pass 
def gensim_objective_function(arg_dict): 
    from .gensim_lda import evaluate_clustering 
    from .gensim_lda import call_lda_single 
    from .gensim_lda import get_topics_ids 

    alpha = arg_dict['alpha'] 
    eta = arg_dict['eta'] 
    iteration= arg_dict['iteration'] 
    gamma_threshold= arg_dict['gamma_threshold'] 
    minimum_probability= arg_dict['minimum_probability'] 
    passes= arg_dict['passes'] 
    # train LDA model 
    lda_model, gensim_corpus = call_lda_single(matrix=gensim_lda_tuning_training_corpus, 
               num_topics=gensim_lda_tuning_num_topic, 
               word2id_dict=gensim_lda_tuning_word2id, 
               alpha=alpha, eta=eta, 
               iteration=iteration, 
               gamma_threshold=gamma_threshold, 
               minimum_probability=minimum_probability, 
               passes=passes) 
    topic_ids = get_topics_ids(trained_lda_model=lda_model, gensim_corpus=gensim_corpus) 
    labels = [t[0] for t in topic_ids] 
    # get silhouette score with extracted label 
    evaluation_score = evaluate_clustering(feature_matrix=gensim_lda_tuning_training_corpus, labels=numpy.array(labels)) 

    return -1 * evaluation_score 


def gensim_lda_optimaze(feature_matrix, num_topics, word2id_dict): 
    assert isinstance(feature_matrix, (ndarray, csr_matrix)) 
    assert isinstance(num_topics, int) 
    assert isinstance(word2id_dict, dict) 

    parameter_space = { 
     'alpha': hp.loguniform("alpha", numpy.log(0.1), numpy.log(1)), 
     'eta': hp.loguniform("eta", numpy.log(0.1), numpy.log(1)), 
     'iteration': 100, 
     'gamma_threshold': 0.001, 
     'minimum_probability': 0.01, 
     'passes': 10 
    } 
    trials = Trials() 

    best = fmin(
     gensim_objective_function, 
     parameter_space, 
     algo=tpe.suggest, 
     max_evals=100, 
     trials=trials 
    ) 

    return best 

ответ

3

Вы всегда можете использовать partial в python.

from functools import partial 

def foo(params, data): 
    return params, data 

goo = partial(foo, data=[1,2,3]) 

print goo('ala') 

дает

ala [1, 2, 3] 

Другими словами, вы делаете функцию прокси, который данные загружены в качестве данного параметра, и вы спросите hyperopt оптимизировать эту новую функцию, с данными, уже установлены.

, таким образом, в вашем случае вы меняете gensim_objective_function быть что-то принимать все Params:

def RAW_gensim_objective_function(arg_dict, gensim_lda_tuning_training_corpus, 
            gensim_lda_tuning_num_topic, 
            gensim_lda_tuning_word2id): 

и создать фактическую функцию оптимизации, передавая данные в другой части кода

gensim_objective_function = partial(RAW_gensim_objective_function, 
       gensim_lda_tuning_training_corpus = YOUR_CORPUS, 
       gensim_lda_tuning_num_topic = YOUR_NUM_TOPICS, 
       gensim_lda_tuning_word2id = YOUR_IDs) 
+0

этот способ работы для меня! Для меня первый раз использовать «partial». Это действительно хорошие новые знания для меня. Я действительно благодарю вас. –