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

目录

1.基础知识

1.1 高斯贝叶斯(Gaussian Naive Bayes)

1.2 决策树(Decision Tree)

1.3 模型评价(Model Evaluation)

1.3.1 评价维度:

1.3.2 评价方法:

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

1.1 导入所需模块

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

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

1.4 定义并训练贝叶斯模型

1.5 评估贝叶斯模型

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

1.7 绘制AUC-ROC曲线

1.8 定义并训练决策树模型

1.9 绘制决策树的混淆矩阵

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

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

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

1.1 导入所需的库

1.2 加载鸢尾花数据集

1.3 数据初步探索和可视化

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

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

1.6 使用测试集进行预测

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

1.8 比较结果的可视化

4.总体代码和运行结果

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

4.1.1 总体代码

4.1.2 运行结果

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

4.2.1 总体代码

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 总体代码

# 导入所需模块
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 总体代码

# 完整实现步骤(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]]

  • 19
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值