Scikit-learn: рдХреЙрд▓рдордЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░ рдХреЗ рдмрд╛рдж рдлреАрдЪрд░ рдирд╛рдо рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 6 рдирд╡ре░ 2018  ┬╖  13рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: scikit-learn/scikit-learn

рдЬрдм рдореИрдВ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рд╕рд╛рде рд╡рд┐рднрд┐рдиреНрди рдХреЙрд▓рдо (рд╕рдВрдЦреНрдпрд╛рддреНрдордХ, рд╢реНрд░реЗрдгреА, рдЯреЗрдХреНрд╕реНрдЯ рд╢рд╛рдорд┐рд▓) рдХреЛ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓рдордЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ рдЕрдВрддрд┐рдо рд░реВрдкрд╛рдВрддрд░рд┐рдд рдбреЗрдЯрд╛ рдХреЗ рдлреАрдЪрд░ рдирд╛рдо рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХрдард┐рди рд╣реИред

рдпрд╣рд╛рдБ рдХреЛрдб рд╣реИ:

titanic_url = ('https://raw.githubusercontent.com/amueller/'
               'scipy-2017-sklearn/091d371/notebooks/datasets/titanic3.csv')

data = pd.read_csv(titanic_url)

target = data.pop('survived')

numeric_columns = ['age','sibsp','parch']
category_columns = ['pclass','sex','embarked']
text_columns = ['name','home.dest']

numeric_transformer = Pipeline(steps=[
    ('impute',SimpleImputer(strategy='median')),
    ('scaler',StandardScaler()
    )
])
category_transformer = Pipeline(steps=[
    ('impute',SimpleImputer(strategy='constant',fill_value='missing')),
    ('ohe',OneHotEncoder(handle_unknown='ignore'))
])
text_transformer = Pipeline(steps=[
    ('cntvec',CountVectorizer())
])

preprocesser = ColumnTransformer(transformers=[
    ('numeric',numeric_transformer,numeric_columns),
    ('category',category_transformer,category_columns),
    ('text',text_transformer,text_columns[0])
])

preprocesser.fit_transform(data)
  1. preprocesser.get_feature_names() рддреНрд░реБрдЯрд┐ рдорд┐рд▓реЗрдЧреА:
    AttributeError: Transformer numeric (type Pipeline) does not provide get_feature_names.
  2. ColumnTransformer я╝М text_transformer рдХреЗрд╡рд▓ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ (рдЬреИрд╕реЗ 'рд╕реЗрдХреНрд╕') рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди text_columns рд░реВрдк рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рд╕реВрдЪреА рдирд╣реАрдВ

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдпрд╣ рдХреЙрд▓рдордЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдореБрджреНрджрд╛ рдирд╣реАрдВ рд╣реИред

  1. рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ eli5 рдПрдХ рдлреАрдЪрд░ рдирд╛рдо рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░ рд╕рдХрддрд╛ рд╣реИред

2 рд░реБрдкрдпреЗред рд╢рд╛рдпрдж рдЖрдк рд╕рд╣реА рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЕрдорд┐рддреНрд░ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓рдо рдкрд░ рдЯреЗрдХреНрд╕реНрдЯ рд╡реЗрдХреНрдЯрд░рд╛рдЗрдЬрд╝рд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕рд╛рдл рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд╕рд╛рдл-рд╕реБрдерд░рд╛ рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рд╣рдо рдХрд╛рдЙрдВрдЯрд╡реЗрдХреНрдЯрд░ рдЖрджрд┐ рдореЗрдВ рдЗрдирдкреБрдЯ рдХреЗ рдХрдИ рдХреЙрд▓рдо рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░рддреЗред

рдЕрдкрдирд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!
рдЬреИрд╕рд╛ рдХрд┐ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рдЬрдм рдореИрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдХреЙрд▓рдо рдХреЛ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдПрдХ рдХреЙрд▓рдо рдХреЛ рдорд▓реНрдЯреА-рдХреЙрд▓рдо рдЬреИрд╕реЗ OneHotEncoder , CountVectorizer , рддреЛ рдореИрдВ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕реЗ рдирдП рдбреЗрдЯрд╛ рдХреЙрд▓рдо рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдЕрдВрддрд┐рдо рдЪрд░рдг рдХреЗ рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░ рджреНрд╡рд╛рд░рд╛ рдлрд╝рдВрдХреНрд╢рди get_feature_names , рдЙрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЬреЛ рдирдП рдХреЙрд▓рдо рдирд╣реАрдВ рдмрдирд╛рддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рдХрдЪреНрдЪреЗ рдХреЙрд▓рдо рдирд╛рдо рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

def get_column_names_from_ColumnTransformer(column_transformer):    
    col_name = []
    for transformer_in_columns in column_transformer.transformers_[:-1]:#the last transformer is ColumnTransformer's 'remainder'
        raw_col_name = transformer_in_columns[2]
        if isinstance(transformer_in_columns[1],Pipeline): 
            transformer = transformer_in_columns[1].steps[-1][1]
        else:
            transformer = transformer_in_columns[1]
        try:
            names = transformer.get_feature_names()
        except AttributeError: # if no 'get_feature_names' function, use raw column name
            names = raw_col_name
        if isinstance(names,np.ndarray): # eg.
            col_name += names.tolist()
        elif isinstance(names,list):
            col_name += names    
        elif isinstance(names,str):
            col_name.append(names)
    return col_name

рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдореИрдВ рдЕрдкрдиреЗ preprocesser рдХреЗ рдХреЙрд▓рдо рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред
рдХреНрдпрд╛ рдпреЗ рдХреЛрдб рдЗрд╕ рдкреНрд░рд╢реНрди рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВ?
eli5 рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдореБрдЭреЗ рд╡рд╣ рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рдорд┐рд▓рд╛, рдХреНрдпрд╛ рдЖрдк рдореБрдЭреЗ рд╕реНрдкрд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ eli5 рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ?

рд╕рднреА 13 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдпрд╣ рдХреЙрд▓рдордЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдореБрджреНрджрд╛ рдирд╣реАрдВ рд╣реИред

  1. рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ eli5 рдПрдХ рдлреАрдЪрд░ рдирд╛рдо рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░ рд╕рдХрддрд╛ рд╣реИред

2 рд░реБрдкрдпреЗред рд╢рд╛рдпрдж рдЖрдк рд╕рд╣реА рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЕрдорд┐рддреНрд░ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓рдо рдкрд░ рдЯреЗрдХреНрд╕реНрдЯ рд╡реЗрдХреНрдЯрд░рд╛рдЗрдЬрд╝рд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕рд╛рдл рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд╕рд╛рдл-рд╕реБрдерд░рд╛ рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рд╣рдо рдХрд╛рдЙрдВрдЯрд╡реЗрдХреНрдЯрд░ рдЖрджрд┐ рдореЗрдВ рдЗрдирдкреБрдЯ рдХреЗ рдХрдИ рдХреЙрд▓рдо рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░рддреЗред

рдпрд╣ рдХреЙрд▓рдордЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдореБрджреНрджрд╛ рдирд╣реАрдВ рд╣реИред

  1. рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ eli5 рдПрдХ рдлреАрдЪрд░ рдирд╛рдо рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░ рд╕рдХрддрд╛ рд╣реИред

2 рд░реБрдкрдпреЗред рд╢рд╛рдпрдж рдЖрдк рд╕рд╣реА рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЕрдорд┐рддреНрд░ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓рдо рдкрд░ рдЯреЗрдХреНрд╕реНрдЯ рд╡реЗрдХреНрдЯрд░рд╛рдЗрдЬрд╝рд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕рд╛рдл рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд╕рд╛рдл-рд╕реБрдерд░рд╛ рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рд╣рдо рдХрд╛рдЙрдВрдЯрд╡реЗрдХреНрдЯрд░ рдЖрджрд┐ рдореЗрдВ рдЗрдирдкреБрдЯ рдХреЗ рдХрдИ рдХреЙрд▓рдо рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░рддреЗред

рдЕрдкрдирд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!
рдЬреИрд╕рд╛ рдХрд┐ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рдЬрдм рдореИрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдХреЙрд▓рдо рдХреЛ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдПрдХ рдХреЙрд▓рдо рдХреЛ рдорд▓реНрдЯреА-рдХреЙрд▓рдо рдЬреИрд╕реЗ OneHotEncoder , CountVectorizer , рддреЛ рдореИрдВ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕реЗ рдирдП рдбреЗрдЯрд╛ рдХреЙрд▓рдо рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдЕрдВрддрд┐рдо рдЪрд░рдг рдХреЗ рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░ рджреНрд╡рд╛рд░рд╛ рдлрд╝рдВрдХреНрд╢рди get_feature_names , рдЙрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЬреЛ рдирдП рдХреЙрд▓рдо рдирд╣реАрдВ рдмрдирд╛рддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рдХрдЪреНрдЪреЗ рдХреЙрд▓рдо рдирд╛рдо рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

def get_column_names_from_ColumnTransformer(column_transformer):    
    col_name = []
    for transformer_in_columns in column_transformer.transformers_[:-1]:#the last transformer is ColumnTransformer's 'remainder'
        raw_col_name = transformer_in_columns[2]
        if isinstance(transformer_in_columns[1],Pipeline): 
            transformer = transformer_in_columns[1].steps[-1][1]
        else:
            transformer = transformer_in_columns[1]
        try:
            names = transformer.get_feature_names()
        except AttributeError: # if no 'get_feature_names' function, use raw column name
            names = raw_col_name
        if isinstance(names,np.ndarray): # eg.
            col_name += names.tolist()
        elif isinstance(names,list):
            col_name += names    
        elif isinstance(names,str):
            col_name.append(names)
    return col_name

рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдореИрдВ рдЕрдкрдиреЗ preprocesser рдХреЗ рдХреЙрд▓рдо рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред
рдХреНрдпрд╛ рдпреЗ рдХреЛрдб рдЗрд╕ рдкреНрд░рд╢реНрди рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВ?
eli5 рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдореБрдЭреЗ рд╡рд╣ рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рдорд┐рд▓рд╛, рдХреНрдпрд╛ рдЖрдк рдореБрдЭреЗ рд╕реНрдкрд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ eli5 рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ?

eli5 рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, transform_feature_names рджреЗрдЦреЗрдВ (explain_weights рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдпреБрдХреНрдд)

1 #6425 рдХрд╛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд╣реИ, рд╣реИ рдирд╛? рдореИрдВ рдЙрд╕ рдкрд░ рдПрдХ рдиреАрдВрдж рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ ColumnTransformer рд╕рд╛рде рдПрдХрд╛рдзрд┐рдХ рдЯреЗрдХреНрд╕реНрдЯ рдХреЙрд▓рдо рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рдпрд╣ рд╕рдмрд╕реЗ рд╕реБрдВрджрд░ рдХреЛрдб рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рдЯреЗрдХреНрд╕реНрдЯ рдХреЙрд▓рдо рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдХрд╛рдЙрдВрдЯ рд╡реЗрдХреНрдЯрд░рд╛рдЗрдЬрд╝рд░ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдФрд░ рдЖрдкрдХрд╛ рд╕реНрдирд┐рдкреЗрдЯ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдирд╣реАрдВ get_feature_names рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рдХреЗрд╡рд▓ рдХреЙрд▓рдо рдирд╛рдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

1 #6425 рдХрд╛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд╣реИ, рд╣реИ рдирд╛? рдореИрдВ рдЙрд╕ рдкрд░ рдПрдХ рдиреАрдВрдж рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ ColumnTransformer рд╕рд╛рде рдПрдХрд╛рдзрд┐рдХ рдЯреЗрдХреНрд╕реНрдЯ рдХреЙрд▓рдо рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рдпрд╣ рд╕рдмрд╕реЗ рд╕реБрдВрджрд░ рдХреЛрдб рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рдЯреЗрдХреНрд╕реНрдЯ рдХреЙрд▓рдо рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдХрд╛рдЙрдВрдЯ рд╡реЗрдХреНрдЯрд░рд╛рдЗрдЬрд╝рд░ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдФрд░ рдЖрдкрдХрд╛ рд╕реНрдирд┐рдкреЗрдЯ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдирд╣реАрдВ get_feature_names рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рдХреЗрд╡рд▓ рдХреЙрд▓рдо рдирд╛рдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╣рд╛рдБ, рдПрдХ рдкрд╛рдВрдбрд╛ рдбреЗрдЯрд╛рдлрд╝реНрд░реЗрдо рдПрдХ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ рдлрд╝реАрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдлреАрдЪрд░ рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдкрддрд╛ рдЪрд▓ рд╕рдХреЗ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрддреНрдкрдиреНрди рдбреЗрдЯрд╛ рд╕реЗ рдХреНрдпрд╛ рд╣реБрдЖ рдерд╛ред

рдареАрдХ рд╣реИ, рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдВрдж рд╣реЛ рд░рд╣рд╛ рд╣реИред

рдпрд╣ рдХреЙрд▓рдордЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдореБрджреНрджрд╛ рдирд╣реАрдВ рд╣реИред

  1. рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ eli5 рдПрдХ рдлреАрдЪрд░ рдирд╛рдо рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░ рд╕рдХрддрд╛ рд╣реИред

2 рд░реБрдкрдпреЗред рд╢рд╛рдпрдж рдЖрдк рд╕рд╣реА рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЕрдорд┐рддреНрд░ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓рдо рдкрд░ рдЯреЗрдХреНрд╕реНрдЯ рд╡реЗрдХреНрдЯрд░рд╛рдЗрдЬрд╝рд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕рд╛рдл рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд╕рд╛рдл-рд╕реБрдерд░рд╛ рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рд╣рдо рдХрд╛рдЙрдВрдЯрд╡реЗрдХреНрдЯрд░ рдЖрджрд┐ рдореЗрдВ рдЗрдирдкреБрдЯ рдХреЗ рдХрдИ рдХреЙрд▓рдо рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░рддреЗред

рдЕрдкрдирд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!
рдЬреИрд╕рд╛ рдХрд┐ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рдЬрдм рдореИрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдХреЙрд▓рдо рдХреЛ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдПрдХ рдХреЙрд▓рдо рдХреЛ рдорд▓реНрдЯреА-рдХреЙрд▓рдо рдЬреИрд╕реЗ OneHotEncoder , CountVectorizer , рддреЛ рдореИрдВ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕реЗ рдирдП рдбреЗрдЯрд╛ рдХреЙрд▓рдо рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдЕрдВрддрд┐рдо рдЪрд░рдг рдХреЗ рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░ рджреНрд╡рд╛рд░рд╛ рдлрд╝рдВрдХреНрд╢рди get_feature_names , рдЙрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЬреЛ рдирдП рдХреЙрд▓рдо рдирд╣реАрдВ рдмрдирд╛рддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рдХрдЪреНрдЪреЗ рдХреЙрд▓рдо рдирд╛рдо рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

def get_column_names_from_ColumnTransformer(column_transformer):    
    col_name = []
    for transformer_in_columns in column_transformer.transformers_[:-1]:#the last transformer is ColumnTransformer's 'remainder'
        raw_col_name = transformer_in_columns[2]
        if isinstance(transformer_in_columns[1],Pipeline): 
            transformer = transformer_in_columns[1].steps[-1][1]
        else:
            transformer = transformer_in_columns[1]
        try:
            names = transformer.get_feature_names()
        except AttributeError: # if no 'get_feature_names' function, use raw column name
            names = raw_col_name
        if isinstance(names,np.ndarray): # eg.
            col_name += names.tolist()
        elif isinstance(names,list):
            col_name += names    
        elif isinstance(names,str):
            col_name.append(names)
    return col_name

рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдореИрдВ рдЕрдкрдиреЗ preprocesser рдХреЗ рдХреЙрд▓рдо рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред
рдХреНрдпрд╛ рдпреЗ рдХреЛрдб рдЗрд╕ рдкреНрд░рд╢реНрди рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВ?
eli5 рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдореБрдЭреЗ рд╡рд╣ рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рдорд┐рд▓рд╛, рдХреНрдпрд╛ рдЖрдк рдореБрдЭреЗ рд╕реНрдкрд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ eli5 рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ?

рдореИрдВрдиреЗ onehot рд░реВрдкреЛрдВ рдХреЗ рд▓рд┐рдП rawname_value рдЬреИрд╕реЗ рдирд╛рдо рдХреЛ рд╡рд╛рдкрд╕ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯреА рд╕реА рд╡реГрджреНрдзрд┐ рдХреА рд╣реИ:

def get_column_names_from_ColumnTransformer(column_transformer):    
    col_name = []
    for transformer_in_columns in column_transformer.transformers_[:-1]:#the last transformer is ColumnTransformer's 'remainder'
        raw_col_name = transformer_in_columns[2]
        raw_col_name_reverse = raw_col_name[::-1]
        if isinstance(transformer_in_columns[1],Pipeline): 
            transformer = transformer_in_columns[1].steps[-1][1]
        else:
            transformer = transformer_in_columns[1]
        try:
            names = transformer.get_feature_names()
            exchange_name = [(_.split("_")) for _ in preprocessor.transformers_[:-1][0][1].steps[-1][1].get_feature_names()]
            last_pre_name = ""
            last_raw_name = ""
            for pre_name,value in exchange_name:
                if pre_name==last_pre_name:
                    col_name.append(last_raw_name+"_"+value)
                if pre_name!=last_pre_name:
                    last_pre_name=pre_name
                    last_raw_name=raw_col_name_reverse.pop()
                    col_name.append(last_raw_name+"_"+value)
        except AttributeError: # if no 'get_feature_names' function, use raw column name
            names = raw_col_name
        if isinstance(names,np.ndarray): # eg.
            col_name += names.tolist()
        elif isinstance(names,list):
            col_name += names    
        elif isinstance(names,str):
            col_name.append(names)
    return col_name

рдпрд╣ рдХреЙрд▓рдордЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдореБрджреНрджрд╛ рдирд╣реАрдВ рд╣реИред

  1. рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ eli5 рдПрдХ рдлреАрдЪрд░ рдирд╛рдо рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░ рд╕рдХрддрд╛ рд╣реИред

2 рд░реБрдкрдпреЗред рд╢рд╛рдпрдж рдЖрдк рд╕рд╣реА рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЕрдорд┐рддреНрд░ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓рдо рдкрд░ рдЯреЗрдХреНрд╕реНрдЯ рд╡реЗрдХреНрдЯрд░рд╛рдЗрдЬрд╝рд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕рд╛рдл рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд╕рд╛рдл-рд╕реБрдерд░рд╛ рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рд╣рдо рдХрд╛рдЙрдВрдЯрд╡реЗрдХреНрдЯрд░ рдЖрджрд┐ рдореЗрдВ рдЗрдирдкреБрдЯ рдХреЗ рдХрдИ рдХреЙрд▓рдо рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░рддреЗред

рдЕрдкрдирд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!
рдЬреИрд╕рд╛ рдХрд┐ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рдЬрдм рдореИрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдХреЙрд▓рдо рдХреЛ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдПрдХ рдХреЙрд▓рдо рдХреЛ рдорд▓реНрдЯреА-рдХреЙрд▓рдо рдЬреИрд╕реЗ OneHotEncoder , CountVectorizer , рддреЛ рдореИрдВ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕реЗ рдирдП рдбреЗрдЯрд╛ рдХреЙрд▓рдо рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдЕрдВрддрд┐рдо рдЪрд░рдг рдХреЗ рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░ рджреНрд╡рд╛рд░рд╛ рдлрд╝рдВрдХреНрд╢рди get_feature_names , рдЙрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЬреЛ рдирдП рдХреЙрд▓рдо рдирд╣реАрдВ рдмрдирд╛рддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рдХрдЪреНрдЪреЗ рдХреЙрд▓рдо рдирд╛рдо рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

def get_column_names_from_ColumnTransformer(column_transformer):    
    col_name = []
    for transformer_in_columns in column_transformer.transformers_[:-1]:#the last transformer is ColumnTransformer's 'remainder'
        raw_col_name = transformer_in_columns[2]
        if isinstance(transformer_in_columns[1],Pipeline): 
            transformer = transformer_in_columns[1].steps[-1][1]
        else:
            transformer = transformer_in_columns[1]
        try:
            names = transformer.get_feature_names()
        except AttributeError: # if no 'get_feature_names' function, use raw column name
            names = raw_col_name
        if isinstance(names,np.ndarray): # eg.
            col_name += names.tolist()
        elif isinstance(names,list):
            col_name += names    
        elif isinstance(names,str):
            col_name.append(names)
    return col_name

рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдореИрдВ рдЕрдкрдиреЗ preprocesser рдХреЗ рдХреЙрд▓рдо рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред
рдХреНрдпрд╛ рдпреЗ рдХреЛрдб рдЗрд╕ рдкреНрд░рд╢реНрди рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВ?
eli5 рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдореБрдЭреЗ рд╡рд╣ рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рдорд┐рд▓рд╛, рдХреНрдпрд╛ рдЖрдк рдореБрдЭреЗ рд╕реНрдкрд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ eli5 рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ?

рдпрджрд┐ рдЖрдк рдПрдХ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ add_indicator рдХреЗ рд╕рд╛рде simpleimputer рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдпрд╣ рддрд░реАрдХрд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

рдпрджрд┐ рдЖрдк рдПрдХ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ add_indicator рдХреЗ рд╕рд╛рде simpleimputer рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдпрд╣ рддрд░реАрдХрд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

рдЗрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП get_feature_names рд╡рд┐рдзрд┐ рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

рдпрджрд┐ рдЖрдк рдПрдХ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ add_indicator рдХреЗ рд╕рд╛рде simpleimputer рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдпрд╣ рддрд░реАрдХрд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

рдпрд╣рд╛рдБ рдЕрд▓реНрдкрдХрд╛рд▓рд┐рдХ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдореЗрд░рд╛ рдпреЛрдЧрджрд╛рди рд╣реИред рдпрд╣ рд╕рднреА рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рд░рдгреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕реВрдЪрд┐рдпреЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ SimpleImputer(add_indicate=True) рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИред рдпрд╣ рдереЛрдбрд╝рд╛ рдФрд░ рд╡рд░реНрдмреЛрдЬрд╝ рднреА рд╣реИред

def get_column_names_from_ColumnTransformer(column_transformer):    
    col_name = []

    for transformer_in_columns in column_transformer.transformers_[:-1]: #the last transformer is ColumnTransformer's 'remainder'
        print('\n\ntransformer: ', transformer_in_columns[0])

        raw_col_name = list(transformer_in_columns[2])

        if isinstance(transformer_in_columns[1], Pipeline): 
            # if pipeline, get the last transformer
            transformer = transformer_in_columns[1].steps[-1][1]
        else:
            transformer = transformer_in_columns[1]

        try:
          if isinstance(transformer, OneHotEncoder):
            names = list(transformer.get_feature_names(raw_col_name))

          elif isinstance(transformer, SimpleImputer) and transformer.add_indicator:
            missing_indicator_indices = transformer.indicator_.features_
            missing_indicators = [raw_col_name[idx] + '_missing_flag' for idx in missing_indicator_indices]

            names = raw_col_name + missing_indicators

          else:
            names = list(transformer.get_feature_names())

        except AttributeError as error:
          names = raw_col_name

        print(names)    

        col_name.extend(names)

    return col_name

рдПрдлрд╡рд╛рдИрдЖрдИ, рдореИрдВрдиреЗ рдЬрдЯрд┐рд▓ рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВ рдФрд░ рдХреЙрд▓рдордЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░реНрд╕ рд╕реЗ рдлреАрдЪрд░ рдирд╛рдо рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдХреЛрдб рдФрд░ рдмреНрд▓реЙрдЧ рд▓рд┐рдЦрд╛ рдерд╛ред рдХреЛрдб рдореЗрд░реА рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯ рдкрд░ рдПрдХ рд╕реБрдзрд╛рд░ рд╣реИред https://towardsdatascience.com/extracting-plotting-feature-names-importance-from-scikit-learn-pipelines-eb5bfa6a31f4

@kylegilde рдорд╣рд╛рди рд▓реЗрдЦ рдФрд░ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдЬрд╛рджреВ рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╡реИрд╢реНрд╡рд┐рдХ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдореИрдВ рдХреБрдЫ рдШрдВрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд░реНрдиреЗрд▓рд╢реИрдк рдФрд░ рдРрд▓рд┐рдмреА рдХреЗ рд╕рд╛рде рдХреБрд╢реНрддреА рдХрд░ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рд╡рдирд╣реЙрдЯ рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ handle_unkown='ignore' рдмрд┐рдирд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛

рдпрд╣рд╛рдВ @pjgao рдХреЗ рд╕реНрдирд┐рдкреЗрдЯ рдХрд╛ рдПрдХ рдФрд░ рд╕рдВрд╕реНрдХрд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд░рд┐рдорд╛рдЗрдВрдбрд░ рдХреЗ рдХреЙрд▓рдо рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

def get_columns_from_transformer(column_transformer, input_colums):    
    col_name = []

    for transformer_in_columns in column_transformer.transformers_[:-1]: #the last transformer is ColumnTransformer's 'remainder'
        raw_col_name = transformer_in_columns[2]
        if isinstance(transformer_in_columns[1],Pipeline): 
            transformer = transformer_in_columns[1].steps[-1][1]
        else:
            transformer = transformer_in_columns[1]
        try:
            names = transformer.get_feature_names(raw_col_name)
        except AttributeError: # if no 'get_feature_names' function, use raw column name
            names = raw_col_name
        if isinstance(names,np.ndarray): # eg.
            col_name += names.tolist()
        elif isinstance(names,list):
            col_name += names    
        elif isinstance(names,str):
            col_name.append(names)

    [_, _, reminder_columns] = column_transformer.transformers_[-1]

    for col_idx in reminder_columns:
        col_name.append(input_colums[col_idx])

    return col_name

рдХреЛрд░ рдХреЛрдбрдмреЗрд╕ рдХреЗ рд╕рдорд╛рди рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдк рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реИрдВ?

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

trchan picture trchan  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

amueller picture amueller  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

vitorcoliveira picture vitorcoliveira  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

AntiDoctor picture AntiDoctor  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

murata-yu picture murata-yu  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ