7

sklearn を使用して、マルチラベル データセットで特徴選択を実行しようとしています。ラベル全体の機能の最終セットを取得したいと考えています。これを別の機械学習パッケージで使用します。ここで見た方法を使用することを計画していました。これは、各ラベルに関連する機能を個別に選択します。

from sklearn.svm import LinearSVC
from sklearn.feature_selection import chi2, SelectKBest
from sklearn.multiclass import OneVsRestClassifier
clf = Pipeline([('chi2', SelectKBest(chi2, k=1000)),
                ('svm', LinearSVC())])
multi_clf = OneVsRestClassifier(clf)

次に、これを使用して、含まれる機能のインデックスをラベルごとに抽出する予定です。

selected_features = []
for i in multi_clf.estimators_:
    selected_features += list(i.named_steps["chi2"].get_support(indices=True))

さて、私の質問は、最終モデルに含める選択した機能をどのように選択すればよいですか? すべての固有の機能 (1 つのラベルにのみ関連する機能を含む) を使用することも、より多くのラベルに関連する機能を選択するために何かを行うこともできます。

私の最初のアイデアは、特定の機能が選択されたラベルの数のヒストグラムを作成し、目視検査に基づいてしきい値を特定することです。私の懸念は、この方法が主観的であることです。sklearn を使用してマルチラベル データセットの機能選択を実行するより原則的な方法はありますか?

4

2 に答える 2

10

この論文の結論によると:

[...] すべてのラベルの平均または最大のカイ 2 乗スコアに従って特徴をランク付けし、使用する特徴を減らしながら、最良の分類器のほとんどを導きました。

次に、機能の適切なサブセットを選択するために、次のことを行う必要があります (次のようなもの):

from sklearn.feature_selection import chi2, SelectKBest

selected_features = [] 
for label in labels:
    selector = SelectKBest(chi2, k='all')
    selector.fit(X, Y[label])
    selected_features.append(list(selector.scores_))

// MeanCS 
selected_features = np.mean(selected_features, axis=0) > threshold
// MaxCS
selected_features = np.max(selected_features, axis=0) > threshold

注: 上記のコードでは、X が何らかのテキスト ベクトライザー (テキストのベクトル化されたバージョン) の出力であり、Y がラベルごとに 1 つの列を持つ pandas データフレームであると想定しています (したがって、列を選択できますY[label])。また、事前に固定しておくべき閾値変数があります。

于 2016-08-23T15:26:46.043 に答える
1

http://scikit-learn.org/stable/modules/feature_selection.html

多数のオプションがありますが、SelectKBest と Recursive 機能の削除は、かなり人気のある 2 つのオプションです。

RFE は、均一な機能をモデルから除外し、再トレーニングして結果を比較することで機能します。これにより、最後に残された機能が最高の予測精度を可能にする機能になります。

最適なものは、データとユース ケースに大きく依存します。

機能選択への相互検証アプローチとして大まかに説明できるものとは別に、より理論的なアプローチであり、複雑なモデルよりも単純なモデルを好む傾向があるベイジアン モデル選択を見ることができます。

于 2016-05-05T12:55:54.970 に答える