как распечатать оценочные коэффициенты после того, как (GridSearchCV) соответствует модели? (SGDRegressor)

#python #scikit-learn

#python #scikit-learn

Вопрос:

Я новичок scikit-learn , но он сделал то, на что я надеялся. Теперь, к сожалению, единственная оставшаяся проблема заключается в том, что я не нахожу, как я мог бы распечатать (или, что еще лучше, записать в небольшой текстовый файл) все оцененные коэффициенты, все выбранные функции. Как это сделать?

То же самое с SGDClassifier, но я думаю, что он одинаков для всех базовых объектов, которые могут быть пригодны, с перекрестной проверкой или без. Полный сценарий ниже.

 import scipy as sp
import numpy as np
import pandas as pd
import multiprocessing as mp
from sklearn import grid_search
from sklearn import cross_validation
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import SGDClassifier


def main():
    print("Started.")
    # n = 10**6
    # notreatadapter = iopro.text_adapter('S:/data/controls/notreat.csv', parser='csv')
    # X = notreatadapter[1:][0:n]
    # y = notreatadapter[0][0:n]
    notreatdata = pd.read_stata('S:/data/controls/notreat.dta')
    notreatdata = notreatdata.iloc[:10000,:]
    X = notreatdata.iloc[:,1:]
    y = notreatdata.iloc[:,0]
    n = y.shape[0]

    print("Data lodaded.")
    X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, y, test_size=0.4, random_state=0)

    print("Data split.")
    scaler = StandardScaler()
    scaler.fit(X_train)  # Don't cheat - fit only on training data
    X_train = scaler.transform(X_train)
    X_test = scaler.transform(X_test)  # apply same transformation to test data

    print("Data scaled.")
    # build a model
    model = SGDClassifier(penalty='elasticnet',n_iter = np.ceil(10**6 / n),shuffle=True)
    #model.fit(X,y)

    print("CV starts.")
    # run grid search
    param_grid = [{'alpha' : 10.0**-np.arange(1,7),'l1_ratio':[.05, .15, .5, .7, .9, .95, .99, 1]}]
    gs = grid_search.GridSearchCV(model,param_grid,n_jobs=8,verbose=1)
    gs.fit(X_train, y_train)

    print("Scores for alphas:")
    print(gs.grid_scores_)
    print("Best estimator:")
    print(gs.best_estimator_)
    print("Best score:")
    print(gs.best_score_)
    print("Best parameters:")
    print(gs.best_params_)


if __name__=='__main__':
    mp.freeze_support()
    main()
 

Ответ №1:

SGDClassifier Экземпляр, снабженный наилучшими гиперпараметрами, хранится gs.best_estimator_ в. coef_ И intercept_ являются подобранными параметрами этой наилучшей модели.

Комментарии:

1. Спасибо, я не видел coef_ и intercept_ не перечислял среди свойств, поэтому я пропустил, gs что они тоже будут. (Вы имели в виду gs.coef_ , а не gs.best_estimator_.coef_ , верно? Хотя я должен быть в состоянии это проверить.)

2. Нет, я имею в виду gs.best_estimator_.coef_ . gs.best_estimator_ это наилучшая оценка, найденная при поиске по сетке (экземпляр SGDClassifier ).

3. возможно ли получить все коэффициенты для разных параметров настройки?

4. К сожалению, текущий API позволяет это сделать. Вероятно, вам придется реализовать собственный поиск по сетке.

5. Вы имели в виду «API не разрешает», а не «разрешает»?

Ответ №2:

  • Из оценщика вы можете получить коэффициенты с coef_ атрибутом.
  • Из конвейера вы можете получить модель с named_steps атрибутом, а затем получить коэффициенты coef_ .
  • Из поиска по сетке вы можете получить модель (наилучшую модель) с best_estimator_ помощью, затем получить named_steps , чтобы получить конвейер, а затем получить coef_ .

Пример:

 from sklearn.svm import LinearSVC
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.model_selection import GridSearchCV

pipe = Pipeline([
    ("scale", StandardScaler()),
    ("model", LinearSVC())
])

# from pipe:
pipe.fit(X, y);
coefs = pipe.named_steps.model.coef_

# from gridsearch:
gs_svc_model = GridSearchCV(estimator=pipe,
                    param_grid={
                      'model__C': [.01, .1, 10, 100, 1000],
                    },
                    cv=5,
                    n_jobs = -1)
gs_svc_model.fit(X, y);
coefs = gs_svc_model.best_estimator_.named_steps.model.coef_
 

Ответ №3:

Я думаю, вы, возможно, ищете оценочные параметры «лучшей» модели, а не гиперпараметры, определенные с помощью grid-search. Вы можете подключить лучшие гиперпараметры из grid-search (‘alpha’ и ‘l1_ratio’ в вашем случае) обратно к модели (‘SGDClassifier’ в вашем случае) для повторного обучения. Затем вы можете найти параметры из подобранного объекта модели.

Код может быть примерно таким:

 model2 = SGDClassifier(penalty='elasticnet',n_iter = np.ceil(10**6 / n),shuffle=True, alpha = gs.best_params_['alpha'], l1_ratio=gs.best_params_['l1_ratio'])
print(model2.coef_)