🎩 欢迎来到技术探索的奇幻世界👨💻
📜 个人主页:@一伦明悦-CSDN博客
✍🏻 作者简介: C++软件开发、Python机器学习爱好者
🗣️ 互动与支持:💬评论 👍🏻点赞 📂收藏 👀关注+
如果文章有所帮助,欢迎留下您宝贵的评论,
点赞加收藏支持我,点击关注,一起进步!
目录
前言
正文
01-决策树简介
02-决策树一维回归实战分析
03-多输出决策树回归实战分析
04-在iris数据集上绘制决策树的决策面
05-具有成本复杂度的后剪枝决策树
总结
前言
决策树是一种基于树结构的分类和回归方法,通过一系列的决策节点和叶节点来对数据进行分类或预测。 决策树的每个非叶节点表示一个特征属性测试,每个分支代表测试结果的一个输出,每个叶节点代表一个类别或回归。
正文
01-决策树简介
sklearn.tree
模块是 Scikit-learn 中用于实现决策树算法的模块,提供了多种决策树相关的类和函数。以下是关于sklearn.tree
模块中决策树的详细介绍:
主要算法:
DecisionTreeClassifier
:用于分类问题的决策树算法。DecisionTreeRegressor
:用于回归问题的决策树算法。重要参数:
criterion
:用于衡量特征选择的标准,常见的有基尼系数(gini)和信息增益(entropy)。max_depth
:决策树的最大深度,用于控制树的复杂度和防止过拟合。min_samples_split
:内部节点再划分所需的最小样本数。min_samples_leaf
:叶子节点所需的最小样本数。max_features
:寻找最佳分割时考虑的最大特征数。重要方法:
fit(X, y)
:用于训练模型,其中X
是特征数据,y
是目标数据。predict(X)
:用于预测新数据的分类或回归结果。score(X, y)
:用于评估模型在测试数据上的准确率或 R^2 得分。特点与应用:
- 决策树易于理解和解释,可视化效果好,适合处理高维数据和非线性关系。
- 但决策树容易过拟合,对数据噪声敏感,需要进行剪枝等参数调优。
- 在实际应用中,决策树常用于分类和回归问题的解决,如金融风险评估、医学诊断、客户分类等领域。
通过
sklearn.tree
模块提供的决策树算法,可以方便地构建、训练和应用决策树模型,实现数据分类和回归的任务。这些算法提供了丰富的参数和方法,可以根据实际需求进行灵活配置和使用。
02-决策树一维回归实战分析
决策树在 Scikit-learn 中的回归模型通常由
DecisionTreeRegressor
实现。下面详细分析决策树回归的主要特点、原理、参数以及应用场景:决策树回归的主要特点:
非参数模型:决策树回归是一种非参数学习方法,不对数据分布做出任何假设,可以适应复杂的数据关系。
简单解释:生成的决策树易于解释和理解,可以通过树结构直观地展示特征之间的关系。
处理非线性问题:适用于处理非线性关系的回归问题,不需要对数据进行线性化处理。
对异常值敏感:决策树回归对数据中的异常值比较敏感,可能导致过拟合。
决策树回归的原理:
- 决策树回归通过特征的分裂来递归地划分数据空间,构建树结构,每个叶节点代表一个预测值。划分时通常选择使得数据方差最小的特征进行分裂。
决策树回归常用参数:
criterion
:用于衡量特征重要性的评价标准,常见的有均方误差(mse)和绝对值误差(mae)。
max_depth
:决策树的最大深度,用于控制树的复杂度和防止过拟合。
min_samples_split
:内部节点再划分所需的最小样本数。
min_samples_leaf
:叶子节点所需的最小样本数。
max_features
:寻找最佳分割时考虑的最大特征数。决策树回归的应用场景:
房价预测:根据房屋特征如面积、地理位置等进行价格预测。
销量预测:根据历史销售数据和市场因素预测未来产品销量。
金融风险评估:根据个人信息和信用记录预测贷款风险。
医学数据分析:根据病人的生理指标和病史数据进行疾病预测。
决策树回归是一种常用的机器学习方法,适用于处理各种回归问题。通过调整参数和优化模型,可以构建出高效准确的回归模型,广泛应用于实际数据分析和预测任务中。
下面给出具体代码分析回归过程应用分析:这段代码实现了一个简单的决策树回归模型,并使用 matplotlib 库将结果可视化。让我来为你解释:
-
首先,通过
import numpy as np
导入 NumPy 库,用于处理数组和矩阵数据;通过from sklearn.tree import DecisionTreeRegressor
导入 Scikit-learn 库中的决策树回归器。 -
然后,通过
import matplotlib.pyplot as plt
导入 Matplotlib 库,用于绘制图形。 -
接着,创建一个随机数据集
X
和y
,其中X
是一个一维数组,y
是根据X
生成的正弦函数值,加上一些噪声。 -
使用
DecisionTreeRegressor
分别初始化两个决策树回归器regr_1
和regr_2
,并分别设置最大深度为 2 和 5。 -
调用
fit()
方法分别对两个回归器进行训练,用随机数据集X
和y
进行拟合。 -
构造测试数据集
X_test
,并使用predict()
方法分别预测两个回归器在测试数据上的输出结果y_1
和y_2
。 -
最后,使用 Matplotlib 绘制散点图表示原始数据,以及两条曲线表示两个不同深度的决策树回归模型在测试数据上的预测结果。
-
图像的横轴是数据特征,纵轴是目标值。散点图中的黑色点表示原始数据点,蓝色曲线表示最大深度为 2 的决策树回归模型的预测结果,绿色曲线表示最大深度为 5 的决策树回归模型的预测结果。
-
从图像中可以看出,最大深度为 2 的模型相对简单,对数据的拟合不够灵活,出现了欠拟合;而最大深度为 5 的模型更复杂,对训练数据的拟合更好,但也可能出现了过拟合。
-
通过调整决策树的最大深度,可以控制模型的复杂度,从而平衡欠拟合和过拟合之间的关系,获得更好的泛化性能。
import numpy as np
from sklearn.tree import DecisionTreeRegressor
import matplotlib.pyplot as plt# Create a random dataset
rng = np.random.RandomState(1)
X = np.sort(5 * rng.rand(80, 1), axis=0)
y = np.sin(X).ravel()
y[::5] += 3 * (0.5 - rng.rand(16))# Fit regression model
regr_1 = DecisionTreeRegressor(max_depth=2)
regr_2 = DecisionTreeRegressor(max_depth=5)
regr_1.fit(X, y)
regr_2.fit(X, y)# Predict
X_test = np.arange(0.0, 5.0, 0.01)[:, np.newaxis]
y_1 = regr_1.predict(X_test)
y_2 = regr_2.predict(X_test)# Plot the results
plt.figure()
plt.scatter(X, y, s=20, edgecolor="black",c="darkorange", label="data")
plt.plot(X_test, y_1, color="cornflowerblue",label="max_depth=2", linewidth=2)
plt.plot(X_test, y_2, color="yellowgreen", label="max_depth=5", linewidth=2)
plt.xlabel("data")
plt.ylabel("target")
plt.title("Decision Tree Regression")
plt.legend()
plt.savefig("../3.png", dpi=500)
plt.show()
实例运行结果如下图所示:
-
散点数据:
- 散点图中的黑色点表示原始数据集的数据点,其中 x 轴表示特征数据,y 轴表示目标数值。数据点分布在正弦函数曲线附近,但由于添加了一些随机噪声,使得数据具有一定的波动性。
-
决策树回归曲线:
- 蓝色曲线(max_depth=2):这条曲线代表了最大深度为 2 的决策树回归模型在测试数据上的预测结果。可以看到,该模型对数据的拟合较为简单,出现了一定程度的欠拟合,未能很好地捕捉数据的复杂性。
- 绿色曲线(max_depth=5):这条曲线代表了最大深度为 5 的决策树回归模型在测试数据上的预测结果。相比于深度为 2 的模型,这个模型更加复杂,能够更好地拟合数据,但也可能存在一定程度的过拟合。
-
横轴和纵轴:
- 横轴(data):表示特征数据的取值范围,即 X 轴,代表了输入数据的特征。
- 纵轴(target):表示目标数值的取值范围,即 y 轴,代表了模型预测的目标数值。
03-多输出决策树回归实战分析
多输出决策树回归是一种可以同时预测多个目标变量的回归方法,通常用于处理具有多个目标的复杂数据。在 Scikit-learn 中,多输出决策树回归模型通常由
DecisionTreeRegressor
的多输出版本MultiOutputRegressor
实现。下面详细分析多输出决策树回归的主要特点、原理、参数以及应用场景:多输出决策树回归的主要特点:
同时预测多个目标:能够有效地处理具有多个目标变量的回归问题,每个目标变量都可以单独地预测。
灵活性:与单输出模型类似,多输出决策树回归具有灵活性和解释性,易于理解和解释。
适应复杂数据:能够适应复杂的数据关系和多维特征空间。
对异常值敏感:与单输出决策树回归相似,对异常值比较敏感,可能导致过拟合。
多输出决策树回归的原理:
- 多输出决策树回归原理与单输出类似,通过特征的分裂递归地划分数据空间,构建多个决策树结构,每个叶节点代表一个多维目标向量。划分时通常选择使得数据方差最小的特征进行分裂。
多输出决策树回归常用参数:
base_estimator
:用于指定基础的回归器,默认为DecisionTreeRegressor
。
n_estimators
:用于指定子模型的数量,即决策树的数量。
bootstrap
:是否使用自助采样法进行数据采样。
max_samples
:用于指定自助采样法中每棵子树使用的样本数量。多输出决策树回归的应用场景:
气象预测:同时预测多个气象变量,如温度、湿度、风速等。
环境监测:预测多个环境指标,如空气质量、水质等。
生态系统建模:预测多个生态系统参数,如植被覆盖、土壤湿度等。
金融市场分析:同时预测多个金融指标,如股票价格、汇率等。
医疗诊断:预测多个医疗指标,如患者病情等级、疾病风险等。
多输出决策树回归能够处理多目标变量的回归问题,在实际应用中具有广泛的应用前景。
下面给出具体代码分析回归过程应用分析:这段代码实现了一个多输出决策树回归模型,并使用 matplotlib 库将结果可视化。解释如下:
-
导入必要的库:代码中导入了 NumPy 库用于数值计算、Matplotlib 库用于可视化、以及 Scikit-learn 中的 DecisionTreeRegressor 用于构建决策树回归模型。
-
创建随机数据集:通过随机数生成器创建了一个包含两个目标变量的随机数据集 X 和目标数据集 y。其中 y 由 X 计算得到正弦和余弦值,并加入一些随机噪声。
-
初始化并训练决策树模型:分别初始化了三个不同 max_depth 的决策树回归器 regr_1、regr_2 和 regr_3,并使用训练数据 X 和 y 对它们进行训练。
-
进行预测:生成测试数据集 X_test,并分别利用三个决策树模型进行预测,得到预测结果 y_1、y_2 和 y_3。
-
绘制图像:利用 Matplotlib 绘制散点图,展示了原始数据集 y 的两个目标变量之间的关系,以及三个决策树模型在测试数据上的预测结果。不同深度的模型用不同颜色的散点表示,同时展示原始数据点。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.tree import DecisionTreeRegressor# Create a random dataset
rng = np.random.RandomState(1)
X = np.sort(200 * rng.rand(100, 1) - 100, axis=0)
y = np.array([np.pi * np.sin(X).ravel(), np.pi * np.cos(X).ravel()]).T
y[::5, :] += (0.5 - rng.rand(20, 2))# Fit regression model
regr_1 = DecisionTreeRegressor(max_depth=2)
regr_2 = DecisionTreeRegressor(max_depth=5)
regr_3 = DecisionTreeRegressor(max_depth=8)
regr_1.fit(X, y)
regr_2.fit(X, y)
regr_3.fit(X, y)# Predict
X_test = np.arange(-100.0, 100.0, 0.01)[:, np.newaxis]
y_1 = regr_1.predict(X_test)
y_2 = regr_2.predict(X_test)
y_3 = regr_3.predict(X_test)# Plot the results
plt.figure()
s = 25
plt.scatter(y[:, 0], y[:, 1], c="navy", s=s,edgecolor="black", label="data")
plt.scatter(y_1[:, 0], y_1[:, 1], c="cornflowerblue", s=s,edgecolor="black", label="max_depth=2")
plt.scatter(y_2[:, 0], y_2[:, 1], c="red", s=s,edgecolor="black", label="max_depth=5")
plt.scatter(y_3[:, 0], y_3[:, 1], c="orange", s=s,edgecolor="black", label="max_depth=8")
plt.xlim([-6, 6])
plt.ylim([-6, 6])
plt.xlabel("target 1")
plt.ylabel("target 2")
plt.title("Multi-output Decision Tree Regression")
plt.legend(loc="best")
plt.savefig("../3.png", dpi=500)
plt.show()
实例运行结果如下图所示:
横轴是第一个目标变量(target 1),纵轴是第二个目标变量(target 2)。
蓝色散点表示 max_depth=2 的模型预测结果,红色散点表示 max_depth=5 的模型预测结果,橙色散点表示 max_depth=8 的模型预测结果。
04-在iris数据集上绘制决策树的决策面
要在 iris 数据集上绘制决策树的决策面,我们首先需要加载 iris 数据集,并使用决策树算法训练模型。下面是一份 Python 代码示例来实现这一目标:
这段代码实现了在 iris 数据集上训练决策树分类器,并绘制了决策边界以及决策树的结构图。
-
加载数据和设置参数:使用
load_iris()
加载 iris 数据集,并设置了绘图所需的参数,如类别数量、颜色等。 -
循环绘制决策边界:通过循环遍历不同特征组合,对每一组特征训练决策树模型,并绘制对应的决策边界。在每个子图中,数据点的颜色表示其所属类别,决策边界由不同颜色的填充区域表示。
-
绘制决策树结构图:在另外一个图中,使用
plot_tree
函数绘制了整个决策树的结构图。
import numpy as np
import matplotlib.pyplot as pltfrom sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier, plot_tree# Parameters
n_classes = 3
plot_colors = "ryb"
plot_step = 0.02# Load data
iris = load_iris()for pairidx, pair in enumerate([[0, 1], [0, 2], [0, 3],[1, 2], [1, 3], [2, 3]]):# We only take the two corresponding featuresX = iris.data[:, pair]y = iris.target# Trainclf = DecisionTreeClassifier().fit(X, y)# Plot the decision boundaryplt.subplot(2, 3, pairidx + 1)x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1xx, yy = np.meshgrid(np.arange(x_min, x_max, plot_step),np.arange(y_min, y_max, plot_step))plt.tight_layout(h_pad=0.5, w_pad=0.5, pad=2.5)Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])Z = Z.reshape(xx.shape)cs = plt.contourf(xx, yy, Z, cmap=plt.cm.RdYlBu)plt.xlabel(iris.feature_names[pair[0]])plt.ylabel(iris.feature_names[pair[1]])# Plot the training pointsfor i, color in zip(range(n_classes), plot_colors):idx = np.where(y == i)plt.scatter(X[idx, 0], X[idx, 1], c=color, label=iris.target_names[i],cmap=plt.cm.RdYlBu, edgecolor='black', s=15)plt.suptitle("Decision surface of a decision tree using paired features")
plt.legend(loc='lower right', borderpad=0, handletextpad=0)
plt.axis("tight")
plt.savefig("../3.png", dpi=500)
plt.figure()
clf = DecisionTreeClassifier().fit(iris.data, iris.target)
plot_tree(clf, filled=True)
plt.savefig("../4.png", dpi=500)
plt.show()
实例运行结果如下图所示:
- 决策边界图:每个子图表示不同特征组合下的决策边界,横轴和纵轴分别表示对应的两个特征,不同颜色的填充区域表示不同类别的决策面,散点表示数据点的分布。
- 决策树结构图:展示了整个决策树的结构,每个节点表示一个特征及其分割阈值,颜色表示该节点对应的主要类别。
05-具有成本复杂度的后剪枝决策树
成本复杂度的后剪枝是一种用于决策树的剪枝策略,通过对已生成的决策树进行修剪来提高泛化能力。具体步骤如下:
训练决策树:首先,我们使用训练数据训练一个决策树模型,通常会选择较大的树,以便更好地拟合训练数据。
对子树进行评估:从叶节点开始,自下而上逐层遍历决策树,对每个内部节点使用验证数据集(validation set)来评估剪枝后的性能。在评估过程中,可以计算成本复杂度(cost complexity)来衡量剪枝的代价,通常成本复杂度定义为节点总数的函数,包括树叶的数量、深度等。
计算成本复杂度参数:对每个内部节点,根据其错误率、节点深度等计算出一个成本复杂度参数。成本复杂度参数一般包含两部分:当前节点错误率(如交叉熵损失)和剪枝代价(如节点个数)。
后剪枝策略:选择一个合适的参数(如复杂度参数的阈值),对决策树进行剪枝。具体来说,对每个节点计算其子树的成本复杂度(包括该节点本身的错误率和剪枝代价),如果剪枝后整体成本复杂度减小,则进行剪枝操作。
重复剪枝:重复进行上述步骤,直到无法继续降低成本复杂度或达到一定条件为止。
通过成本复杂度的后剪枝,可以使决策树在保持准确性的同时具备更强的泛化能力,避免过拟合。这种策略不仅可以提高模型的预测性能,还可以减小模型的复杂度,更易于理解和解释。
这段代码展示了在乳腺癌数据集上使用决策树进行成本复杂度剪枝,并分析剪枝后的决策树性能。下面是对这段代码的分析以及对生成的图像的解释:
-
加载数据和拆分数据集:通过
load_breast_cancer
加载乳腺癌数据集,并使用train_test_split
将数据集划分为训练集和测试集。 -
计算成本复杂度剪枝路径:使用
cost_complexity_pruning_path
方法计算决策树在不同成本复杂度(ccp_alpha)下的剪枝路径。得到ccp_alphas
和impurities
。 -
绘制总不纯度随有效 alpha 变化的图像:绘制了训练集上总不纯度随着有效 alpha 变化的曲线图,用于选择合适的 alpha 进行剪枝。这张图展示了剪枝对总不纯度的影响。
-
基于不同 alpha 训练剪枝后的决策树:根据不同的
ccp_alpha
值,训练了一系列剪枝后的决策树,并计算了各个子树的节点数量和深度。 -
绘制节点数量和树深度随 alpha 变化的图像:绘制了剪枝后的决策树节点数量和深度随着 alpha 变化的曲线图,用于分析剪枝对决策树结构的影响。
-
绘制训练集和测试集准确率随 alpha 变化的图像:通过绘制训练集和测试集准确率随着 alpha 变化的曲线图,可以观察不同剪枝策略对于模型泛化能力的影响。
通过绘制这些图像,可以对成本复杂度剪枝后的决策树模型进行全面的分析,包括剪枝路径选择、树的结构变化以及模型性能的影响。这有助于找到最优的剪枝参数,提高模型泛化能力并减少过拟合的风险。
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_breast_cancer
from sklearn.tree import DecisionTreeClassifierX, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)clf = DecisionTreeClassifier(random_state=0)
path = clf.cost_complexity_pruning_path(X_train, y_train)
ccp_alphas, impurities = path.ccp_alphas, path.impuritiesfig, ax = plt.subplots()
ax.plot(ccp_alphas[:-1], impurities[:-1], marker='o', drawstyle="steps-post")
ax.set_xlabel("effective alpha")
ax.set_ylabel("total impurity of leaves")
ax.set_title("Total Impurity vs effective alpha for training set")
plt.savefig("../3.png", dpi=500)clfs = []
for ccp_alpha in ccp_alphas:clf = DecisionTreeClassifier(random_state=0, ccp_alpha=ccp_alpha)clf.fit(X_train, y_train)clfs.append(clf)
print("Number of nodes in the last tree is: {} with ccp_alpha: {}".format(clfs[-1].tree_.node_count, ccp_alphas[-1]))clfs = clfs[:-1]
ccp_alphas = ccp_alphas[:-1]node_counts = [clf.tree_.node_count for clf in clfs]
depth = [clf.tree_.max_depth for clf in clfs]
fig, ax = plt.subplots(2, 1)
ax[0].plot(ccp_alphas, node_counts, marker='o', drawstyle="steps-post")
ax[0].set_xlabel("alpha")
ax[0].set_ylabel("number of nodes")
ax[0].set_title("Number of nodes vs alpha")
ax[1].plot(ccp_alphas, depth, marker='o', drawstyle="steps-post")
ax[1].set_xlabel("alpha")
ax[1].set_ylabel("depth of tree")
ax[1].set_title("Depth vs alpha")
fig.tight_layout()
plt.savefig("../4.png", dpi=500)train_scores = [clf.score(X_train, y_train) for clf in clfs]
test_scores = [clf.score(X_test, y_test) for clf in clfs]fig, ax = plt.subplots()
ax.set_xlabel("alpha")
ax.set_ylabel("accuracy")
ax.set_title("Accuracy vs alpha for training and testing sets")
ax.plot(ccp_alphas, train_scores, marker='o', label="train",drawstyle="steps-post")
ax.plot(ccp_alphas, test_scores, marker='o', label="test",drawstyle="steps-post")
ax.legend()
plt.savefig("../5.png", dpi=500)
plt.show()
实例运行结果如下图所示:
总结
决策树算法是一类常用于分类和回归任务的监督学习方法。以下是关于决策树算法的总结:
原理简介:
- 决策树是一种树形结构,每个非叶节点表示一个特征属性测试,每个分支代表一个测试输出,每个叶节点代表一种类别或回归值。
- 决策树的构建过程是基于特征属性的条件划分,目标是生成树结构使得数据集在各个子集上有最大的纯度或最小的不纯度。
常见算法:
- ID3(Iterative Dichotomiser 3):使用信息增益作为特征选择标准,适用于分类任务。
- C4.5:ID3 的改进版本,使用信息增益比进行特征选择,支持缺失值处理和剪枝操作。
- CART(Classification and Regression Trees):既可以用于分类也可以用于回归任务,树的构建基于基尼不纯度(分类)或均方误差(回归)。
- CHAID(Chi-squared Automatic Interaction Detection):使用卡方检验作为特征选择标准,适用于分类任务。
优点:
- 简单直观,易于理解和解释。
- 能够处理数值型和类别型数据。
- 可以自动进行特征选择。
- 鲁棒性较好,对数据的干扰性较小。
缺点:
- 容易过拟合,特别是对于高维、复杂数据集。
- 忽略了特征之间的相关性。
- 对于不平衡数据和噪声敏感。
- 结果不稳定,数据微小变化可能导致树结构巨大变化。
改进方法:
- 剪枝操作:包括预剪枝和后剪枝,用于降低过拟合风险。
- 集成方法:如随机森林、梯度提升树等集成决策树模型,通过组合多个决策树减少单棵树的过拟合风险。
总的来说,决策树算法是一种常用、直观的机器学习方法,在一些情况下表现良好,但需要注意过拟合和数据质量对结果的影响。结合剪枝操作、集成方法等手段可以提高模型性能和稳定性。