在机器学习包,比如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。 所以RandomForestClassifier
, RandomForestRegressor
, GradientBoostingClassifier
和GradientBoostingRegressor
都支持这一点。
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?