使用带测试训练拆分的 DBSCAN 进行分类
Posted
技术标签:
【中文标题】使用带测试训练拆分的 DBSCAN 进行分类【英文标题】:Classification Using DBSCAN w/ Test-Train Split 【发布时间】:2019-08-20 18:46:33 【问题描述】:提出的问题如下:使用 scikit-learn 将数据拆分为训练集和测试集。使用 DBSCAN 将数据分类为猫或狗。
我试图弄清楚如何使用 DBSCAN 来拟合使用训练数据的模型,然后预测测试集的标签。我很清楚 DBSCAN 用于聚类而不是预测。我还查看了Use sklearn DBSCAN model to classify new entries 以及许多其他线程。 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)))
【问题讨论】:
实际上是 Use sklearn DBSCAN model to classify new entries 的复制品,因为只有当您可以预测新数据上的学习标签时,训练/测试拆分才有意义。 【参考方案1】:给你这个任务的人一点头绪都没有……
DBSCAN从不预测“猫”或“狗”。就是做不到。
因为它是一种无监督算法,所以它不使用训练标签。 y_train
被忽略(参见参数文档),而且 sklearn 完全允许你通过它是愚蠢的! 它会输出点集,即集群。许多工具会将这些集合枚举为 1、2、...,但它不会将集合命名为“狗”。
此外,它也无法预测新数据 - 您需要预测“测试”数据。所以它不能用于训练测试拆分,但这并不重要,因为它不使用标签。
【讨论】:
【参考方案2】:您链接的问题中接受的答案对您来说也是一个很好的答案:you want to perform classification, not discover structure(这就是集群的作用)。
在 scikit-learn 中实现的 DBSCAN 是一种转导算法,这意味着您无法对 新 数据进行预测。有一个关于这个的old discussion from 2012 on the scikit-learn repository。
可以说,当您使用聚类算法时,训练/测试拆分的概念不太明确。交叉验证通常涉及不同的指标;例如,在 K-means 中,交叉验证通常在超参数k
上进行,而不是数据的互斥子集,优化的指标是集群内与集群间方差,而不是 F1 准确度.
底线:尝试使用聚类技术进行分类实际上是方钉圆孔。如果你真的想的话,你可以把它塞进去,但是使用现成的分类器会容易得多。
【讨论】:
所以这个问题的措辞很糟糕,因为 DBSCAN 不是用于分类目的。可以使用 DBSCAN 为分类算法提供的标签,但不应该使用或尝试使用模型进行分类,是吗? @user3727648 你基本上可以通过找出每个 DBSCAN 预测“映射”到的真实标签来将 F1 分数组合在一起。这充满了问题,其中最重要的一点是如果 DBSCAN 设法将一个类分成两半,那么预测和地面实况之间的“映射”是模棱两可的。但即使它确实有效,你也有一个对新数据没有用的转换模型,所以是的,不可能进行真正的训练测试交叉验证。 我决定对整个数据集使用 fit_predict() ,它只是将所有内容聚集到一个集群(标签)中。将其与实际标签进行比较似乎毫无意义。以上是关于使用带测试训练拆分的 DBSCAN 进行分类的主要内容,如果未能解决你的问题,请参考以下文章
使用 PyTorch 和 TorchVision 对自定义数据集进行训练-有效-测试拆分
scikit learn 的训练测试拆分导致训练数据中只有一个唯一值的特征