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

# 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 секунды)
Связанные примеры
© 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