我有一个数据集,其中所有特征都是二进制的,每个数据点的类也是二进制的。我正在尝试将 KNearestClassifier 与用户定义的距离函数一起使用,如下所示:
KNN = KNeighborsClassifier(n_neighbors=3,
algorithm='ball_tree',
metric='pyfunc',
metric_params={"func": lev_metric})
x_train, x_test, y_train, y_test = train_test_split(df_sum,
y,
test_size=0.1,
random_state=0)
KNN.fit(x_train, y_train)
我的自定义指标函数如下:
def lev_metric(a, b):
print(a)
print(b)
return levenshtein(a, b)
度量函数需要两个 ndarrays 的二进制值 0 和 1。当knn.fit调用度量函数时,“b”看起来像预期的那样(例如[0 1 1 0 0 1 0 1 ...),但“a”看起来像乱码,并且是一个具有0到1之间实值元素的ndarray,例如:
[0.32222222 0.42222222 0.34444444 0.47777778 0.41111111 0.38888889
0.4 0.31111111 0.35555556 0.35555556 0.42222222 0.46666667
0.36666667 0.32222222 0.41111111 0.32222222 0.36666667 0.35555556
0.41111111 0.33333333 0.4 0.42222222 0.3 0.37777778
0.38888889 0.48888889 0.41111111 0.43333333 0.34444444 0.35555556
0.43333333 0.38888889 0.43333333 0.32222222 0.47777778 0.34444444...
我错过了什么?我还检查了“x_train”是否正确。另外,knn 不是基于实例的学习器吗?为什么它无论如何都要调用距离函数?不应该只记住训练示例吗?谢谢。