#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_)