Как использовать gridsearch и перекрестную проверку с различными параметрами моделей? - PullRequest
0 голосов
/ 25 февраля 2020

Я пишу алгоритм классификации и использую 6 разных моделей. Я хочу улучшить модель, используя параметры тонкой настройки для каждой модели. Проблема, с которой я сталкиваюсь, связана с моим "для l oop" На самом деле, я l oop в трех разных словарях, но соответствие между моделью, которую я использую в gridsearch, и параметрами не сохраняется, так как словари не упорядочены;

Кажется, мне не удалось найти другое решение:

здесь мой код и результат, как вы можете видеть, model_name отличается от param_name, поэтому я получаю несколько ошибок, как например (ValueError: Invalid альфа-параметр для оценки LinearSV C (C = 1,0, class_weight = None, dual = True, fit_intercept = True,)

ниже кода

    model1 = LinearSVC()
    model2 = MultinomialNB()
    model3 = LogisticRegression()
    model4 = RandomForestClassifier()
    model5 = KNeighborsClassifier()
    model6 = MLPClassifier(max_iter=300, random_state=1)

    models = {'Model_SVC': model1, 'Model_G_NB': model2, 'Model_LR': model3, 'Model_RF': model4, 'Model_KN': model5, 'Model_MLP': model6}

    # list of parameters 


    parameter_RF = {'min_samples_split': [3, 5, 10], 
    'criterion': ['gini', 'entropy'],
    'n_estimators' : [100, 300],
    'max_features': ['auto', 'sqrt','log2'],
    'bootstrap': ['True', 'False'],
    'max_depth': [3, 5, 15, 25]
    }

    parameter_LinearSvc = {'C': [0.001, 0.01, 0.1, 1, 10, 100]
    }

    parameter_LR = {'C': [0.001, 0.01, 0.1, 1, 10, 100],
    'penalty' : ['l1', 'l2'],
    'solver' : ['liblinear', 'warn'],
    'dual' : ['True','False'],
    'max_iter' :[100, 110, 120, 130, 140]
    }

    parameter_NB = {'alpha':  [1, 0.1, 0.01, 0.001, 0.0001, 0.00001]
    'loss': ['hinge', 'hinge_squarred'],
    'penalty' : ['l1', 'l2']
    }

    k_range = list(range(1, 31))
    weight_options = ['uniform', 'distance']

    parameter_KNN = dict(n_neighbors=k_range, weights=weight_options)


    parameter_MLP = { 'hidden_layer_sizes': [(50,50,50), (50,100,50), (100,)],
    'activation': ['tanh', 'relu'],
    'solver': ['sgd', 'adam'],
    'alpha': [0.0001, 0.05],
    'learning_rate': ['constant','adaptive'],
    'max_iter' : [100, 200, 300]
    }

    parameters_dict = {'Model_SVC': parameter_LinearSvc, 'Model_G_NB': parameter_NB, 'Model_LR': parameter_LR, 'Model_RF': parameter_LR, 'Model_KN': parameter_KNN, 'Model_MLP': parameter_MLP}
    cv_splitter = KFold(n_splits=10, shuffle=False, random_state=None)

    for feature_name, feature in features.items():
        for model_name, model in models.items():
            for param_name, parameter in parameters_dict.items():
                clf = GridSearchCV(estimator=model, param_grid=parameter, cv=cv_splitter, verbose = 1, n_jobs = -1, return_train_score=True)
                best_model = clf.fit(feature, ylabels)

вывод: как вы можете видеть иногда это работает, но в других случаях параметр и модель не совпадают, что приводит к ошибке

[5 rows x 7 columns]
Feature: vecteur_CV
Model: Model_SVC
Param: Model_SVC

Fitting 10 folds for each of 6 candidates, totalling 60 fits
[Parallel(n_jobs=-1)]: Using backend LokyBackend with 32 concurrent workers.
[Parallel(n_jobs=-1)]: Done  58 out of  60 | elapsed:    2.8s remaining:    0.1s
/svm/base.py:929: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.
  "the number of iterations.", ConvergenceWarning)
[Parallel(n_jobs=-1)]: Done  60 out of  60 | elapsed:    2.8s finished
Feature: vecteur_CV
Model: Model_SVC
Param: Model_G_NB

Fitting 10 folds for each of 24 candidates, totalling 240 fits
[Parallel(n_jobs=-1)]: Using backend LokyBackend with 32 concurrent workers.
joblib.externals.loky.process_executor._RemoteTraceback: 
"""
Traceback (most recent call last):
  File "/ho/anaconda3/lib/python3.7/site-packages/joblib/externals/loky/process_executor.py", line 418, in _process_worker
    r = call_item()
  File "/ho/anaconda3/lib/python3.7/site-packages/joblib/externals/loky/process_executor.py", line 272, in __call__
    return self.fn(*self.args, **self.kwargs)
  File "/ho/anaconda3/lib/python3.7/site-packages/joblib/_parallel_backends.py", line 567, in __call__
    return self.func(*args, **kwargs)
  File "/ho/anaconda3/lib/python3.7/site-packages/joblib/parallel.py", line 225, in __call__
    for func, args, kwargs in self.items]
  File "/ho/anaconda3/lib/python3.7/site-packages/joblib/parallel.py", line 225, in <listcomp>
    for func, args, kwargs in self.items]
  File "/home/anaconda3/lib/python3.7/site-packages/sklearn/model_selection/_validation.py", line 503, in _fit_and_score
    estimator.set_params(**parameters)
  File "/home/anaconda3/lib/python3.7/site-packages/sklearn/base.py", line 224, in set_params
    (key, self))
ValueError: Invalid parameter alpha for estimator LinearSVC(C=1.0, class_weight=None, dual=True, fit_intercept=True,

Функции выглядят следующим образом

`X_data, X_data_0, X_data_1, X_data_2 = features_fusion(verbatim, first_arg)



    features = {'vecteur_CV': X_data, 'vecteur_NEG': X_data_0, 'Vecteur_NEG_lexique': X_data_1, 'Vecteur_NEG_CV': X_data_2}

1 Ответ

0 голосов
/ 28 февраля 2020

Я использовал 2 слегка отличающиеся версии набора данных Iris, и этот код запускается (хотя со многими предупреждениями во время обучения):

from sklearn.model_selection import GridSearchCV,KFold
from sklearn.neural_network import MLPClassifier
from sklearn.svm import LinearSVC
from sklearn.naive_bayes import MultinomialNB
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris

data = load_iris()

model1 = LinearSVC()
model2 = MultinomialNB()
model3 = LogisticRegression()
model4 = RandomForestClassifier()
model5 = KNeighborsClassifier()
model6 = MLPClassifier(max_iter=300, random_state=1)

models = {'Model_SVC': model1, 'Model_G_NB': model2, 'Model_LR': model3, 
          'Model_RF': model4, 'Model_KN': model5, 'Model_MLP': model6}

# list of parameters 


parameter_RF = {'max_depth': [2,3, 5, 15, 25],
                'min_samples_split': [3, 5, 10],
                'criterion': ['gini', 'entropy'],
                'n_estimators' : [100, 300],
                'max_features': ['auto', 'sqrt','log2'],
                'bootstrap': ['True', 'False'],
                }

parameter_LinearSvc = {'C': [0.001, 0.01, 0.1, 1, 10, 100]}

parameter_LR = {'C': [0.001, 0.01, 0.1, 1, 10, 100],
                'penalty' : ['l1', 'l2'],
                'solver' : ['liblinear', 'warn'],
                #'dual' : ['True','False'],
                'max_iter' :[100, 110, 120, 130, 140]
                }

parameter_NB = {'alpha':  [1, 0.1, 0.01, 0.001, 0.0001, 0.00001],
                #'loss': ['hinge', 'hinge_squarred'],
                #'penalty' : ['l1', 'l2']
                }

k_range = list(range(1, 31))
weight_options = ['uniform', 'distance']

parameter_KNN = dict(n_neighbors=k_range, weights=weight_options)


parameter_MLP = {'hidden_layer_sizes':[(50,50,50),(50,100,50),(100,)],
                 'activation': ['tanh', 'relu'],
                 'solver': ['sgd', 'adam'],
                 'alpha': [0.0001, 0.05],
                 'learning_rate': ['constant','adaptive'],
                 'max_iter' : [100, 200, 300]
                 }

parameters_dict = {'Model_SVC': parameter_LinearSvc,
                   'Model_G_NB': parameter_NB,
                   'Model_LR': parameter_LR, 'Model_RF': parameter_RF,
                   'Model_KN': parameter_KNN, 'Model_MLP': parameter_MLP}
cv_splitter = KFold(n_splits=10, shuffle=False, random_state=None)

#features = {'vecteur_CV': X_data, 'vecteur_NEG': X_data_0, 
#            'Vecteur_NEG_lexique': X_data_1, 'Vecteur_NEG_CV': X_data_2}

features = {'iris': data['data'],'iris_sub':data['data'][:,1:]}
ylabels = data['target']

for feature_name, feature in features.items():
    #print(feature_name, feature)
    for model_name in models:
        print('Training model: ', model_name)
        clf = GridSearchCV(estimator=models[model_name],
                           param_grid=parameters_dict[model_name], 
                           cv=cv_splitter, verbose = 1, n_jobs = -1,
                           return_train_score=True)
        best_model = clf.fit(feature, ylabels)

#for feature_name, feature in features.items():
#    for model_name, model in models.items():
#        for param_name, parameter in parameters_dict.items():
#            print(model_name,model,param_name,parameter)
#            clf = GridSearchCV(estimator=model, param_grid=parameter, 
#                               cv=cv_splitter, verbose = 1, n_jobs = -1,
#                               return_train_score=True)
#            best_model = clf.fit(feature, ylabels)

Мне пришлось прокомментировать некоторые параметры модели, так как они давали ошибки. Была также опечатка в вашем фрагменте выше 'Model_RF': parameter_LR должно быть 'Model_RF': parameter_RF. Я не уверен, что это было причиной вашей ошибки. Я также удалил внутренний parameters_dict l oop, так как я мог получить доступ ко всем элементам, используя те же клавиши, что и models.

...