【机器学习】任务四:使用贝叶斯算法识别葡萄酒类别和使用三种不同的决策树方法(ID3,C4.5,CART)对鸢尾花数据进行分类

目录

1.基础知识

[1.1 高斯贝叶斯(Gaussian Naive Bayes)](#1.1 高斯贝叶斯(Gaussian Naive Bayes))

[1.2 决策树(Decision Tree)](#1.2 决策树(Decision Tree))

[1.3 模型评价(Model Evaluation)](#1.3 模型评价(Model Evaluation))

[1.3.1 评价维度:](#1.3.1 评价维度:)

[1.3.2 评价方法:](#1.3.2 评价方法:)

2.使用贝叶斯算法识别葡萄酒类别

[1.1 导入所需模块](#1.1 导入所需模块)

[1.2 加载数据并进行训练集和测试集的划分](#1.2 加载数据并进行训练集和测试集的划分)

[1.3 可视化训练集样本数据分布](#1.3 可视化训练集样本数据分布)

[1.4 定义并训练贝叶斯模型](#1.4 定义并训练贝叶斯模型)

[1.5 评估贝叶斯模型](#1.5 评估贝叶斯模型)

[1.6 绘制贝叶斯模型的混淆矩阵](#1.6 绘制贝叶斯模型的混淆矩阵)

[1.7 绘制AUC-ROC曲线](#1.7 绘制AUC-ROC曲线)

[1.8 定义并训练决策树模型](#1.8 定义并训练决策树模型)

[1.9 绘制决策树的混淆矩阵](#1.9 绘制决策树的混淆矩阵)

[1.10 比较贝叶斯和决策树的ROC曲线](#1.10 比较贝叶斯和决策树的ROC曲线)

[1.11 使用交叉验证评估模型精度](#1.11 使用交叉验证评估模型精度)

3.使用三种不同的决策树方法(ID3,C4.5,CART)对鸢尾花数据进行分类

[1.1 导入所需的库](#1.1 导入所需的库)

[1.2 加载鸢尾花数据集](#1.2 加载鸢尾花数据集)

[1.3 数据初步探索和可视化](#1.3 数据初步探索和可视化)

[1.4 将数据集划分为训练集和测试集](#1.4 将数据集划分为训练集和测试集)

[1.5 训练三个不同的决策树模型(ID3, C4.5, CART)](#1.5 训练三个不同的决策树模型(ID3, C4.5, CART))

[1.6 使用测试集进行预测](#1.6 使用测试集进行预测)

[1.7 评估分类器性能(混淆矩阵和分类报告)](#1.7 评估分类器性能(混淆矩阵和分类报告))

[1.8 比较结果的可视化](#1.8 比较结果的可视化)

4.总体代码和运行结果

[4.1 葡萄酒类别总体代码和运行结果](#4.1 葡萄酒类别总体代码和运行结果)

[4.1.1 总体代码](#4.1.1 总体代码)

[4.1.2 运行结果](#4.1.2 运行结果)

[4.2 鸢尾花数据集总体代码和结果](#4.2 鸢尾花数据集总体代码和结果)

[4.2.1 总体代码](#4.2.1 总体代码)

[4.2.2 运行结果](#4.2.2 运行结果)


1.基础知识

1.1 高斯贝叶斯(Gaussian Naive Bayes)

基本思想

高斯贝叶斯是一种基于贝叶斯定理的分类方法,旨在计算每个类别的后验概率。贝叶斯定理结合了先验概率和似然概率,以推断出数据样本属于某一类别的概率。在高斯贝叶斯分类器中,假设所有特征之间是独立的,并且每个特征的条件概率服从高斯分布(正态分布)。

工作流程

  1. 先验概率:计算每个类别的先验概率。
  2. 似然估计:基于训练数据,假设每个特征服从正态分布,计算出特征在各类别下的似然概率。
  3. 后验概率计算:通过贝叶斯定理,结合先验概率和似然概率,计算出后验概率。
  4. 分类决策:将样本分类到具有最高后验概率的类别。

优点

  • 计算效率高,适用于高维数据。
  • 对于小样本数据集非常有效。

缺点

  • 假设特征之间相互独立,这在实际应用中可能不成立。

1.2 决策树(Decision Tree)

基本思想

决策树是一种监督学习方法,通过构建一个树状模型,根据特征的值递归地将数据样本分类。树的每个内部节点表示一个特征的测试,每个分支代表该测试的结果,每个叶节点则代表一个类别的决策。

工作流程

  1. 划分数据:使用如信息增益或基尼系数等指标,选择最能区分类别的特征作为划分依据,建立决策树的节点。
  2. 递归构建:对每个子集继续进行相同的划分过程,直到达到终止条件(如所有样本同属一个类别或树的深度达到预设值)。
  3. 剪枝:为了避免过拟合,可能需要对决策树进行剪枝,即去掉不必要的叶子节点或分支。

优点

  • 简单易于解释。
  • 既适用于分类问题,也适用于回归问题。
  • 不需要特征标准化。

缺点

  • 容易过拟合,尤其是深度较大的决策树。
  • 对于少数类样本的预测效果可能较差。

1.3 模型评价(Model Evaluation)

模型评价是对机器学习模型的性能、有效性和适用性进行评估的过程。评价包括多个维度,如模型的准确性、泛化能力、可解释性和计算效率。评价方法则有交叉验证法、留出验证法、自助法等。

1.3.1 评价维度:

  1. 准确性(Accuracy)

    • 衡量模型预测的整体准确性,即模型正确分类的样本数与总样本数的比值。适用于类分布平衡的数据集。
  2. 精确率(Precision)

    • 衡量模型在预测为正样本时的准确性,即真正为正样本的比例。在类分布不平衡的情况下,精确率是重要指标。
  3. 召回率(Recall)

    • 衡量模型对正样本的识别能力,即真正为正样本的比例。高召回率意味着模型对正样本的捕捉能力强。
  4. F1-Score

    • 精确率和召回率的调和平均值,作为模型在不平衡数据集上的综合评价指标。适用于处理正负样本不平衡的数据。
  5. 泛化能力(Generalization Ability)

    • 模型在未见过的数据上的表现能力,可以通过交叉验证或留出验证来衡量。ROC曲线和AUC值也是常用的泛化能力评估工具。
  6. 可解释性(Interpretability)

    • 对于某些应用,理解模型决策过程尤为重要。传统方法如决策树和线性回归具有较好的可解释性,而复杂的深度学习模型则较难解释。
  7. 计算效率(Computational Efficiency)

    • 包括模型的训练时间和预测时间,特别是在大规模数据或实时应用中至关重要。

1.3.2 评价方法:

  1. 交叉验证法(Cross-Validation)

    • 将数据集分为K个不相交的子集,轮流使用其中K-1个子集进行训练,剩下的子集进行验证。这样可以更全面地评估模型的性能,减小偶然误差。
  2. 留出验证法(Hold-Out Validation)

    • 将数据集随机划分为训练集和测试集,训练模型后使用测试集进行评估。这种方法简单直接,可以反映模型在未知数据上的真实表现。
  3. 自助法(Bootstrap Method)

    • 使用有放回抽样从原始数据集中生成多个样本,特别适合小数据集的情况。这种方法能够充分利用有限数据资源。
  4. 混淆矩阵(Confusion Matrix)

    • 通过矩阵形式展示模型的预测结果,包括真正例、假正例、假负例和真负例,从而对模型的分类性能进行详细评估。

2.使用贝叶斯算法识别葡萄酒类别

葡萄酒识别数据集( Wine Recognition dataset )通常用于多类别分类问题建 2 / 12 3 / 12模。数据集包括从三个不同的品种(类别)的葡萄酒中测得的 13 种不同的化学特征,共 178 个样本。这些化学特征包括酸度、灰分、酒精浓度等。该数据集是由 UCI 机器学习库提供,并且已经被广泛用于分类和聚类任务,作为基准测试 数据集之一,数据集地址: Wine - UCI Machine Learning Repository 。数据集的说明如表 1。

表 1 中数据集中的类别(目标变量)代表三种不同品种的葡萄酒,在实际应用中,这些类别可能会被赋予更具描述性的名称,如琴酒、雪莉和贝尔莫得等。

1.1 导入所需模块

import matplotlib.pyplot as plt
from sklearn.naive_bayes import GaussianNB
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report, ConfusionMatrixDisplay
from sklearn.metrics import roc_curve, auc
from sklearn.datasets import load_wine
import pandas as pd

详细解释

  • matplotlib.pyplot:这是Python中的一个绘图库,用于生成各种图表,帮助我们可视化数据和结果,例如散点图、ROC曲线、混淆矩阵等。
  • GaussianNB:这是一个朴素贝叶斯分类器的实现,适用于连续值特征数据,特别是高斯分布的数据。我们将用它来训练模型。
  • DecisionTreeClassifier:这是决策树分类器的实现,用于对比朴素贝叶斯模型的效果。
  • train_test_split:用于将数据集划分为训练集和测试集。
  • cross_val_score:用于交叉验证模型的性能。
  • accuracy_score, confusion_matrix, classification_report:这些都是评价分类器性能的指标,包括准确率、混淆矩阵和分类报告。
  • roc_curve, auc:用于绘制ROC曲线和计算AUC(曲线下的面积),这是用来评价分类器效果的标准。
  • load_wine :从 sklearn.datasets 中加载葡萄酒数据集,它包含不同种类的葡萄酒及其特征。
  • pandas:用于数据处理,特别是处理交叉验证结果时方便整理为表格形式。

1.2 加载数据并进行训练集和测试集的划分

# 导入数据,分别为输入特征和标签
wine = load_wine()
X = wine.data
Y = wine.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.2, random_state=42)

# 输出结果
print("训练集特征形状:", X_train.shape)
print("测试集特征形状:", X_test.shape)
print("训练集标签形状:", y_train.shape)
print("测试集标签形状:", y_test.shape)

详细解释

  1. 使用 load_wine() 函数从 sklearn.datasets 中加载葡萄酒数据集。该数据集包含13个特征,如酒精含量、灰分含量等,以及3个不同类别的葡萄酒。
  2. X = wine.data 表示将数据集的特征值存储在变量 X 中,Y = wine.target 表示将对应的类别标签存储在变量 Y 中。
  3. train_test_split() 用于将数据集划分为训练集和测试集。test_size=0.2 表示将20%的数据作为测试集,80%作为训练集。random_state=42 确保划分结果是固定的,这样每次运行代码都会得到相同的划分结果。
  4. print() 语句用于显示训练集和测试集的特征和标签的形状,以确保数据集已正确划分。

1.3 可视化训练集样本数据分布

# 可视化训练集样本数据分布
feature_names = wine.feature_names
target_names = wine.target_names
plt.figure(figsize=(10, 6))
scatter = plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap='viridis', edgecolor='k', s=100)
plt.xlabel(feature_names[0])
plt.ylabel(feature_names[1])
plt.title('Training Samples Scatter Plot')
handles = [plt.Line2D([0], [0], marker='o', color='w', markerfacecolor=scatter.cmap(scatter.norm(i)), markersize=10) for i in range(len(target_names))]
plt.legend(handles, target_names, title="Classes")
plt.grid()
plt.show()

详细解释

  1. plt.scatter() :这是用于绘制散点图的函数。X_train[:, 0]X_train[:, 1] 分别表示使用葡萄酒数据集的前两个特征(例如酒精含量和苹果酸含量)作为横坐标和纵坐标。c=y_train 表示点的颜色根据葡萄酒的类别来区分。cmap='viridis' 是颜色图,edgecolor='k' 给点添加黑色边框,s=100 调整点的大小。
  2. plt.xlabel()plt.ylabel():用于设置横轴和纵轴的标签,分别对应葡萄酒数据集的前两个特征。
  3. plt.legend():生成图例,标记不同类别的葡萄酒。
  4. 最后,使用 plt.show() 显示图形,帮助我们直观地查看训练集样本的分布情况。

1.4 定义并训练贝叶斯模型

# 定义和训练贝叶斯模型
nb_model = GaussianNB()
nb_model.fit(X_train, y_train)

# 在测试集上进行预测
nb_y_pred = nb_model.predict(X_test)

# 获取预测概率
nb_y_pred_proba = nb_model.predict_proba(X_test)

详细解释

  1. GaussianNB():我们定义了一个高斯朴素贝叶斯模型,适用于数值特征呈现高斯分布的数据。
  2. fit() :这是模型训练的步骤。使用 X_train 作为输入特征,y_train 作为标签来训练贝叶斯分类器。
  3. predict() :训练完成后,我们使用测试集 X_test 进行预测,预测结果存储在 nb_y_pred 中。
  4. predict_proba():输出每个样本属于每个类别的概率。这将用于绘制ROC曲线。

1.5 评估贝叶斯模型

# 评估模型
accuracy = accuracy_score(y_test, nb_y_pred)
conf_matrix = confusion_matrix(y_test, nb_y_pred)
class_report = classification_report(y_test, nb_y_pred, target_names=target_names)

# 打印评价指标
print(f"Accuracy: {accuracy:.2f}")
print("Confusion Matrix:\n", conf_matrix)
print("Classification Report:\n", class_report)

详细解释

  1. accuracy_score() :用于计算模型的准确率,结果存储在 accuracy 变量中。准确率表示模型预测正确的比例。
  2. confusion_matrix():生成混淆矩阵,表示模型在每个类别上的预测结果,能够显示真实类别与预测类别的匹配情况。
  3. classification_report():生成详细的分类报告,包括每个类别的精确率(precision)、召回率(recall)、F1值等。
  4. 打印结果以检查模型的表现,print(f"Accuracy: {accuracy:.2f}") 打印出模型的准确率,混淆矩阵和分类报告也一并输出。

1.6 绘制贝叶斯模型的混淆矩阵

# 绘制混淆矩阵
ConfusionMatrixDisplay(confusion_matrix=conf_matrix, display_labels=target_names).plot(cmap='Blues')
plt.title('Confusion Matrix')
plt.show()

详细解释

  1. ConfusionMatrixDisplay() :用于可视化混淆矩阵。传入 conf_matrixtarget_names,使用 cmap='Blues' 为矩阵着色,蓝色的颜色深浅反映了预测结果的准确性。
  2. 最后,使用 plt.show() 显示混淆矩阵图,这可以帮助我们更直观地理解模型在哪些类别上表现良好,在哪些类别上预测错误。

1.7 绘制AUC-ROC曲线

# 绘制AUC-ROC曲线
plt.figure(figsize=(10, 6))
fpr = dict()
tpr = dict()
roc_auc = dict()
n_classes = len(target_names)
for i in range(n_classes):
    fpr[i], tpr[i], _ = roc_curve(y_test, nb_y_pred_proba[:, i], pos_label=i)
    roc_auc[i] = auc(fpr[i], tpr[i])

# 绘制每个类别的 ROC 曲线
for i in range(n_classes):
    plt.plot(fpr[i], tpr[i], label=f'ROC curve of class {target_names[i]} (area = {roc_auc[i]:.2f})')

# 绘制随机猜测基线
plt.plot([0, 1], [0, 1], 'k--', label='Random')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic (ROC) Curve')
plt.legend(loc='lower right')
plt.grid()
plt.show()

详细解释

  1. roc_curve() :计算ROC曲线的假阳性率(False Positive Rate, FPR)和真正率(True Positive Rate, TPR),nb_y_pred_proba[:, i] 表示贝叶斯模型对第i类的预测概率。
  2. auc():计算AUC(曲线下的面积),AUC值越大,模型性能越好。
  3. 循环绘制每个类别的ROC曲线,并标注每条曲线的AUC值。绘制随机猜测的基线(对角线),用于对比模型性能。
  4. 使用 plt.show() 显示ROC曲线,帮助我们评估模型在不同类别上的分类效果。

1.8 定义并训练决策树模型

# 定义并训练决策树模型
dt_model = DecisionTreeClassifier(random_state=42)
dt_model.fit(X_train, y_train)

# 使用决策树进行预测
dt_pred = dt_model.predict(X_test)

# 输出模型分类结果的评价指标
dt_accuracy = accuracy_score(y_test, dt_pred)
dt_conf_matrix = confusion_matrix(y_test, dt_pred)
print(f"Decision Tree Accuracy: {dt_accuracy:.2f}")
print("Decision Tree Classification Report:\n", classification_report(y_test, dt_pred, target_names=target_names))

详细解释

  1. DecisionTreeClassifier() :定义决策树模型。random_state=42 确保决策树的生成是固定的。
  2. 使用训练集 X_trainy_train 训练决策树模型,fit() 完成模型训练。
  3. 使用 predict() 对测试集进行预测,将预测结果存储在 dt_pred 中。
  4. 计算决策树的准确率,输出混淆矩阵和分类报告,与贝叶斯模型进行对比。

1.9 绘制决策树的混淆矩阵

# 绘制决策树的混淆矩阵
plt.figure(figsize=(12, 6))
ConfusionMatrixDisplay(confusion_matrix=dt_conf_matrix, display_labels=target_names).plot(cmap='Blues', ax=plt.gca())
plt.title('Decision Tree Confusion Matrix')
plt.tight_layout()
plt.show()

详细解释

  1. 同样使用 ConfusionMatrixDisplay() 来绘制决策树的混淆矩阵,查看其分类效果。
  2. tight_layout() 调整布局,以防图形显示时出现重叠。
  3. 最后使用 plt.show() 显示决策树的混淆矩阵。

1.10 比较贝叶斯和决策树的ROC曲线

# 比对贝叶斯分类和决策树分类的ROC曲线
dt_y_pred_proba = dt_model.predict_proba(X_test)
fpr_nb, tpr_nb, _ = roc_curve(y_test, nb_y_pred_proba[:, 1], pos_label=1)
fpr_dt, tpr_dt, _ = roc_curve(y_test, dt_y_pred_proba[:, 1], pos_label=1)
roc_auc_nb = auc(fpr_nb, tpr_nb)
roc_auc_dt = auc(fpr_dt, tpr_dt)

# 绘制AUC-ROC曲线
plt.figure(figsize=(10, 6))
plt.plot(fpr_nb, tpr_nb, label=f'Naive Bayes (area = {roc_auc_nb:.2f})')
plt.plot(fpr_dt, tpr_dt, label=f'Decision Tree (area = {roc_auc_dt:.2f})')
plt.plot([0, 1], [0, 1], 'k--', label='Random')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic (ROC) Curve')
plt.legend(loc='lower right')
plt.grid()
plt.show()

详细解释

  1. predict_proba():获取决策树模型的预测概率。
  2. 使用 roc_curve()auc() 分别为贝叶斯和决策树模型绘制ROC曲线和计算AUC值。
  3. 将两条ROC曲线绘制在一张图上,通过AUC值对比两个模型的分类效果。

1.11 使用交叉验证评估模型精度

# 使用交叉验证评估模型精度
models = {
    'Naive Bayes': nb_model,
    'Decision Tree': dt_model
}
results = []
for model_name, model in models.items():
    scores = cross_val_score(model, X_test, y_test, cv=5)
    results.append(scores)

# 将结果转换为 DataFrame 以便于绘图
results_df = pd.DataFrame(results, index=models.keys()).T

# 绘制箱线图
plt.figure(figsize=(10, 6))
plt.boxplot(results_df.values)
plt.xticks([1, 2], models.keys())
plt.title('Model Accuracy Comparison')
plt.xlabel('Model')
plt.ylabel('Accuracy')
plt.xticks(rotation=45)
plt.grid()
plt.show()

详细解释

  1. cross_val_score() :使用交叉验证对贝叶斯和决策树模型进行评估,cv=5 表示5折交叉验证。
  2. 将交叉验证的结果存储在 results 中,并将其转换为 DataFrame 以便于绘图。
  3. 使用 boxplot() 绘制箱线图,比较不同模型的精度分布,直观展示模型的表现。

3.使用三种不同的决策树方法(ID3,C4.5,CART)对鸢尾花数据进行分类

导入 scikit-learn 库中的鸢尾花数据集,使用三种不同的决策树方法( ID3 ,C4.5, CART )对鸢尾花数据进行分类。鸢尾花数据集各列说明如表 2 所示。

1.1 导入所需的库

import numpy as np
import pandas as pd
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import classification_report, confusion_matrix
import matplotlib.pyplot as plt
import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib import rcParams

详细解释

  1. numpypandas:分别用于数值计算和数据处理。
  2. datasetssklearn 提供的经典数据集库,这里我们将用 load_iris() 加载鸢尾花数据集。
  3. train_test_split:用于将数据集划分为训练集和测试集。
  4. DecisionTreeClassifier:用于构建决策树分类模型。
  5. classification_report, confusion_matrix:用于评估模型,包括分类报告和混淆矩阵。
  6. matplotlibseaborn:用于绘制图表和可视化数据关系。
  7. rcParams:设置绘图参数,如支持中文显示和负号的显示。

1.2 加载鸢尾花数据集

# 加载鸢尾花数据集
iris = datasets.load_iris()

# 创建DataFrame用于数据探索
df_iris = pd.DataFrame(data=iris.data, columns=iris.feature_names)
df_iris['target'] = iris.target

详细解释

  1. load_iris() :从 sklearn.datasets 加载鸢尾花数据集,包含150个样本,3个类别(Setosa、Versicolour、Virginica),每个样本有4个特征(萼片长度、萼片宽度、花瓣长度、花瓣宽度)。
  2. 将数据集转为 pandas 的 DataFrame 格式,更便于数据的处理和分析,数据包括4个特征和1个类别标签。

1.3 数据初步探索和可视化

# 查看数据基本信息
df_iris.info()
df_iris.describe()

# 可视化数据之间的关系
sns.pairplot(df_iris, hue='target')
plt.show()

详细解释

  1. info():查看数据集的基本信息,如数据量、数据类型等。
  2. describe():显示数据集中各个特征的统计信息,如平均值、最小值、最大值等。
  3. sns.pairplot():绘制特征之间的成对关系图,用不同颜色表示三种鸢尾花类别(target),帮助我们初步了解特征间的关系。

1.4 将数据集划分为训练集和测试集

# 将数据集分为训练集和测试集,按8:2的比例
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=42)

详细解释

  1. 使用 train_test_split() 将数据集划分为训练集和测试集,80%的数据用于训练,20%的数据用于测试。random_state=42 保证结果的可复现性。

1.5 训练三个不同的决策树模型(ID3, C4.5, CART)

# 分类器1:ID3 (使用 entropy 作为划分标准)
clf_id3 = DecisionTreeClassifier(criterion='entropy', random_state=42)
clf_id3.fit(X_train, y_train)

# 分类器2:CART (使用 gini 作为划分标准)
clf_cart = DecisionTreeClassifier(criterion='gini', random_state=42)
clf_cart.fit(X_train, y_train)

# 分类器3:C4.5 使用的方式在 sklearn 中可以近似为使用 entropy + 限制 max_depth
clf_c45 = DecisionTreeClassifier(criterion='entropy', max_depth=4, random_state=42)
clf_c45.fit(X_train, y_train)

详细解释

  1. DecisionTreeClassifier(criterion='entropy'):使用信息增益(entropy)作为划分标准,这实现了 ID3 算法。
  2. DecisionTreeClassifier(criterion='gini'):使用基尼系数(gini)作为划分标准,实现 CART 算法。
  3. DecisionTreeClassifier(criterion='entropy', max_depth=4) :通过限制树的深度来模拟 C4.5 算法,它使用信息增益比作为划分标准,并限制了树的复杂度(通过 max_depth)。

1.6 使用测试集进行预测

# 使用测试集进行预测
y_pred_id3 = clf_id3.predict(X_test)
y_pred_cart = clf_cart.predict(X_test)
y_pred_c45 = clf_c45.predict(X_test)

详细解释

  1. predict() :分别使用训练好的三个模型(ID3、CART、C4.5)对测试集数据进行预测,得到各自的预测结果 y_pred_id3y_pred_carty_pred_c45

1.7 评估分类器性能(混淆矩阵和分类报告)

# ID3分类器性能评估
print("ID3 分类报告:")
print(classification_report(y_test, y_pred_id3))
print("ID3 混淆矩阵:")
print(confusion_matrix(y_test, y_pred_id3))

# CART分类器性能评估
print("\nCART 分类报告:")
print(classification_report(y_test, y_pred_cart))
print("CART 混淆矩阵:")
print(confusion_matrix(y_test, y_pred_cart))

# C4.5分类器性能评估
print("\nC4.5 分类报告:")
print(classification_report(y_test, y_pred_c45))
print("C4.5 混淆矩阵:")
print(confusion_matrix(y_test, y_pred_c45))

详细解释

  1. classification_report():生成分类报告,显示每个类别的精确率、召回率、F1分数等。
  2. confusion_matrix():生成混淆矩阵,显示预测结果和实际标签的匹配情况。通过混淆矩阵可以清晰地看到模型在哪些类别上表现良好,哪些类别上有误分类的情况。

1.8 比较结果的可视化

# 对比较结果进行可视化
fig, axes = plt.subplots(1, 3, figsize=(18, 5))

sns.heatmap(confusion_matrix(y_test, y_pred_id3), annot=True, fmt="d", cmap="Blues", ax=axes[0])
axes[0].set_title("ID3 混淆矩阵")

sns.heatmap(confusion_matrix(y_test, y_pred_cart), annot=True, fmt="d", cmap="Greens", ax=axes[1])
axes[1].set_title("CART 混淆矩阵")

sns.heatmap(confusion_matrix(y_test, y_pred_c45), annot=True, fmt="d", cmap="Oranges", ax=axes[2])
axes[2].set_title("C4.5 混淆矩阵")

plt.show()

详细解释

  1. heatmap() :使用 seaborn 绘制混淆矩阵的热力图,每个方格中的数字表示预测与真实值的匹配情况,颜色越深,表示匹配的数量越多。
  2. 将三个模型的混淆矩阵放在一张图中展示,方便我们对比三种不同算法的性能。

4.总体代码和运行结果

4.1 葡萄酒类别总体代码和运行结果

4.1.1 总体代码

python 复制代码
# 导入所需模块
import matplotlib.pyplot as plt
from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report, ConfusionMatrixDisplay
from sklearn.metrics import roc_curve, auc
from sklearn.datasets import load_wine

# 导入数据,分别为输入特征和标签
wine = load_wine()
X = wine.data
Y = wine.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.2, random_state=42)

# 输出结果
print("训练集特征形状:", X_train.shape)
print("测试集特征形状:", X_test.shape)
print("训练集标签形状:", y_train.shape)
print("测试集标签形状:", y_test.shape)

# 可视化训练集样本数据分布
feature_names = wine.feature_names
target_names = wine.target_names
plt.figure(figsize=(10, 6))
scatter = plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap='viridis', edgecolor='k', s=100)
plt.xlabel(feature_names[0])
plt.ylabel(feature_names[1])
plt.title('Training Samples Scatter Plot')
handles = [plt.Line2D([0], [0], marker='o', color='w', markerfacecolor=scatter.cmap(scatter.norm(i)), markersize=10) for i in range(len(target_names))]
plt.legend(handles, target_names, title="Classes")
plt.grid()
plt.show()

# 定义和训练贝叶斯模型
nb_model = GaussianNB()
nb_model.fit(X_train, y_train)

# 在测试集上进行预测
nb_y_pred = nb_model.predict(X_test)

# 获取预测概率
nb_y_pred_proba = nb_model.predict_proba(X_test)

# 评估模型
accuracy = accuracy_score(y_test, nb_y_pred)
conf_matrix = confusion_matrix(y_test, nb_y_pred)
class_report = classification_report(y_test, nb_y_pred, target_names=target_names)

# 打印评价指标
print(f"Accuracy: {accuracy:.2f}")
print("Confusion Matrix:\n", conf_matrix)
print("Classification Report:\n", class_report)

# 绘制混淆矩阵
ConfusionMatrixDisplay(confusion_matrix=conf_matrix, display_labels=target_names).plot(cmap='Blues')
plt.title('Confusion Matrix')
plt.show()

# 绘制AUC-ROC曲线
plt.figure(figsize=(10, 6))
fpr = dict()
tpr = dict()
roc_auc = dict()
n_classes = len(target_names)
for i in range(n_classes):
    fpr[i], tpr[i], _ = roc_curve(y_test, nb_y_pred_proba[:, i], pos_label=i)
    roc_auc[i] = auc(fpr[i], tpr[i])

# 绘制每个类别的 ROC 曲线
for i in range(n_classes):
    plt.plot(fpr[i], tpr[i], label=f'ROC curve of class {target_names[i]} (area = {roc_auc[i]:.2f})')

# 绘制随机猜测基线
plt.plot([0, 1], [0, 1], 'k--', label='Random')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic (ROC) Curve')
plt.legend(loc='lower right')
plt.grid()
plt.show()

# 定义并训练决策树模型
from sklearn.tree import DecisionTreeClassifier
dt_model = DecisionTreeClassifier(random_state=42)
dt_model.fit(X_train, y_train)

# 使用决策树进行预测
dt_pred = dt_model.predict(X_test)

# 输出模型分类结果的评价指标
dt_accuracy = accuracy_score(y_test, dt_pred)
dt_conf_matrix = confusion_matrix(y_test, dt_pred)
print(f"Decision Tree Accuracy: {dt_accuracy:.2f}")
print("Decision Tree Classification Report:\n", classification_report(y_test, dt_pred, target_names=target_names))

# 绘制决策树的混淆矩阵
plt.figure(figsize=(12, 6))
ConfusionMatrixDisplay(confusion_matrix=dt_conf_matrix, display_labels=target_names).plot(cmap='Blues', ax=plt.gca())
plt.title('Decision Tree Confusion Matrix')
plt.tight_layout()
plt.show()

# 比对贝叶斯分类和决策树分类的ROC曲线
dt_y_pred_proba = dt_model.predict_proba(X_test)
fpr_nb, tpr_nb, _ = roc_curve(y_test, nb_y_pred_proba[:, 1], pos_label=1)
fpr_dt, tpr_dt, _ = roc_curve(y_test, dt_y_pred_proba[:, 1], pos_label=1)
roc_auc_nb = auc(fpr_nb, tpr_nb)
roc_auc_dt = auc(fpr_dt, tpr_dt)

# 绘制AUC-ROC曲线
plt.figure(figsize=(10, 6))
plt.plot(fpr_nb, tpr_nb, label=f'Naive Bayes (area = {roc_auc_nb:.2f})')
plt.plot(fpr_dt, tpr_dt, label=f'Decision Tree (area = {roc_auc_dt:.2f})')
plt.plot([0, 1], [0, 1], 'k--', label='Random')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic (ROC) Curve')
plt.legend(loc='lower right')
plt.grid()
plt.show()

# 使用交叉验证评估不同模型的精度
import pandas as pd
from sklearn.model_selection import cross_val_score
models = {
    'Naive Bayes': nb_model,
    'Decision Tree': dt_model
}
results = []
for model_name, model in models.items():
    scores = cross_val_score(model, X_test, y_test, cv=5)
    results.append(scores)

# 将结果转换为 DataFrame 以便于绘图
results_df = pd.DataFrame(results, index=models.keys()).T

# 绘制箱线图
plt.figure(figsize=(10, 6))
plt.boxplot(results_df.values)  # 修改此处
plt.xticks([1, 2], models.keys())  # 设置x轴标签
plt.title('Model Accuracy Comparison')
plt.xlabel('Model')
plt.ylabel('Accuracy')
plt.xticks(rotation=45)
plt.grid()
plt.show()

4.1.2 运行结果

复制代码
训练集特征形状: (142, 13)
测试集特征形状: (36, 13)
训练集标签形状: (142,)
测试集标签形状: (36,)
复制代码
Accuracy: 1.00
Confusion Matrix:
 [[14  0  0]
 [ 0 14  0]
 [ 0  0  8]]
Classification Report:
               precision    recall  f1-score   support

     class_0       1.00      1.00      1.00        14
     class_1       1.00      1.00      1.00        14
     class_2       1.00      1.00      1.00         8

    accuracy                           1.00        36
   macro avg       1.00      1.00      1.00        36
weighted avg       1.00      1.00      1.00        36
复制代码
Decision Tree Accuracy: 0.94
Decision Tree Classification Report:
               precision    recall  f1-score   support

     class_0       0.93      0.93      0.93        14
     class_1       0.93      1.00      0.97        14
     class_2       1.00      0.88      0.93         8

    accuracy                           0.94        36
   macro avg       0.95      0.93      0.94        36
weighted avg       0.95      0.94      0.94        36

[7]:

4.2 鸢尾花数据集总体代码和结果

4.2.1 总体代码

python 复制代码
# 完整实现步骤(2):导入鸢尾花数据集并使用三种不同的决策树分类方法(ID3,C4.5,CART)

# 导入所需的库
import numpy as np
import pandas as pd
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import classification_report, confusion_matrix
import matplotlib.pyplot as plt
import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib import rcParams

# 设置字体为支持中文的字体
rcParams['font.sans-serif'] = ['SimHei']  # 使用 SimHei 字体显示中文
rcParams['axes.unicode_minus'] = False    # 解决负号显示问题


# 第一步:加载鸢尾花数据集
iris = datasets.load_iris()

# 创建DataFrame用于数据探索
df_iris = pd.DataFrame(data=iris.data, columns=iris.feature_names)
df_iris['target'] = iris.target

# 第二步:对数据进行初步探索(查看基本信息)
df_iris.info()
df_iris.describe()

# 可视化数据之间的关系
sns.pairplot(df_iris, hue='target')
plt.show()

# 第三步:将数据集分为训练集和测试集,按8:2的比例
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=42)

# 第四步:分别使用三种决策树方法(ID3,C4.5,CART)训练模型
# ID3 和 CART 都可以用 DecisionTreeClassifier 实现,其中 criterion 分别为 'entropy' 和 'gini'
# 由于 sklearn 没有直接支持 C4.5,我们通过改进 ID3 方式来近似实现

# 分类器1:ID3 (使用 entropy 作为划分标准)
clf_id3 = DecisionTreeClassifier(criterion='entropy', random_state=42)
clf_id3.fit(X_train, y_train)

# 分类器2:CART (使用 gini 作为划分标准)
clf_cart = DecisionTreeClassifier(criterion='gini', random_state=42)
clf_cart.fit(X_train, y_train)

# 分类器3:C4.5 使用的方式在 sklearn 中可以近似为使用 entropy + 限制 max_depth
clf_c45 = DecisionTreeClassifier(criterion='entropy', max_depth=4, random_state=42)
clf_c45.fit(X_train, y_train)

# 第五步:使用测试集进行预测
y_pred_id3 = clf_id3.predict(X_test)
y_pred_cart = clf_cart.predict(X_test)
y_pred_c45 = clf_c45.predict(X_test)

# 第六步:使用混淆矩阵和分类报告来评估分类器性能
print("ID3 分类报告:")
print(classification_report(y_test, y_pred_id3))
print("ID3 混淆矩阵:")
print(confusion_matrix(y_test, y_pred_id3))

print("\nCART 分类报告:")
print(classification_report(y_test, y_pred_cart))
print("CART 混淆矩阵:")
print(confusion_matrix(y_test, y_pred_cart))

print("\nC4.5 分类报告:")
print(classification_report(y_test, y_pred_c45))
print("C4.5 混淆矩阵:")
print(confusion_matrix(y_test, y_pred_c45))

# 第七步:对比较结果进行可视化
# 这里可以通过展示混淆矩阵的热力图来对比三种方法的效果
fig, axes = plt.subplots(1, 3, figsize=(18, 5))

sns.heatmap(confusion_matrix(y_test, y_pred_id3), annot=True, fmt="d", cmap="Blues", ax=axes[0])
axes[0].set_title("ID3 混淆矩阵")

sns.heatmap(confusion_matrix(y_test, y_pred_cart), annot=True, fmt="d", cmap="Greens", ax=axes[1])
axes[1].set_title("CART 混淆矩阵")

sns.heatmap(confusion_matrix(y_test, y_pred_c45), annot=True, fmt="d", cmap="Oranges", ax=axes[2])
axes[2].set_title("C4.5 混淆矩阵")

plt.show()

4.2.2 运行结果

复制代码
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 150 entries, 0 to 149
Data columns (total 5 columns):
 #   Column             Non-Null Count  Dtype  
---  ------             --------------  -----  
 0   sepal length (cm)  150 non-null    float64
 1   sepal width (cm)   150 non-null    float64
 2   petal length (cm)  150 non-null    float64
 3   petal width (cm)   150 non-null    float64
 4   target             150 non-null    int64  
dtypes: float64(4), int64(1)
memory usage: 6.0 KB
复制代码
ID3 分类报告:
              precision    recall  f1-score   support

           0       1.00      1.00      1.00        10
           1       1.00      1.00      1.00         9
           2       1.00      1.00      1.00        11

    accuracy                           1.00        30
   macro avg       1.00      1.00      1.00        30
weighted avg       1.00      1.00      1.00        30

ID3 混淆矩阵:
[[10  0  0]
 [ 0  9  0]
 [ 0  0 11]]

CART 分类报告:
              precision    recall  f1-score   support

           0       1.00      1.00      1.00        10
           1       1.00      1.00      1.00         9
           2       1.00      1.00      1.00        11

    accuracy                           1.00        30
   macro avg       1.00      1.00      1.00        30
weighted avg       1.00      1.00      1.00        30

CART 混淆矩阵:
[[10  0  0]
 [ 0  9  0]
 [ 0  0 11]]

C4.5 分类报告:
              precision    recall  f1-score   support

           0       1.00      1.00      1.00        10
           1       1.00      1.00      1.00         9
           2       1.00      1.00      1.00        11

    accuracy                           1.00        30
   macro avg       1.00      1.00      1.00        30
weighted avg       1.00      1.00      1.00        30

C4.5 混淆矩阵:
[[10  0  0]
 [ 0  9  0]
 [ 0  0 11]]
相关推荐
余炜yw29 分钟前
【LSTM实战】跨越千年,赋诗成文:用LSTM重现唐诗的韵律与情感
人工智能·rnn·深度学习
莫叫石榴姐1 小时前
数据科学与SQL:组距分组分析 | 区间分布问题
大数据·人工智能·sql·深度学习·算法·机器学习·数据挖掘
如若1231 小时前
利用 `OpenCV` 和 `Matplotlib` 库进行图像读取、颜色空间转换、掩膜创建、颜色替换
人工智能·opencv·matplotlib
YRr YRr1 小时前
深度学习:神经网络中的损失函数的使用
人工智能·深度学习·神经网络
ChaseDreamRunner2 小时前
迁移学习理论与应用
人工智能·机器学习·迁移学习
Guofu_Liao2 小时前
大语言模型---梯度的简单介绍;梯度的定义;梯度计算的方法
人工智能·语言模型·矩阵·llama
我爱学Python!2 小时前
大语言模型与图结构的融合: 推荐系统中的新兴范式
人工智能·语言模型·自然语言处理·langchain·llm·大语言模型·推荐系统
果冻人工智能2 小时前
OpenAI 是怎么“压力测试”大型语言模型的?
人工智能·语言模型·压力测试
日出等日落2 小时前
Windows电脑本地部署llamafile并接入Qwen大语言模型远程AI对话实战
人工智能·语言模型·自然语言处理
麦麦大数据2 小时前
Python棉花病虫害图谱系统CNN识别+AI问答知识neo4j vue+flask深度学习神经网络可视化
人工智能·python·深度学习