实验七:K 均值聚类算法实现与测试
一、实验目的
深入理解 K 均值聚类算法的算法原理,进而理解无监督学习的意义,能够使用 Python 语言实现 K 均值聚类算法的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。
二、实验内容
(1)从 scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注 意同分布取样); (2)使用训练集训练 K 均值聚类算法,类别数为 3; (3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选 择; (4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验七的 部分。
三、算法步骤、代码、及结果
1. 算法伪代码
算法名称:基于 K 均值聚类的鸢尾花数据集分类及多维度性能评估
输入
鸢尾花数据集(包含特征数据以及对应的类别标签)
步骤
- 数据准备阶段
- o 从 sklearn 库中加载鸢尾花数据集,提取特征数据赋值给变量 X,类别标签赋值给变量 y。
- o 使用留出法,按照测试集占总样本的 0.33 比例,将数据集划分为训练集(X_train、y_train)和测试集(X_test、y_test),设置随机种子为 42 并通过 stratify=y 保证训练集和测试集的类别分布与原始数据集相似。
- 模型构建与训练阶段
- o 创建 K 均值聚类模型实例 kmeans,设定类别数为 3,随机数生成器的种子设为 42,同时显式设置 n_init 参数为 10。
- o 使用训练集数据(X_train、y_train)对 kmeans 模型进行训练。
- 交叉验证准备阶段
- o 利用训练好的 kmeans 模型对训练集 X_train 进行预测,得到训练集的预测标签 train_predictions。
- o 定义函数 evaluate_model,用于根据真实标签 y_true 和预测标签 y_pred 计算准确度(accuracy)、精度(precision)、召回率(recall)以及 F1 值(f1),计算精度、召回率、F1 值时采用 'weighted' 平均方式。
- 交叉验证阶段
- o 运用五折交叉验证方法,针对 kmeans 模型在训练集(X_train、y_train)上进行性能评估,将每次折叠得到的评估分数存储在 cross_val_scores 变量中。
- o 打印输出五折交叉验证得分(即 cross_val_scores 的值)。
- 训练集性能评估阶段
- o 调用 evaluate_model 函数,传入训练集的真实标签 y_train 和预测标签 train_predictions,计算并获取训练集上的准确度、精度、召回率以及 F1 值,分别赋值给变量 accuracy、precision、precision、f1。
- o 打印输出训练集上的各项评估指标,包括准确度、精度、召回率以及 F1 值。
- 测试集性能评估阶段
- o 利用训练好的 kmeans 模型对测试集 X_test 进行预测,得到测试集的预测标签 test_predictions。
- o 调用 evaluate_model 函数,传入测试集的真实标签 y_test 和预测标签 test_predictions,计算并获取测试集上的准确度、精度、召回率以及 F1 值,分别赋值给变量 test_accuracy、test_precision、test_recall、test_f1。
- o 打印输出测试集上的各项评估指标,包括准确度、精度、召回率以及 F1 值。
- 聚类效果评估阶段(使用轮廓系数)
- o 计算测试集的轮廓系数 silhouette_avg,通过 silhouette_score 函数传入测试集特征数据 X_test 和测试集预测标签 test_predictions 进行计算。
- o 打印输出测试集轮廓系数(即 silhouette_avg 的值)。
输出
- 五折交叉验证得分。
- 训练集上的准确度、精度、召回率以及 F1 值。
- 测试集上的准确度、精度、召回率以及 F1 值。
- 测试集轮廓系数。
详细描述五折交叉验证的过程
评估模型性能的指标有哪些?
如何选择合适的K值对于K均值聚类?
2. 算法主要代码
完整源代码\调用库方法(函数参数说明)
import
numpy as np
import pandas as pd
from sklearn import datasets
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.cluster import KMeans
from sklearn.metrics import accuracy_score, precision_score, recall_score,
f1_score
from sklearn.metrics import silhouette_score
# 1. 加载 iris 数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target
# 2. 留出法将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33,
random_state=42, stratify=y)
# 3. 训练 K 均值聚类算法,类别数为 3,设置 n_init 参数
kmeans = KMeans(n_clusters=3, random_state=42, n_init=10) # 显式设置 n_init
kmeans.fit(X_train)
# 4. 使用五折交叉验证评估模型性能
# 为了计算准确度、精度、召回率和 F1 值,我们需要将聚类结果和真实标签进行比较
# KMeans 返回聚类标签,我们使用其预测进行评估
# 先得到训练集的预测标签
train_predictions = kmeans.predict(X_train)
# 然后为了便于进行交叉验证,定义一个函数来计算评估指标
def evaluate_model(y_true, y_pred):
accuracy = accuracy_score(y_true,
y_pred)
precision = precision_score(y_true,
y_pred, average='weighted')
recall = recall_score(y_true, y_pred,
average='weighted')
f1 = f1_score(y_true, y_pred,
average='weighted')
return accuracy, precision, recall,
f1
# 进行五折交叉验证
cross_val_scores = cross_val_score(kmeans, X_train, y_train, cv=5)
print(f'五折交叉验证得分: {cross_val_scores}')
# 在训练集上评估模型
accuracy, precision, recall, f1 = evaluate_model(y_train, train_predictions)
print(f'训练集上的评估指标:\n准确度: {accuracy}\n精度: {precision}\n召回率: {recall}\nF1 值: {f1}')
# 5. 在测试集上测试模型性能
test_predictions = kmeans.predict(X_test)
test_accuracy, test_precision, test_recall, test_f1 = evaluate_model(y_test,
test_predictions)
print(f'测试集上的评估指标:\n准确度: {test_accuracy}\n精度: {test_precision}\n召回率: {test_recall}\nF1 值: {test_f1}')
# 6. 计算轮廓系数以评估聚类效果
silhouette_avg = silhouette_score(X_test, test_predictions)
print(f'测试集轮廓系数: {silhouette_avg}')
3. 训练结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
四、实验结果分析
1. 测试结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
2. 对比分析
在对 Iris 数据集应用 KMeans 聚类算法的分析中,模型的表现显著低于预期。五折交叉验证得分均为负值,显示出模型在训练集上的聚类效果不佳。此外,训练集和测试集的评估指标,包括准确度、精度、召回率和 F1 值,均较低,表明模型未能有效地区分各个聚类,且在未见数据上的泛化能力有限。测试集的轮廓系数为 0.525,显示出聚类效果一般,存在一定的重叠现象。
标签:score,训练,10.18,train,测试,聚类,test From: https://www.cnblogs.com/jais/p/18647895