这是一个创建分类器的简单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))
答案 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个参数并解决您看到的错误。