【问题标题】:Is there an "Or"-functionality in scikit learns pipelinesscikit 学习管道中是否有“或”功能
【发布时间】:2016-12-11 21:01:58
【问题描述】:

我正在使用 scikit learn 库的 Pipeline 和 GridSearchCV。

我知道例如特征选择方法可以通过FeatureUnion组合。在这种情况下,结果是串联的。我正在寻找的是一个或功能,这样网格搜索会并行执行一些事情,并且最终不会合并。

在下面的(无效)示例中,应执行 SelectKBest() + SVC() 和 VarianceThreshold() + SVC()。

pipeline = Pipeline([ 
    [('kbest', SelectKBest()), 
     ('variance', VarianceThreshold())], 
    ('svm', SVC()) 
]) 

parameters = { 
    'kbest__k': [3, 5], 
    'variance__threshold': [0.1, 0.2], 
    'svm__C': [1], 
    'svm__gamma': [0.1, 0.01] 
} 

grid_search = GridSearchCV(pipeline, parameters) 
grid_search.fit(X, y) 

如果是,是否可以使用相同的功能来拥有多个估算器?

【问题讨论】:

  • 我不知道答案,但解决方法是使用管道列表pipelines = [Pipeline([cleaner, ('svm', SVC())]) for cleaner in [('kbest', SelectKBest()), ('variance', VarianceThreshold())]]
  • @Mephy 感谢您的建议。这种情况下的缺点是您必须在每次迭代中定义一组单独的参数。
  • 看看我对这个问题的回答:stackoverflow.com/questions/23045318/…

标签: python scikit-learn


【解决方案1】:

这是怎么做的:

  1. 使用字典列表而不是单个字典,类似于 example 在 sklearn 官方文档中提供。在某种程度上,每个 dict 就像一个 OR 语句。
  2. 要跳过的步骤,只需使用[None] 跳过即可。

一个工作示例:

from sklearn.feature_selection import VarianceThreshold
from sklearn.svm import SVC
from sklearn.datasets import load_iris

pipeline = Pipeline([ 
    ('kbest', SelectKBest()), 
    ('variance', VarianceThreshold()), 
    ('svm', SVC()) 
]) 

iris = load_iris()
X = iris.data
y = iris.target

parameters = [
    {
        'variance': [None], 
        'kbest__k': [1, 2], 
        'svm__C': [1], 
        'svm__gamma': [0.1, 0.01] 
    },
    {
        'kbest': [None], 
        'variance__threshold': [0.1, 0.2], 
        'svm__C': [1], 
        'svm__gamma': [0.1, 0.01] 
    }
]

grid_search = GridSearchCV(pipeline, parameters) 
grid_search.fit(X, y) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-18
    • 2018-08-24
    • 2019-12-03
    • 2020-11-15
    • 2017-01-06
    • 2020-01-01
    • 2021-10-12
    相关资源
    最近更新 更多