使用 KBinsDiscretizer 对连续特征进行离散化#

此示例比较了在对实值特征进行离散化和未进行离散化的情况下,线性回归(线性模型)和决策树(基于树的模型)的预测结果。

如离散化前结果所示,线性模型构建速度快,解释起来相对简单,但只能模拟线性关系,而决策树可以构建更复杂的模型。让线性模型在连续数据上更强大的方法之一是使用离散化(也称为分箱)。在本例中,我们对特征进行离散化并对转换后的数据进行独热编码。请注意,如果箱的宽度不合理,则过度拟合的风险会大大增加,因此通常应在交叉验证下调整离散化器的参数。

离散化后,线性回归和决策树的预测结果完全相同。由于特征在每个箱内都是常数,因此任何模型都必须对箱内所有点预测相同的值。与离散化前的结果相比,线性模型变得更加灵活,而决策树变得不那么灵活。请注意,对于基于树的模型,分箱特征通常没有好处,因为这些模型可以学习在任何地方分割数据。

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.244 秒)

相关示例

演示KBinsDiscretizer的不同策略

演示KBinsDiscretizer的不同策略

使用贝叶斯岭回归进行曲线拟合

使用贝叶斯岭回归进行曲线拟合

梯度提升回归

梯度提升回归

决策树回归

决策树回归

由 Sphinx-Gallery 生成的图库