Как вести словари нескольких моделей для резюме (и использовать их в цикле)

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

Например, здесь только резюме для XGBoost:

набор данных:

import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
iris = load_iris()
data = pd.DataFrame(data= np.c_[iris['data'], iris['target']],
                     columns= iris['feature_names'] + ['target'])

from sklearn.model_selection import train_test_split
X = data.drop(['target'], axis=1)
y = data['target']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)

функция поиска лучших параметров:

from sklearn.model_selection import GridSearchCV
from sklearn.metrics import accuracy_score, make_scorer
accu = make_scorer(accuracy_score) # I will be using f1 in future

def predict_for_best_params(alg, X_train, y_train, X_test):
    params = {'n_estimators': [200, 300, 500]}
    clf = GridSearchCV(alg, params, scoring = accu, cv=2)
    clf.fit(X_train, y_train)
    print(clf.best_estimator_)
    y_pred = clf.predict(X_test)
    return y_pred

используя его на одной модели:

from xgboost import XGBClassifier
alg = [XGBClassifier()]
y_pred = predict_for_best_params(alg[0], X_train, y_train, X_test)

from sklearn.metrics import accuracy_score
print(accuracy_score(y_test, y_pred))

Я хочу добиться чего-то вроде:

from xgboost import XGBClassifier
from sklearn.ensemble import RandomForestClassifier

alg = [XGBClassifier(), RandomForrest()] # list of many of them

alg_params = {'XGBClassifier': [{'n_estimators': [200, 300, 500]}],
             'RandomForrest': [{'max_depth ': [1, 2, 3, 4]}]}

def predict_for_best_params(alg, X_train, y_train, X_test, params):
    clf = GridSearchCV(alg, params, scoring = accu, cv=2)
    clf.fit(X_train, y_train)
    print(clf.best_estimator_)
    y_pred = clf.predict(X_test)
    return y_pred

for algo in alg:
    params = alg_params[str(algo)][0] #this won't work because str(algo) <> e.g. XGBClassifier() but XGBClassier(all default params)
    y_pred = predict_for_best_params(algo, X_train, y_train, X_test, params)
    print('{} accuracy is: {}'.format(algo, accuracy_score(y_test, y_pred)))

Это хороший способ добиться этого?

Пожалуйста, воздержитесь от вопросов о «наилучшем способе [сделать что-то]» - вопросов о том, как это сделать, должно быть более чем достаточно ...

desertnaut 31.10.2018 14:38
1
1
808
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вас беспокоит только то, как поставить ключ, то можно использовать

params = alg_params[alg.__class__.__name__][0] 

Это должно вернуть только имя класса для объекта alg.

Для альтернативного подхода вы можете посмотреть мой другой ответ:

В этом ответе используется тот факт, что GridSearchCV может принимать список диктовок комбинаций параметров, в которых каждый список будет расширяться отдельно. Но обратите внимание на следующее:

  • Это может быть быстрее, чем ваш текущий for-loop, если вы используете n_jobs > 1 (используйте многопроцессорную обработку).
  • Затем вы можете использовать атрибут cv_results_ заполненного GridSearchCV для анализа оценок.
  • Чтобы вычислить y_pred для отдельных оценщиков, вы можете отфильтровать cv_results_ (возможно, импортировав его в pandas DataFrame), а затем снова подогнать оценщик с наилучшими найденными параметрами, а затем вычислить y_pred. Но должно быть довольно легко.

Привет. Думаю, ваш ответ (ответы) будет полезен и для моего вопроса - stackoverflow.com/questions/55468376/… - Не могли бы вы взглянуть на него? Я думаю, что сейчас моя проблема - это часть y_pred.

scientific_explorer 03.04.2019 13:49

Другие вопросы по теме