如何在多分类中按频率压缩类标签的数量?

时间:2018-04-22 03:32:59

标签: python scikit-learn

我一直在工作的项目是二元多标签分类,标签超过1000.显然,获得良好的预测太多了。如果我打算选择频率为10%的标签,我应该如何实现这一目标。

缺少值的未处理标签然后我用UNKNOWN替换它,现在它看起来像这样:

148          UNKNOWN
149    RM106 |RM159 
150          UNKNOWN
151           MI291 
152           TM187 
153          UNKNOWN

这是我用scikit-learn分割和二值化标签类的代码。

mlb = MultiLabelBinarizer()
y = [processed_val.split('|') for processed_val in processed]
y_encoded =mlb.fit_transform(y)
list(mlb.classes_)

然后我得到了这样的标签:

 'MI053 ',
 'MI055 ',
 'MI056 ',
 'MI057 ',
 'MI059 ',
 'MI062 ',

这是多标签二值化后的0和1的矩阵

y_encoded.shape
(134110L, 1039L)

我感谢任何有助于压缩数字的方法,而不仅仅是严格到10%的频率。我是Python和机器学习的初学者。你提供的任何东西都会有很大的帮助。感谢。

1 个答案:

答案 0 :(得分:0)

有这么多课程,你可以尝试建立一个与休息的分类器

http://scikit-learn.org/stable/modules/generated/sklearn.multiclass.OneVsRestClassifier.html

然后你只需要担心你所关心的课程的预测。在你的情况下,最常见的课程。在对模型进行评分时,可以使用sample_weight参数来减少对模型性能的影响。请注意,这不会改变模型的拟合度,只会改变评分

训练时,您需要设置分层选项(不是无)

http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html

如果结果不佳,您可能会坚持使用“一对一”方法,但只需为您感兴趣的每个类手动构建二进制分类器。如果您需要,可以对少数标签进行下采样。在训练期间平衡数据集。

如果您不知道样本的类,则应考虑删除该数据点,而不是将其视为单独的类。当“未知”是一个类而不是完全删除这些数据时,也许可以测试模型的性能。