Scikit-learn: كيف تعرف الميزة التي اختارها FeatureUnion؟

تم إنشاؤها على ٦ يناير ٢٠١٦  ·  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 مباشرةً ، ولكن إذا قرأت في سؤالك بشكل صحيح ، فأنت تتساءل بشكل عام عن كيفية ترشيح السمات من خلال خط الأنابيب المخصص.

متأخرًا إلى الحفلة ، ولكن يمكنك الوصول إلى العناصر داخل خط الأنابيب ، بغض النظر عن مدى تعقيدها ، من خلال السير عبر هيكل خط الأنابيب ، والعثور على الخطوة المناسبة (حتى داخل الميزة) ثم استخدام السمة المناسبة. هذا مثال قمت بتشغيله للتو:

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), ])

إن إظهار كائن خط الأنابيب نفسه عبر الطباعة (خط الأنابيب) يعطيني نقطة مرجعية:

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']

ثم انتقل إلى المستوى التالي وهو قائمة المحولات (أو خط الأنابيب الفئوية) عبر:

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

ثم انتقل إلى المستوى التالي وهو الخطوات داخل خط الأنابيب الفئوي عبر:

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

المخرجات المذكورة أعلاه هي هيكل نموذجي لخط الأنابيب ، حيث يمكننا الآن استخدام اسمه_الخطوات:
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 ؛
تجول في هيكل خط الأنابيب قطعة بقطعة باستخدام خط الأنابيب المخصص الخاص بك ، ثم قم بالوصول إلى السمة كما تفعل عادةً مع قطعة المحول / المقدّر.

ال 4 كومينتر

أوافق على أنه يجب أن تكون هناك طريقة لمعرفة الميزات التي تنتمي إلى أي منها
المكونات ، وقد اقترحت هذا منذ فترة طويلة ، لكنني لا أعتقد أنه
ممكن حاليا.

في 6 يناير 2016 الساعة 18:23 ، كتب genliu777 [email protected] :

أنا أدير كود ،

http: // scikit-learnorg / stabil / auto_examples / feature_stackerhtml # example -feature-stacker -py
ومع الكود التالي ،

بناء المقدر من PCA والاختيار أحادي المتغير:

Combined_features = FeatureUnion ([("pca"، pca)، ("univ_select"، select)])

استخدم الميزات المدمجة لتحويل مجموعة البيانات:

X_features = الجمع بين ميزات الملائمة (X ، y) التحويل (X)

مع البيانات التي تم وضعها في FeatureUnion ، أريد أن أعرف الميزة المحددة
في مستند FeatureUnion ، هناك وظيفة get_feature_names () التي
يحصل على جميع الأسماء من جميع المحولات ، لذا فقط قم باستدعاء هذه الوظيفة
وتحصل على خطأ مثل هذا ،
AttributeError: لا يوفر Transformer pca get_feature_names
في الواقع ، أعرف أن pca ليس لديها وظيفة مثل هذه ولكن لماذا FeatureUnion
تقدم هذه الوظيفة !؟

-
قم بالرد على هذا البريد الإلكتروني مباشرة أو قم بعرضه على GitHub
https://github.com/scikit-learn/scikit-learn/issues/6122.

لماذا مستحيل حاليا !؟ كما تعلم ، فإن FeatureUnion يعطي الوظيفة get_feature_names() ، ويجب أن تعمل أيضًا!

مثل ، ربما جميعهم ، نماذج في sklearn ، لها الوظيفة fit و transform ، يجب أن تصنع جميع الطرز التي يمكن وضعها في FeatureUnion وتعمل بشكل جيد ، وتوفر السمة كمصدر كود get_feature_names() calls if not hasattr(trans, 'get_feature_names'): . خلاف ذلك ، لا توفر FeatureUnion بالضرورة وظيفة get_feature_names() !!

قد لا يعالج هذا مشكلتك الخاصة مع PCA مباشرةً ، ولكن إذا قرأت في سؤالك بشكل صحيح ، فأنت تتساءل بشكل عام عن كيفية ترشيح السمات من خلال خط الأنابيب المخصص.

متأخرًا إلى الحفلة ، ولكن يمكنك الوصول إلى العناصر داخل خط الأنابيب ، بغض النظر عن مدى تعقيدها ، من خلال السير عبر هيكل خط الأنابيب ، والعثور على الخطوة المناسبة (حتى داخل الميزة) ثم استخدام السمة المناسبة. هذا مثال قمت بتشغيله للتو:

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), ])

إن إظهار كائن خط الأنابيب نفسه عبر الطباعة (خط الأنابيب) يعطيني نقطة مرجعية:

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']

ثم انتقل إلى المستوى التالي وهو قائمة المحولات (أو خط الأنابيب الفئوية) عبر:

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

ثم انتقل إلى المستوى التالي وهو الخطوات داخل خط الأنابيب الفئوي عبر:

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

المخرجات المذكورة أعلاه هي هيكل نموذجي لخط الأنابيب ، حيث يمكننا الآن استخدام اسمه_الخطوات:
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 ؛
تجول في هيكل خط الأنابيب قطعة بقطعة باستخدام خط الأنابيب المخصص الخاص بك ، ثم قم بالوصول إلى السمة كما تفعل عادةً مع قطعة المحول / المقدّر.

الرجاء تجربة eli5 's transform_feature_names والتي يمكن أن تعمل في الحالات التي لا يعمل فيها scikit-Learn's get_feature_names .

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات