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", quantile_method="averaged_inverted_cdf"
)
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.206 секунды)

Launch binder
Launch JupyterLite

Download Jupyter notebook: plot_discretization.ipynb

Download Python source code: plot_discretization.py

Download zipped: plot_discretization.zip

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

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

Аппроксимация кривой с помощью байесовской гребневой регрессии

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

Регрессия с помощью дерева решений

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

Spec-Zone.ru

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