提出的问题如下:使用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)))
答案 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,...,但不会将集合命名为“狗”。
此外,它也无法根据新数据进行预测-您需要根据“测试”数据进行预测。因此,它不能与火车测试拆分配合使用,但这并不重要,因为它始终不使用标签。