Введение
В этой статье мы рассмотрим функцию `make_column_transformer`, которая упрощает применение различных методов предварительной обработки к различным подмножествам объектов в вашем наборе данных. Мы также объясним разницу между `make_column_transformer` и `ColumnTransformer`.
Что такое make_column_transformer?
`make_column_transformer` — это удобная функция в модуле предварительной обработки sklearn, которая позволяет вам легко применять различные методы предварительной обработки к разным столбцам вашего набора данных. Это особенно полезно, когда ваш набор данных содержит сочетание непрерывных и категориальных функций, поскольку для разных типов данных подходят разные методы предварительной обработки.
Вот простой пример, иллюстрирующий, как работает `make_column_transformer`. Предположим, у нас есть следующий набор данных:
import pandas as pd data = {'age': [25, 32, 47, 51], 'gender': ['M', 'F', 'F', 'M'], 'income': [50000, 55000, 60000, 65000]} df = pd.DataFrame(data)
Наш набор данных содержит три столбца: «возраст», «пол» и «доход». Мы хотим стандартизировать столбцы «возраст» и «доход» и сразу закодировать столбец «пол». Для этого мы можем использовать make_column_transformer следующим образом:
from sklearn.compose import make_column_transformer from sklearn.preprocessing import StandardScaler, OneHotEncoder preprocessor = make_column_transformer( (StandardScaler(), ['age', 'income']), (OneHotEncoder(), ['gender']) ) X_transformed = preprocessor.fit_transform(df)
В этом примере мы сначала импортируем необходимые функции и создаем объект препроцессора с помощью make_column_transformer. Мы передаем кортежи, где первый элемент — это преобразователь, который мы хотим использовать (например, `StandardScaler` или `OneHotEncoder`), а второй элемент — это список имена столбцов, к которым мы хотим применить преобразователь. Наконец, мы подгоняем и преобразуем наши данные с помощью метода fit_transform.
Разница между make_column_transformer и ColumnTransformer
`make_column_transformer` и `ColumnTransformer` позволяют применять разные методы предварительной обработки к разным столбцам в наборе данных. Ключевое различие между ними заключается в их синтаксисе и способе создания экземпляров.
`make_column_transformer` – это удобная функция, которая создает объект `ColumnTransformer` за кулисами. Он предлагает более краткий синтаксис, так как вам не нужно явно указывать имена преобразователей. Вот пример использования `make_column_transformer`:
from sklearn.compose import make_column_transformer from sklearn.preprocessing import StandardScaler, OneHotEncoder preprocessor = make_column_transformer( (StandardScaler(), ['age', 'income']), (OneHotEncoder(), ['gender']) )
С другой стороны, при использовании `ColumnTransformer` вам необходимо создать экземпляр объекта и предоставить список преобразователей, каждый с именем, экземпляром преобразователя и столбцами, к которым нужно применить. Вот тот же пример с использованием `ColumnTransformer`:
from sklearn.compose import ColumnTransformer from sklearn.preprocessing import StandardScaler, OneHotEncoder preprocessor = ColumnTransformer( transformers=[ ('standardscaler', StandardScaler(), ['age', 'income']), ('onehotencoder', OneHotEncoder(), ['gender']) ] )
Как видите, `ColumnTransformer` требует немного более подробного синтаксиса, чем `make_column_transformer`. Однако оба подхода дают один и тот же результат, и выбор между ними в основном сводится к личным предпочтениям или удобочитаемости.
Таким образом, `make_column_transformer` и `ColumnTransformer` служат одной и той же цели: для предварительной обработки разных столбцов в вашем наборе данных с использованием разных преобразователей. `make_column_transformer` предлагает более краткий синтаксис, а `ColumnTransformer` требует, чтобы вы явно называли преобразователи и предоставляли их в виде списка.
Как выбрать целевые столбцы для желаемого преобразования
В `make_column_transformer` вы можете выбирать столбцы DataFrame различными способами. Вот несколько распространенных способов указать столбцы при создании объекта `make_column_transformer`:
1. По имени столбца
Вы можете выбрать столбцы, используя их имена столбцов, предоставив список имен столбцов в виде строк:
preprocessor = make_column_transformer( (StandardScaler(), ['age', 'income']), (OneHotEncoder(), ['gender']) )
2. По индексу столбца
Кроме того, вы можете выбирать столбцы по их позициям в индексе, используя целые числа:
preprocessor = make_column_transformer( (StandardScaler(), [0, 2]), (OneHotEncoder(), [1]) )
3. По булевой маске
Вы также можете выбрать столбцы, используя логическую маску, где «True» выбирает столбец, а «False» пропускает его:
preprocessor = make_column_transformer( (StandardScaler(), [True, False, True]), (OneHotEncoder(), [False, True, False]) )
4. Указав типы данных
`make_column_transformer` также позволяет выбирать столбцы на основе их типов данных. Например, вы можете использовать параметры `include` и `exclude` метода `pd.DataFrame.select_dtypes()`:
# Select all numeric columns numeric_columns = df.select_dtypes(include='number').columns # Select all non-numeric columns non_numeric_columns = df.select_dtypes(exclude='number').columns preprocessor = make_column_transformer( (StandardScaler(), numeric_columns), (OneHotEncoder(), non_numeric_columns) )
Объедините все вместе: используйте make_column_transfer с make_pipeline.
В этом разделе мы создадим сквозной пример, который включает предварительную обработку различных столбцов с помощью `make_column_transformer` и передачу предварительно обработанных данных в модель машинного обучения с помощью `make_pipeline`. со следующим набором данных:
import pandas as pd from sklearn.model_selection import train_test_split data = {'age': [25, 32, 47, 51, 28, 38, 45, 61], 'gender': ['M', 'F', 'F', 'M', 'F', 'M', 'F', 'M'], 'income': [50000, 55000, 60000, 65000, 48000, 58000, 62000, 68000], 'country': ['US', 'UK', 'UK', 'US', 'US', 'UK', 'UK', 'US'], 'target': [0, 1, 1, 0, 1, 1, 0, 0]} df = pd.DataFrame(data)
Мы хотим стандартизировать столбцы «возраст» и «доход», сразу закодировать столбцы «пол» и «страна», а затем обучить модель логистической регрессии. Для этого мы можем использовать `make_column_transformer` и `make_pipeline` следующим образом:
from sklearn.compose import make_column_transformer from sklearn.pipeline import make_pipeline from sklearn.preprocessing import StandardScaler, OneHotEncoder from sklearn.linear_model import LogisticRegression from sklearn.model_selection import cross_val_score X = df.drop(columns=['target']) y = df['target'] # Preprocessing using make_column_transformer preprocessor = make_column_transformer( (StandardScaler(), ['age', 'income']), (OneHotEncoder(), ['gender', 'country']) ) # Creating a pipeline with preprocessing and logistic regression pipeline = make_pipeline( preprocessor, LogisticRegression(random_state=42) ) # Evaluate the pipeline using cross-validation cv_scores = cross_val_score(pipeline, X, y, cv=5) # Calculate the average accuracy across the cross-validation folds average_accuracy = cv_scores.mean() print(f"Average accuracy: {average_accuracy:.2f}")