使用SGD查找与SVM最相关或最重要的功能(loss = hinge)

时间:2019-05-07 16:25:19

标签: python machine-learning scikit-learn text-classification sklearn-pandas

我正在研究文本分类问题,并且发现SVM在我的文本分类问题上表现最佳。但是,我使用sklearn的SGD分类器(loss = hinge)进行了实验。

LIME似乎提供了一种分析实例并显示给定实例的每个类的分析的方法。但是,LIME的问题是:

exp = explainer.explain_instance(test_document, c.predict_proba)

在explorer.explain_instance函数中,它要求概率分布作为第二个参数(c.predict_proba),并且没有可用于SGD的predict_proba(loss = hinge)。我曾尝试使用CalibratedClassifierCV,但得到的结果却有所不同。

'=======SGD (loss=hinge)======='
Predicted:  [19, 7, 7, 13, 16, 9, 17, 6, 13, 17, 16, 17, 11, 1, 4, 14, 8, 10, 12, 10, 16, 1, 1]
True     :  [19, 3, 7, 13, 16, 9, 15, 6, 13, 10, 16, 17, 11, 1, 4, 14, 8, 5, 20, 18, 2, 12, 1]
0.6521739130434783
'====Calibrated Results======'
Predicted:  [19, 7, 7, 13, 16, 16, 12, 6, 13, 17, 16, 17, 11, 5, 4, 14, 8, 10, 15, 10, 16, 7, 1]
True     :  [19, 3, 7, 13, 16, 9, 15, 6, 13, 10, 16, 17, 11, 1, 4, 14, 8, 5, 20, 18, 2, 12, 1]
0.5652173913043478

此处的目标是在多类文本分类问题中为每个类找到最相关/最重要的功能。目的是分析结果并在研究论文中讨论它们之间的差异。 开放任何建议或替代方案。

此外,我可以使用sklearn的SVC而不是SGD,因为它具有predict_proba属性。但是,问题在于SGD,我已经有了一组要对其进行分析的参数,我找不到将SGD的配置完全转换为SVC的配置的方法。

1 个答案:

答案 0 :(得分:0)

因此我无法使用LIME,但是我找到了LIME的替代方法,称为ELI5 python的库。我将在教程网站上重新创建一个示例,说明如何使用此模块调试机器学习算法。

假设您已经有一个sklearn的clf或estimator对象,该对象适合矢量文本数据:

import eli5
eli5.show_weights(clf, top=10)

enter image description here

上面的代码有效,但是更好的方法是改为提供矢量化器,并让eli5自动找出细节:

#vec is the vectorizer object and 
#target_names is the names of the classes to be used
eli5.show_weights(clf, vec=vec, top=10,
                  target_names=twenty_test.target_names)

enter image description here

要研究分类器如何分配特定类别 show_prediction ,以显示每个类别的分数,以及有助于该分数的热门单词

#second param is the test instance whose prediction you'd like to see.
#vec and target_names are same from show_weights 
eli5.show_prediction(clf, twenty_test.data[0], vec=vec,
                     target_names=twenty_test.target_names)

以下内容只是通过 show_prediction 方法产生的全部输出的一部分。 enter image description here

这正是我在寻找的东西,我想知道为什么以前没有找到它。希望它可以帮助其他人寻找类似的东西。