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

devtools/2024/9/19 19:28:03/ 标签: 分类, 数据挖掘, 人工智能

目录

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   supportclass_0       1.00      1.00      1.00        14class_1       1.00      1.00      1.00        14class_2       1.00      1.00      1.00         8accuracy                           1.00        36macro 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   supportclass_0       0.93      0.93      0.93        14class_1       0.93      1.00      0.97        14class_2       1.00      0.88      0.93         8accuracy                           0.94        36macro 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    float641   sepal width (cm)   150 non-null    float642   petal length (cm)  150 non-null    float643   petal width (cm)   150 non-null    float644   target             150 non-null    int64  
dtypes: float64(4), int64(1)
memory usage: 6.0 KB

ID3 分类报告:precision    recall  f1-score   support0       1.00      1.00      1.00        101       1.00      1.00      1.00         92       1.00      1.00      1.00        11accuracy                           1.00        30macro avg       1.00      1.00      1.00        30
weighted avg       1.00      1.00      1.00        30ID3 混淆矩阵:
[[10  0  0][ 0  9  0][ 0  0 11]]CART 分类报告:precision    recall  f1-score   support0       1.00      1.00      1.00        101       1.00      1.00      1.00         92       1.00      1.00      1.00        11accuracy                           1.00        30macro avg       1.00      1.00      1.00        30
weighted avg       1.00      1.00      1.00        30CART 混淆矩阵:
[[10  0  0][ 0  9  0][ 0  0 11]]C4.5 分类报告:precision    recall  f1-score   support0       1.00      1.00      1.00        101       1.00      1.00      1.00         92       1.00      1.00      1.00        11accuracy                           1.00        30macro avg       1.00      1.00      1.00        30
weighted avg       1.00      1.00      1.00        30C4.5 混淆矩阵:
[[10  0  0][ 0  9  0][ 0  0 11]]


http://www.ppmy.cn/devtools/113362.html

相关文章

(更新20240727)机器视觉康耐视visionpro学习步骤

第一步&#xff0c;首先要有软件&#xff0c;软件建议淘宝买&#xff0c;有破解&#xff0c;本群不提供&#xff0c;只提供解答。 第二步&#xff1a;工具讲解&#xff0c;网址 (https://www.bilibili.com/video/BV1tg411z7UD/?spm_id_from333.337.searchcard.all.click&…

MoneyPrinterTurbo 安装使用流程

项目地址&#xff1a; https://github.com/harry0703/MoneyPrinterTurbo 开发环境&#xff1a;mac 1 git 下载 # 下载代码到本地 git clone https://github.com/harry0703/MoneyPrinterTurbo.git cd MoneyPrinterTurbo2 docker 配源 在 docker 安装目录执行以下命令显示隐藏…

人工智能GPT____豆包使用的一些初步探索步骤 体验不一样的工作

豆包工具是我使用比较频繁的一款软件&#xff0c;其集合了很多功能。对话 图像 AI搜索 伴读等等使用都非常不错。电脑端安装集合了很多功能。 官网直达&#xff1a;豆包 使用我的文案创作能力&#xff0c;您可以注意以下几个技巧&#xff1a; 明确需求&#xff1a; 尽可能具…

数据结构之栈(python)

栈&#xff08;顺序栈与链栈&#xff09; 1.栈存储结构1.1栈的基本介绍1.2进栈和出栈1.3栈的具体实现1.4栈的应用例一例二例三 2.顺序栈及基本操作&#xff08;包含入栈和出栈&#xff09;2.1顺序栈的基础介绍2.2顺序栈元素入栈2.3顺序栈元素出栈2.4顺序栈的表示和实现 3.链栈及…

web开发 之 HTML、CSS、JavaScript、以及JavaScript的高级框架Vue(学习版2)

一、前言 接下来就是来解决这些问题 二、 Ajax 1.ajax javscript是网页三剑客之一&#xff0c;空用来控制网页的行为的 xml是一种标记语言&#xff0c;是用来存储数据的 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-…

OpenAI全新发布o1模型:开启 AGI 的新时代

OpenAI全新发布o1模型&#xff1a;开启 AGI 的新时代 欢迎关注【youcans的AGI学习笔记】原创作品 2024年9月13日&#xff0c;OpenAI新模型o1 正式发布。o1 在测试化学、物理和生物学专业知识的基准 GPQA-diamond 上&#xff0c;全面超过了人类博士专家。 OpenAI 宣称&#xff…

HarmonyOS NEXT 封装实现好用的网络模块(基于最新5.0的API12)

在 HarmonyOS-NEXT 开发中&#xff0c;网络请求是应用开发中不可或缺的一部分。为了提高开发效率和代码复用性&#xff0c;我们可以封装一个好用的网络模块组件。本文将介绍如何在 HarmonyOS-NEXT 中封装一个功能强大且易于使用的网络模块组件。 封装目的 网络模块使用的频率最…

计算机操作系统之并行性与并发性笔记

目录 在计算机操作系统中&#xff0c;并行性与并发性是两个既相似又有区别的重要概念 并行性&#xff1a; 并发性&#xff1a; 可以通过多任务处理和资源共享来具体说明 并发性的例子 并行性的例子 总结 在计算机操作系统中&#xff0c;并行性与并发性是两个既相似又有区别…

Vue.js 中的 DOM 更新之后执行某些操作

在Vue.js中&#xff0c;如果你需要在DOM更新之后执行某些操作&#xff0c;可以使用nextTick方法。这个方法会在下次DOM更新循环结束之后执行回调函数&#xff0c;这时候相关的DOM变更已经完成。 以下是一个使用nextTick的例子&#xff1a; <template> <div> <…

车载软件架构 --- SOA设计与应用(中)

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

【计算机网络 - 基础问题】每日 3 题(一)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

个人电脑可以当服务器用吗?

服务器和普通电脑的主要区别体现在以下几个方面&#xff1a; 1.CPU处理性能 服务器的CPU配置通常是多核的&#xff0c;普通电脑的CPU往往只包含单个核心&#xff0c;因此在数据处理能力上远远不如服务器。 2.安全性能 服务器具备更高的可靠性、安全性、容错能力和安全保护能…

苹果 Vision Pro 曝出严重漏洞,黑客可通过用户眼动输入窃取信息

近日&#xff0c;苹果公司的 Vision Pro 混合现实头戴式设备曝出一个安全漏洞&#xff0c;一旦被黑客成功利用&#xff0c;他们就可以推断出用户在该设备的虚拟键盘上输入的具体数据。 该攻击活动名为 GAZEploit&#xff0c;该漏洞被追踪为 CVE-2024-40865。 佛罗里达大学的学…

Spring面试

一、对Spring的理解 &#xff08;一&#xff09;Spring的发展史 &#xff08;二&#xff09;Spring的体系结构 &#xff08;三&#xff09;Spring相关组件 1.Spring和SpringMVC的关系 2.Spring和SpringBoot的关系 3.Spring和SpringCloud的关系 4.Spring和SpringSecurity的…

系统架构设计师 需求分析篇二

&#x1f4d8; 面向对象分析方法 1. 用例模型 &#x1f4c8; 构建用例模型一般需要经历 4 个阶段&#xff1a; 识别参与者 &#x1f50d;&#xff1a;识别与系统交互的所有事物。合并需求获得用例 &#x1f517;&#xff1a;将需求分配给予其相关的参与者。细化用例描述 &am…

Nuxt Kit 中的页面和路由管理

title: Nuxt Kit 中的页面和路由管理 date: 2024/9/17 updated: 2024/9/17 author: cmdragon excerpt: 摘要:本文介绍了Nuxt Kit中页面和路由管理的高级功能,包括extendPages自定义页面路由、extendRouteRules定义复杂路由逻辑及addRouteMiddleware注册路由中间件。通过这…

手把手教你:在微信小程序中加载map并实现拖拽添加标记定位

本文将为大家详细介绍如何在微信小程序中加载map组件&#xff0c;并实现拖拽标记定位功能。 实现步骤 1、首先&#xff0c;我们需要在项目的app.json文件中添加map组件的相关配置。如下所示&#xff1a; {"pages": ["pages/index/index"],"permiss…

2024 年最佳 Chrome 验证码扩展,解决 reCAPTCHA 问题

验证码&#xff0c;特别是 reCAPTCHA&#xff0c;已成为在线安全的不可或缺的一部分。虽然它们在区分人类和机器人方面起着至关重要的作用&#xff0c;但它们也可能成为合法用户和从事网络自动化的企业的主要障碍。无论您是试图简化在线体验的个人&#xff0c;还是依赖自动化工…

SpringBoot Kafka发送消息与接收消息实例

前言 Kafka的基本工作原理 我们将消息的发布&#xff08;publish&#xff09;称作 producer(生产者)&#xff0c;将消息的订阅&#xff08;subscribe&#xff09;表述为 consumer&#xff08;消费者&#xff09;&#xff0c;将中间的存储阵列称作 broker(代理)&#xff0c;这…

TCP/IP - TCP

目录 1. 数据格式2. TCP建立:三次握手第一次握手:Client发出SYN帧(SN=a, AN=0, SYN=1, ACK=0)第二次握手:Server发出SYN+ACK帧(SN=b, AN=a+1, SYN=1, ACK=1)第三次握手:Clietn发出ACK帧(SN=a+1, AN=b+1, SYN=0, ACK=1)为什么是三次握手,而不是两次?建立连接之后,一…