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

Classification Using DBSCAN w/ Test-Train Split

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

我正在尝试弄清楚如何使用 DBSCAN 来使用训练数据拟合模型,然后预测测试集的标签。我很清楚 DBSCAN 是用于聚类而不是预测的。我还查看了 以及许多其他线程。 DBSCAN 仅附带 fit 和 fit_predict 函数,在尝试使用训练数据拟合模型然后使用测试数据测试模型时,这些函数似乎不太有用。

问题措辞不当还是我遗漏了什么?我查看了 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)))

您链接的问题中接受的答案对您来说也是一个很好的答案:(这就是聚类的作用)。

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

可以这么说,当您使用聚类算法时,train/test 拆分的概念定义较少。交叉验证通常涉及不同的指标;例如,在 K-means 中,交叉验证通常是针对超参数 k,而不是数据的互斥子集,并且优化的指标是簇内与簇间方差,而不是F1准确率。

底线:尝试使用聚类技术进行分类实际上是方钉圆孔。如果你真的想的话,你可以把它塞进去,但是使用现成的分类器会容易得多。

给你那个任务的人都不知道...

DBSCAN 将从不 预测"cat" 或"dog"。就是做不到。

因为它是一种无监督算法,所以它不使用训练标签。 y_train 被忽略(参见参数文档),sklearn 允许你完全传递它是愚蠢的! 它会输出作为簇的点集。许多工具会将这些集合枚举为 1、2、... 但它不会命名集合 "dogs".

此外,它也无法预测新数据 - 您需要预测 "test" 数据。所以它不能与训练测试拆分一起使用,但这并不重要,因为它无论如何都不使用标签。