使用带测试训练拆分的 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 的训练测试拆分导致训练数据中只有一个唯一值的特征

Sklearn 将 Pandas Dataframe 和 CSR Matrix 拆分为测试和训练集

将主数据目录拆分为训练/验证/测试集

机器学习训练和测试数据拆分方法