函数“pipeline.py”中的一段代码如下
def fit(self, X, y=None, **fit_params):
"""Fit all the transforms one after the other and transform the
data, then fit the transformed data using the final estimator.
"""
Xt, fit_params = self._pre_transform(X, y, **fit_params)
self.steps[-1][-1].fit(Xt, y, **fit_params)
return self
在main()中调用:
pl.fit(X_train, y_train)
我对自我的使用并不熟悉。我的问题是,我可以在不改变“适合”功能的情况下访问变量“Xt”吗?
答案 0 :(得分:2)
是的,在这个特定的例子中 - 看起来你可以这样做:
Xt, fit_params = pl._pre_transform(X_train, y_train)
...在fit
函数之外获取Xt
,然后忽略fit_params
。
值得庆幸的是,看起来fit
函数计算Xt
的方式非常简单 - 只需对方法进行一次调用即可。但请注意,_pre_transform
被标记为“私有”方法 - 通过使用下划线启动方法,您正在使用的库的作者已表明该方法名义上是私有的,不属于公共API,可能会在以后的版本中更改。
看起来该方法也在修改自己,所以你应该仔细检查以确保调用_pre_transform
不会造成任何副作用。
我怎么知道这会起作用?
好吧,当你做pl.fit(X_train, y_train)
时,我知道Python会在内部重写这样的内容:
fit(pl, X_train, y_train)
这意味着在fit
方法中,self
引用pl
,X
引用X_train
,y
引用{ {1}}。
通常,当您执行y_train
时,它与my_obj.method(a, b)
大致相同。这意味着method(my_obj, a, b)
通常与self
相同(除非你做的事情非常奇怪/做元编程)。
然后,my_obj
方法的第一行是:
fit
所以,如果Xt, fit_params = self._pre_transform(X, y, **fit_params)
,self -> pl
和X -> X_train
,我知道这行代码实际上在做:
y -> y_train
我也知道你可以忽略Xt, fit_params = pl._pre_transform(X_train, y_train, **fit_params)
,因为除了X_train和y_train之外你没有提供任何参数:
fit_params
好吧,没有什么可以阻止我们在Xt, fit_params = pl._pre_transform(X_train, y_train)
函数之外调用这段确切的代码 - 无论它在何处被调用,它都应该正常运行。所以我做到了。
然而,更一般的问题的答案是'不' - 仅仅因为函数使用'self'并不意味着函数内的变量是自动可用的。该方法必须返回fit
,或执行Xt
之类的操作,将self.Xt = Xt
添加为对象的字段。