sklearn: 在RandomizedSearchCV中使用Pipeline?

我想在sklearn的RandomizedSearchCV中使用Pipeline。然而,目前我认为只支持估计器。这里有一个我希望能够实现的例子:

import numpy as npfrom sklearn.grid_search import RandomizedSearchCVfrom sklearn.datasets import load_digitsfrom sklearn.svm import SVCfrom sklearn.preprocessing import StandardScaler    from sklearn.pipeline import Pipeline# get some datairis = load_digits()X, y = iris.data, iris.target# specify parameters and distributions to sample fromparam_dist = {'C': [1, 10, 100, 1000],           'gamma': [0.001, 0.0001],           'kernel': ['rbf', 'linear'],}# create pipeline with a scaler steps = [('scaler', StandardScaler()), ('rbf_svm', SVC())]pipeline = Pipeline(steps)# do searchsearch = RandomizedSearchCV(pipeline, param_distributions=param_dist, n_iter=50)search.fit(X, y)print search.grid_scores_

如果你直接这样运行,会得到以下错误:

ValueError: Invalid parameter kernel for estimator Pipeline

在sklearn中,有没有好的方法来实现这个功能?


回答:

RandomizedSearchCV以及GridSearchCV确实支持Pipeline(实际上,它们的实现是独立的,而Pipeline被设计为与常规分类器等效)。

问题的关键在于,如果你考虑应该搜索哪些参数,这个问题就很简单了。因为Pipeline由多个对象组成(几个转换器 + 一个分类器),你可能希望为分类器和转换器找到最佳参数。因此,你需要以某种方式区分从哪里获取/设置属性。

所以你需要做的是,说明你想为某个参数找到值,比如,不仅仅是某个抽象的gamma(Pipeline根本没有这个参数),而是Pipeline的分类器的gamma,在你的例子中称为rbf_svm(这也证明了命名需求)。这可以通过在sklearn中广泛使用的嵌套模型的双下划线语法来实现:

param_dist = {          'rbf_svm__C': [1, 10, 100, 1000],           'rbf_svm__gamma': [0.001, 0.0001],           'rbf_svm__kernel': ['rbf', 'linear'],}

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注