sklearn:计算测试数据集上k-means的准确度得分

Posted

技术标签:

【中文标题】sklearn:计算测试数据集上k-means的准确度得分【英文标题】:sklearn: calculating accuracy score of k-means on the test data set 【发布时间】:2016-10-16 23:10:49 【问题描述】:

我正在对具有 2 个聚类的 30 个样本集进行 k-means 聚类(我已经知道有两个类)。我将数据分为训练集和测试集,并尝试计算测试集的准确度分数。但是有两个问题:首先我不知道我是否真的可以为 k-means 聚类做到这一点(测试集上的准确度得分)。第二:如果允许我这样做,我的实现是对还是错。这是我尝试过的:

df_hist = pd.read_csv('video_data.csv')

y = df_hist['label'].values
del df_hist['label']
df_hist.to_csv('video_data1.csv')
X = df_hist.values.astype(np.float)

X_train, X_test,y_train,y_test =  cross_validation.train_test_split(X,y,test_size=0.20,random_state=70)
k_means = cluster.KMeans(n_clusters=2)
k_means.fit(X_train)
print(k_means.labels_[:])
print(y_train[:])

score = metrics.accuracy_score(y_test,k_means.predict(X_test))
print('Accuracy:0:f'.format(score))

k_means.predict(X_test)
print(k_means.labels_[:])
print(y_test[:])

但是,当我为测试集打印 k-means 标签时 (k_means.predict(X_test) print(k_means.labels_[:])) 和 y_test 标签(print(k_means.labels_[:])) 在最后三行中,我得到的标签与我安装 X-train 时的标签相同,而不是为X 检验。知道我在这里可能做错了什么吗?我正在做什么来评估 k-means 的性能是否正确? 谢谢!

【问题讨论】:

【参考方案1】:

在评估准确性方面。您应该记住,k-means 不是分类工具,因此分析准确性不是一个好主意。你可以这样做,但这不是 k-means 的用途。它应该找到一组最大化集群间距离的数据,它不使用你的标签来训练。因此,像 k-means 这样的东西通常会用 RandIndex 和其他聚类指标来测试。为了最大限度地提高准确性,您应该拟合实际的分类器,例如 kNN、逻辑回归、SVM 等。

就代码本身而言,k_means.predict(X_test)返回标签,它不会更新内部labels_字段,你应该这样做

print(k_means.predict(X_test))

此外,在 python 中,您不必(也不应该)使用[:] 来打印数组,只需这样做

print(k_means.labels_)
print(y_test)

【讨论】:

以上是关于sklearn:计算测试数据集上k-means的准确度得分的主要内容,如果未能解决你的问题,请参考以下文章

菜菜的sklearn课堂笔记支持向量机-探索核函数在不同数据集上的表现

sklearn获得某个参数的不同取值在训练集和测试集上的表现的曲线刻画

sklearn 管道在应用于测试集时不记得其状态

交叉验证 Python Sklearn

机器学习 sklearn 无监督学习 聚类算法 K-means

为啥我的 k-means 收敛条件给出的结果与 sklearn 不同?