【问题标题】:how to use gridsearch and cross validation with differents parameters models?如何使用不同参数模型的网格搜索和交叉验证?
【发布时间】:2020-06-09 14:12:05
【问题描述】:

我编写了一个分类算法并使用了 6 个不同的模型。我想通过对每个模型使用微调参数来改进模型。我遇到的问题与我的“for循环”有关。事实上,我在三个不同的字典中循环,但是我在网格搜索中使用的模型和参数之间的对应关系没有保持,因为字典没有排序;

我似乎没有找到另一个解决方案:

在这里我的代码和结果如您所见 model_name 与 param_name 不同,因此我得到多个错误,例如(ValueError: Invalid parameter alpha for estimator LinearSVC(C=1.0, class_weight=None, dual=True, fit_intercept=真, )

代码下方

    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}

【问题讨论】:

  • 嗨。可以添加features的定义吗?
  • @balleveryday 我添加它

标签: python python-3.x dataframe machine-learning scikit-learn


【解决方案1】:

我使用了 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 上面的sn-p 中还有一个错字应该是'Model_RF': parameter_RF。我不确定这是否是您错误的原因。我还删除了内部parameters_dict 循环,因为我可以使用与models 相同的键访问所有元素。

【讨论】:

    猜你喜欢
    • 2021-12-11
    • 1970-01-01
    • 2017-10-07
    • 2020-04-29
    • 2015-04-21
    • 2019-09-29
    • 2015-09-18
    • 2017-06-19
    • 2013-10-20
    相关资源
    最近更新 更多