Spec-Zone.ru › scikit-learn

Примечание

Перейти в конец для скачивания полного кода примера. Или запустить этот пример в браузере через JupyterLite или Binder

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

Пример сравнивает результат прогнозирования линейной регрессии (линейная модель) и дерева решений (модель на основе дерева) с дискретизацией и без дискретизации вещественных признаков.

Как видно из результата до дискретизации, линейная модель быстро строится и относительно проста в интерпретации, но может моделировать только линейные зависимости, тогда как дерево решений может построить гораздо более сложную модель данных. Один из способов сделать линейную модель более мощной для непрерывных данных — использовать дискретизацию (также известную как бинирование). В примере мы дискретизируем признак и кодируем преобразованные данные с помощью one-hot кодирования. Обратите внимание, что если бины не имеют разумной ширины, может существенно повыситься риск переобучения, поэтому параметры дискретизатора обычно следует настраивать с помощью перекрёстной проверки.

После дискретизации линейная регрессия и дерево решений делают точно такой же прогноз. Поскольку признаки постоянны в каждом бине, любая модель должна предсказывать одно и то же значение для всех точек внутри бина. По сравнению с результатом до дискретизации, линейная модель становится гораздо более гибкой, а дерево решений становится гораздо менее гибким. Обратите внимание, что бинирование признаков обычно не оказывает положительного эффекта для моделей на основе деревьев, так как эти модели могут научиться разбивать данные где угодно.

Result before discretization, Result after discretization
# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause

import matplotlib.pyplot as plt
import numpy as np

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

# construct the dataset
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)

# transform the dataset with KBinsDiscretizer
enc = KBinsDiscretizer(n_bins=10, encode="onehot")
X_binned = enc.fit_transform(X)

# 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()

Общее время выполнения скрипта: (0 минут 0,241 секунды)

Launch binder
Launch JupyterLite

Download Jupyter notebook: plot_discretization.ipynb

Download Python source code: plot_discretization.py

Download zipped: plot_discretization.zip

Связанные примеры

Демонстрация различных стратегий KBinsDiscretizer

Кривая подгонка с помощью байесовской регрессии Риджа

Регрессия с градиентным бустингом

Дерево решений для регрессии

© 2007–2025 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.6/auto_examples/preprocessing/plot_discretization.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API