如何获得scikit学习分类器的大多数信息功能?
classification
machine-learning
python
scikit-learn
10
0

诸如liblinear和nltk之类的机器学习包中的分类器提供了show_most_informative_features()方法,该方法对于调试功能确实很有帮助:

viagra = None          ok : spam     =      4.5 : 1.0
hello = True           ok : spam     =      4.5 : 1.0
hello = None           spam : ok     =      3.3 : 1.0
viagra = True          spam : ok     =      3.3 : 1.0
casino = True          spam : ok     =      2.0 : 1.0
casino = None          ok : spam     =      1.5 : 1.0

我的问题是,是否对scikit-learn中的分类器实施了类似的操作。我搜索了文档,但找不到类似的东西。

如果尚无此类功能,是否有人知道如何解决这些值的解决方法?

非常感谢!

参考资料:
Stack Overflow
收藏
评论
共 5 个回答
高赞 时间 活跃

在larsmans代码的帮助下,我想到了以下二进制情况的代码:

def show_most_informative_features(vectorizer, clf, n=20):
    feature_names = vectorizer.get_feature_names()
    coefs_with_fns = sorted(zip(clf.coef_[0], feature_names))
    top = zip(coefs_with_fns[:n], coefs_with_fns[:-(n + 1):-1])
    for (coef_1, fn_1), (coef_2, fn_2) in top:
        print "\t%.4f\t%-15s\t\t%.4f\t%-15s" % (coef_1, fn_1, coef_2, fn_2)
收藏
评论

分类器本身不记录要素名称,它们仅显示数字数组。但是,如果使用Vectorizer / CountVectorizer / TfidfVectorizer / DictVectorizer提取了特征, 并且使用的是线性模型(例如LinearSVC或Naive Bayes),则可以应用与文档分类示例相同的技巧。示例( 未经测试 ,可能包含一个或两个错误):

def print_top10(vectorizer, clf, class_labels):
    """Prints features with the highest coefficient values, per class"""
    feature_names = vectorizer.get_feature_names()
    for i, class_label in enumerate(class_labels):
        top10 = np.argsort(clf.coef_[i])[-10:]
        print("%s: %s" % (class_label,
              " ".join(feature_names[j] for j in top10)))

这是用于多类分类的;对于二进制情况,我认为您应该仅使用clf.coef_[0] 。您可能需要对class_labels进行排序。

收藏
评论

要添加更新, RandomForestClassifier现在支持.feature_importances_属性。此属性告诉您该功能可以解释多少观测到的方差。显然,所有这些值的总和必须小于等于1。

在执行特征工程时,我发现此属性非常有用。

感谢scikit学习团队和贡献者!

编辑:这适用于RandomForest和GradientBoosting。因此, RandomForestClassifierRandomForestRegressorGradientBoostingClassifierGradientBoostingRegressor均支持此功能。

收藏
评论

实际上,我必须在NaiveBayes分类器上找到功能重要性,尽管我使用了上述功能,但无法基于类获得功能重要性。我仔细阅读了scikit-learn的文档,并对上面的函数进行了一些调整,以发现它可以解决我的问题。希望它也对您有帮助!

def important_features(vectorizer,classifier,n=20):
    class_labels = classifier.classes_
    feature_names =vectorizer.get_feature_names()

    topn_class1 = sorted(zip(classifier.feature_count_[0], feature_names),reverse=True)[:n]
    topn_class2 = sorted(zip(classifier.feature_count_[1], feature_names),reverse=True)[:n]

    print("Important words in negative reviews")

    for coef, feat in topn_class1:
        print(class_labels[0], coef, feat)

    print("-----------------------------------------")
    print("Important words in positive reviews")

    for coef, feat in topn_class2:
        print(class_labels[1], coef, feat)

请注意,您的分类器(在我的情况下是NaiveBayes)必须具有feature_count_属性才能起作用。

收藏
评论

我们最近发布了一个库( https://github.com/TeamHG-Memex/eli5 ),该库可以做到这一点:它处理来自scikit-learn,二进制/多类案例的变量分类器,允许根据特征值突出显示文本,与IPython等集成。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题