gpt4 book ai didi

python - scikit 管道 python 中的多个分类模型

转载 作者:太空狗 更新时间:2023-10-30 01:31:50 24 4
gpt4 key购买 nike

我正在使用 Python 解决一些文本文档的二进制分类问题并实现 scikit-learn 库,我希望尝试不同的模型来比较和对比结果 - 主要使用 朴素贝叶斯分类器,SVM with K-Fold CV,CV=5。考虑到后两个模型使用 gridSearchCV(),我发现很难将所有方法组合到一个管道中。由于并发问题,我不能在单个实现期间运行多个管道,因此我需要使用一个管道来实现所有不同的模型。

这是我目前的情况,

# pipeline for naive bayes
naive_bayes_pipeline = Pipeline([
('bow_transformer', CountVectorizer(analyzer=split_into_lemmas, stop_words='english')),
('tf_idf', TfidfTransformer()),
('classifier', MultinomialNB())
])

# accessing and using the pipelines
naive_bayes = naive_bayes_pipeline.fit(train_data['data'], train_data['gender'])

# pipeline for SVM
svm_pipeline = Pipeline([
('bow_transformer', CountVectorizer(analyzer=split_into_lemmas, stop_words='english')),
('tf_idf', TfidfTransformer()),
('classifier', SVC())
])

param_svm = [
{'classifier__C': [1, 10], 'classifier__kernel': ['linear']},
{'classifier__C': [1, 10], 'classifier__gamma': [0.001, 0.0001], 'classifier__kernel': ['rbf']},
]

grid_svm_skf = GridSearchCV(
svm_pipeline, # pipeline from above
param_grid=param_svm, # parameters to tune via cross validation
refit=True, # fit using all data, on the best detected classifier
n_jobs=-1, # number of cores to use for parallelization; -1 uses "all cores"
scoring='accuracy',
cv=StratifiedKFold(train_data['gender'], n_folds=5), # using StratifiedKFold CV with 5 folds
)

svm_skf = grid_svm_skf.fit(train_data['data'], train_data['gender'])
predictions_svm_skf = svm_skf.predict(test_data['data'])

编辑 1:第二个管道是唯一使用 gridSearchCV() 的管道,而且似乎从未执行过。

编辑 2:添加了更多代码以显示 gridSearchCV() 的使用。

最佳答案

考虑在这里检查类似的问题:

  1. Compare multiple algorithms with sklearn pipeline
  2. Pipeline: Multiple classifiers?

总而言之,

这是一种优化任何分类器和每个分类器的任何参数设置的简单方法。

创建适用于任何估算器的切换器类

from sklearn.base import BaseEstimator
class ClfSwitcher(BaseEstimator):

def __init__(
self,
estimator = SGDClassifier(),
):
"""
A Custom BaseEstimator that can switch between classifiers.
:param estimator: sklearn object - The classifier
"""

self.estimator = estimator


def fit(self, X, y=None, **kwargs):
self.estimator.fit(X, y)
return self


def predict(self, X, y=None):
return self.estimator.predict(X)


def predict_proba(self, X):
return self.estimator.predict_proba(X)


def score(self, X, y):
return self.estimator.score(X, y)

现在您可以为估算器参数传入任何内容。您可以按如下方式为传入的任何估算器优化任何参数:

执行超参数优化

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.linear_model import SGDClassifier
from sklearn.pipeline import Pipeline
from sklearn.model_selection import GridSearchCV

pipeline = Pipeline([
('tfidf', TfidfVectorizer()),
('clf', ClfSwitcher()),
])

parameters = [
{
'clf__estimator': [SGDClassifier()], # SVM if hinge loss / logreg if log loss
'tfidf__max_df': (0.25, 0.5, 0.75, 1.0),
'tfidf__stop_words': ['english', None],
'clf__estimator__penalty': ('l2', 'elasticnet', 'l1'),
'clf__estimator__max_iter': [50, 80],
'clf__estimator__tol': [1e-4],
'clf__estimator__loss': ['hinge', 'log', 'modified_huber'],
},
{
'clf__estimator': [MultinomialNB()],
'tfidf__max_df': (0.25, 0.5, 0.75, 1.0),
'tfidf__stop_words': [None],
'clf__estimator__alpha': (1e-2, 1e-3, 1e-1),
},
]

gscv = GridSearchCV(pipeline, parameters, cv=5, n_jobs=12, return_train_score=False, verbose=3)
gscv.fit(train_data, train_labels)

如何解读clf__estimator__loss

clf__estimator__loss 被解释为任何 estimatorloss 参数,其中 estimator = SGDClassifier() 在最上面的例子,它本身就是 clf 的一个参数,它是一个 ClfSwitcher 对象。

关于python - scikit 管道 python 中的多个分类模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48507651/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com