Transformador de Colunas com Tipos Mistos

Beginner

This tutorial is from open-source community. Access the source code

Introdução

Este laboratório ilustra como aplicar diferentes pipelines de pré-processamento e extração de características a diferentes subconjuntos de características, utilizando ColumnTransformer. Isto é particularmente útil para conjuntos de dados que contêm tipos de dados heterogéneos, uma vez que podemos querer escalar as características numéricas e codificar em one-hot as características categóricas.

Neste laboratório, utilizaremos o conjunto de dados Titanic do OpenML para construir um pipeline que pré-processa dados categóricos e numéricos utilizando ColumnTransformer e utilizá-lo para treinar um modelo de regressão logística.

Dicas da VM

Após o arranque da VM, clique no canto superior esquerdo para mudar para a aba Notebook para aceder ao Jupyter Notebook para a prática.

Por vezes, pode ser necessário esperar alguns segundos para o Jupyter Notebook terminar de carregar. A validação das operações não pode ser automatizada devido a limitações no Jupyter Notebook.

Se tiver problemas durante a aprendizagem, não hesite em contactar o Labby. Forneça feedback após a sessão e resolveremos prontamente o problema para si.

Importar Bibliotecas

Neste passo, iremos importar as bibliotecas necessárias para construir o nosso pipeline.

import numpy as np
from sklearn.compose import ColumnTransformer
from sklearn.datasets import fetch_openml
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split, RandomizedSearchCV
from sklearn.feature_selection import SelectPercentile, chi2

Carregar o Conjunto de Dados

Neste passo, carregaremos o conjunto de dados Titanic do OpenML utilizando fetch_openml.

X, y = fetch_openml(
    "titanic", version=1, as_frame=True, return_X_y=True, parser="pandas"
)

Definir Características Numéricas e Categóricas

Neste passo, definiremos as características numéricas e categóricas que utilizaremos no nosso pipeline. Também definiremos os pipelines de pré-processamento para dados numéricos e categóricos.

numeric_features = ["age", "fare"]
numeric_transformer = Pipeline(
    steps=[("imputer", SimpleImputer(strategy="median")), ("scaler", StandardScaler())]
)

categorical_features = ["embarked", "sex", "pclass"]
categorical_transformer = Pipeline(
    steps=[
        ("encoder", OneHotEncoder(handle_unknown="ignore")),
        ("selector", SelectPercentile(chi2, percentile=50)),
    ]
)

Definir o Pré-processador

Neste passo, definiremos o ColumnTransformer que será utilizado para pré-processar os nossos dados.

preprocessor = ColumnTransformer(
    transformers=[
        ("num", numeric_transformer, numeric_features),
        ("cat", categorical_transformer, categorical_features),
    ]
)

Adicionar o Classificador ao Pipeline de Pré-processamento

Neste passo, adicionaremos o classificador de regressão logística ao nosso pipeline de pré-processamento utilizando Pipeline.

clf = Pipeline(
    steps=[("preprocessor", preprocessor), ("classifier", LogisticRegression())]
)

Dividir os Dados

Neste passo, dividiremos os nossos dados em conjuntos de treino e teste utilizando train_test_split.

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

Ajustar o Pipeline

Neste passo, ajustaremos o nosso pipeline aos nossos dados de treino.

clf.fit(X_train, y_train)

Avaliar o Pipeline

Neste passo, avaliaremos o desempenho do nosso pipeline calculando a pontuação do modelo.

print("model score: %.3f" % clf.score(X_test, y_test))

Utilizar ColumnTransformer Selecionando Colunas por Tipos de Dados

Neste passo, utilizaremos ColumnTransformer selecionando colunas por seus tipos de dados. Usaremos make_column_selector para selecionar colunas com base em seus tipos de dados.

from sklearn.compose import make_column_selector as selector

subset_feature = ["embarked", "sex", "pclass", "age", "fare"]
X_train, X_test = X_train[subset_feature], X_test[subset_feature]

preprocessor = ColumnTransformer(
    transformers=[
        ("num", numeric_transformer, selector(dtype_exclude="category")),
        ("cat", categorical_transformer, selector(dtype_include="category")),
    ]
)
clf = Pipeline(
    steps=[("preprocessor", preprocessor), ("classifier", LogisticRegression())]
)

Usar Busca em Grade para Ajustar Hiperparâmetros

Neste passo, usaremos busca em grade para ajustar os hiperparâmetros do nosso pipeline.

param_grid = {
    "preprocessor__num__imputer__strategy": ["mean", "median"],
    "preprocessor__cat__selector__percentile": [10, 30, 50, 70],
    "classifier__C": [0.1, 1.0, 10, 100],
}

search_cv = RandomizedSearchCV(clf, param_grid, n_iter=10, random_state=0)
search_cv.fit(X_train, y_train)

print("Melhores parâmetros:")
print(search_cv.best_params_)
print(f"Pontuação de validação cruzada interna: {search_cv.best_score_:.3f}")

Resumo

Neste laboratório, aprendemos como usar ColumnTransformer para pré-processar dados categóricos e numéricos em um pipeline e como usar busca em grade para ajustar os hiperparâmetros do nosso pipeline.