python缺少1个必需的位置参数

时间:2018-07-25 22:32:53

标签: python machine-learning scipy scikit-learn typeerror

这是一个创建分类器的简单ML程序。我是按照ML上的Google开发者播放列表创建的。当我运行程序时,输出错误(TypeError:fit()缺少1个必需的位置参数:“ 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))

1 个答案:

答案 0 :(得分:2)

正如评论中指出的那样,您的错误所在的行:

my_classifier = ScrappyKNN 

您应该更改为

my_classifier = ScrappyKNN() 

出现错误的原因是基于输入参数在python中的工作方式。 Python使用位置参数。这只是意味着,除非另行说明,否则python只是假定输入与函数定义的顺序相同。

在代码中,您将fit定义为ScrappyKNN类中具有3个输入的方法。适合的定义是:

fit(self,X_train,y_train)

您可以看到按顺序有三个输入:self,x_train和y_train。

通常,此方法将由ScrappyKNN类的 object 调用。当您使用对象调用类方法时(如object.method()中的方法),该对象将被用作方法的第一个输入。因此,在幕后的my_classifier.fit(X,y)中,正在发生的事情是使用输入my_classifier X,y调用方法fit。

但是,在您的代码中,您无需实例化对象即可调用fit,而是使用对ScrappyKNN类的引用。由于尚未创建对象,因此没有“自我”可用作输入,因此fit调用仅看到2个输入。

错误提示

  

Blockquote   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作为第一个适合的参数传递,总共给它3个参数并解决您看到的错误。