python - 具有非数字数据的 KNeighborClassifier 失败

标签 python machine-learning scikit-learn knn nearest-neighbor

我正在尝试使用非数字数据训练 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 分类器的所有功能。我缺少一些选项吗?或者如果之前我不将样本转换为 float ,我就无法训练模型?

注意我知道通过输入数字而不是字符可以轻松解决问题。但我需要解决另一个处理非数字数据的问题,并且我无法找到到 float 的简单映射,如前所述。

最佳答案

除了 Mohammed 已经提到的内容之外:你的方法在数学上有缺陷,sklearn 可能无法保证会发生什么。

KNN 分类器只是像 KD-trees 这样的核心数据结构的一个很好的包装。和 Ball-treesHere you can see what kind of assumptions those need .

Here func is a function which takes two one-dimensional numpy arrays, and returns a distance. Note that in order to be used within the BallTree, the distance must be a true metric: i.e. it must satisfy the following properties

Non-negativity: d(x, y) >= 0

Identity: d(x, y) = 0 if and only if x == y

Symmetry: d(x, y) = d(y, x)

Triangle Inequality: d(x, y) + d(y, z) >= d(x, z)

公平地说。 That's just what a metric is .

如上所述,您的指标并不是真正的指标! (即使是最明显的规则:也没有给出非负性。

现在,在上面的文本中,仅给出了有关 Ball 树(而不是 KD 树)的警告,并且 KNN 自动选择底层树结构。因此,这里可能存在一个不好的情况,您应该避免这种情况。

不过我不确定 KD 树是否也需要这些假设!我本以为是,然后指向 kd-trees docs仍然使用“metric”一词和可用的“kd_tree.valid_metrics”(尽管此列表只是 sklearn 附带的常见指标的子集)。

关于python - 具有非数字数据的 KNeighborClassifier 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46372738/

相关文章:

python - python sklearn中的拟合方法

python - 通过另一个程序调用回文函数时输出错误

Python argparse 错误 : error: argument count: invalid int value

tensorflow - 通过批量训练计算自动编码器 MSE 的正确方法

numpy - 多项朴素贝叶斯与 scikit-learn 用于连续和分类数据

python - scikit-learn 中聚类的混淆矩阵

python - C++:仅在具有指定索引的元素中查找数组中的最小值

python - 对 lambda 和列表理解感到困惑

python - 在 Tensorflow 的 2D 数组中存储和标记图像

machine-learning - 如何使用贝叶斯分析计算并组合多个规则的权重来识别书籍