网站开发的账务处理,wordpress做博客,成都专业网站设计好公司,优化网站除了百度站长决策树
# 模块导入
from sklearn.tree import ExtraTreeRegressor as ETR, DecisionTreeRegressor as DTRExtraTreeRegressor和DecisionTreeRegressor是scikit-learn库中的两种回归模型#xff0c;用于拟合和预测连续型目标变量。
决策树是一种基于树结构的机器学习算法用于拟合和预测连续型目标变量。
决策树是一种基于树结构的机器学习算法用于解决分类和回归问题。它通过对数据的特征进行一系列判断和分支逐步将数据集划分成不同的子集最终得到一个基于特征的树形结构用于预测新数据的类别或数值。
决策树算法的核心思想是在每个节点上选择最有价值的特征进行划分使得子节点间的纯度尽可能高同时保持树的简单性。在分类任务中纯度通常指子节点中样本所属类别的比例在回归任务中纯度通常指子节点中样本目标变量的方差或标准差。
决策树在处理离散型和连续型特征时有不同的处理方式其中最常见的方法是使用信息增益、信息增益比、基尼指数等指标进行节点划分。对于过拟合问题可以通过剪枝、随机森林等方法进行处理。
两种树对比
DecisionTreeClassifier和DecisionTreeRegressor是决策树算法的两个变体用于解决分类和回归问题。它们的主要区别在于所解决的问题类型和输出类型。
DecisionTreeClassifier决策树分类器 问题类型DecisionTreeClassifier用于解决分类问题即将样本分为不同的类别。输出类型其输出是一个离散的类别标签表示样本属于哪个类别。 DecisionTreeRegressor决策树回归器 问题类型DecisionTreeRegressor用于解决回归问题即预测连续目标变量的值。输出类型其输出是一个连续的数值表示预测的目标变量的值。
除了上述区别DecisionTreeClassifier和DecisionTreeRegressor在算法实现上也有一些略微的差异
分割准则分类树通常使用基尼系数Gini index或熵entropy来度量特征的重要性以选择最佳的分割点。而回归树通常使用平方误差mean squared error作为分割准则。剪枝策略为了防止过拟合决策树通常需要进行剪枝。对于分类树来说常用的剪枝策略有预剪枝和后剪枝。对于回归树来说通常采用贪心策略进行自底向上的剪枝。
总结起来DecisionTreeClassifier和DecisionTreeRegressor主要区别在于解决的问题类型和输出类型。前者适用于分类问题输出离散类别标签后者适用于回归问题输出连续数值。
决策树中的专业名词
节点Node表示决策树上的一个数据处理单元包含一个或多个子节点和一个父节点。根节点Root Node表示决策树的起始节点没有父节点。叶节点Leaf Node表示决策树的终止节点没有子节点。内部节点Internal Node表示除根节点和叶节点外的其他节点拥有一个或多个子节点。特征Feature表示决策树划分节点时使用的属性或特征值可以是离散型或连续型。阈值Threshold表示用于划分连续型特征的阈值通常是根据特征值的中位数或平均值确定的。深度Depth表示决策树从根节点到某个节点的路径长度根节点的深度为0。路径Path表示从根节点到叶节点的一条路径由一系列节点和边组成。分支Branch表示从一个节点到其子节点的一条边。剪枝Pruning表示对决策树进行修剪以防止模型过拟合。常用的剪枝方法有预剪枝Pre-Pruning和后剪枝Post-Pruning。信息增益Information Gain表示在某个节点上划分前后数据集的信息熵差异用于选择最佳划分特征。基尼指数Gini Index表示在某个节点上划分前后数据集的基尼系数差异用于选择最佳划分特征。
DecisionTreeRegressor
导入模块
from sklearn.tree import DecisionTreeRegressor, ExtraTreeRegressor创建模型对象
dtr DecisionTreeRegressor(max_depthNone, criterionmse, splitterbest, random_stateNone)参数说明
max_depth决策树的最大深度默认为None表示不限制深度。criterion节点划分的标准可选’mse’均方误差或’mae’平均绝对误差默认为’mse’。splitter节点划分的策略可选’best’最优划分或’random’随机划分默认为’best’。random_state随机种子用于重复实验。
拟合模型
dtr.fit(X,y)X是一个二维数组或者数据框其中每一行代表一个样本每一列表示一个特征
y是目标变量向量是一个一维数组或列表其中每个元素表示一个样本的目标值
预测
y_pred_dtr dtr.predict(X_test)其中X_test是我们待预测的新特征矩阵
示例代码
数据分为训练集和测试集
from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state42)train_test_split(X, y, test_size0.2, random_state42) 是一个常用的函数调用用于将数据集 X 和对应的目标变量 y 划分为训练集和测试集。具体解释如下
X表示样本特征矩阵其中每一行代表一个样本每一列代表一个特征。y表示目标变量或标签是与样本特征矩阵 X 对应的目标值。test_size0.2表示将数据集划分为训练集和测试集时测试集的大小为全部数据的 20%。random_state42表示设置随机数种子为 42用于控制随机划分的重现性。
该函数会返回划分后的训练集和测试集以便后续在机器学习模型中使用。具体返回结果会有以下四个元组
X_train表示划分后的训练集样本特征。X_test表示划分后的测试集样本特征。y_train表示划分后的训练集目标变量。y_test表示划分后的测试集目标变量。
通过这个函数可以确保训练集和测试集的划分是随机的并且可以重复该划分过程。同时通过指定随机数种子可以使得每次运行时得到相同的划分结果以保持实验的可重现性。
具体代码
from sklearn.datasets import load_diabetes # 导入糖尿病数据集
from sklearn.model_selection import train_test_split # 将数据划分为训练集和测试集
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import mean_squared_error # 计算均方误差# 加载糖尿病数据集
diabetes load_diabetes()
X, y diabetes.data, diabetes.target# 划分训练集和测试集
X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state42)
# X_train, X_test, y_train, y_test 分别是 训练集样本特征矩阵 测试集样本特征矩阵 训练集目标向量 测试集目标向量# 创建决策树回归模型dtr DecisionTreeRegressor(max_depth5, random_state42)# 训练模型dtr.fit(X_train, y_train)# 预测测试集y_pred_dtr dtr.predict(X_test)# 评估模型性能mse mean_squared_error(y_test, y_pred_dtr)
print(均方误差 (MSE):, mse) # 3600 均方误差较大需要改进模型均方误差
均方误差Mean Squared ErrorMSE是一种常用的回归模型评估指标。它用于衡量模型预测结果与真实值之间的差异程度具体计算方式如下
MSE (1/n) * Σ(yᵢ - ŷᵢ)²
其中n 是样本数量yᵢ 是真实值ŷᵢ 是模型的预测值。
MSE 的计算方法是将每个样本的预测误差平方后求和再除以样本数量。因为误差被平方所以 MSE 比较敏感较大的误差会被放大而较小的误差则相对较小。
对于 MSE 来说**数值越小表示模型的预测结果与真实值之间的差异越小模型的拟合能力越好。**当 **MSE 为0时表示模型完全拟合了训练数据但这可能意味着模型过于复杂存在过拟合的风险。**通常情况下我们希望选择一个使得 MSE 较小且在训练集和测试集上表现一致的模型。
需要注意的是MSE 的值与数据集的单位相关因此无法直接进行跨数据集的比较。在评估模型时可以将 MSE 与其他模型的 MSE 进行比较或者将其与问题的背景和要求相结合来进行评估例如与实际误差的大小进行比较或与领域专家的知识相结合。
模型优化
要修改决策树的参数、进行剪枝以及使用基尼系数进行划分使得模型更加优化通常需要使用机器学习库来实现
首先我们导入所需的库和数据集
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score加载鸢尾花数据集并将其分为训练集和测试集
data load_iris()
X_train, X_test, y_train, y_test train_test_split(data.data, data.target, test_size0.2, random_state42)创建决策树分类器对象并设置参数
clf DecisionTreeClassifier(criteriongini, max_depthNone, random_state42)其中criterion参数设置了用于划分的准则这里选择了基尼系数gini index。max_depth参数表示树的最大深度设置为None表示不限制深度。random_state参数用于确定每次运行时的随机性以便结果可重复。
拟合训练决策树分类器
clf.fit(X_train, y_train)使用训练好的模型进行预测
y_pred clf.predict(X_test)计算预测的准确率
accuracy accuracy_score(y_test, y_pred)
print(准确率, accuracy)接下来我们可以进行剪枝。
首先我们可以使用预剪枝设置max_depth参数限制树的最大深度
clf_pruned DecisionTreeClassifier(criteriongini, max_depth3, random_state42)然后重复之前的拟合、预测和准确率计算过程
clf_pruned.fit(X_train, y_train)
y_pred_pruned clf_pruned.predict(X_test)
accuracy_pruned accuracy_score(y_test, y_pred_pruned)
print(剪枝后的准确率, accuracy_pruned)最后基于基尼系数的划分是决策树算法的默认选择所以不需要额外的代码来设置它。