案例介绍

在这个案例中,我们将使用决策树回归来预测波士顿地区的房屋价格。通过给定一些特征变量(如平均房间数、犯罪率等),我们的目标是预测对应房屋的房价。

算法原理

决策树回归是一种基于树结构的回归模型,它通过将特征空间划分为不同的区域,每个区域内具有相同的目标变量值,并通过构建决策树来实现预测。

决策树回归的关键思想是根据特征的取值进行划分,选择最优的划分特征和划分点,使得划分后的子集内目标变量的方差最小化。具体的算法原理如下:

  1. 计算当前节点的目标变量的方差,即平方误差和;
  2. 对每个特征的每个可能取值进行划分,计算划分后的子集的平方误差和;
  3. 选择划分特征和划分点,使得划分后的平方误差和最小;
  4. 递归地继续划分子集,直到满足停止条件,例如达到最大深度、节点包含的样本数小于某个阈值等。

公式推导

假设我们有一个数据集$D$,其中包含$n$个样本,每个样本包括$d$个特征变量和一个目标变量。我们的目标是通过构建决策树来建立回归模型。

对于回归问题,我们的目标是最小化平方误差和:
$$\text{MSE} = \frac{1}{n}\sum_{i=1}^{n}(y_i – \hat{y_i})^2$$
其中,$y_i$是样本$i$的真实目标变量值,$\hat{y_i}$是决策树预测的目标变量值。

决策树回归的算法过程可以通过递归地构建二叉树来实现,其中每个节点代表一个特征变量,每个叶节点代表一个预测值。

为了找到最佳划分特征和划分点,我们可以使用贪婪算法,依次评估每个特征的每个划分点,并选择最小的平方误差和。

数据集

我们使用sklearn库中的波士顿房屋价格数据集。这个数据集包含了506个样本,每个样本有13个特征变量和一个连续的目标变量(房屋价格中位数)。

计算步骤

  1. 加载数据集,并将其划分为训练集和测试集;
  2. 创建决策树回归模型,并设置相关参数;
  3. 使用训练集训练模型;
  4. 使用测试集评估模型性能,并计算预测结果的平均绝对误差和均方根误差;
  5. 可视化决策树模型。

Python代码示例

# 导入所需的库和模块
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import mean_absolute_error, mean_squared_error
from sklearn.tree import export_graphviz
import pydot

# 加载波士顿房屋价格数据集
boston = load_boston()

# 划分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(boston.data, boston.target, test_size=0.2, random_state=42)

# 创建决策树回归模型
regressor = DecisionTreeRegressor(max_depth=4)

# 训练模型
regressor.fit(X_train, y_train)

# 预测
y_pred = regressor.predict(X_test)

# 计算平均绝对误差和均方根误差
mae = mean_absolute_error(y_test, y_pred)
mse = mean_squared_error(y_test, y_pred)
print("Mean Absolute Error:", mae)
print("Mean Squared Error:", mse)

# 可视化决策树模型
dot_data = export_graphviz(regressor, out_file=None, feature_names=boston.feature_names, filled=True)
graph = pydot.graph_from_dot_data(dot_data)[0]
graph.write_png('decision_tree.png')

代码细节解释

  1. 从sklearn.datasets导入load_boston,用于加载波士顿房屋价格数据集。
  2. 从sklearn.model_selection导入train_test_split,用于划分数据集为训练集和测试集。
  3. 从sklearn.tree导入DecisionTreeRegressor,用于创建决策树回归模型。
  4. 从sklearn.metrics导入mean_absolute_error和mean_squared_error,用于计算模型性能指标。
  5. 从sklearn.tree导入export_graphviz,用于可视化决策树模型。
  6. 加载波士顿房屋价格数据集,并将数据集划分为训练集和测试集。
  7. 创建决策树回归模型,并设置相关参数,如最大深度。
  8. 使用训练集训练模型。
  9. 使用测试集进行预测。
  10. 计算预测结果的平均绝对误差和均方根误差。
  11. 可视化决策树模型,并保存为PNG格式的图片文件。

通过以上代码,我们可以训练一个决策树回归模型,并使用该模型预测波士顿房屋价格。最后,我们可视化生成的决策树模型,以便更好地理解模型的决策过程。

回复 新用户 取消回复

您的邮箱地址不会被公开。 必填项已用 * 标注

评论(3)

  • 新用户 2023年 12月 7日 上午8:57

    绘制网络图时出现:“dot” not found in path,具体解决办法为:
    1、下载绘图软件graphviz
    https://gitlab.com/api/v4/projects/4207231/packages/generic/graphviz-releases/9.0.0/windows_10_cmake_Release_graphviz-install-9.0.0-win64.exe
    2、双击安装,勾选加入环境变量。如果忘记勾选,后期手工加入,类似Java安装时需要将%JAVA_HOME%\bin加入Path变量中一样。
    3、在python安装环境下找到pydot.py文件,若是虚拟环境或者Anaconda环境的话直接到相应的python目录中查找即可,打开此文件找到第1274行,将self.prog = ‘dot’修改为:
    import platform

    sys = platform.system()
    if sys == “Windows”:
    self.prog = ‘dot.exe’
    elif sys == “Linux”:
    self.prog = ‘dot’
    (4)再次执行代码应该不再出现错误。

  • 新用户 2023年 12月 7日 上午9:10

    最后一句输出png,pycharm提示”Unresolved attribute reference ‘write_png’ for class ‘Dot’ ”
    改正方法,将其改为graph.write(‘decision_tree.png’, format=’png’)

  • 新用户 2023年 12月 7日 上午9:13

    如果从本地采用如下方法加载数据集:
    file_path = ‘../data/boston_housing.csv’
    # 从CSV文件中读取数据
    boston_df = pd.read_csv(file_path)
    # 分离特征和目标变量
    X = boston_df.drop(‘TARGET’, axis=1)
    y = boston_df[‘TARGET’]
    # 将数据集划分为训练集和测试集
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

    需要将可视化决策树模型一行feature_names=boston.feature_names改为feature_names=X.columns
    dot_data = export_graphviz(regressor, out_file=None, feature_names=X.columns, filled=True)