GridSearchCV с неверным параметром гамма для оценки LogisticRegression - PullRequest
0 голосов
/ 25 октября 2019

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

Данные находятся в CSV-файле (11,1 МБ), ссылка для скачивания: https://drive.google.com/file/d/1cQFp7HteaaL37CefsbMNuHqPzkINCVzs/view?usp=sharing

У меня есть grid_values = {'gamma':[0.01, 0.1, 1, 10, 100]} Мне нужно применить штраф L1 e L2 вЛогистическая регрессия

Я не смог проверить, будут ли баллы выполняться, потому что у меня следующая ошибка: Неверный параметр гамма для оценщика LogisticRegression. Проверьте список доступных параметров с помощью estimator.get_params().keys().

Это мой код:

from sklearn.model_selection import train_test_split

df = pd.read_csv('fraud_data.csv')

X = df.iloc[:,:-1]
y = df.iloc[:,-1]

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)




def LogisticR_penalty():    
    from sklearn.model_selection import GridSearchCV
    from sklearn.linear_model import LogisticRegression
    from sklearn.model_selection import cross_val_score

    grid_values = {'gamma':[0.01, 0.1, 1, 10, 100]}


    #train de model with many parameters for "C" and penalty='l1'
    lr_l1 = LogisticRegression(penalty='l1')
    grid_lr_l1 = GridSearchCV(lr_l1, param_grid = grid_values, cv=3, scoring = 'recall')
    grid_lr_l1.fit(X_train, y_train)
    y_decision_fn_scores_recall = grid_lr_l1.decision_function(X_test)


    lr_l2 = LogisticRegression(penalty='l2')
    grid_lr_l2 = GridSearchCV(lr_l2, param_grid = grid_values, cv=3 , scoring = 'recall')
    grid_lr_l2.fit(X_train, y_train)
    y_decision_fn_scores_recall = grid_lr_l2.decision_function(X_test)



    #The precision, recall, and accuracy scores for every combination 
    #of the parameters in param_grid are stored in cv_results_
    results = pd.DataFrame()

    results['l1_results'] = pd.DataFrame(grid_lr_l1.cv_results_)
    results['l1_results'] = results['l2_results'].sort_values(by='mean_test_precision_score', ascending=False)

    results['l2_results'] = pd.DataFrame(grid_lr_l2.cv_results_)
    results['l2_results'] = results['l2_results'].sort_values(by='mean_test_precision_score', ascending=False)


    return results
LogisticR_penalty()

Я ожидал от .cv_results_ средних значений теста для каждой комбинации параметров, которые я должен быть доступенздесь: mean_test_precision_score, но не уверен

Вывод: ValueError: Неверный параметр гамма для оценщика LogisticRegression. Проверьте список доступных параметров с помощью estimator.get_params().keys().

Ответы [ 3 ]

1 голос
/ 26 октября 2019

Сообщение об ошибке содержит ответ на ваш вопрос. Вы можете использовать функцию estimator.get_params().keys(), чтобы увидеть все доступные для вас параметры оценки:

from sklearn.linear_model import LogisticRegression

lr = LogisticRegression()

print(lr.get_params().keys())

Выход:

dict_keys(['C', 'class_weight', 'dual', 'fit_intercept', 'intercept_scaling', 'l1_ratio', 'max_iter', 'multi_class', 'n_jobs', 'penalty', 'random_state', 'solver', 'tol', 'verbose', 'warm_start'])
1 голос
/ 26 октября 2019

Из документации scikit-learn , LogisticRegression не имеет параметра gamma, но имеет параметр C для веса регуляризации.

Если вы измените grid_values = {'gamma':[0.01, 0.1, 1, 10, 100]} на grid_values = {'C':[0.01, 0.1, 1, 10, 100]}, ваш код должен работать.

0 голосов
/ 29 октября 2019

Мой код содержал некоторые ошибки, основной ошибкой было неправильное использование param_grid. Мне пришлось применить штрафы L1 и L2 с гаммой 0,01, 0,1, 1, 10, 100. Правильный способ сделать это:

grid_values ​​= {'penalty': ['l1', 'l2'], 'C': [0.01, 0.1, 1, 10, 100]}

Затем необходимо было исправить способ, которым я тренировал свою логистикурегрессии и исправить то, как я получил оценки в cv_results_ и усреднил эти оценки. Следуй за моим кодом:

from sklearn.model_selection import train_test_split

df = pd.read_csv('fraud_data.csv')

X = df.iloc[:,:-1]
y = df.iloc[:,-1]

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)

def LogisticR_penalty():    
    from sklearn.model_selection import GridSearchCV
    from sklearn.linear_model import LogisticRegression
    from sklearn.model_selection import cross_val_score

    grid_values = {'penalty': ['l1', 'l2'], 'C': [0.01, 0.1, 1, 10, 100]}


    #train de model with many parameters for "C" and penalty='l1'

    lr = LogisticRegression()
    # We use GridSearchCV to find the value of the range that optimizes a given measurement metric.
    grid_lr_recall = GridSearchCV(lr, param_grid = grid_values, cv=3, scoring = 'recall')
    grid_lr_recall.fit(X_train, y_train)
    y_decision_fn_scores_recall = grid_lr_recall.decision_function(X_test)

    ##The precision, recall, and accuracy scores for every combination 
    #of the parameters in param_grid are stored in cv_results_
    CVresults = []
    CVresults = pd.DataFrame(grid_lr_recall.cv_results_)

    #test scores and mean of them
    split_test_scores = np.vstack((CVresults['split0_test_score'], CVresults['split1_test_score'], CVresults['split2_test_score']))
    mean_scores = split_test_scores.mean(axis=0).reshape(5, 2)

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