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

news2024/11/18 1:31:25

目录

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]]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2133220.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

android 删除系统原有的debug.keystore,系统运行的时候,重新生成新的debug.keystore,来完成App的运行。

1、先上一个图&#xff1a;这个是keystore无效的原因 之前在安装这个旧版本android studio的时候呢&#xff0c;安装过一版最新的android studio&#xff0c;然后通过模拟器跑过测试的demo。 2、运行旧的项目到模拟器的时候&#xff0c;就报错了&#xff1a; Execution failed…

proteus+51单片机+AD/DA学习5

目录 1.DA转换原理 1.1基本概念 1.1.1DA的简介 1.1.2DA0832芯片 1.1.3PCF8591芯片 1.2代码 1.2.1DAC8053的代码 1.2.2PCF8951的代码 1.3仿真 1.3.1DAC0832的仿真 1.3.2PFC8951的仿真 2.AD转换原理 2.1AD的基本概念 2.1.1AD的简介 2.1.2ADC0809的介绍 2.1.3XPT2…

双指针算法专题(1)

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; 优选算法专题 目录 双指针算法的介绍 283. 移动零 1089. 复写零 202. 快乐数 11.盛最多水的容器 双指针算法的介绍 在正式做题之前&a…

C++ 获取文件夹下的全部文件及指定文件(代码)

文章目录 1.&#xff08;C17&#xff09;获得指定目录下的所有文件&#xff08;不搜索子文件夹&#xff09;2.&#xff08;C11&#xff09;获得指定目录下的所有文件&#xff08;不搜索子文件夹&#xff09;3.&#xff08;C11&#xff09;获取目录下指定格式的所有文件&#xf…

工厂安灯系统在优化生产流程上的优势

工厂安灯系统通过可视化的方式&#xff0c;帮助工厂管理者和操作工人及时了解生产状态&#xff0c;快速响应问题&#xff0c;从而优化生产流程。 一、安灯系统实时监控与反馈 安灯系统的核心功能是实时监控生产线的状态。通过在生产现场设置灯光、显示屏等设备&#xff0c;工人…

OpenGL(四) 纹理贴图

几何模型&材质&纹理 渲染一个物体需要&#xff1a; 几何模型&#xff1a;决定了物体的形状材质&#xff1a;绝对了当灯光照到上面时的作用效果纹理&#xff1a;决定了物体的外观 纹理对象 纹理有2D的&#xff0c;有3D的。2D图像就是一张图片&#xff0c;3D图像是在…

记得忘记密码情况下如何退出苹果Apple ID

在日常使用苹果手机时&#xff0c;我们可能会遇到需要退出Apple ID的情况&#xff0c;比如更换手机、不再使用某些服务或出于安全考虑等。下面&#xff0c;我们就来详细介绍一下苹果手机如何退出Apple ID。 情况一&#xff1a;记得Apple ID密码 若是记得Apple ID密码&#xff…

3. 轴指令(omron 机器自动化控制器)——>MC_HomeWithParameterMC_Move

机器自动化控制器——第三章 轴指令 3 MC_HomeWithParameter变量▶输入变量▶输出变量 功能说明▶原点复位动作与原点复位参数的关系▶重启运动指令▶多重启动运动指令▶错误代码 MC_Move变量▶输入变量▶输出变量▶输入输出变量 功能说明▶指令详情▶重启运动指令▶多重启动运…

pytorch入门(1)——pytorch加载数据初认识

环境配置及其安装&#xff1a; 2023最新pytorch安装&#xff08;超详细版&#xff09;-CSDN博客 pytorch加载数据初认识 Dataset&#xff1a;创建可被Pytorch使用的数据集 提供一种方式获取数据及其label Dataloader&#xff1a;向模型传递数据 为网络提供不同的数据形式 …

算法_队列+宽度优先搜索---持续更新

文章目录 前言N叉树的层序遍历题目要求题目解析代码如下 二叉树最大宽度题目要求题目解析代码如下 在每个树中找最大值题目要求题目解析代码如下 二叉树的锯齿形层序遍历题目要求题目解析代码如下 前言 本文将会向你介绍有关队列宽度优先搜索的题目&#xff1a;N叉树的层序遍历…

【每日一题】LeetCode 2398.预算内的最多机器人数目(滑动窗口、数组、二分查找、前缀和、堆(优先队列))

【每日一题】LeetCode 2398.预算内的最多机器人数目&#xff08;滑动窗口、数组、二分查找、前缀和、堆&#xff08;优先队列&#xff09;&#xff09; 题目描述 给定两个整数数组 chargeTimes 和 runningCosts&#xff0c;分别代表 n 个机器人的充电时间和运行成本。再给定一…

喂料机和失重秤的区别?

喂料机和失重秤的区别&#xff1f;在硬件结构上的具体差异&#xff1a; 1. 喂料机的硬件结构 喂料机的结构比较简单&#xff0c;主要功能是传送物料&#xff0c;不涉及精确的称重系统。其硬件结构通常包括以下部分&#xff1a; 料斗&#xff1a;用于存储物料&#xff0c;物料…

cesium.js 入门到精通(7)

我们说一下相机的概念&#xff1a; 生活中的相机是一个用来拍照的设备&#xff0c;而这里的相机应该理解成一个人机交互的媒介。地图的缩放、平移、旋转&#xff0c;以及相关的鼠标操作都是由相机作为媒介来实现的。相机的位置和姿态参数决定了我们能看到的地图的样子。 可以…

centos7.9安装clamav教程

本章教程主要记录在centos7.9安装clamav过程。 ClamAV(Clam AntiVirus)是一个开源的防病毒软件工具,主要用于检测和消除恶意软件。它最初由 Tomasz Kojm 于 2001 年开发,并由 Cisco Systems 维护和支持。ClamAV 广泛应用于邮件网关、文件服务器和其他需要防病毒保护的环境中…

Linux软件包循环依赖解决 彻底删除i386架构 更新软件源

0.问题 之前为了wine和intel核显驱动加了32位的库&#xff0c;现在每次apt upgrade更新都被循环依赖弄得不堪其扰&#xff0c;apt --fix-broken install解决缺失都循环报错&#xff0c;寸步难行&#xff0c;忍无可忍、 而且一看全是i386的依赖&#xff0c;这32位我不用也罢&…

apache文件共享和访问控制

实现apache文件共享 文件共享路径 <Directory "/var/www/html"> #默认发布路径&#xff0c;功能限制 Options Indexes FollowSymLinks #indexes支持文件共享功能 AllowOverride None Require all granted </Directory> 进入到该路径下 cd…

【Java Bean Validation API】Spring3 集成 Bean 参数校验框架

Spring3 集成 Bean 参数校验框架 Java Bean Validation API 1. 依赖 Spring 版本&#xff1a;3.0.5 Java 版本&#xff1a;jdk21 检验框架依赖&#xff08;也可能不需要&#xff0c;在前面 spring 的启动依赖里就有&#xff09;&#xff1a; <!-- 自定义验证注解 -->…

【原创】java+springboot+mysql高校社团网系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

spring内置的

程序里注入了spring内置的线程池&#xff0c;但没有看到线程池相关参数配置&#xff08;corePoolSize maxPoolSize 队列大小&#xff09;&#xff0c;网上查说默认是1个线程&#xff0c;结果和生产实际看到的不一致。 从生产可以看到有8个线程在跑&#xff0c;task-1 task-8&am…

buildroot移植qt报错Info: creating stash file (补充qt添加字库)

移植qt库&#xff0c;编译文件报错Info: creating stash file /home/rbing/QT/uart/.qmake.stash Project ERROR: Unknown module(s) in QT: serialport rbingouc:~/QT/uart$ /home/rbing/linux/tool/buildroot-2022.02.9/output/host/usr/bin/qmake Info: creating stash fil…