在 scikit-learn 中实现 K 邻居分类器,每个对象有 3 个特征

Posted

技术标签:

【中文标题】在 scikit-learn 中实现 K 邻居分类器,每个对象有 3 个特征【英文标题】:Implement K Neighbors Classifier in scikit-learn with 3 feature per object 【发布时间】:2013-01-08 11:12:39 【问题描述】:

我想用 scikit-learn 模块实现一个 KNeighborsClassifier (http://scikit-learn.org/dev/modules/generated/sklearn.neighbors.KNeighborsClassifier.html)

我从我的图像中检索出稳固性、伸长率和 Humoments 特征。 我如何准备这些数据以进行训练和验证? 我必须为我从图像中检索到的每个对象创建一个包含 3 个特征 [Hm, e, s] 的列表(从 1 个图像有更多对象)?

我读过这个例子(http://scikit-learn.org/dev/modules/generated/sklearn.neighbors.KNeighborsClassifier.html):

X = [[0], [1], [2], [3]]
y = [0, 0, 1, 1]
from sklearn.neighbors import KNeighborsClassifier
neigh = KNeighborsClassifier(n_neighbors=3)
neigh.fit(X, y) 

print(neigh.predict([[1.1]]))
print(neigh.predict_proba([[0.9]]))

X 和 y 是 2 个特征?

samples = [[0., 0., 0.], [0., .5, 0.], [1., 1., .5]]
from sklearn.neighbors import NearestNeighbors
neigh = NearestNeighbors(n_neighbors=1)
neigh.fit(samples) 

print(neigh.kneighbors([1., 1., 1.])) 

为什么在第一个示例中使用 X 和 y 而现在进行采样?

【问题讨论】:

【参考方案1】:

您的第一段代码在1d 数据上定义了一个分类器。

X代表特征向量。

[0] is the feature vector of the first data example
[1] is the feature vector of the second data example
....
[[0],[1],[2],[3]] is a list of all data examples, 
  each example has only 1 feature.

y 代表标签。

下图显示了这个想法:

绿色节点是标签为 0 的数据 红色节点是标签为1的数据 灰色节点是带有未知标签的数据。 打印(neigh.predict([[1.1]]))

这是要求分类器预测x=1.1 的标签。

    print(neigh.predict_proba([[0.9]]))

这是要求分类器为每个标签提供成员概率估计。

由于两个灰色节点都靠近绿色,所以下面的输出是有意义的。

    [0] # green label
    [[ 0.66666667  0.33333333]]  # green label has greater probability

第二段代码其实在scikit-learn上有很好的说明:

在以下示例中,我们从表示数据集的数组构造一个 NeighborsClassifier 类,并询问谁是最接近 [1,1,1] 的点

>>> 样本 = [[0., 0., 0.], [0., .5, 0.], [1., 1., .5]] >>> 从 sklearn.neighbors 导入 NearestNeighbors >>> neigh = NearestNeighbors(n_neighbors=1) >>> neigh.fit(样本) NearestNeighbors(算法='auto',leaf_size=30,...) >>> print(neigh.kneighbors([1., 1., 1.])) (数组([[ 0.5]]),数组([[2]]...))

这里没有目标值,因为这只是一个NearestNeighbors 类,它不是分类器,因此不需要标签。

针对你自己的问题:

既然你需要一个分类器,如果你想使用KNN 方法,你应该诉诸KNeighborsClassifier。您可能想要构建特征向量X 和标签y,如下所示:

X = [ [h1, e1, s1], 
      [h2, e2, s2],
      ...
    ]
y = [label1, label2, ..., ]

【讨论】:

最后一个问题:如何选择标签?为什么是 [0,0,1,1] 而不是 [0,1,2,3] 或 [0,0,0,1] ? 我得到了错误:“设置一个带有序列的数组元素”,因为 fit 函数需要:X : array-like, sparse matrix, BallTree, cKDTree。我有一份清单!如果我在特征向量中插入所有 7 个幽默:“查询数据维度必须匹配 BallTree 数据维度”,我还尝试将其隐藏在 numpy 数组中,同样的错误:“使用序列设置数组元素。” 标签是 [0,0,1,1] 而不是 [0,1,2,3] 因为在那个例子中我们只有 2 个类而不是 4 个类。如果最左边的三个节点实际上是同一个类,它可能是 [0,0,0,1]。您能否针对第二个问题将代码发布在不同的帖子中? 但我有 292 个对象,我该如何选择课程数量?好吧,我在一个新问题中发布我的代码 您的分类目标是什么?这些图像是否描述了不同的主题/图案/颜色/对象?如果是,则对于每种类型,您都给出不同的标签。无论是 0,1,2 还是 'red','white','black',标签的值都无关紧要。重要的是它们有多少值。我也回复了你发的其他帖子。

以上是关于在 scikit-learn 中实现 K 邻居分类器,每个对象有 3 个特征的主要内容,如果未能解决你的问题,请参考以下文章

scikit-learn 中分类算法的文本特征输入格式

在 scikit-learn 中使用具有多项式内核的支持向量分类器

如何在 scikit-learn 中实现多项式逻辑回归?

在 Python 中实现逻辑回归时 Scikit-learn ValueError

在 pyspark 中实现类不平衡算法

用于拟合 scikit 邻居/半径分类的预计算矩阵