TypeError:fit()缺少1个必需的位置参数:“ y”(使用sklearn-ExtraTreesRegressor)

时间:2020-08-03 03:35:23

标签: python scikit-learn

只需试用Sklearn python库,然后我将用于线性回归的一些代码重新定位为适合看到的示例的回归树模型(这是示例代码):

def fit(self, X, y):
        """
        Fit a Random Forest model to data `X` and targets `y`.

        Parameters
        ----------
        X : array-like
            Input values.
        y: array-like
            Target values.
        """
        self.X = X
        self.y = y
        self.n = self.X.shape[0]
        self.model = ExtraTreesRegressor(**self.params)
        self.model.fit(X, y)

这是我编写/修改过的代码

data = pd.read_csv("rmsearch.csv", sep=",")
data = data[["price", "type", "number_bedrooms"]]
predict = "price"

X = np.array(data.drop([predict], 1))
y = np.array(data[predict])
x_train, x_test, y_train, y_test = sklearn.model_selection.train_test_split(X, y, test_size=0.2)

etr = ensemble.ExtraTreesRegressor
etr.fit(x_train, y_train)
acc = etr.score(x_test, y_test)
print("Accuracy; ", acc)

我收到此错误:

etr.fit(x_train, y_train)
TypeError: fit() missing 1 required positional argument: 'y'

我知道fit()将'X','y'和'sample_weight'作为输入。但是,sample_weight默认为无。其他示例对我没有太大帮助,但也可能是我对python相当陌生,无法发现简单的编码错误。

fit()文档:

https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.ExtraTreesRegressor.html#sklearn.ensemble.ExtraTreesRegressor.fit

谢谢您的帮助。

1 个答案:

答案 0 :(得分:1)

问题在这里

etr = ensemble.ExtraTreesRegressor
etr.fit(x_train, y_train)

您需要在调用ensemble.ExtraTreesRegressor之前实例化fit。将此代码更改为

etr = ensemble.ExtraTreesRegressor()
etr.fit(x_train, y_train)

由于y是实例方法,您会收到一个看似奇怪的错误,即缺少.fit,因此此函数的第一个参数实际上是self。在实例上调用.fit时,将自动传递self。如果在类(而不是实例)上调用.fit,则必须提供self。因此,您的代码等效于ensemble.ExtraTreesRegressor.fit(self=x_train, x=y_train)

有关差异的示例,请参见下面的示例。两种形式在功能上是等效的,但是您可以看到第一种形式很笨重。

from sklearn import ensemble

# Synthetic data.
x = [[0]]
y = [1]

myinstance = ensemble.ExtraTreesRegressor()
ensemble.ExtraTreesRegressor.fit(myinstance, x, y)

etr = ensemble.ExtraTreesRegressor()
etr.fit(x, y)