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