用于回归问题的决策树通常被称为回归树。回归树的主要思想和分类树类似,但它预测的是连续值,而不是离散的类别。
回归树算法的主要步骤是先进行特征选择,根据这个特征对数据集进行分割,将其划分为两个子集,以递归的方式重复上述操作,直到满足某个停止条件。在生成树的过程中和结束后对回归树进行适当的剪枝操作以提高其泛化性。最后用生成好的回归树模型进行预测。
回归树的特征选择通常基于最小化均方误差(MSE)或最小化平均绝对误差(MAE)。具体来说,我们需要对每一个特征,尝试所有可能的分割点,然后计算每个分割点的MSE或MAE。通常选择能使MSE或MAE最小的特征和分割点。
例如,假设我们有一个特征A,我们可以尝试将数据集 根据特征A的每个可能取值划分为两部分,然后计算每个划分的MSE。
对于每个分割点 ,计算分割后的MSE或MAE。以MSE为例,公式如下:
其中, 和 是根据特征A的取值 划分的两个子集, 和 是两个子集的目标变量的均值。
这个公式的具体含义是:
一旦我们确定了最佳的特征和分割点,我们就可以根据这个特征和分割点将数据集划分为两个子集。然后,在每个子集上,我们重复特征选择和分割的过程。
我们会继续在每个子节点上重复特征选择和分割的过程,直到满足某个停止条件。常见的停止条件有:
当满足停止条件时,我们将当前节点标记为叶节点。
在回归问题中,叶节点的值通常是所有样本的目标变量的均值或中位数。这个值就是我们对到达这个叶节点的样本的预测结果。
为了防止过拟合,我们通常需要对决策树进行剪枝。剪枝可以是预剪枝(在构建决策树的过程中进行)或后剪枝(在构建完决策树后进行)。剪枝的目标是找到一个平衡,使模型在训练数据上的表现良好,同时也能在未见过的数据上泛化。
最后,当我们得到一个新的样本时,我们可以使用决策树进行预测。从根节点开始,根据样本在每个节点的特征取值来决定走哪个分支,直到达到一个叶节点。叶节点的值就是我们对这个样本的预测结果。
1from sklearn.datasets import load_boston
2from sklearn.model_selection import train_test_split
3from sklearn.tree import DecisionTreeRegressor, plot_tree
4from sklearn.metrics import mean_squared_error
5import matplotlib.pyplot as plt
6
7# 加载波士顿房价数据集
8boston = load_boston()
9X = boston.data
10y = boston.target
11
12# 划分训练集和测试集
13X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
14
15# 创建决策树回归器并训练
16reg = DecisionTreeRegressor(max_depth=3)
17reg.fit(X_train, y_train)
18
19# 预测测试集
20y_pred = reg.predict(X_test)
21
22# 计算并打印均方误差
23mse = mean_squared_error(y_test, y_pred)
24print('均方误差为:', mse)
25
26# 可视化决策树
27plt.figure(figsize=(15,10))
28plot_tree(reg, filled=True, feature_names=boston.feature_names)
29plt.show()
1from sklearn.datasets import load_boston
2from sklearn.model_selection import train_test_split
3from sklearn.tree import DecisionTreeRegressor, plot_tree
4from sklearn.metrics import mean_squared_error
5import matplotlib.pyplot as plt
6
7# 加载波士顿房价数据集
8boston = load_boston()
9X = boston.data
10y = boston.target
11
12# 划分训练集和测试集
13X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
14
15# 创建决策树回归器并训练
16reg = DecisionTreeRegressor(max_depth=3)
17reg.fit(X_train, y_train)
18
19# 预测测试集
20y_pred = reg.predict(X_test)
21
22# 计算并打印均方误差
23mse = mean_squared_error(y_test, y_pred)
24print('均方误差为:', mse)
25
26# 可视化决策树
27plt.figure(figsize=(15,10))
28plot_tree(reg, filled=True, feature_names=boston.feature_names)
29plt.show()
这段代码加载了波士顿房价数据集,将数据集划分为训练集和测试集。然后,创建一个决策树回归器,并使用训练集对其进行训练。使用训练好的决策树回归器对测试集进行预测。计算并打印了预测结果的均方误差,用于评估回归器的性能。最后对分类结果进行可视化展示。
运行结果:
1均方误差为: 13.491273032995437
1均方误差为: 13.491273032995437