【问题标题】:MLPClassifier threshold factor to eliminate test samples that are not in match with train dataMLPClassifier 阈值因子,用于消除与训练数据不匹配的测试样本
【发布时间】:2018-03-07 10:12:58
【问题描述】:

我正在使用 MLPClassifer 示例 scikit-learn

训练代码:

from sklearn.neural_network import MLPClassifier
X = [[0., 0.], [1., 1.]]
y = [0, 1]
clf = MLPClassifier(solver='lbfgs', alpha=1e-5,
                    hidden_layer_sizes=(5, 2), random_state=1)

clf.fit(X, y)                         

在预测步骤,我们使用测试数据 [2., 2.], [-1., -2.] in clf.predict([[2., 2.], [-1., -2.]])。这个函数的输出是 array([1, 0])

正如我们所观察到的,测试数据 [2.,2.] 不在我们通过的训练数据集中。尽管如此,我们还是得到了最接近的匹配标签 1。

我想要找到的是,如果我提供的测试数据不在训练数据集中,我应该向用户打印一条消息,指出数据无效,而不是告诉他错误的标签为 1。

例如,在 knn 分类中,我有kneighbours function,它告诉我最近的邻居与我以 0 到 1 的比例提供的测试数据的距离。因此,我可以通过将阈值保持在 0.6 或 0.7 来轻松消除与我的训练数据样本相距甚远的测试数据样本。

有没有像这样的标准/阈值,我可以用 MLPClassifier 或Incremental Classifiers mentioned here 中的任何一个来限制我的测试样本(如果火车数据集中不存在)?

【问题讨论】:

  • 那么,您想仅从训练集中预测样本吗?
  • 抱歉,这些模型不是这样工作的。假设训练样本和测试样本基于某个未知分布独立同分布,而 MLP 只是学习这个分布。如果你把无效的输入塞进它的喉咙里,你不应该期望它知道,因为它假设你知道你在做什么。我建议您在将其传递给预测之前提前过滤掉这些无效值。
  • @user1 ,那么,你不能只检查样本是否在训练集中,如果是,就报告相应的 y 值吗?使用分类器有什么意义?
  • 我有一个训练数据集,它对我的​​ 10 个不同的人脸图像进行分类。当我预测我的新人脸图像时,它总是预测为我的。完美的。没问题,。但是,当我给我的同事提供未经训练的图像时,它仍然与我训练过的一张脸相匹配。我的脸不应该和我同事的脸匹配,即使相似度很小。
  • 我用 knn 分类器尝试了这个,并且由于 kneighbour 函数,阈值因子在那里工作正常。但是,我想看看我如何与其他分类器一起预测这一点。我很想知道是否有任何距离公式或概率可以设置为过滤器。我试图用 predict_proba(test_data) 找到一些方法并得到值 [[0.34 0.002...]。我不确定这是否是我应该专注的事情。

标签: python machine-learning scikit-learn


【解决方案1】:

在 cmets 中,您已经解释说您已经使用单个类(您的脸的图片)训练了分类器。为了能够分类它是否是你的脸,你应该用负类(not你的脸)训练你的模型,这样模型将学习可能有助于识别的特征您在不同人群中的脸。

互联网上充斥着带有面孔的图片,因此您可以轻松收集数千张此类图片并正确训练您的分类器。

【讨论】:

  • 我后来在 cmets 中扩展,我现在训练了 4 个不同的课程。我的问题不是分类。算法与我传递的任何数据完美分类。然而,即使对于未知数据,它也给出了最接近的匹配。我想避免这种情况。使用 knn 分类器可以过滤掉即使使用距离测量一次也完全没有训练过的未知人脸。在 0 到 1 的范围内,我所有的脸的距离都在 0 到 0.1 左右。任何高于 0.5 的东西都很有可能不是我的脸。我正在寻找类似 MLP 的类似措施
  • 尽管我把互联网上所有图片的面孔都拿来分类,但新面孔仍然会加起来。我认为无论分类器模型有多好,有一个阈值可以提供很多控制。
  • @user1,试着问这个问题on datascience.stackexchange.com
  • 好的。谢谢你。随意添加您的任何想法/建议
【解决方案2】:

Decision functionhttps://datascience.stackexchange.com/a/28762/15884。它包含正值、0 值和负值。因此,将阈值设置为 0 以上可以消除异常值。

编辑:如果您使用 partial_fit(),则必须再次检查阈值因子。高于 0 的阈值仅适用于 fit()。此外,MLPClassifier 没有 decision_function()。这个答案适用于提供决策函数()的算法。

【讨论】:

    猜你喜欢
    • 2013-08-13
    • 2018-11-20
    • 2019-03-18
    • 1970-01-01
    • 1970-01-01
    • 2021-03-14
    • 2017-03-24
    • 2013-12-21
    • 2019-07-06
    相关资源
    最近更新 更多