Python缺少1个必需的位置参数。

4

这是一个创建分类器的简单 ML 程序。我通过跟随 Google 开发者在 ML 上的播放列表来创建它。当我运行程序时,会输出错误(TypeError: fit() missing 1 required positional argument: 'y_train')。我不明白为什么会出现这种情况。

from scipy.spatial import distance
def euc(a,b):
    return distance.euclidean(a,b)
class ScrappyKNN():
    def fit(self,X_train,y_train):
        self.X_train=X_train
        self.Y_train=y_train
    def predict(self,X_test):
        predictions=[]
        for row in X_test:
            label = self.closest(row)
            predictions.append(label)
        return predictions
    def closest(self,row):
        best_dist = euc(row,self.X_train[0])
        best_index=0
        for i in range(1,len(self.X_train)):
            dist= euc(row,self.X_train[i])
            if dist>best_dist:
                best_dist=dist
                best_index=i
        return self.Y_train[best_index]
from sklearn import datasets
from sklearn.cross_validation import train_test_split
from sklearn.metrics import accuracy_score
iris = datasets.load_iris()
X=iris.data
y=iris.target
X_train, X_test, y_train, y_test=train_test_split(X,y,test_size=0.5)
my_classifier=ScrappyKNN
my_classifier.fit(X_train, y_train)   
predictions=my_classifier.predict(X_test)
print(accuracy_score(y_test,predictions))

3
my_classifier=ScrappyKNN 更改为 my_classifier=ScrappyKNN()。你将其设置为类,但实际上你需要的是该类的一个实例。 - user3483203
1个回答

6
正如评论中指出的那样,你的错误在于这一行:


my_classifier = ScrappyKNN 

你应该将它更改为

my_classifier = ScrappyKNN() 

你得到的错误是基于Python中输入参数的工作方式。Python使用“位置参数”。这意味着,除非你告诉它不同,否则Python会假设输入与函数定义的顺序相同。
在你的代码中,你将fit定义为ScrappyKNN类中的一个方法,有3个输入。fit的定义如下:
fit(self,X_train,y_train)

你可以看到有三个输入,依次为self、x_train和y_train。
通常情况下,这个方法会由ScrappyKNN类的一个对象调用。当你使用一个对象(例如object.method())调用一个类方法时,对象被用作方法的第一个输入。因此,在我的分类器中,my_classifier.fit(X,y)在后台发生了什么是调用fit方法并传入输入my_classifier、X和y。
然而,在你的代码中,你调用了fit,却从来没有实例化一个对象,而是使用了对ScrappyKNN类的引用。因为你没有创建对象,所以没有"self"可用作输入,所以对fit的调用只能看到两个输入。
错误说:
fit()缺少1个必需的位置参数:'y_train'
这是因为fit有3个必需参数:self、x_train和y_train。Python总是假定你的第一个输入是self,第二个输入是X_train,第三个输入是y_train。因为你给它两个输入,它把你的第一个输入,即X_train变量,作为self,把你的第二个输入,即y_train变量,作为X_train。然后它找不到第三个参数,所以报告给你说缺少y_train。实际上,你缺少的参数是self,但python无法知道。
把你的调用从ScrappyKNN改成ScrappyKNN(),实例化了一个ScrappyKNN类的对象。使用该对象调用ScrappyKNN类中的一个方法,然后将self作为fit的第一个参数传递给它,总共有3个参数,并解决了你看到的错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接