我正在尝试使用非数字数据训练KNeighborClassifier
,但是我提供的自定义度量标准允许在样本之间计算相似性分数。
from sklearn.neighbors import KNeighborsClassifier
#Compute the "ASCII" distance:
def my_metric(a,b):
return ord(a)-ord(b)
#Samples and labels
X = [["a"],["b"], ["c"],["m"], ["z"]]
#S=Start of the alphabet, M=Middle, E=end
y = ["S", "S", "S", "M", "E"]
model = KNeighborsClassifier(metric=my_metric)
model.fit(X,y)
X_test = [["e"],["f"],["w"]]
y_test = [["S"],["M"],["E"]]
model.score(X_test, y_test)
我有以下错误:
Traceback (most recent call last):
File "/home/marcofavorito/virtualenvs/nlp/lib/python3.5/site-packages/IPython/core/interactiveshell.py", line 2862, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-20-e339c96eea22>", line 1, in <module>
model.score(X_test, y_test)
File "/home/marcofavorito/virtualenvs/nlp/lib/python3.5/site-packages/sklearn/base.py", line 350, in score
return accuracy_score(y, self.predict(X), sample_weight=sample_weight)
File "/home/marcofavorito/virtualenvs/nlp/lib/python3.5/site-packages/sklearn/neighbors/classification.py", line 145, in predict
neigh_dist, neigh_ind = self.kneighbors(X)
File "/home/marcofavorito/virtualenvs/nlp/lib/python3.5/site-packages/sklearn/neighbors/base.py", line 361, in kneighbors
**self.effective_metric_params_)
File "/home/marcofavorito/virtualenvs/nlp/lib/python3.5/site-packages/sklearn/metrics/pairwise.py", line 1247, in pairwise_distances
return _parallel_pairwise(X, Y, func, n_jobs, **kwds)
File "/home/marcofavorito/virtualenvs/nlp/lib/python3.5/site-packages/sklearn/metrics/pairwise.py", line 1090, in _parallel_pairwise
return func(X, Y, **kwds)
File "/home/marcofavorito/virtualenvs/nlp/lib/python3.5/site-packages/sklearn/metrics/pairwise.py", line 1104, in _pairwise_callable
X, Y = check_pairwise_arrays(X, Y)
File "/home/marcofavorito/virtualenvs/nlp/lib/python3.5/site-packages/sklearn/metrics/pairwise.py", line 110, in check_pairwise_arrays
warn_on_dtype=warn_on_dtype, estimator=estimator)
File "/home/marcofavorito/virtualenvs/nlp/lib/python3.5/site-packages/sklearn/utils/validation.py", line 402, in check_array
array = np.array(array, dtype=dtype, order=order, copy=copy)
ValueError: could not convert string to float: 'e'
我想我可以很容易地实现该算法,但是没有sklearn
分类器的所有功能。我错过了一些选择?或者简单地说,如果我不将样品翻译成浮子之前,我无法训练模型?
n.b。我知道可以通过数字而不是字符来轻松解决问题。但是我需要解决另一个处理非数字数据的问题,以及我找不到对浮子的简单映射的问题。
除了穆罕默德已经提到的东西外:您的方法在数学上存在缺陷,Sklearn可能无法保证会发生什么。
KNN分类器只是KD-Trees和Ball-Trees等核心数据结构的不错的交易。在这里,您可以看到这些需要什么样的假设。
这里的弹奏是一个函数,该函数需要两个一维的numpy阵列,并返回一定距离。请注意,为了在Balltree内使用,距离必须是真实的度量:即,它必须满足以下属性
非阴性:d(x,y)&gt; = 0
身份:d(x,y)= 0时,仅当x == y
时对称性:D(x,y)= d(y,x)
三角形不等式:d(x,y) d(y,z)&gt; = d(x,z)
公平。那就是指标。
这样说,您的公制不是真正的度量标准!(即使是最明显的规则:未给出非阴性。
现在在上面的文本中,只给出了对球树(不是KD-Tree)的警告,而KNN自动选择了基础的树结构。因此,这里可能会有一个坏案例,您应该避免。
我不确定,如果也需要KD-Tree的这些假设!我本来可以期待的,只是指向仍在使用 temric 和可用kd_tree.valid_metrics
的KD-Trees Docs(尽管此列表只是Sklearnn随附的常见指标的一个子集)。
您的代码中有一些错误。首先是您必须以某种方式将分类数据转换为数值数据。Sklearn中的KNN分类器尚不支持分类数据。其次,您需要在sklearn中使用make_scorer()函数,以便使用自定义指标。KNN中的默认score
函数返回平均准确性,而不是您指定的度量。你可以在这里读更多关于它的内容。您需要更改数据集,以便使用KNN分类器的Sklearlen实现。