使用带测试训练分割的DBSCAN进行分类

时间:2019-03-29 19:00:57

标签: scikit-learn classification dbscan

提出的问题如下:使用scikit-learn将数据分为训练和测试集。使用DBSCAN将数据分类为猫还是狗。

我正在尝试弄清楚如何使用DBSCAN使用训练数据拟合模型,然后预测测试集的标签。我很清楚,DBSCAN是用于聚类而不是预测。我还研究了Use sklearn DBSCAN model to classify new entries以及许多其他线程。 DBSCAN仅带有fit和fit_predict函数,当尝试使用训练数据拟合模型然后使用测试数据对模型进行测试时,DBSCAN似乎没有什么用。

这个问题的措辞不好还是我错过了什么?我查看了scikit-learn文档以及示例,但没有任何运气。

# Split the samples into two subsets, use one for training and the other for testing
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)

# Instantiate the learning model
dbscan = DBSCAN()

# Fit the model
dbscan.fit(X_train, y_train)

# Predict the response

# Confusion matrix and quantitative metrics
print("The confusion matrix is: " + np.str(confusion_matrix(y_test, dbscan_pred)))
print("The accuracy score is: " + np.str(accuracy_score(y_test, dbscan_pred)))

2 个答案:

答案 0 :(得分:1)

您链接的问题中接受的答案对您来说也是一个很好的答案:you want to perform classification, not discover structure(集群的作用)。

scikit-learn中实现的

DBSCAN是一种转导算法,这意味着您无法对 new 数据进行预测。有一个old discussion from 2012 on the scikit-learn repository

可以说,在使用聚类算法时,训练/测试拆分的概念定义较少。交叉验证通常涉及不同的指标。例如,在K均值中,交叉验证通常是在超参数k上,而不是数据的互斥子集,并且经过优化的度量标准是内部对内部聚类方差,而不是F1准确性。

底线:尝试使用聚类技术执行分类实际上是正方形固定圆孔。您可以根据需要进行调整,但是仅使用现成的分类器会容易得多。

答案 1 :(得分:1)

谁给你的任务毫无头绪...

DBSCAN将从不预测“猫”或“狗”。只是不能。

由于它是无监督算法,因此不使用训练标签。 y_train被忽略(请参阅参数文档),而sklearn完全允许您通过它是很愚蠢的。它将输出成簇的点集。许多工具会将这些集合枚举为1、2,...,但不会将集合命名为“狗”。

此外,它也无法根据新数据进行预测-您需要根据“测试”数据进行预测。因此,它不能与火车测试拆分配合使用,但这并不重要,因为它始终不使用标签。