【发布时间】:2020-07-14 13:37:13
【问题描述】:
我正在使用 GridSearchCV 进行模型选择和超参数调整。从最初的实验来看,带有 rdf 内核的 SVC 具有最好的性能。问题在于它太慢(200K+)样本。使用 OneVsRestClassifier 可以并行化 SVC (n_jobs)。但是,当我使用 Pipeline 同时测试多个估算器时,gridsearchcv 不适用于此嵌入式估算器。
pipe = Pipeline([('clf', SVC())]) # Placeholder Estimator
# Candidate learning algorithms and their hyperparameters
search_space = [{'clf': [OneVsRestClassifier(SVC(tol=0.1, gamma='scale', probability=True), n_jobs=-1],
'clf__kernel': ['rbf', 'linear'],
'clf__C': [1, 10, 100]},
{'clf': [LogisticRegression(tol=0.1, penalty='l1', solver='saga', multi_class='multinomial', n_jobs=8)],
'clf__C': [1, 10, 100]},
{'clf': [RandomForestClassifier(n_jobs=8)],
'clf__n_estimators': [50, 100, 200, 300, 400],
'clf__max_depth': [10, 20, 30],
'clf__min_samples_leaf': [1, 2, 4],
'clf__min_samples_split': [2, 5, 10]},
{'clf': [MultinomialNB()],
'clf__alpha': [0.1, 0.5, 1]}]
gs = GridSearchCV(pipe, search_space, cv=skf, scoring='accuracy', verbose=10)
我有错误
Invalid Parameter __kernel
但是根据GridSearch for an estimator inside a OneVsRestClassifier,这个方法应该可以。我认为是管道搞砸了,因为它基本上在 OneVsRestClassifier 之上添加了另一层。我究竟如何为这个嵌套估计器执行 gridsearchcv?
【问题讨论】:
-
@desertnaut 在我根据输出更改为
clf__estimator__kernel之后,它似乎确实加载了第一个估计器。但我立即收到了ValueError: WRITEBACKIFCOPY base is read-only。 -
好吧,不知道那个...!!!???我们需要minimal reproducible example 来调查它...
-
@desertnaut 但此错误仅在我将“估计器”添加到参数后才会发生。仅使用
SVC而没有OneVsRestClassifier运行良好。实际上,如果我从OneVsRestClassifier中取出n_jobs=-1,错误就会消失。但是如果不并行运行,就否定了使用OneVsRestClassifier的目的 -
您的数据中有多少类和特征?
-
@desertnaut 大约 170 个不同的类。这是一个文本分类,因此数据被转换为稀疏矩阵。矢量化后,我取了前 2000 个特征。
标签: python machine-learning scikit-learn pipeline