我想使用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的X
s和y
s?或者一个解决方案是怎样的呢?它用多个不同的数据集调用GridSearch(最好是并行的)?或者有人试过定制GridSearchCV
或者可以指出一些关于这个的阅读材料?在
您的代码非常干净,因此很高兴为您提供这个快速而肮脏的解决方案:
输出:
^{pr2}$注意,您需要3个样本,因为您正在进行(默认)3倍交叉验证。在
您得到的错误是由于
GridSearchCV
对象执行的检查导致的,因此它发生在您的转换器有机会执行任何操作之前。所以我要对你的第一个问题说“不”:编辑:
我意识到这是不必要的混淆,以下三行是等价的: 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
在这里不需要。在总结一下,您将始终能够:
只要把输入
X
转换成完全无关的东西,就不会有人抱怨它了。不过,您确实需要一些输入random_X
。现在,如果您想使用监督度量(我从您的问题中得到了这种感觉),您还需要指定
y
。一个简单的场景是,你有一个固定的
y
向量,你想用它来尝试几个X
。然后你就可以:它应该运行良好。如果您想搜索
y
的不同值,可能会比较麻烦。在相关问题 更多 >
编程相关推荐