Введение

В этой статье мы рассмотрим функцию `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}")