如何获得最翔实的特点为scikit学习分类?如何获得最翔实的特点为scikit学习分类?(How t

2019-06-02 14:09发布

在机器学习包,比如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学习。 我搜索的文件,但找不到任何东西等。

如果没有这样的功能呢,没有别人知道一个解决办法如何让这些价值?

非常感谢!

Answer 1:

自己不记录功能名称的分类,他们只看到数字阵列。 但是,如果提取使用的功能Vectorizer / CountVectorizer / TfidfVectorizer / DictVectorizer你使用的是线性模型(例如LinearSVC或朴素贝叶斯),那么你可以使用同样的伎俩,该文档分类例如使用。 实施例( 未测试的 ,可含有一个错误或两个):

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



Answer 2:

With the help of larsmans code I came up with this code for the binary case:

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)


Answer 3:

要添加更新, RandomForestClassifier现在支持.feature_importances_属性。 此属性会告诉你有多少所观察到的变化是由该功能解释。 显然,所有这些值的总和必须为<= 1。

我发现执行功能的工程时,这个属性是非常有用的。

得益于scikit学习团队和执行本贡献者!

编辑:这适用于这两个随机森林和GradientBoosting。 所以RandomForestClassifierRandomForestRegressorGradientBoostingClassifierGradientBoostingRegressor都支持这一点。



Answer 4:

我们最近发布了一个库( https://github.com/TeamHG-Memex/eli5 ),它可以做到这一点:它处理variuos分类从scikit学习,二进制/多类案件,可以根据特征值来突出显示文本,集成了IPython中,等等。



Answer 5:

其实我有找到了我的NaiveBayes分类功能的重要性,虽然我使用了上述功能,我是不是能够得到基于类的功能的重要性。 我通过scikit去学习的文档,并调整了上述功能了一下,找到它为我的问题的工作。 希望它可以帮助你!

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_这个工作。



Answer 6:

你也可以做这样的事情的,以创造的重要特征图:

importances = clf.feature_importances_
std = np.std([tree.feature_importances_ for tree in clf.estimators_],
         axis=0)
indices = np.argsort(importances)[::-1]

# Print the feature ranking
#print("Feature ranking:")


# Plot the feature importances of the forest
plt.figure()
plt.title("Feature importances")
plt.bar(range(train[features].shape[1]), importances[indices],
   color="r", yerr=std[indices], align="center")
plt.xticks(range(train[features].shape[1]), indices)
plt.xlim([-1, train[features].shape[1]])
plt.show()


Answer 7:

RandomForestClassifier还没有一个coef_ attrubute,但它会在0.17版本中,我想。 不过,看到RandomForestClassifierWithCoef在课堂上使用scikit学习随机森林递归特征消除 。 这可能给你一些想法来解决上述限制。



Answer 8:

不正是你所寻找的,但一个快速的方法来获得最大的幅度系数(假设大熊猫数据帧列的功能名称):

你训练的模型,如:

lr = LinearRegression()
X_train, X_test, y_train, y_test = train_test_split(df, Y, test_size=0.25)
lr.fit(X_train, y_train)

得到10倍最大的负系数的值(或改变扭转= True以最大正),如:

sorted(list(zip(feature_df.columns, lr.coef_)), key=lambda x: x[1], 
reverse=False)[:10]


文章来源: How to get most informative features for scikit-learn classifiers?