繁体   English   中英

如何将参数传递给scikit中只有一部分管道对象学习?

[英]How to pass a parameter to only one part of a pipeline object in scikit learn?

我需要将一个参数sample_weight传递给我的RandomForestClassifier如下所示:

X = np.array([[2.0, 2.0, 1.0, 0.0, 1.0, 3.0, 3.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0,
        1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 5.0, 3.0,
        2.0, '0'],
       [15.0, 2.0, 5.0, 5.0, 0.466666666667, 4.0, 3.0, 2.0, 0.0, 0.0, 0.0,
        0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0,
        7.0, 14.0, 2.0, '0'],
       [3.0, 4.0, 3.0, 1.0, 1.33333333333, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0,
        0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0,
        9.0, 8.0, 2.0, '0'],
       [3.0, 2.0, 3.0, 0.0, 0.666666666667, 2.0, 2.0, 1.0, 0.0, 0.0, 0.0,
        0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0,
        5.0, 3.0, 1.0, '0']], dtype=object)

y = np.array([ 0.,  0.,  1.,  0.])

m = sklearn.ensemble.RandomForestClassifier(
        random_state=0, 
        oob_score=True, 
        n_estimators=100,
        min_samples_leaf=5, 
        max_depth=10)

m.fit(X, y, sample_weight=np.array([3,4,2,3]))

上面的代码完全正常。 然后,我尝试在管道对象中执行此操作,使用管道对象而不是仅使用随机林:

m = sklearn.pipeline.Pipeline([
    ('feature_selection', sklearn.feature_selection.SelectKBest(
        score_func=sklearn.feature_selection.f_regression,
        k=25)),
    ('model', sklearn.ensemble.RandomForestClassifier(
        random_state=0, 
        oob_score=True, 
        n_estimators=500,
        min_samples_leaf=5, 
        max_depth=10))])

m.fit(X, y, sample_weight=np.array([3,4,2,3]))

现在,这会在fit方法中出现“ ValueError: need more than 1 value to unpack ”。

ValueError                                Traceback (most recent call last)
<ipython-input-212-c4299f5b3008> in <module>()
     25         max_depth=10))])
     26 
---> 27 m.fit(X, y, sample_weights=np.array([3,4,2,3]))

/usr/local/lib/python2.7/dist-packages/sklearn/pipeline.pyc in fit(self, X, y, **fit_params)
    128         data, then fit the transformed data using the final estimator.
    129         """
--> 130         Xt, fit_params = self._pre_transform(X, y, **fit_params)
    131         self.steps[-1][-1].fit(Xt, y, **fit_params)
    132         return self

/usr/local/lib/python2.7/dist-packages/sklearn/pipeline.pyc in _pre_transform(self, X, y, **fit_params)
    113         fit_params_steps = dict((step, {}) for step, _ in self.steps)
    114         for pname, pval in six.iteritems(fit_params):
--> 115             step, param = pname.split('__', 1)
    116             fit_params_steps[step][param] = pval
    117         Xt = X

ValueError: need more than 1 value to unpack

我使用sklearn版本0.14
我认为问题在于管道中的F selection步骤不会为sample_weights接受参数。 如何在运行“ fit ”时将此参数传递给管道中的一个步骤? 谢谢。

从文档:

管道的目的是组合几个步骤,这些步骤可以在设置不同参数的同时进行交叉验证。 为此,它可以使用它们的名称和以“__”分隔的参数名称来设置各个步骤的参数 ,如下例所示。

因此,您只需在要传递到'model'步骤的任何拟合参数kwargs之前插入model__

m.fit(X, y, model__sample_weight=np.array([3,4,2,3]))

您还可以使用方法set_params并添加步骤的名称。

m = sklearn.pipeline.Pipeline([
    ('feature_selection', sklearn.feature_selection.SelectKBest(
        score_func=sklearn.feature_selection.f_regression,
        k=25)),
    ('model', sklearn.ensemble.RandomForestClassifier(
        random_state=0, 
        oob_score=True, 
        n_estimators=500,
        min_samples_leaf=5, 
        max_depth=10))])
m.set_params(model__sample_weight=np.array([3,4,2,3]))

希望我可以在上面的@rovyko帖子上发表评论,而不是单独的答案,但我没有足够的stackoverflow声誉,但是留下评论,所以在这里它是相反的。

你不能使用:

Pipeline.set_params(model__sample_weight=np.array([3,4,2,3])

设置RandomForestClassifier.fit()方法的参数。 代码( 此处 )中指示的Pipeline.set_params()仅用于管道中各个步骤的初始化参数。 RandomForestClassifier没有名为sample_weight初始化参数(请参阅此处的 __init__()方法)。 sample_weight实际上是RandomForestClassifierfit()方法的输入参数,因此只能通过正确标记的答案中提供的方法设置为@ali_m,即,

m.fit(X, y, model__sample_weight=np.array([3,4,2,3]))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM