【机器学习】利用决策树分类Iris鸢尾花数据集
目标
本文旨在实现一个基础的决策树分类模型,理解并应用决策树分类模型:学习如何使用Scikit-learn库的DecisionTreeClassifier来实现分类任务。数据集划分与训练:掌握如何将数据划分为训练集和测试集,并进行模型训练。模型调优:通过测试不同深度的决策树,理解树的深度对模型性能的影响,并找到最佳深度。模型评估与可视化:评估决策树模型的准确率,学习如何通过可视化工具展示决策树及其规则。
环境
Python编程语言
Scikit-learn库
Matplotlib(用于数据可视化)
NumPy和Pandas库(用于数据处理)
Jupyter Notebook或类似IDE(用于代码编写和结果展示)
数据集
本实验使用的是鸢尾花数据集(Iris dataset),它是一个经典的多分类数据集,包含150个样本,4个特征(花萼长度、花萼宽度、花瓣长度、花瓣宽度),以及3个目标类别(Setosa、Versicolor、Virginica)。
步骤
1. 数据加载与初步探索
加载鸢尾花数据集,获取特征数据X和目标标签y。
初步了解数据集的特征和目标类别分布。
2. 数据集划分与标准化
使用 train_test_split 方法将数据划分为训练集(80%)和测试集(20%)。
3. 模型训练与预测
使用DecisionTreeClassifier(默认深度)对训练集进行拟合,得到分类模型。
在测试集上进行预测,计算模型的准确率。
4. 决策树可视化
使用plot_tree方法可视化决策树,展示决策树的结构和分类规则。
5. 模型深度调优
测试不同的树深度(从1到10),观察树深度对训练集和测试集准确率的影响。
绘制不同深度下的准确率曲线,选择最佳的树深度。
6. 最佳深度模型训练与评估
使用找到的最佳深度重新训练决策树模型。
评估并输出测试集的准确率。
7. 最佳决策树可视化与规则提取
可视化最佳深度下的决策树。
输出最佳深度决策树的规则,以便分析模型如何做出决策。
实验结果展示
基础决策树准确率:显示模型在测试集上的准确率
不同深度下的训练与测试准确率:显示不同深度下训练集和测试集的准确率曲线。
最佳决策树的可视化:使用plot_tree绘制最佳深度下的决策树图,展示每个节点的决策规则和类别分布。通过图形化形式直观展示决策树如何根据特征进行分类。
代码参考
导入必要的库
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier, export_text, plot_tree
from sklearn.metrics import accuracy_score
加载鸢尾花数据集(Iris Dataset)
iris = load_iris()
X = iris.data
y = iris.target
数据划分
分为训练集和测试集,测试集占比为 20%
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
基础模型训练
使用默认深度的决策树分类器
clf_base = DecisionTreeClassifier(random_state=42)
clf_base.fit(X_train, y_train)
图1
预测和评估模型的基础准确率
y_pred_base = clf_base.predict(X_test)
y_pred_base
base_accuracy = accuracy_score(y_test, y_pred_base)
print(f"基础模型准确率: {base_accuracy:.2f}")
图2
可视化基础决策树
import matplotlib.pyplot as plt
from matplotlib import rcParams
rcParams['font.sans-serif'] = ['SimHei']
rcParams['axes.unicode_minus'] = False
plt.figure(figsize=(12, 8))
plot_tree(
clf_base,
feature_names=iris.feature_names,
class_names=iris.target_names,
filled=True
)
plt.title("基础决策树", fontsize=16, pad=20)
plt.subplots_adjust(top=0.9)
plt.show()
图3
打印决策树的规则
tree_rules = export_text(clf_base, feature_names=iris.feature_names)
print("基础决策树规则:n", tree_rules)
图4
深度优化实验
测试不同深度下的准确率
max_depth_range = range(1, 11)
train_accuracies = []
test_accuracies = []
for depth in max_depth_range:
clf = DecisionTreeClassifier(max_depth=depth, random_state=42)
clf.fit(X_train, y_train)
train_accuracies.append(accuracy_score(y_train, clf.predict(X_train)))
test_accuracies.append(accuracy_score(y_test, clf.predict(X_test)))
绘制深度与准确率的关系图
rcParams['font.sans-serif'] = ['SimHei']
rcParams['axes.unicode_minus'] = False
plt.figure(figsize=(10, 6))
plt.plot(max_depth_range, train_accuracies, label="训练集准确率", marker='o', color='lightblue', linestyle='--', linewidth=2)
plt.plot(max_depth_range, test_accuracies, label="测试集准确率", marker='s', color='lightpink', linestyle='-', linewidth=2)
plt.xlabel("决策树深度", fontsize=12)
plt.ylabel("准确率", fontsize=12)
plt.title("决策树深度与准确率的关系", fontsize=16)
plt.legend(fontsize=10)
plt.grid(True, linestyle=':', linewidth=0.7)
图5
找到测试集准确率最高的深度
best_depth = max_depth_range[np.argmax(test_accuracies)]
print(f"测试集准确率最高的决策树深度: {best_depth}")
图6
使用最佳深度重新训练决策树
clf_best = DecisionTreeClassifier(max_depth=best_depth, random_state=42)
clf_best.fit(X_train, y_train)
y_pred_best = clf_best.predict(X_test)
best_accuracy = accuracy_score(y_test, y_pred_best)
print(f"最佳深度模型的测试集准确率: {best_accuracy:.2f}")
图7
可视化最佳深度的决策树
rcParams['font.sans-serif'] = ['SimHei']
rcParams['axes.unicode_minus'] = False
plt.figure(figsize=(12, 8))
plot_tree(
clf_best,
feature_names=iris.feature_names,
class_names=iris.target_names,
filled=True
)
plt.title(f"最佳深度({best_depth})决策树", fontsize=16, pad=20)
plt.subplots_adjust(top=0.9)
plt.show()
图8
打印最佳深度的决策树规则
best_tree_rules = export_text(clf_best, feature_names=iris.feature_names)
print("最佳深度决策树规则:n", best_tree_rules)
图9
绘制在 iris 数据集上训练的决策树的决策面
rcParams['font.sans-serif'] = ['SimHei']
rcParams['axes.unicode_minus'] = False
iris = load_iris()
n_classes = 3
plot_colors = "ryb"
plot_step = 0.02
for pairidx, pair in enumerate([[0, 1], [0, 2], [0, 3], [1, 2], [1, 3], [2, 3]]):
X = iris.data[:, pair]
y = iris.target
clf = DecisionTreeClassifier().fit(X, y)
ax = plt.subplot(2, 3, pairidx + 1)
plt.tight_layout(h_pad=0.5, w_pad=0.5, pad=2.5)
DecisionBoundaryDisplay.from_estimator(
clf,
X,
cmap=plt.cm.RdYlBu,
response_method="predict",
ax=ax,
xlabel=iris.feature_names[pair[0]],
ylabel=iris.feature_names[pair[1]],
)
for 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],
edgecolor="black",
s=30,
linewidth=1.5
)
plt.suptitle("决策树分类器在特征对上的决策面", fontsize=16)
plt.subplots_adjust(top=0.9)
plt.legend(loc="lower right", borderpad=0.5, handletextpad=0.5, fontsize=12)
plt.show()
图10
相关知识
基于机器学习的鸢尾花数据集的三分类算法的实现 C++
机器学习:鸢尾花数据集
python利用c4.5决策树对鸢尾花卉数据集进行分类(iris)
机器学习案例——鸢尾花数据集分析
python实战(一)——iris鸢尾花数据集分类
鸢尾花数据集深度分析:机器学习的入门实践
机器学习鸢尾花数据集
【python数据挖掘课程】十九.鸢尾花数据集可视化、线性回归、决策树花样分析
Iris鸢尾花数据集可视化、线性回归、决策树分析、KMeans聚类分析
鸢尾花数据集在机器学习中的应用与分析
网址: 【机器学习】利用决策树分类Iris鸢尾花数据集 https://www.huajiangbk.com/newsview1548750.html
上一篇: 中国盆景的分类体系和分类方法 – |
下一篇: 在Jupyter noteboo |
推荐分享

- 1君子兰什么品种最名贵 十大名 4012
- 2世界上最名贵的10种兰花图片 3364
- 3花圈挽联怎么写? 3286
- 4迷信说家里不能放假花 家里摆 1878
- 5香山红叶什么时候红 1493
- 6花的意思,花的解释,花的拼音 1210
- 7教师节送什么花最合适 1167
- 8勿忘我花图片 1103
- 9橄榄枝的象征意义 1093
- 10洛阳的市花 1039