[英]How to extract feature names from sklearn pipeline transformers?
以供參考:
我有一個scikit-learn pipeline
,可以為我格式化一些數據,如下所述:
我這樣定義我的pipeline
:
# Pipeline 1
cat_selector = make_column_selector(dtype_include=object)
num_selector = make_column_selector(dtype_include=np.number)
cat_linear_processor = OneHotEncoder(handle_unknown="ignore", drop='first', sparse=False)
num_linear_processor = make_pipeline(SimpleImputer(strategy="median", add_indicator=True), MinMaxScaler(feature_range=(-1,1)))
linear_preprocessor = make_column_transformer( (num_linear_processor, num_selector), (cat_linear_processor, cat_selector) )
model_params ={'alpha': 0.0013879181970625643,
'l1_ratio': 0.9634269882730605,
'fit_intercept': True,
'normalize': False,
'max_iter': 245.69684524349375,
'tol': 0.01855761485447601,
'positive': False,
'selection': 'random'}
model = ElasticNet(**model_params)
pipeline = make_pipeline(linear_preprocessor, model)
pipeline.steps
產量:
[('columntransformer',
ColumnTransformer(transformers=[('pipeline',
Pipeline(steps=[('simpleimputer',
SimpleImputer(add_indicator=True,
strategy='median')),
('minmaxscaler',
MinMaxScaler(feature_range=(-1,
1)))]),
<sklearn.compose._column_transformer.make_column_selector object at 0x0000029CA3231EE0>),
('onehotencoder',
OneHotEncoder(handle_unknown='ignore',
sparse=False),
<sklearn.compose._column_transformer.make_column_selector object at 0x0000029CA542F040>)])),
('elasticnet',
ElasticNet(alpha=0.0013879181970625643, l1_ratio=0.9634269882730605,
max_iter=245.69684524349375, normalize=False, selection='random',
tol=0.01855761485447601))]
我想要做的是檢索經過訓練/測試的數據的特征名稱。
我試過引用許多其他問題:
然而,這些解決方案都沒有奏效。 例如:
[i for i in v.get_feature_names() for k, v in pipeline.named_steps.items() if hasattr(v,'get_feature_names')]
產量:
----> 1 [i for i in v.get_feature_names() for k, v in pipeline.named_steps.items() if hasattr(v,'get_feature_names')]
NameError: name 'v' is not defined
我試過了:
pipeline[:-1].get_feature_names_out()
產量:
AttributeError: Estimator simpleimputer does not provide get_feature_names_out. Did you mean to call pipeline[:-1].get_feature_names_out()?
如何從當前管道編碼后檢索功能名稱?
我想這篇文章可能會有所幫助:
也就是說,問題應該只是 sklearn 的版本。 我幾個月前發布的內容中引用的 PR 似乎剛剛合並,盡管從那以后還沒有新版本。 安裝 sklearn 的實際開發版本scikit-learn 1.1.dev0
應該可以解決問題(至少對我來說是這樣)。
您可以這樣安裝夜間構建: pip install --pre --extra-index https://pypi.anaconda.org/scipy-wheels-nightly/simple scikit-learn -U
。
這是玩具數據集的示例:
import pandas as pd
import numpy as np
from sklearn.preprocessing import OneHotEncoder, MinMaxScaler
from sklearn.impute import SimpleImputer
from sklearn.pipeline import make_pipeline
from sklearn.compose import make_column_selector, make_column_transformer
from sklearn.linear_model import ElasticNet
X = pd.DataFrame({'city': ['London', 'London', 'Paris', 'Sallisaw', ''],
'title': ['His Last Bow', 'How Watson Learned the Trick', 'A Moveable Feast', 'The Grapes of Wrath', 'The Jungle'],
'expert_rating': [5, 3, 4, 5, 3],
'user_rating': [4, 5, 4, 2, 3]})
# Pipeline 1
cat_selector = make_column_selector(dtype_include=object)
num_selector = make_column_selector(dtype_include=np.number)
cat_linear_processor = OneHotEncoder(handle_unknown="ignore", drop='first', sparse=False)
num_linear_processor = make_pipeline(SimpleImputer(strategy="median", add_indicator=True), MinMaxScaler(feature_range=(-1,1)))
linear_preprocessor = make_column_transformer( (num_linear_processor, num_selector), (cat_linear_processor, cat_selector) )
model_params ={
'alpha': 0.0013879181970625643,
'l1_ratio': 0.9634269882730605,
'fit_intercept': True,
'normalize': False,
'max_iter': 245,
'tol': 0.01855761485447601,
'positive': False,
'selection': 'random'}
model = ElasticNet(**model_params)
pipeline = make_pipeline(linear_preprocessor, model)
pipeline.fit(X.iloc[:, :-1], X.iloc[:, -1])
pipeline[:-1].get_feature_names_out()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.