Параметры печати, используемые при поиске по сетке во время gridsearchcv - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь увидеть параметры, которые в настоящее время используются в пользовательской функции оценки в gridsearchcv, пока выполняется поиск по сетке.В идеале это должно выглядеть следующим образом:

Редактировать : Чтобы уточнить, я хочу использовать параметры из сетки поиска, поэтому мне нужно иметь доступ к ним в функции.

def fit(X, y): 
    grid = {'max_features':[0.8,'sqrt'],
            'subsample':[1, 0.7],
            'min_samples_split' : [2, 3],
            'min_samples_leaf' : [1, 3],
            'learning_rate' : [0.01, 0.1],
            'max_depth' : [3, 8, 15],
            'n_estimators' : [10, 20, 50]}   
    clf = GradientBoostingClassifier()
    score_func = make_scorer(make_custom_score, needs_proba=True)


    model = GridSearchCV(estimator=clf, 
                         param_grid=grid, 
                         scoring=score_func,
                         cv=5)


def make_custom_score(y_true, y_score):
    '''
    y_true: array-like, shape = [n_samples] Ground truth (true relevance labels).
    y_score : array-like, shape = [n_samples] Predicted scores
    '''

    print(parameters_used_in_current_gridsearch)

    …

    return score

Я знаю, что могу получить параметры после завершения выполнения, но я пытался получить параметры во время выполнения кода.

Ответы [ 3 ]

0 голосов
/ 15 ноября 2018

Если вам нужно что-то сделать между шагами поиска по сетке, вам нужно написать собственную подпрограмму, используя некоторые низкоуровневые функции Scikit-learn.

GridSearchCV внутренне использует класс ParameterGrid, который можно перебирать для получения комбинаций значений параметров.

Базовый цикл выглядит примерно так

import sklearn
from sklearn.model_selection import ParameterGrid, KFold

clf = GradientBoostingClassifier()

grid = {
    'max_features': [0.8,'sqrt'],
    'subsample': [1, 0.7],
    'min_samples_split': [2, 3],
    'min_samples_leaf': [1, 3],
    'learning_rate': [0.01, 0.1],
    'max_depth': [3, 8, 15],
    'n_estimators': [10, 20, 50]
}

scorer = make_scorer(make_custom_score, needs_proba=True)
sampler = ParameterGrid(grid)
cv = KFold(5)

for params in sampler:
    for ix_train, ix_test in cv.split(X, y):
        clf_fitted = clone(clf).fit(X[ix_train], y[ix_train])
        score = scorer(clf_fitted, X[ix_test], y[ix_test])
        # do something with the results
0 голосов
/ 15 ноября 2018

Вместо использования make_scorer() на вашем "custom score" вы можете создать свой собственный scorer (обратите внимание на разницу между score и scorer !!), который принимает три аргумента с подписью (estimator, X_test, y_test). См. документацию для получения более подробной информации .

В этой функции вы можете получить доступ к объекту estimator, который уже обучен по данным обучения в сетке-поиске. Затем вы можете легко получить доступ ко всем параметрам этого оценщика. Но обязательно верните значение с плавающей запятой в виде счета.

Что-то вроде:

def make_custom_scorer(estimator, X_test, y_test):
    '''
    estimator: scikit-learn estimator, fitted on train data
    X_test: array-like, shape = [n_samples, n_features] Data for prediction
    y_test: array-like, shape = [n_samples] Ground truth (true relevance labels).
    y_score : array-like, shape = [n_samples] Predicted scores
    '''

    # Here all_params is a dict of all the parameters in use
    all_params = estimator.get_params()

    # You need to do some filtering to get the parameters you want, 
    # but that should be easy I guess (just specify the key you want)
    parameters_used_in_current_gridsearch = {k:v for k,v in all_params.items() 
                                            if k in ['max_features', 'subsample', ..., 'n_estimators']}
    print(parameters_used_in_current_gridsearch)

    y_score = estimator.predict(X_test)

    # Use whichever metric you want here
    score = scoring_function(y_test, y_score)
    return score
0 голосов
/ 14 ноября 2018

Не уверен, удовлетворяет ли это вашему варианту использования, но есть параметр verbose, доступный только для такого рода вещей:

from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import SGDRegressor

estimator = SGDRegressor()
gscv = GridSearchCV(estimator, {
    'alpha': [0.001, 0.0001], 'average': [True, False],
    'shuffle': [True, False], 'max_iter': [5], 'tol': [None]
}, cv=3, verbose=2)

gscv.fit([[1,1,1],[2,2,2],[3,3,3]], [1, 2, 3])

Печатается на stdout:

Fitting 3 folds for each of 8 candidates, totalling 24 fits
[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.
[CV] alpha=0.001, average=True, max_iter=5, shuffle=True, tol=None ...
[CV]  alpha=0.001, average=True, max_iter=5, shuffle=True, tol=None, total=   0.0s
[Parallel(n_jobs=1)]: Done   1 out of   1 | elapsed:    0.0s remaining:    0.0s
[CV] alpha=0.001, average=True, max_iter=5, shuffle=True, tol=None ...
[CV]  alpha=0.001, average=True, max_iter=5, shuffle=True, tol=None, total=   0.0s
[CV] alpha=0.001, average=True, max_iter=5, shuffle=True, tol=None ...
[CV]  alpha=0.001, average=True, max_iter=5, shuffle=True, tol=None, total=   0.0s
[CV] alpha=0.001, average=True, max_iter=5, shuffle=False, tol=None ..
[CV]  alpha=0.001, average=True, max_iter=5, shuffle=False, tol=None, total=   0.0s
[CV] alpha=0.001, average=True, max_iter=5, shuffle=False, tol=None ..
[CV]  alpha=0.001, average=True, max_iter=5, shuffle=False, tol=None, total=   0.0s
[CV] alpha=0.001, average=True, max_iter=5, shuffle=False, tol=None ..
[CV]  alpha=0.001, average=True, max_iter=5, shuffle=False, tol=None, total=   0.0s
[CV] alpha=0.001, average=False, max_iter=5, shuffle=True, tol=None ..
[CV]  alpha=0.001, average=False, max_iter=5, shuffle=True, tol=None, total=   0.0s
[CV] alpha=0.001, average=False, max_iter=5, shuffle=True, tol=None ..
[CV]  alpha=0.001, average=False, max_iter=5, shuffle=True, tol=None, total=   0.0s
[CV] alpha=0.001, average=False, max_iter=5, shuffle=True, tol=None ..
[CV]  alpha=0.001, average=False, max_iter=5, shuffle=True, tol=None, total=   0.0s
[CV] alpha=0.001, average=False, max_iter=5, shuffle=False, tol=None .
[CV]  alpha=0.001, average=False, max_iter=5, shuffle=False, tol=None, total=   0.0s
[CV] alpha=0.001, average=False, max_iter=5, shuffle=False, tol=None .
[CV]  alpha=0.001, average=False, max_iter=5, shuffle=False, tol=None, total=   0.0s
[CV] alpha=0.001, average=False, max_iter=5, shuffle=False, tol=None .
[CV]  alpha=0.001, average=False, max_iter=5, shuffle=False, tol=None, total=   0.0s
[CV] alpha=0.0001, average=True, max_iter=5, shuffle=True, tol=None ..
[CV]  alpha=0.0001, average=True, max_iter=5, shuffle=True, tol=None, total=   0.0s
[CV] alpha=0.0001, average=True, max_iter=5, shuffle=True, tol=None ..
[CV]  alpha=0.0001, average=True, max_iter=5, shuffle=True, tol=None, total=   0.0s
[CV] alpha=0.0001, average=True, max_iter=5, shuffle=True, tol=None ..
[CV]  alpha=0.0001, average=True, max_iter=5, shuffle=True, tol=None, total=   0.0s
[CV] alpha=0.0001, average=True, max_iter=5, shuffle=False, tol=None .
[CV]  alpha=0.0001, average=True, max_iter=5, shuffle=False, tol=None, total=   0.0s
[CV] alpha=0.0001, average=True, max_iter=5, shuffle=False, tol=None .
[CV]  alpha=0.0001, average=True, max_iter=5, shuffle=False, tol=None, total=   0.0s
[CV] alpha=0.0001, average=True, max_iter=5, shuffle=False, tol=None .
[CV]  alpha=0.0001, average=True, max_iter=5, shuffle=False, tol=None, total=   0.0s
[CV] alpha=0.0001, average=False, max_iter=5, shuffle=True, tol=None .
[CV]  alpha=0.0001, average=False, max_iter=5, shuffle=True, tol=None, total=   0.0s
[CV] alpha=0.0001, average=False, max_iter=5, shuffle=True, tol=None .
[CV]  alpha=0.0001, average=False, max_iter=5, shuffle=True, tol=None, total=   0.0s
[CV] alpha=0.0001, average=False, max_iter=5, shuffle=True, tol=None .
[CV]  alpha=0.0001, average=False, max_iter=5, shuffle=True, tol=None, total=   0.0s
[CV] alpha=0.0001, average=False, max_iter=5, shuffle=False, tol=None
[CV]  alpha=0.0001, average=False, max_iter=5, shuffle=False, tol=None, total=   0.0s
[CV] alpha=0.0001, average=False, max_iter=5, shuffle=False, tol=None
[CV]  alpha=0.0001, average=False, max_iter=5, shuffle=False, tol=None, total=   0.0s
[CV] alpha=0.0001, average=False, max_iter=5, shuffle=False, tol=None
[CV]  alpha=0.0001, average=False, max_iter=5, shuffle=False, tol=None, total=   0.0s
[Parallel(n_jobs=1)]: Done  24 out of  24 | elapsed:    0.0s finished

Вы можете ссылаться на документы, но также можно указать более высокие значения для большей детализации.

...