在Python中设置分类器输出的阈值

3
假设我在Python中使用 "Probability=True" 标志训练了一个SVM分类器:
classifier = SVC(C = 1000000, gamma = 10, probability=True) 
classifier.fit(my_data, the_labels)

在对新数据进行分类时,我想只保留那些概率高于阈值的新数据,比如说0.90。我该怎么做呢?目前我在尝试以下代码,但是遇到了瓶颈:


当我对新数据进行分类时,我想只保留那些概率高于特定阈值(例如0.9)的分类结果。请问如何实现这一操作?目前,我已经尝试了以下代码,但是还存在问题:
labels_predicted = classifier.predict(new_data)
probabilities = classifier.predict_proba(new_data)

第一个命令返回实际标签,第二个命令返回其标签的概率。因此,对于每个数据点,我都有其最大似然标签以及所有与其相关的属于所有标签的概率。但是最大似然标签可能为0.4,而我不想要它。如何只保留具有一定阈值的标签?

1个回答

2
据我所知,SVC本身不允许以您想要的方式对概率进行阈值处理。在构建“labels_predicted”和“probabilities”之后,您可以进行第二次索引的操作,并获取接受的标签。
thresh = 0.9
accepted_probabilities_idx = probabilities.max(axis=1) > thresh
accepted_labels_predicted = labels_predicted[accepted_probabilities_idx]
accepted_new_data = pandas.DataFrame(new_data, index=accepted_probabilities_idx)

我不确定您想如何处理概率较低的机器学习数据。这个解决方案完全舍弃了这些数据。


我想将被分配到标签的概率低于0.9的数据视为异常值。 - azal
好的,那么以上解决方案是可行的,accepted_new_data之外的所有数据都是异常值。 - Sudeep Juvekar
1
导入 pandas。很有可能你的 new_data 已经是一个 DataFrame 了。只需在 Python 控制台上检查 new_data.__class__。如果它是一个 DataFrame,你可以从代码中删除 pandas.DataFrame - Sudeep Juvekar
在你的回答中,第三行出现了错误:ValueError: boolean index array should have 1 dimension。 - azal
啊,好的... predict_proba 返回一组概率矩阵,但计算每行的最大值不应该很难:将第2行改为 accepted_probabilities_idx = probabilities.max(axis=1) > thresh - Sudeep Juvekar
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接