我正在使用SCIkit KNN和levenstein距离来处理一些字符串,就像本页底部的这个例子一样:http://scikit-learn.org/stable/faq.html。不同之处在于我的数据被拆分为训练集并在数据帧中。
此处列出了拆分:
train_feature, test_feature, train_class, test_class = train_test_split(features, classes,
test_size=TEST_SET_SIZE, train_size=TRAINING_SET_SIZE,
random_state=42)
我有以下几点:
>>> model = KNeighborsClassifier(metric='pyfunc',func=machine_learning.custom_distance)
>>> model.fit(train_feature['id'], train_class.as_matrix(['gender']))
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='pyfunc',
metric_params={'func': <function custom_distance at 0x7fd0236267b8>},
n_neighbors=5, p=2, weights='uniform')
其中train_features有一列([24000 行 x 1 列]),id 和 train_class(名称:性别,dtype:对象)是带有"性别"的系列,即"M"或"F"。id 对应于其他地方字典中的键。
自定义距离函数为:
def custom_distance(x,y):
i, j = int(x[0]), int(y[0])
return damerau_levenshtein_distance(lookup_dict[i],lookup_dict[j])
当我尝试获得模型的准确性时:
accuracy = model.score(test_feature, test_class)
我收到此错误:
ValueError: Expected n_neighbors <= 1. Got 5
老实说,我真的很困惑。我已经检查了每个数据集的长度,它们很好。为什么它会告诉我我只有一个数据点可以绘制?任何帮助将不胜感激。
分类器认为数据集只有一个条目。可能它将id
的向量解释为行向量而不是列向量。
尝试
model.fit(train_feature.as_matrix(['id']), train_class.as_matrix(['gender']))
看看是否有帮助。
我遇到了同样的错误。我有一个巨大的数据库,我可以在其中获取训练和测试数据,但出于代码测试目的,我使用了一个相当小的数据库(~原始数据的 0.5%)。在训练过程中,我测试了许多不同的邻居,例如
for neighbor in range(5,19): ...
对 n_neigbors=19
引发了 ValueError 异常。仅当我使用小数据库时才会引发此错误。原因是它没有实际的数据输入来创建 19 种不同的测量。当我使用完整的数据库进行测试时,没有出现此类异常。
设置algorithm='brute'
并不能解决问题,尽管它可能有效。你应该做的是检查你的观察长度,包括训练和测试,并相应地设置n_neighbors
值的上限。
只需设置n_neighbors值
knn = KNeighborsClassifier(n_neighbors=1)
。我需要将模型设置为蛮力和度量到距离:
model = KNeighborsClassifier(metric=machine_learning.custom_distance,algorithm='brute',n_neighbors=50)