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

Beginner

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

简介

本实验展示了如何使用 Scikit-learn 中的 KBinsDiscretizer 类对连续特征进行离散化。离散化是通过将特征值划分为一组区间,将连续特征转换为离散特征的过程。这在处理只能对线性关系进行建模的线性模型时,或者在降低决策树的复杂度时可能会很有用。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签页,以访问 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 个区间,并使用独热编码来转换数据。

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)

可视化结果

在这一步中,我们将可视化离散化前后线性回归模型和决策树模型的结果。

## 使用原始数据集进行预测
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="线性回归")
reg = DecisionTreeRegressor(min_samples_split=3, random_state=0).fit(X, y)
ax1.plot(line, reg.predict(line), linewidth=2, color="red", label="决策树")
ax1.plot(X[:, 0], y, "o", c="k")
ax1.legend(loc="best")
ax1.set_ylabel("回归输出")
ax1.set_xlabel("输入特征")
ax1.set_title("离散化前的结果")

## 使用转换后的数据集进行预测
line_binned = enc.transform(line)
reg = LinearRegression().fit(X_binned, y)
ax2.plot(
    line,
    reg.predict(line_binned),
    linewidth=2,
    color="green",
    linestyle="-",
    label="线性回归",
)
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="决策树",
)
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("输入特征")
ax2.set_title("离散化后的结果")

plt.tight_layout()
plt.show()

总结

在本次实验中,我们学习了如何使用 Scikit-learn 中的 KBinsDiscretizer 类对连续特征进行离散化。在处理线性模型或降低决策树的复杂度时,离散化可能会很有用。我们还学习了如何在原始数据集和离散化后的数据集上训练线性回归模型和决策树模型,以及如何可视化结果。