机器学习:决策树回归树实现

1、决策树

是一种树形结构,用于通过一系列的是非问题来预测目标值。在决策树回归中,树的叶子节点代表预测的连续值。

2、数据准备

收集数据集,并对其进行清洗和预处理。

将数据集分为特征(X)和目标变量(y)。

python 复制代码
# 读取CSV文件中的数据
data = pd.read_csv("spambase.csv")

# 选取特征列和目标列
x = data.iloc[:, :-1]  # 特征数据
y = data.iloc[:, -1]   # 目标数据

3、特征选择

选择用于构建决策树的特征。这可以通过特征重要性分析来完成。

python 复制代码
# 划分训练集和测试集,测试集占20%,随机状态设置为42以保证结果可复现
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42)

4、构建决策树

从根节点开始,选择一个特征和该特征的某个值作为分割点。

基于分割点将数据集分为子集。

对每个子集重复上述过程,直到满足停止条件(例如,达到最大深度,或子集中的样本数量小于某个阈值)。

6、剪枝

为了防止过拟合,可以对树进行剪枝。剪枝可以是预剪枝(在树生长之前设置最大深度)或后剪枝(在树生长后删除一些分支)。

python 复制代码
# 初始化一个列表来存储不同树深度的交叉验证分数
scores = []

# 定义一个树深度候选列表
c = [5, 6, 7, 8, 9, 10, 11, 12, 13]

# 遍历树深度候选列表
for i in c:
    # 创建一个决策树回归模型,设置最大深度为当前候选深度
    reg = DecisionTreeRegressor(max_depth=i)
    
    # 对训练集进行8折交叉验证,并获取分数
    score = cross_val_score(reg, x_train, y_train, cv=8)
    
    # 计算交叉验证分数的平均值
    score_mean = sum(score) / len(score)
    
    # 将平均分数添加到分数列表中
    scores.append(score_mean)

# 使用分数列表中的最大值找到最佳树深度
best_c = c[np.argmax(scores)]

# 使用最佳树深度创建决策树回归模型
reg = DecisionTreeRegressor(max_depth=best_c)

7、训练模型

使用训练数据集来训练决策树模型。

python 复制代码
# 训练模型
reg.fit(x_train, y_train)

8、预测

使用训练好的模型对新的数据进行预测。

python 复制代码
# 使用测试集进行预测
predict_test = reg.predict(x_test)

# 打印模型在测试集上的R^2分数
print(reg.score(x_test, y_test))

9、结果

10、参数调整

根据模型评估的结果,调整模型参数以优化性能。

**tree.**DecisionTreeRegressor (criterion='mse' , splitter='best' , max_depth=None , min_samples_split=2 , min_samples_leaf=1 , min_weight_fraction_leaf=0.0 , max_features=None , random_state=None , max_leaf_nodes=None , min_impurity_decrease=0.0 , min_impurity_split=None , presort=False )

1.criterion:节点分裂依据。默认:mse,可选择·mae(平均绝对误差)->使用绝对值。

2.splitter:默认best,表示以最优的方式切分节点。决定了树构建过程中的节点分裂策略。值为'best',意味着在每个节点上,算法会找出最好的分割点来尽量降低信息熵或者减少均方误差。如果设置为'random',则算法会随机选择一个特征进行分裂。

3.max_depth:树的最大深度。过深的树可能导致过拟合。

4.min_samples_split :默认值是2. 分裂一个内部节点需要的最小样本数。

5.min_samples_leaf : 默认值是1,叶子节点最少样本数。

6.max_leaf_nodes :设置最多的叶子节点个数,达到要求就停止分裂【控制过拟合】。

11、完整代码

python 复制代码
import pandas as pd
import numpy as np
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.model_selection import train_test_split
# 读取CSV文件中的数据
data = pd.read_csv("spambase.csv")

# 选取特征列和目标列
x = data.iloc[:, :-1]  # 特征数据
y = data.iloc[:, -1]  # 目标数据

# 划分训练集和测试集,测试集占20%,随机状态设置为42以保证结果可复现
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42)

# 导入决策树回归模型和交叉验证函数
from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import cross_val_score

# 初始化一个列表来存储不同树深度的交叉验证分数
scores = []

# 定义一个树深度候选列表
c = [5, 6, 7, 8, 9, 10, 11, 12, 13]

# 遍历树深度候选列表
for i in c:
    # 创建一个决策树回归模型,设置最大深度为当前候选深度
    reg = DecisionTreeRegressor(max_depth=i)

    # 对训练集进行8折交叉验证,并获取分数
    score = cross_val_score(reg, x_train, y_train, cv=8)

    # 计算交叉验证分数的平均值
    score_mean = sum(score) / len(score)

    # 将平均分数添加到分数列表中
    scores.append(score_mean)

# 使用分数列表中的最大值找到最佳树深度
best_c = c[np.argmax(scores)]

# 使用最佳树深度创建决策树回归模型
reg = DecisionTreeRegressor(max_depth=best_c)

# 训练模型
reg.fit(x_train, y_train)

# 打印最佳树深度
print(best_c)

# 使用测试集进行预测
predict_test = reg.predict(x_test)

# 打印模型在测试集上的R^2分数
print(reg.score(x_test, y_test))
相关推荐
HenrySmale3 小时前
05 回归问题和分类问题
分类·数据挖掘·回归
蒋星熠3 小时前
如何在Anaconda中配置你的CUDA & Pytorch & cuNN环境(2025最新教程)
开发语言·人工智能·pytorch·python·深度学习·机器学习·ai
Hcoco_me3 小时前
什么是机器学习?
人工智能·机器学习
合作小小程序员小小店3 小时前
机器学习介绍
人工智能·python·机器学习·scikit-learn·安全威胁分析
蒋星熠6 小时前
深度学习实战指南:从神经网络基础到模型优化的完整攻略
人工智能·python·深度学习·神经网络·机器学习·卷积神经网络·transformer
java1234_小锋6 小时前
Scikit-learn Python机器学习 - 分类算法 - K-近邻(KNN)算法
python·算法·机器学习
手握风云-7 小时前
回溯剪枝的 “减法艺术”:化解超时危机的 “救命稻草”(二)
算法·机器学习·剪枝
剪一朵云爱着7 小时前
一文入门:机器学习
人工智能·机器学习
hi0_67 小时前
机器学习实战(一): 什么是机器学习
人工智能·机器学习·机器人·机器学习实战
IT古董8 小时前
【漫话机器学习系列】003.Agglomerative聚类
人工智能·算法·机器学习