2024.12.10

以下是使用Python和scikit-learn库实现朴素贝叶斯算法的代码示例,包括加载数据集、训练模型、使用五折交叉验证评估模型性能以及测试模型性能的步骤。代码中包含了详细的注释,解释了每个函数和参数的作用。

# 导入必要的库
from sklearn import datasets
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
from sklearn.model_selection import StratifiedKFold

# 加载iris数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target

# 使用留出法留出1/3的样本作为测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/3, random_state=42, stratify=y)

# 创建并训练朴素贝叶斯分类器
gnb = GaussianNB()  # GaussianNB是高斯朴素贝叶斯分类器,适用于连续变量
gnb.fit(X_train, y_train)  # 训练模型

# 使用五折交叉验证评估模型性能
kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)  # StratifiedKFold用于分层抽样
cv_scores = cross_val_score(gnb, X_train, y_train, cv=kfold)  # 交叉验证

# 训练集上的预测结果
y_train_pred = gnb.predict(X_train)

# 测试集上的预测结果
y_test_pred = gnb.predict(X_test)

# 计算训练集和测试集的性能指标
train_accuracy = accuracy_score(y_train, y_train_pred)
train_precision = precision_score(y_train, y_train_pred, average='weighted')
train_recall = recall_score(y_train, y_train_pred, average='weighted')
train_f1 = f1_score(y_train, y_train_pred, average='weighted')

test_accuracy = accuracy_score(y_test, y_test_pred)
test_precision = precision_score(y_test, y_test_pred, average='weighted')
test_recall = recall_score(y_test, y_test_pred, average='weighted')
test_f1 = f1_score(y_test, y_test_pred, average='weighted')

# 打印结果
print("训练结果:")
print(f"准确率:{train_accuracy:.4f}")
print(f"精度(查准率):{train_precision:.4f}")
print(f"召回率(查全率):{train_recall:.4f}")
print(f"F1:{train_f1:.4f}")

print("\n五折交叉验证平均准确率:{:.4f}".format(cv_scores.mean()))

print("\n测试结果:")
print(f"准确率:{test_accuracy:.4f}")
print(f"精度(查准率):{test_precision:.4f}")
print(f"召回率(查全率):{test_recall:.4f}")
print(f"F1:{test_f1:.4f}")

# 对比分析
print("\n对比分析:")
print("训练集和测试集的准确率、精度、召回率和F1值都可以用来评估模型的性能。")
print("通常情况下,如果模型在训练集上过拟合,那么训练集的准确率会高于测试集的准确率。")
print("如果模型在训练集和测试集上的性能指标接近,说明模型具有良好的泛化能力。")

参数解释:

  • train_test_split: 用于将数据集分为训练集和测试集。test_size=1/3表示测试集占总数据的1/3,random_state用于控制随机数生成器的种子,确保结果的可重复性,stratify=y确保训练集和测试集的类别分布与原始数据集相同。
  • GaussianNB: 高斯朴素贝叶斯分类器,适用于特征值符合正态分布的数据。
  • fit: 训练模型。
  • cross_val_score: 进行交叉验证,cv参数指定交叉验证的折数。
  • accuracy_score, precision_score, recall_score, f1_score: 分别计算准确率、精度、召回率和F1值。
  • StratifiedKFold: 分层K折交叉验证,n_splits=5表示5折交叉验证,shuffle=True表示在每次分割前随机打乱数据,random_state控制随机数生成器的种子。

这段代码将帮助你完成实验任务,并生成所需的结果。记得将代码和结果打包命名为“学号姓名-任务6”提交到超星作业平台。

posted @ 2024-12-10 23:03  258333  阅读(33)  评论(0)    收藏  举报