【问题标题】:Do I need to extract feature vectors from MNIST before using Kmeans在使用 Kmeans 之前是否需要从 MNIST 中提取特征向量
【发布时间】:2019-10-20 02:16:24
【问题描述】:

我正在通过sklearn.cluster.KMeans 与 MNIST 一起练习。

直观地说,我只是将训练数据拟合到 sklearn 函数中。但是我的准确率很低。我想知道我错过了哪一步。我应该首先通过 PCA 提取特征向量吗?还是我应该换一个更大的n_clusters

from sklearn import cluster
from sklearn.metrics import accuracy_score

clf = cluster.KMeans(init='k-means++', n_clusters=10, random_state=42)

clf.fit(X_train)

y_pred=clf.predict(X_test)

print(accuracy_score(y_test, y_pred))

结果我很穷 0.137。有什么推荐吗?谢谢!

【问题讨论】:

  • KMeans 是一种聚类算法,对于图像分类并不十分理想。您可以改用KNeighborsClassifier 以及其他分类算法。

标签: python scikit-learn cluster-analysis k-means mnist


【解决方案1】:

你是如何传递图像的?像素是扁平化的还是保持 2d 格式?像素是否被归一化到 0-1 之间?

当您运行集群时,我建议您不要使用 PCA,而是选择保留邻域信息的 T-SNE,但您应该不需要在运行 K-Means 之前需要这样做。

调试的最佳方法是查看您的拟合模型预测为集群的内容。你可以在这里看到一个例子: https://scikit-learn.org/stable/auto_examples/cluster/plot_kmeans_digits.html

通过此信息,您可以了解可能出现的错误。祝你好运!


添加注释:K-Means 也可能不是最适合您的模型。最好在无监督的上下文中对数据进行聚类。而 MNIST 是一个分类用例。 KNN 将是一个更好的选择,同时仍允许您尝试邻居等。

这是我使用 KNN 创建的示例:https://gist.github.com/andrew-x/0bb997b129647f3a7b7c0907b7e836fc

【讨论】:

  • 感谢您的洞察力。我改用KNN,发现了一个令人费解的现象。当我将原始的 60,000 个训练样本拟合到 sklearn.neighbors.KNeighborsClassifier 时,我在 10,000 个样本的测试集中获得了 0.15 左右的准确度。然后我改用sklearn自己提供的mini-MNIST,大约有1000个训练样本和100个测试样本。我得到了一个欺骗性的 0.99 左右的准确度。考虑到样本量,我不认为这是一个合理的结果。 ... ...
  • [cont] 同时,我正在用深度神经网络做同样的任务,用 60, 000 个训练样本轻松突破 98% 的准确率。您是否认为与具有相同数据量的深度神经网络相比,KNN 作为一种常规方法应该归咎于之前的较差性能(0.15 准确度)?还是我处理不当?
  • 我用我创建的使用 KNN over MNIST 的 gist 链接更新了答案。它能够在测试集上获得大约 98% 的成绩。希望它可以帮助您调试模型。
【解决方案2】:

除非我遗漏了什么:您将任意编号为 0-9 的聚类标签与任意编号为 0-9 的标签进行比较。您的集群中的 0 可能最终不会出现在集群编号 0 中,但这是您进行的比较。因此,聚类结果的评估方式不同。获得正确评估的一些选项:

【讨论】:

    猜你喜欢
    • 2014-07-04
    • 2014-03-05
    • 2013-05-11
    • 2016-09-05
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多