1.基础知识
1.1 高斯贝叶斯(Gaussian Naive Bayes)
基本思想:
高斯贝叶斯是一种基于贝叶斯定理的分类方法,旨在计算每个类别的后验概率。贝叶斯定理结合了先验概率和似然概率,以推断出数据样本属于某一类别的概率。在高斯贝叶斯分类器中,假设所有特征之间是独立的,并且每个特征的条件概率服从高斯分布(正态分布)。
工作流程:
- 先验概率:计算每个类别的先验概率。
- 似然估计:基于训练数据,假设每个特征服从正态分布,计算出特征在各类别下的似然概率。
- 后验概率计算:通过贝叶斯定理,结合先验概率和似然概率,计算出后验概率。
- 分类决策:将样本分类到具有最高后验概率的类别。
优点:
- 计算效率高,适用于高维数据。
- 对于小样本数据集非常有效。
缺点:
- 假设特征之间相互独立,这在实际应用中可能不成立。
1.2 决策树(Decision Tree)
基本思想:
决策树是一种监督学习方法,通过构建一个树状模型,根据特征的值递归地将数据样本分类。树的每个内部节点表示一个特征的测试,每个分支代表该测试的结果,每个叶节点则代表一个类别的决策。
工作流程:
- 划分数据:使用如信息增益或基尼系数等指标,选择最能区分类别的特征作为划分依据,建立决策树的节点。
- 递归构建:对每个子集继续进行相同的划分过程,直到达到终止条件(如所有样本同属一个类别或树的深度达到预设值)。
- 剪枝:为了避免过拟合,可能需要对决策树进行剪枝,即去掉不必要的叶子节点或分支。
优点:
- 简单易于解释。
- 既适用于分类问题,也适用于回归问题。
- 不需要特征标准化。
缺点:
- 容易过拟合,尤其是深度较大的决策树。
- 对于少数类样本的预测效果可能较差。
1.3 模型评价(Model Evaluation)
模型评价是对机器学习模型的性能、有效性和适用性进行评估的过程。评价包括多个维度,如模型的准确性、泛化能力、可解释性和计算效率。评价方法则有交叉验证法、留出验证法、自助法等。
1.3.1 评价维度:
-
准确性(Accuracy):
- 衡量模型预测的整体准确性,即模型正确分类的样本数与总样本数的比值。适用于类分布平衡的数据集。
-
精确率(Precision):
- 衡量模型在预测为正样本时的准确性,即真正为正样本的比例。在类分布不平衡的情况下,精确率是重要指标。
-
召回率(Recall):
- 衡量模型对正样本的识别能力,即真正为正样本的比例。高召回率意味着模型对正样本的捕捉能力强。
-
F1-Score:
- 精确率和召回率的调和平均值,作为模型在不平衡数据集上的综合评价指标。适用于处理正负样本不平衡的数据。
-
泛化能力(Generalization Ability):
- 模型在未见过的数据上的表现能力,可以通过交叉验证或留出验证来衡量。ROC曲线和AUC值也是常用的泛化能力评估工具。
-
可解释性(Interpretability):
- 对于某些应用,理解模型决策过程尤为重要。传统方法如决策树和线性回归具有较好的可解释性,而复杂的深度学习模型则较难解释。
-
计算效率(Computational Efficiency):
- 包括模型的训练时间和预测时间,特别是在大规模数据或实时应用中至关重要。
1.3.2 评价方法:
-
交叉验证法(Cross-Validation):
- 将数据集分为K个不相交的子集,轮流使用其中K-1个子集进行训练,剩下的子集进行验证。这样可以更全面地评估模型的性能,减小偶然误差。
-
留出验证法(Hold-Out Validation):
- 将数据集随机划分为训练集和测试集,训练模型后使用测试集进行评估。这种方法简单直接,可以反映模型在未知数据上的真实表现。
-
自助法(Bootstrap Method):
- 使用有放回抽样从原始数据集中生成多个样本,特别适合小数据集的情况。这种方法能够充分利用有限数据资源。
-
混淆矩阵(Confusion Matrix):
- 通过矩阵形式展示模型的预测结果,包括真正例、假正例、假负例和真负例,从而对模型的分类性能进行详细评估。
2.使用贝叶斯算法识别葡萄酒类别
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)
详细解释:
- 使用
load_wine()
函数从sklearn.datasets
中加载葡萄酒数据集。该数据集包含13个特征,如酒精含量、灰分含量等,以及3个不同类别的葡萄酒。 X = wine.data
表示将数据集的特征值存储在变量X
中,Y = wine.target
表示将对应的类别标签存储在变量Y
中。train_test_split()
用于将数据集划分为训练集和测试集。test_size=0.2
表示将20%的数据作为测试集,80%作为训练集。random_state=42
确保划分结果是固定的,这样每次运行代码都会得到相同的划分结果。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()
详细解释:
plt.scatter()
:这是用于绘制散点图的函数。X_train[:, 0]
和X_train[:, 1]
分别表示使用葡萄酒数据集的前两个特征(例如酒精含量和苹果酸含量)作为横坐标和纵坐标。c=y_train
表示点的颜色根据葡萄酒的类别来区分。cmap='viridis'
是颜色图,edgecolor='k'
给点添加黑色边框,s=100
调整点的大小。plt.xlabel()
和plt.ylabel()
:用于设置横轴和纵轴的标签,分别对应葡萄酒数据集的前两个特征。plt.legend()
:生成图例,标记不同类别的葡萄酒。- 最后,使用
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)
详细解释:
GaussianNB()
:我们定义了一个高斯朴素贝叶斯模型,适用于数值特征呈现高斯分布的数据。fit()
:这是模型训练的步骤。使用X_train
作为输入特征,y_train
作为标签来训练贝叶斯分类器。predict()
:训练完成后,我们使用测试集X_test
进行预测,预测结果存储在nb_y_pred
中。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)
详细解释:
accuracy_score()
:用于计算模型的准确率,结果存储在accuracy
变量中。准确率表示模型预测正确的比例。confusion_matrix()
:生成混淆矩阵,表示模型在每个类别上的预测结果,能够显示真实类别与预测类别的匹配情况。classification_report()
:生成详细的分类报告,包括每个类别的精确率(precision)、召回率(recall)、F1值等。- 打印结果以检查模型的表现,
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()
详细解释:
ConfusionMatrixDisplay()
:用于可视化混淆矩阵。传入conf_matrix
和target_names
,使用cmap='Blues'
为矩阵着色,蓝色的颜色深浅反映了预测结果的准确性。- 最后,使用
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()
详细解释:
roc_curve()
:计算ROC曲线的假阳性率(False Positive Rate, FPR)和真正率(True Positive Rate, TPR),nb_y_pred_proba[:, i]
表示贝叶斯模型对第i类的预测概率。auc()
:计算AUC(曲线下的面积),AUC值越大,模型性能越好。- 循环绘制每个类别的ROC曲线,并标注每条曲线的AUC值。绘制随机猜测的基线(对角线),用于对比模型性能。
- 使用
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))
详细解释:
DecisionTreeClassifier()
:定义决策树模型。random_state=42
确保决策树的生成是固定的。- 使用训练集
X_train
和y_train
训练决策树模型,fit()
完成模型训练。 - 使用
predict()
对测试集进行预测,将预测结果存储在dt_pred
中。 - 计算决策树的准确率,输出混淆矩阵和分类报告,与贝叶斯模型进行对比。
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()
详细解释:
- 同样使用
ConfusionMatrixDisplay()
来绘制决策树的混淆矩阵,查看其分类效果。 tight_layout()
调整布局,以防图形显示时出现重叠。- 最后使用
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()
详细解释:
predict_proba()
:获取决策树模型的预测概率。- 使用
roc_curve()
和auc()
分别为贝叶斯和决策树模型绘制ROC曲线和计算AUC值。 - 将两条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()
详细解释:
cross_val_score()
:使用交叉验证对贝叶斯和决策树模型进行评估,cv=5
表示5折交叉验证。- 将交叉验证的结果存储在
results
中,并将其转换为DataFrame
以便于绘图。 - 使用
boxplot()
绘制箱线图,比较不同模型的精度分布,直观展示模型的表现。
3.使用三种不同的决策树方法(ID3,C4.5,CART)对鸢尾花数据进行分类
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
详细解释:
numpy
和pandas
:分别用于数值计算和数据处理。datasets
:sklearn
提供的经典数据集库,这里我们将用load_iris()
加载鸢尾花数据集。train_test_split
:用于将数据集划分为训练集和测试集。DecisionTreeClassifier
:用于构建决策树分类模型。classification_report
,confusion_matrix
:用于评估模型,包括分类报告和混淆矩阵。matplotlib
和seaborn
:用于绘制图表和可视化数据关系。rcParams
:设置绘图参数,如支持中文显示和负号的显示。
1.2 加载鸢尾花数据集
# 加载鸢尾花数据集
iris = datasets.load_iris()
# 创建DataFrame用于数据探索
df_iris = pd.DataFrame(data=iris.data, columns=iris.feature_names)
df_iris['target'] = iris.target
详细解释:
load_iris()
:从sklearn.datasets
加载鸢尾花数据集,包含150个样本,3个类别(Setosa、Versicolour、Virginica),每个样本有4个特征(萼片长度、萼片宽度、花瓣长度、花瓣宽度)。- 将数据集转为
pandas
的 DataFrame 格式,更便于数据的处理和分析,数据包括4个特征和1个类别标签。
1.3 数据初步探索和可视化
# 查看数据基本信息
df_()
df_iris.describe()
# 可视化数据之间的关系
sns.pairplot(df_iris, hue='target')
plt.show()
详细解释:
info()
:查看数据集的基本信息,如数据量、数据类型等。describe()
:显示数据集中各个特征的统计信息,如平均值、最小值、最大值等。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)
详细解释:
- 使用
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)
详细解释:
DecisionTreeClassifier(criterion='entropy')
:使用信息增益(entropy)作为划分标准,这实现了 ID3 算法。DecisionTreeClassifier(criterion='gini')
:使用基尼系数(gini)作为划分标准,实现 CART 算法。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)
详细解释:
predict()
:分别使用训练好的三个模型(ID3、CART、C4.5)对测试集数据进行预测,得到各自的预测结果y_pred_id3
,y_pred_cart
和y_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))
详细解释:
classification_report()
:生成分类报告,显示每个类别的精确率、召回率、F1分数等。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()
详细解释:
heatmap()
:使用seaborn
绘制混淆矩阵的热力图,每个方格中的数字表示预测与真实值的匹配情况,颜色越深,表示匹配的数量越多。- 将三个模型的混淆矩阵放在一张图中展示,方便我们对比三种不同算法的性能。
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 36Decision 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_()
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 KBID3 分类报告: 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]]