73

liblinear や nltk などの機械学習パッケージの分類子は、show_most_informative_features()機能のデバッグに非常に役立つmethod を提供します。

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 の分類器に同様のものが実装されているかどうかです。ドキュメントを検索しましたが、そのようなものは見つかりませんでした。

そのような関数がまだない場合、誰かがそれらの値に到達する方法を知っていますか?

4

9 に答える 9

66

分類子自体は機能名を記録せず、数値配列を表示するだけです。Vectorizerただし、 / CountVectorizer/ TfidfVectorizer/DictVectorizerを使用て特徴を抽出し、線形モデル(またはナイーブベイズなど)を使用している場合は、ドキュメント分類の例LinearSVCで使用されているのと同じトリックを適用できます。例(テストされていない、バグが1つか2つ含まれている可能性があります):

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

于 2012-06-20T09:51:55.117 に答える
54

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)
于 2012-06-21T14:55:49.690 に答える
16

更新を追加するために、属性RandomForestClassifierをサポートするようになりました。.feature_importances_この属性は、観測された分散がその特徴によってどの程度説明されるかを示します。明らかに、これらすべての値の合計は <= 1 でなければなりません。

この属性は、特徴量エンジニアリングを実行するときに非常に便利です。

これを実装してくれた scikit-learn チームと貢献者に感謝します!

編集: これは RandomForest と GradientBoosting の両方で機能します。RandomForestClassifierRandomForestRegressorGradientBoostingClassifierおよびGradientBoostingRegressorすべてがこれをサポートします。

于 2016-08-13T07:31:42.823 に答える
13

最近、それを可能にするライブラリ ( https://github.com/TeamHG-Memex/eli5 ) をリリースしました: scikit-learn、バイナリ/マルチクラスのケースからさまざまな分類子を処理し、特徴値に従ってテキストを強調表示できます、IPython などと統合します。

于 2016-11-24T17:42:54.873 に答える
1

次のようなことを行って、重要な機能の順序別グラフを作成することもできます。

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()
于 2016-08-01T14:55:15.973 に答える
0

RandomForestClassifierはまだ属性を持っていませんがcoef_、0.17 リリースではそうなると思います。ただし、scikit-learn を使用したランダム フォレストでの再帰的特徴の除去RandomForestClassifierWithCoefのクラスを参照してください。これにより、上記の制限を回避するためのアイデアが得られる場合があります。

于 2015-07-28T18:35:13.777 に答える
0

最初にリストを作成し、このリストに名前ラベルを付けます。その後、すべての機能名と列名を抽出して、ラベル リストに追加します。ここでは、単純ベイズ モデルを使用します。単純ベイズ モデルでは、feature_log_prob_ が特徴の確率を示します。

def top20(model,label):

  feature_prob=(abs(model.feature_log_prob_))

  for i in range(len(feature_prob)):

    print ('top 20 features for {} class'.format(i))

    clas = feature_prob[i,:]

    dictonary={}

    for count,ele in enumerate(clas,0): 

      dictonary[count]=ele

    dictonary=dict(sorted(dictonary.items(), key=lambda x: x[1], reverse=True)[:20])

    keys=list(dictonary.keys())

    for i in keys:

      print(label[i])

    print('*'*1000)
于 2020-01-09T18:33:24.483 に答える