Scikit-learn: FeatureUnionによってどの機能が選択されているかを知る方法は?

作成日 2016年01月06日  ·  4コメント  ·  ソース: scikit-learn/scikit-learn

私はのコードを実行します、
http://scikit-learn.org/stable/auto_examples/feature_stacker.html#example -feature-stacker-py
そして次のコードで、

# Build estimator from PCA and Univariate selection:
combined_features = FeatureUnion([("pca", pca), ("univ_select", selection)])

# Use combined features to transform dataset:
X_features = combined_features.fit(X, y).transform(X)

FeatureUnionにデータを入れて、どの機能が選択されているか知りたいです。 FeatureUnionのドキュメントには、すべてのトランスフォーマーからすべての名前を取得する関数get_feature_names()があります。 したがって、この関数を呼び出すだけで、次のようなエラーが発生します。

AttributeError: Transformer pca does not provide get_feature_names.

実際、pcaにはこのような機能がないことを私は知っています。 しかし、なぜFeatureUnionがこの機能を提供するのですか!?

最も参考になるコメント

これはPCAに関する特定の問題に直接対処しない場合がありますが、質問を正しく読んだ場合、一般に、カスタムパイプラインを介して属性を浸透させる方法について疑問に思っています。

パーティーに遅れますが、パイプライン構造をウォークスルーし、適切なステップを見つけて(featureunion内であっても)、適切な属性を使用することで、パイプライン内の要素にアクセスできます。 これが私が実行したばかりの例です:

pipeline = Pipeline([ ('union', FeatureUnion([ ('categoric', Pipeline([ ('f_cat', feature_type_split(type = 'categoric')), #returns categoric in array for vect ('vect', vect), ])), ('numeric', Pipeline([ ('f_num', feature_type_split(type = 'numeric')), ])), ])), ('select', ff), ('tree_clf', clf), ])

print(pipeline)を介してパイプラインオブジェクト自体を表示すると、参照ポイントが得られます。

Pipeline(steps=[('union', FeatureUnion(n_jobs=1, transformer_list=[('categoric', Pipeline(steps=[('f_cat', feature_type_split(type='categoric')), ('vect', DictVectorizer(dtype=<type 'numpy.float64'>, separator='=', sort=True, sparse=True))])), ('numeric', Pipeline(steps=[('f_num', feature_type...it=2, min_weight_fraction_leaf=0.0, presort=False, random_state=None, splitter='best'))])

だから私は次の方法で組合のステップに進みます:

pipeline.named_steps['union']

次に、次のレベルであるtransformer_list(またはカテゴリパイプライン)に移動します。

pipeline.named_steps['union'].transformer_list[0]

次に、次のレベルに進みます。これは、次の方法でカテゴリパイプライン内のステップです。

pipeline.named_steps['union'].transformer_list[0][1]

上記は典型的なパイプライン構造を出力し、named_stepsを利用できるようになりました。
print pipeline.named_steps['union'].transformer_list[0][1].named_steps['vect']

したがって、次の方法で必要な属性にアクセスします。
print pipeline.named_steps['union'].transformer_list[0][1].named_steps['vect'].get_feature_names()

TLDR;
カスタムパイプラインを使用してパイプライン構造を1つずつウォークスルーし、その変換/推定部分に対して通常行うように属性にアクセスします。

全てのコメント4件

どの機能がどの機能に属しているかを確認する方法があるはずだということに同意します
コンポーネント、そして私はずっと前にこれを提案しました、しかし私はそれがそうではないと思います
現在可能です。

2016年1月6日18:23、 genliu777notifications @ github.comは次のように書いています。

私はのコードを実行します、

http:// scikit-learnorg / stable / auto_examples / feature_stackerhtml#example -feature-stacker-py
そして次のコードで、

PCAと単変量選択から推定量を構築します。

Combined_features = FeatureUnion([( "pca"、pca)、( "univ_select"、selection)])

組み合わせた機能を使用してデータセットを変換します。

X_features = Combined_featuresfit(X、y)transform(X)

FeatureUnionにデータを入れて、どの機能が選択されているか知りたい
FeatureUnionのドキュメントには、関数get_feature_names()があります。
すべてのトランスフォーマーからすべての名前を取得するので、この関数を呼び出すだけです
このようなエラーが発生します
AttributeError:Transformerpcaはget_feature_namesを提供しません
実際、私はpcaがこのような機能を持っていないことを知っていますが、なぜFeatureUnion
この機能を提供してください!?


このメールに直接返信するか、GitHubで表示してください
https://github.com/scikit-learn/scikit-learn/issues/6122。

なぜ現在不可能なのか!? ご存知のとおり、FeatureUnionは関数get_feature_names()を提供し、それも機能するはずです。

たとえば、sklearnのモデルはすべて、関数fittransformを持っているので、FeatureUnionに入れてうまく機能するすべてのモデルを作成し、ソースとして属性を提供する必要があります。 get_feature_names() if not hasattr(trans, 'get_feature_names'): $#$を呼び出します。 それ以外の場合、FeatureUnionは必ずしもget_feature_names()の機能を提供するわけではありません!!

これはPCAに関する特定の問題に直接対処しない場合がありますが、質問を正しく読んだ場合、一般に、カスタムパイプラインを介して属性を浸透させる方法について疑問に思っています。

パーティーに遅れますが、パイプライン構造をウォークスルーし、適切なステップを見つけて(featureunion内であっても)、適切な属性を使用することで、パイプライン内の要素にアクセスできます。 これが私が実行したばかりの例です:

pipeline = Pipeline([ ('union', FeatureUnion([ ('categoric', Pipeline([ ('f_cat', feature_type_split(type = 'categoric')), #returns categoric in array for vect ('vect', vect), ])), ('numeric', Pipeline([ ('f_num', feature_type_split(type = 'numeric')), ])), ])), ('select', ff), ('tree_clf', clf), ])

print(pipeline)を介してパイプラインオブジェクト自体を表示すると、参照ポイントが得られます。

Pipeline(steps=[('union', FeatureUnion(n_jobs=1, transformer_list=[('categoric', Pipeline(steps=[('f_cat', feature_type_split(type='categoric')), ('vect', DictVectorizer(dtype=<type 'numpy.float64'>, separator='=', sort=True, sparse=True))])), ('numeric', Pipeline(steps=[('f_num', feature_type...it=2, min_weight_fraction_leaf=0.0, presort=False, random_state=None, splitter='best'))])

だから私は次の方法で組合のステップに進みます:

pipeline.named_steps['union']

次に、次のレベルであるtransformer_list(またはカテゴリパイプライン)に移動します。

pipeline.named_steps['union'].transformer_list[0]

次に、次のレベルに進みます。これは、次の方法でカテゴリパイプライン内のステップです。

pipeline.named_steps['union'].transformer_list[0][1]

上記は典型的なパイプライン構造を出力し、named_stepsを利用できるようになりました。
print pipeline.named_steps['union'].transformer_list[0][1].named_steps['vect']

したがって、次の方法で必要な属性にアクセスします。
print pipeline.named_steps['union'].transformer_list[0][1].named_steps['vect'].get_feature_names()

TLDR;
カスタムパイプラインを使用してパイプライン構造を1つずつウォークスルーし、その変換/推定部分に対して通常行うように属性にアクセスします。

eli5transform_feature_namesを試してみてください。これは、scikit-learnのget_feature_namesが機能しない場合に機能します。

このページは役に立ちましたか?
0 / 5 - 0 評価