sklearn基础--『监督学习』之决策树回归

决策树 算法是一种既可以用于分类 ,也可以用于回归的算法。

决策树回归 是通过对输入特征的不断划分来建立一棵决策树,每一步划分都基于当前数据集的最优划分特征。

它的目标是最小化总体误差或最大化预测精度,其构建通常采用自上而下的贪心搜索方式,通过比较不同划分标准来选择最优划分。

决策树回归广泛应用于各种回归问题,如预测房价、股票价格、客户流失等。

1. 算法概述

决策树相关的诸多算法之中,有一种CART算法 ,全称是 classification and regression tree(分类与回归树)。

顾名思义,这个算法既可以用来分类,也可以用来回归,本篇主要介绍其在回归问题上的应用。

决策树算法的核心在于生成一棵决策树过程中,如何划分各个特征到树的不同分支上去。
CART算法是根据基尼系数(Gini)来划分特征的,每次选择基尼系数最小的特征作为最优切分点。

其中基尼系数的计算方法: <math xmlns="http://www.w3.org/1998/Math/MathML"> g i n i ( p ) = ∑ i = 1 n p i ( 1 − p i ) = 1 − ∑ i = 1 n p i 2 gini(p) = \sum_{i=1}^n p_i(1-p_i)=1-\sum_{i=1}^n p_i^2 </math>gini(p)=∑i=1npi(1−pi)=1−∑i=1npi2

2. 创建样本数据

这次的回归样本数据,我们用 scikit-learn 自带的玩具数据集中的糖尿病数据集

关于玩具数据集的内容,可以参考:sklearn基础--『数据加载』之玩具数据集

python 复制代码
from sklearn.datasets import load_diabetes

# 糖尿病数据集
diabetes = load_diabetes()
X = diabetes.data
y = diabetes.target

这个数据集中大约有400多条数据。

3. 模型训练

训练之前,为了减少算法误差,先对数据进行标准化处理。

python 复制代码
from sklearn import preprocessing as pp

# 数据标准化
X = pp.scale(X)
y = pp.scale(y)

接下来分割训练集测试集

python 复制代码
from sklearn.model_selection import train_test_split

# 分割训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1)

然后用scikit-learn中的DecisionTreeRegressor模型来训练:

python 复制代码
from sklearn.tree import DecisionTreeRegressor

# 定义决策树回归模型
reg = DecisionTreeRegressor(max_depth=2)

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

# 在测试集上进行预测
y_pred = reg.predict(X_test)

DecisionTreeRegressor的主要参数包括:

  1. criterion:用于衡量节点划分质量的指标。可以选择的值有'mse'(均方误差)或'mae'(平均绝对误差)。默认值为'mse',适用于大多数情况。
  2. splitter:用于决定节点如何进行划分的策略。可以选择的值有'best'(选择最佳划分)或'random'(随机划分)。默认值为'best'。
  3. max_depth:决策树的最大深度。默认值为None,表示不限制最大深度。增加最大深度有助于更好地拟合训练数据,但可能导致过拟合。
  4. random_state:用于设置随机数生成器的种子。默认值为None,表示使用随机数生成器。
  5. ccp_alpha:用于控制正则化强度的参数。默认值为None,表示不进行正则化。
  6. max_samples:用于控制每个节点最少需要多少样本才能进行分裂。默认值为None,表示使用整个数据集。
  7. min_samples_split:用于控制每个节点最少需要多少样本才能进行分裂。默认值为2,表示每个节点至少需要2个样本才能进行分裂。
  8. min_samples_leaf:用于控制每个叶子节点最少需要多少样本才能停止分裂。默认值为1,表示每个叶子节点至少需要1个样本才能停止分裂。
  9. min_weight_fraction_leaf:用于控制每个叶子节点最少需要多少样本的权重才能停止分裂。默认值为0.0,表示每个叶子节点至少需要0个样本的权重才能停止分裂。
  10. max_features:用于控制每个节点最多需要考虑多少个特征进行分裂。默认值为None,表示使用所有特征。
  11. max_leaf_nodes:用于控制决策树最多有多少个叶子节点。默认值为None,表示不限制叶子节点的数量。
  12. min_impurity_decrease:用于控制每个节点最少需要减少多少不纯度才能进行分裂。默认值为0.0,表示每个节点至少需要减少0个不纯度才能进行分裂。
  13. min_impurity_split:用于控制每个叶子节点最少需要减少多少不纯度才能停止分裂。默认值为None,表示使用min_impurity_decrease参数。
  14. class_weight:用于设置类别权重的字典或方法。默认值为None,表示使用均匀权重。

最后验证模型的训练效果:

python 复制代码
from sklearn import metrics

# 在测试集上进行预测
y_pred = reg.predict(X_test)

mse, r2, m_error = 0.0, 0.0, 0.0
y_pred = reg.predict(X_test)
mse = metrics.mean_squared_error(y_test, y_pred)
r2 = metrics.r2_score(y_test, y_pred)
m_error = metrics.median_absolute_error(y_test, y_pred)

print("均方误差:{}".format(mse))
print("复相关系数:{}".format(r2))
print("中位数绝对误差:{}".format(m_error))

# 运行结果
均方误差:0.5973573097746598
复相关系数:0.5153160857515913
中位数绝对误差:0.5496418600646286

从预测的误差 来看,训练的效果还不错

这里用DecisionTreeRegressor训练模型时使用了参数max_depth=2

我从max_depth=1逐个尝试到了max_depth=10,发现max_depth=2时误差最小。

4. 总结

决策树回归 具有直观、易于理解、易于实现等优点。

生成的决策树可以直观地展示出输入特征与输出结果之间的关系,因此对于非专业人士来说也易于理解。

此外,决策树回归算法相对简单,易于实现,且对数据的预处理要求较低。

然而,决策树回归也存在一些缺点。

首先,它容易过拟合 训练数据,特别是当训练数据量较小时;

其次,决策树的性能受划分标准选择的影响较大 ,不同的划分标准可能会导致生成的决策树性能差异较大;

此外,决策树回归在处理大规模数据时可能会比较耗时,因为需要遍历整个数据集进行训练和预测。

相关推荐
IT古董27 分钟前
【人工智能】Python在机器学习与人工智能中的应用
开发语言·人工智能·python·机器学习
机器人虎哥1 小时前
【8210A-TX2】Ubuntu18.04 + ROS_ Melodic + TM-16多线激光 雷达评测
人工智能·机器学习
罗小罗同学4 小时前
医工交叉入门书籍分享:Transformer模型在机器学习领域的应用|个人观点·24-11-22
深度学习·机器学习·transformer
孤独且没人爱的纸鹤4 小时前
【深度学习】:从人工神经网络的基础原理到循环神经网络的先进技术,跨越智能算法的关键发展阶段及其未来趋势,探索技术进步与应用挑战
人工智能·python·深度学习·机器学习·ai
羊小猪~~4 小时前
tensorflow案例7--数据增强与测试集, 训练集, 验证集的构建
人工智能·python·深度学习·机器学习·cnn·tensorflow·neo4j
不去幼儿园6 小时前
【MARL】深入理解多智能体近端策略优化(MAPPO)算法与调参
人工智能·python·算法·机器学习·强化学习
无脑敲代码,bug漫天飞7 小时前
COR 损失函数
人工智能·机器学习
HPC_fac130520678167 小时前
以科学计算为切入点:剖析英伟达服务器过热难题
服务器·人工智能·深度学习·机器学习·计算机视觉·数据挖掘·gpu算力
老艾的AI世界15 小时前
AI翻唱神器,一键用你喜欢的歌手翻唱他人的曲目(附下载链接)
人工智能·深度学习·神经网络·机器学习·ai·ai翻唱·ai唱歌·ai歌曲
DK2215115 小时前
机器学习系列----关联分析
人工智能·机器学习