scikitlearn管道:生成d的变压器参数的网格搜索

2024-05-11 19:16:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我想使用scikit学习管道的第一步来生成一个玩具数据集,以便评估分析的性能。我提出的一个简单的示例解决方案如下所示:

import numpy as np
from sklearn.pipeline import Pipeline
from sklearn.grid_search import GridSearchCV
from sklearn.base import TransformerMixin
from sklearn import cluster

class FeatureGenerator(TransformerMixin):

    def __init__(self, num_features=None):
        self.num_features = num_features

    def fit(self, X, y=None, **fit_params):
        return self

    def transform(self, X, **transform_params):
        return np.array(
            range(self.num_features*self.num_features)
        ).reshape(self.num_features,
                  self.num_features)

    def get_params(self, deep=True):
        return {"num_features": self.num_features}

    def set_params(self, **parameters):
        self.num_features = parameters["num_features"]
        return self

这个变压器的作用,例如,被称为:

^{pr2}$

当我尝试在这个管道上进行网格搜索时,它就变得很棘手:

parameter_sets = {
    'pick_features__num_features' : [10,20,30],
    'kmeans__n_clusters' : [2,3,4]
}

pipeline = Pipeline([
    ('pick_features', FeatureGenerator()),
    ('kmeans', cluster.KMeans())
])

g_search_estimator = GridSearchCV(pipeline, parameter_sets)

g_search_estimator.fit(None,None)

网格搜索需要样本和标签作为输入,而不像管道那样健壮,管道不会抱怨None作为输入参数:

TypeError: Expected sequence or array-like, got <type 'NoneType'>

这是有意义的,因为网格搜索需要将数据集划分为不同的cv分区。在


除了上面的例子,我还有很多参数,可以在数据集生成步骤中进行调整。因此,我需要一个解决方案,将这一步包括在我的参数选择交叉验证中。在

问题:有没有办法从第一个转换器内部设置GridSearch的Xs和ys?或者一个解决方案是怎样的呢?它用多个不同的数据集调用GridSearch(最好是并行的)?或者有人试过定制GridSearchCV或者可以指出一些关于这个的阅读材料?在


Tags: 数据fromimportselfnonesearchreturn管道
1条回答
网友
1楼 · 发布于 2024-05-11 19:16:20

您的代码非常干净,因此很高兴为您提供这个快速而肮脏的解决方案:

g_search_estimator.fit([1., 1., 1.],[1., 0., 0.])
g_search_estimator.best_params_

输出:

^{pr2}$

注意,您需要3个样本,因为您正在进行(默认)3倍交叉验证。在

您得到的错误是由于GridSearchCV对象执行的检查导致的,因此它发生在您的转换器有机会执行任何操作之前。所以我要对你的第一个问题说“不”:

Is there a way to set the Xs and ys of the GridSearch from inside the first transformer?

编辑:
我意识到这是不必要的混淆,以下三行是等价的: g\U搜索_估值器.fit([1.,1.,1.],[1.,0.,0.]) g\U搜索_估值器.fit([1.,1.,1.],无) g\U搜索_估值器.fit([1,1,1.])

对不起,我匆忙地把随机的y扔进去了。在

关于网格搜索如何计算不同网格点的分数的一些解释:当您将scoring=None传递给GridSearchCV构造函数时(这是默认设置,所以这里就是这样),它要求估计器提供一个score函数。如果有这样的功能,它是用来评分的。对于KMeans来说,默认的分数函数本质上与到簇中心的距离之和相反。
这是一个无监督的指标,因此y在这里不需要。在

总结一下,您将始终能够:

set the Xs of the GridSearch from inside the first transformer

只要把输入X转换成完全无关的东西,就不会有人抱怨它了。不过,您确实需要一些输入random_X
现在,如果您想使用监督度量(我从您的问题中得到了这种感觉),您还需要指定y
一个简单的场景是,你有一个固定的y向量,你想用它来尝试几个X。然后你就可以:

g_search_estimator.fit(random_X, y, scoring=my_scoring_function)

它应该运行良好。如果您想搜索y的不同值,可能会比较麻烦。在

相关问题 更多 >