_transform()接受2个位置参数,但给出了3个 [英] _transform() takes 2 positional arguments but 3 were given
问题描述
我尝试建立具有变量转换的管道 而且我做如下
I try to build a pipeline with variable transformation And i do as below
import numpy as np
import pandas as pd
import sklearn
from sklearn import linear_model
from sklearn.base import BaseEstimator, TransformerMixin
from sklearn.pipeline import Pipeline
数据框
df = pd.DataFrame({'y': [4,5,6], 'a':[3,2,3], 'b' : [2,3,4]})
我尝试获取一个用于预测的新变量
I try to get a new variable for predict
class Complex():
def __init__(self, X1, X2):
self.a = X1
self.b = X2
def transform(self, X1, X2):
age = pd.DataFrame(self.a - self.b)
return age
def fit_transform(self, X1, X2):
self.fit( X1, X2)
return self.transform(X1, X2)
def fit(self, X1, X2):
return self
然后我制作一条管道
X = df[['a', 'b']]
y = df['y']
regressor = linear_model.SGDRegressor()
pipeline = Pipeline([
('transform', Complex(X['a'], X['b'])) ,
('model_fitting', regressor)
])
pipeline.fit(X, y)
我收到错误
pred = pipeline.predict(X)
pred
TypeError Traceback (most recent call last)
<ipython-input-555-7a07ccb0c38a> in <module>()
----> 1 pred = pipeline.predict(X)
2 pred
C:\Program Files\Anaconda3\lib\site-packages\sklearn\utils\metaestimators.py in <lambda>(*args, **kwargs)
52
53 # lambda, but not partial, allows help() to work with update_wrapper
---> 54 out = lambda *args, **kwargs: self.fn(obj, *args, **kwargs)
55 # update the docstring of the returned function
56 update_wrapper(out, self.fn)
C:\Program Files\Anaconda3\lib\site-packages\sklearn\pipeline.py in predict(self, X)
324 for name, transform in self.steps[:-1]:
325 if transform is not None:
--> 326 Xt = transform.transform(Xt)
327 return self.steps[-1][-1].predict(Xt)
328
TypeError: transform() missing 1 required positional argument: 'X2'
我做错了什么?我看到错误是在Complex()类中.如何解决?
what i do wrong? I see the mistake is in class Complex(). How to fix it?
推荐答案
因此,问题在于transform
需要一个形状为[n_samples, n_features]
So the problem is that transform
expects an argument of array of shape [n_samples, n_features]
请参见源,它希望X
是一个数组,而不是像X1
和X2
这样的单独变量.
See the Examples section in the documentation of sklearn.pipeline.Pipeline
, it uses sklearn.feature_selection.SelectKBest
as a transform, and you can see its source that it expects X
to be an array instead of separate variables like X1
and X2
.
简而言之,您的代码可以像这样固定:
In short, your code can be fixed like this:
import pandas as pd
import sklearn
from sklearn import linear_model
from sklearn.pipeline import Pipeline
df = pd.DataFrame({'y': [4,5,6], 'a':[3,2,3], 'b' : [2,3,4]})
class Complex():
def transform(self, Xt):
return pd.DataFrame(Xt['a'] - Xt['b'])
def fit_transform(self, X1, X2):
return self.transform(X1)
X = df[['a', 'b']]
y = df['y']
regressor = linear_model.SGDRegressor()
pipeline = Pipeline([
('transform', Complex()) ,
('model_fitting', regressor)
])
pipeline.fit(X, y)
pred = pipeline.predict(X)
print(pred)
这篇关于_transform()接受2个位置参数,但给出了3个的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!