#python #scikit-learn
#python #scikit-learn
Вопрос:
у меня уже есть некоторые логические функции (1 или 0), но у меня есть некоторые категориальные переменные, которым требуется OHE, и некоторые числовые переменные, которые нуждаются в вменении / масштабировании… я могу добавить категориальные переменные числовые переменные в преобразователь столбца конвейера, но как мне добавить логические функции в конвейер, чтобы они были включены в модель? не могу найти никаких примеров или хорошей фразы для поиска такого рода дилеммы… есть идеи?
вот пример из sklearn, объединяющий конвейер num и cat, однако, что, если некоторые из моих функций уже находятся в логической форме (1/0) и не нуждаются в предварительной обработке / OHE … как мне сохранить эти функции (т. Е. Добавить их в конвейер с переменными num и cat)?
источник: https://scikit-learn.org/stable/modules/generated/sklearn.compose.ColumnTransformer.html
titanic_url = ('https://raw.githubusercontent.com/amueller/scipy-2017-sklearn/091d371/notebooks/datasets/titanic3.csv')
data = pd.read_csv(titanic_url)
numeric_features = ['age', 'fare']
numeric_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='median')),
('scaler', StandardScaler())])
categorical_features = ['embarked', 'sex', 'pclass']
categorical_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='constant', fill_value='missing')),
('onehot', OneHotEncoder(handle_unknown='ignore'))])
preprocessor = ColumnTransformer(
transformers=[
('num', numeric_transformer, numeric_features),
('cat', categorical_transformer, categorical_features)])
clf = Pipeline(steps=[('preprocessor', preprocessor),
('classifier', LogisticRegression(solver='lbfgs'))])
X = data.drop('survived', axis=1)
y = data['survived']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
clf.fit(X_train, y_train)
print("model score: %.3f" % clf.score(X_test, y_test))
Ответ №1:
Я выяснил свой собственный вопрос здесь … с помощью ColumnTransformer я могу просто добавить дополнительные функции в список (т. Е. numeric_features и categorical_features, как в коде из моего вопроса), а с помощью FeatureUnion я могу использовать этот класс DF Selector для добавления функций в конвейер… подробности можно найти в этой записной книжке => https://github.com/ageron/handson-ml/blob/master/02_end_to_end_machine_learning_project.ipynb
# Create a class to select numerical or categorical columns
class PandasDataFrameSelector(BaseEstimator, TransformerMixin):
def __init__(self, attribute_names):
self.attribute_names = attribute_names
def fit(self, X, y=None):
return self
def transform(self, X):
return X[self.attribute_names].values
# ex
feature_list = [...]
("num_features", Pipeline([
("select_num_features", PandasDataFrameSelector(feature_list)),
("scales", StandardScaler())
Ответ №2:
Используйте remainder='passthrough
для прохождения по любым столбцам, не рассмотренным в вашем column_transformers
списке. Тем не менее, ответ @thePurplePython может быть весьма полезным.
preprocessor_pipeline = sklearn.compose.ColumnTransformer(column_transformers, remainder='passthrough')
В качестве альтернативы, передайте конвейерную тройку ‘passthrough’ вместо функции transformer и список столбцов для прохождения.
('passthrough','passthrough',passthrough_columns)