Как получить имена объектов, выбранные путем исключения объектов в конвейере sklearn?
Я использую рекурсивное удаление функций в моем конвейере sklearn, конвейер выглядит примерно так:
from sklearn.pipeline import FeatureUnion, Pipeline
from sklearn import feature_selection
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.svm import LinearSVC
X = ['I am a sentence', 'an example']
Y = [1, 2]
X_dev = ['another sentence']
# classifier
LinearSVC1 = LinearSVC(tol=1e-4, C = 0.10000000000000001)
f5 = feature_selection.RFE(estimator=LinearSVC1, n_features_to_select=500, step=1)
pipeline = Pipeline([
('features', FeatureUnion([
('tfidf', TfidfVectorizer(ngram_range=(1, 3), max_features= 4000)),
('custom_features', CustomFeatures())])),
('rfe_feature_selection', f5),
('clf', LinearSVC1),
])
pipeline.fit(X, Y)
y_pred = pipeline.predict(X_dev)
Как я могу получить названия функций функций, выбранных RFE? RFE должен выбрать 500 лучших функций, но мне действительно нужно посмотреть, какие функции были выбраны.
РЕДАКТИРОВАТЬ:
У меня есть сложный конвейер, который состоит из нескольких конвейеров и объединений объектов, выбора процентильных объектов и, в конце, исключения рекурсивных объектов:
fs = feature_selection.SelectPercentile(feature_selection.chi2, percentile=90)
fs_vect = feature_selection.SelectPercentile(feature_selection.chi2, percentile=80)
f5 = feature_selection.RFE(estimator=svc, n_features_to_select=600, step=3)
countVecWord = TfidfVectorizer(ngram_range=(1, 3), max_features=2000, analyzer=u'word', sublinear_tf=True, use_idf = True, min_df=2, max_df=0.85, lowercase = True)
countVecWord_tags = TfidfVectorizer(ngram_range=(1, 4), max_features= 1000, analyzer=u'word', min_df=2, max_df=0.85, sublinear_tf=True, use_idf = True, lowercase = False)
pipeline = Pipeline([
('union', FeatureUnion(
transformer_list=[
('vectorized_pipeline', Pipeline([
('union_vectorizer', FeatureUnion([
('stem_text', Pipeline([
('selector', ItemSelector(key='stem_text')),
('stem_tfidf', countVecWord)
])),
('pos_text', Pipeline([
('selector', ItemSelector(key='pos_text')),
('pos_tfidf', countVecWord_tags)
])),
])),
('percentile_feature_selection', fs_vect)
])),
('custom_pipeline', Pipeline([
('custom_features', FeatureUnion([
('pos_cluster', Pipeline([
('selector', ItemSelector(key='pos_text')),
('pos_cluster_inner', pos_cluster)
])),
('stylistic_features', Pipeline([
('selector', ItemSelector(key='raw_text')),
('stylistic_features_inner', stylistic_features)
])),
])),
('percentile_feature_selection', fs),
('inner_scale', inner_scaler)
])),
],
# weight components in FeatureUnion
# n_jobs=6,
transformer_weights={
'vectorized_pipeline': 0.8, # 0.8,
'custom_pipeline': 1.0 # 1.0
},
)),
('rfe_feature_selection', f5),
('clf', classifier),
])
Я постараюсь объяснить шаги. Первый конвейер состоит из векторизаторов и называется "vectorized_pipeline", все они имеют функцию "get_feature_names". Второй конвейер состоит из моих собственных функций, я реализовал их с помощью функций fit, transform и get_feature_names. Когда я использую предложение @Kevin, я получаю сообщение об ошибке, что у 'union' (которое является именем моего верхнего элемента в конвейере) нет функции get_feature_names:
support = pipeline.named_steps['rfe_feature_selection'].support_
feature_names = pipeline.named_steps['union'].get_feature_names()
print np.array(feature_names)[support]
Кроме того, когда я пытаюсь получить имена объектов из отдельных FeatureUnions, например:
support = pipeline.named_steps['rfe_feature_selection'].support_
feature_names = pipeline_age.named_steps['union_vectorizer'].get_feature_names()
print np.array(feature_names)[support]
Я получаю ключевую ошибку:
feature_names = pipeline.named_steps['union_vectorizer'].get_feature_names()
KeyError: 'union_vectorizer'
1 ответ
Вы можете получить доступ к каждому шагу Pipeline
с атрибутом named_steps
Вот пример набора данных радужной оболочки, который выбирает только 2
функции, но решение будет масштабироваться.
from sklearn import datasets
from sklearn import feature_selection
from sklearn.svm import LinearSVC
iris = datasets.load_iris()
X = iris.data
y = iris.target
# classifier
LinearSVC1 = LinearSVC(tol=1e-4, C = 0.10000000000000001)
f5 = feature_selection.RFE(estimator=LinearSVC1, n_features_to_select=2, step=1)
pipeline = Pipeline([
('rfe_feature_selection', f5),
('clf', LinearSVC1)
])
pipeline.fit(X, y)
С named_steps
Вы можете получить доступ к атрибутам и методам объекта преобразования в конвейере. RFE
атрибут support_
(или метод get_support()
) вернет логическую маску выбранных функций:
support = pipeline.named_steps['rfe_feature_selection'].support_
Сейчас support
является массивом, вы можете использовать его для эффективного извлечения названия выбранных объектов (столбцов). Убедитесь, что имена ваших функций находятся в numpy array
, а не список питонов.
import numpy as np
feature_names = np.array(iris.feature_names) # transformed list to array
feature_names[support]
array(['sepal width (cm)', 'petal width (cm)'],
dtype='|S17')
РЕДАКТИРОВАТЬ
В соответствии с моим комментарием выше, вот ваш пример с удаленной функцией CustomFeautures():
from sklearn.pipeline import FeatureUnion, Pipeline
from sklearn import feature_selection
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.svm import LinearSVC
import numpy as np
X = ['I am a sentence', 'an example']
Y = [1, 2]
X_dev = ['another sentence']
# classifier
LinearSVC1 = LinearSVC(tol=1e-4, C = 0.10000000000000001)
f5 = feature_selection.RFE(estimator=LinearSVC1, n_features_to_select=500, step=1)
pipeline = Pipeline([
('features', FeatureUnion([
('tfidf', TfidfVectorizer(ngram_range=(1, 3), max_features= 4000))])),
('rfe_feature_selection', f5),
('clf', LinearSVC1),
])
pipeline.fit(X, Y)
y_pred = pipeline.predict(X_dev)
support = pipeline.named_steps['rfe_feature_selection'].support_
feature_names = pipeline.named_steps['features'].get_feature_names()
np.array(feature_names)[support]