Дискретизация непрерывных признаков с использованием KBinsDiscretizer

Beginner

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

Введение

В этом практическом занятии показано, как дискретизировать непрерывные признаки с использованием класса KBinsDiscretizer из библиотеки Scikit-learn. Дискретизация - это процесс преобразования непрерывных признаков в дискретные, путём разделения значений признака на группы (bins). Это может быть полезно при работе с линейными моделями, которые могут моделировать только линейные зависимости, или для уменьшения сложности деревьев решений.

Советы по работе с ВМ

После запуска виртуальной машины (VM) нажмите в левом верхнем углу, чтобы переключиться на вкладку Notebook и приступить к практике с использованием Jupyter Notebook.

Иногда может потребоваться подождать несколько секунд, пока Jupyter Notebook полностью загрузится. Валидация операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.

Загрузка необходимых библиотек

В этом шаге мы импортируем необходимые библиотеки.

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

Создание набора данных

В этом шаге мы создадим набор данных с непрерывным входным признаком и непрерывным выходным признаком. Мы будем использовать метод numpy.random.RandomState() для генерации случайных чисел для входного признака и метод numpy.sin() для генерации выходного признака.

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)

Визуализация набора данных

В этом шаге мы визуализируем набор данных с использованием точечного графика.

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

Дискретизация входного признака

В этом шаге мы будем использовать класс KBinsDiscretizer для дискретизации входного признака. Мы создадим 10 групп (bins) и применим one-hot кодирование для преобразования данных.

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

Визуализация дискретизированного набора данных

В этом шаге мы визуализируем дискретизированный набор данных с использованием точечного графика.

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

Обучение модели линейной регрессии

В этом шаге мы обучим модель линейной регрессии на исходном наборе данных.

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

Обучение модели дерева решений

В этом шаге мы обучим модель дерева решений на исходном наборе данных.

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

Обучение модели линейной регрессии на дискретизированном наборе данных

В этом шаге мы обучим модель линейной регрессии на дискретизированном наборе данных.

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

Обучение модели дерева решений на дискретизированном наборе данных

В этом шаге мы обучим модель дерева решений на дискретизированном наборе данных.

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

Визуализация результатов

В этом шаге мы визуализируем результаты моделей линейной регрессии и дерева решений до и после дискретизации.

## predict with original dataset
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="linear regression")
reg = DecisionTreeRegressor(min_samples_split=3, random_state=0).fit(X, y)
ax1.plot(line, reg.predict(line), linewidth=2, color="red", label="decision tree")
ax1.plot(X[:, 0], y, "o", c="k")
ax1.legend(loc="best")
ax1.set_ylabel("Regression output")
ax1.set_xlabel("Input feature")
ax1.set_title("Result before discretization")

## predict with transformed dataset
line_binned = enc.transform(line)
reg = LinearRegression().fit(X_binned, y)
ax2.plot(
    line,
    reg.predict(line_binned),
    linewidth=2,
    color="green",
    linestyle="-",
    label="linear regression",
)
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="decision tree",
)
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("Input feature")
ax2.set_title("Result after discretization")

plt.tight_layout()
plt.show()

Резюме

В этом практическом занятии мы узнали, как дискретизировать непрерывные признаки с использованием класса KBinsDiscretizer в Scikit-learn. Дискретизация может быть полезной при работе с линейными моделями или для уменьшения сложности деревьев решений. Мы также узнали, как обучать модели линейной регрессии и деревьев решений на как исходном, так и дискретизированном наборах данных, а также как визуализировать результаты.