在机器学习领域,线性回归和决策树是两种常见的预测模型。线性回归模型以其构建速度快和解释性较强而受到青睐,但它只能捕捉线性关系。相比之下,决策树模型能够构建更复杂的数据模型,但解释性相对较弱。为了增强线性回归模型在连续数据上的表现,可以通过数据离散化(也称为分箱)来实现。在本例中,对特征进行了离散化处理,并使用独热编码转换了数据。需要注意的是,如果分箱的宽度设置不合理,可能会导致过拟合的风险显著增加,因此通常需要在交叉验证下调整离散化参数。
离散化之后,线性回归和决策树模型的预测结果完全相同。因为在每个箱内特征是恒定的,任何模型都必须对箱内所有点预测相同的值。与离散化前的结果相比,线性回归模型变得更加灵活,而决策树模型则变得不那么灵活。值得注意的是,对特征进行分箱处理通常对基于树的模型没有益处,因为这些模型能够学习在任何地方分割数据。
以下是使用Python实现线性回归和决策树模型的代码,包括数据的生成、离散化处理以及模型的预测。
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
# 生成数据集
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)
# 使用KBinsDiscretizer进行数据转换
enc = KBinsDiscretizer(n_bins=10, encode="onehot")
X_binned = enc.fit_transform(X)
# 使用原始数据集进行预测
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()
reg.fit(X, y)
ax1.plot(line, reg.predict(line), linewidth=2, color="green", label="线性回归")
reg = DecisionTreeRegressor(min_samples_split=3, random_state=0)
reg.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()
reg.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)
reg.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()
这段代码首先导入了必要的库,然后生成了一个随机的数据集。接着,使用KBinsDiscretizer对数据进行了离散化处理。之后,分别使用线性回归和决策树模型对原始数据集和离散化后的数据集进行了拟合和预测。最后,使用matplotlib库绘制了预测结果的图表。