Discrétisation des caractéristiques continues avec KBinsDiscretizer

Beginner

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

Introduction

Ce laboratoire montre comment discrétiser des caractéristiques continues à l'aide de la classe KBinsDiscretizer dans Scikit-learn. La discrétisation est le processus consistant à transformer des caractéristiques continues en caractéristiques discrètes en divisant les valeurs des caractéristiques en un ensemble de classes. Cela peut être utile lorsqu'on travaille avec des modèles linéaires qui ne peuvent modéliser que des relations linéaires, ou pour réduire la complexité des arbres de décision.

Conseils sur la machine virtuelle

Une fois le démarrage de la machine virtuelle terminé, cliquez dans le coin supérieur gauche pour passer à l'onglet Carnet de notes pour accéder à Jupyter Notebook pour la pratique.

Parfois, vous devrez peut-être attendre quelques secondes pour que Jupyter Notebook ait fini de charger. La validation des opérations ne peut pas être automatisée en raison des limites de Jupyter Notebook.

Si vous rencontrez des problèmes pendant l'apprentissage, n'hésitez pas à demander à Labby. Donnez des commentaires après la session, et nous réglerons rapidement le problème pour vous.

Charger les bibliothèques requises

Dans cette étape, nous allons importer les bibliothèques requises.

import numpy as np
import matplotlib.pyplot as plt

from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import KBinsDiscretizer
from sklearn.tree import DecisionTreeRegressor

Créer l'ensemble de données

Dans cette étape, nous allons créer un ensemble de données avec une caractéristique d'entrée continue et une caractéristique de sortie continue. Nous utiliserons la méthode numpy.random.RandomState() pour générer des nombres aléatoires pour la caractéristique d'entrée, et la méthode numpy.sin() pour générer la caractéristique de sortie.

rnd = np.random.RandomState(42)
X = rnd.uniform(-3, 3, size=100)
y = np.sin(X) + rnd.normal(size=len(X)) / 3
X = X.reshape(-1, 1)

Visualiser l'ensemble de données

Dans cette étape, nous allons visualiser l'ensemble de données à l'aide d'un graphique de dispersion.

plt.scatter(X, y, color='black')
plt.show()

Discrétiser la caractéristique d'entrée

Dans cette étape, nous allons utiliser la classe KBinsDiscretizer pour discrétiser la caractéristique d'entrée. Nous allons créer 10 classes et utiliser le codage one-hot pour transformer les données.

enc = KBinsDiscretizer(n_bins=10, encode="onehot")
X_binned = enc.fit_transform(X)

Visualiser l'ensemble de données discrétisé

Dans cette étape, nous allons visualiser l'ensemble de données discrétisé à l'aide d'un graphique de dispersion.

plt.scatter(X_binned, y, color='black')
plt.show()

Entraîner un modèle de régression linéaire

Dans cette étape, nous allons entraîner un modèle de régression linéaire sur l'ensemble de données original.

reg = LinearRegression().fit(X, y)

Entraîner un modèle d'arbre de décision

Dans cette étape, nous allons entraîner un modèle d'arbre de décision sur l'ensemble de données original.

reg = DecisionTreeRegressor(min_samples_split=3, random_state=0).fit(X, y)

Entraîner un modèle de régression linéaire sur l'ensemble de données discrétisé

Dans cette étape, nous allons entraîner un modèle de régression linéaire sur l'ensemble de données discrétisé.

reg = LinearRegression().fit(X_binned, y)

Entraîner un modèle d'arbre de décision sur l'ensemble de données discrétisé

Dans cette étape, nous allons entraîner un modèle d'arbre de décision sur l'ensemble de données discrétisé.

reg = DecisionTreeRegressor(min_samples_split=3, random_state=0).fit(X_binned, y)

Visualiser les résultats

Dans cette étape, nous allons visualiser les résultats des modèles de régression linéaire et d'arbre de décision avant et après discrétisation.

## prédire avec l'ensemble de données original
fig, (ax1, ax2) = plt.subplots(ncols=2, sharey=True, figsize=(10, 4))
line = np.linspace(-3, 3, 1000, endpoint=False).reshape(-1, 1)
reg = LinearRegression().fit(X, y)
ax1.plot(line, reg.predict(line), linewidth=2, color="green", label="régression linéaire")
reg = DecisionTreeRegressor(min_samples_split=3, random_state=0).fit(X, y)
ax1.plot(line, reg.predict(line), linewidth=2, color="red", label="arbre de décision")
ax1.plot(X[:, 0], y, "o", c="k")
ax1.legend(loc="best")
ax1.set_ylabel("Sortie de régression")
ax1.set_xlabel("Caractéristique d'entrée")
ax1.set_title("Résultat avant discrétisation")

## prédire avec l'ensemble de données transformé
line_binned = enc.transform(line)
reg = LinearRegression().fit(X_binned, y)
ax2.plot(
    line,
    reg.predict(line_binned),
    linewidth=2,
    color="green",
    linestyle="-",
    label="régression linéaire",
)
reg = DecisionTreeRegressor(min_samples_split=3, random_state=0).fit(X_binned, y)
ax2.plot(
    line,
    reg.predict(line_binned),
    linewidth=2,
    color="red",
    linestyle=":",
    label="arbre de décision",
)
ax2.plot(X[:, 0], y, "o", c="k")
ax2.vlines(enc.bin_edges_[0], *plt.gca().get_ylim(), linewidth=1, alpha=0.2)
ax2.legend(loc="best")
ax2.set_xlabel("Caractéristique d'entrée")
ax2.set_title("Résultat après discrétisation")

plt.tight_layout()
plt.show()

Sommaire

Dans ce laboratoire, nous avons appris à discrétiser les caractéristiques continues à l'aide de la classe KBinsDiscretizer dans Scikit-learn. La discrétisation peut être utile lorsqu'on travaille avec des modèles linéaires ou pour réduire la complexité des arbres de décision. Nous avons également appris à entraîner des modèles de régression linéaire et d'arbre de décision sur les ensembles de données originaux et discrétisés, et à visualiser les résultats.