一、实验目的
深入理解 K 均值聚类算法的算法原理,进而理解无监督学习的意义,能够使用 Python语言实现 K 均值聚类算法的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。
二、实验内容
(1)从 scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注意同分布取样);
(2)使用训练集训练 K 均值聚类算法,类别数为 3;
(3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选择;
(4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验七的部分。
三、算法步骤、代码、及结果
1. 算法伪代码
开始
数据集 = load_iris()
特征 = 数据集.data
标签 = 数据集.target
训练集特征, 测试集特征, 训练集标签, 测试集标签 = train_test_split(特征, 标签, 测试集比例=1/3, 随机种子=42, 同分布取样)
模型 = KMeans(类别数=3, 随机种子=42)
模型.fit(训练集特征)
指标 = {
'准确度': accuracy_score,
'精度': precision_score(加权平均),
'召回率': recall_score(加权平均),
'F1值': f1_score(加权平均)
}
对于 每个指标 在 指标 中:
交叉验证得分 = cross_val_score(模型, 训练集特征, 训练集标签, 折数=5, 评分=指标)
输出(指标 + " : " + 交叉验证得分的平均值)
预测结果 = 模型.predict(测试集特征)
报告 = classification_report(测试集标签, 预测结果)
输出(报告)
结束
2. 算法主要代码
完整源代码\调用库方法(函数参数说明)
'''
Created on 2024年12月12日
@author: 席酒
'''
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.cluster import KMeans
from sklearn.metrics import make_scorer, accuracy_score, precision_score, recall_score, f1_score, classification_report
# 加载 iris 数据集
iris = 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=0.33, random_state=42, stratify=y)
# 创建 KMeans 模型,类别数为 3
kmeans = KMeans(n_clusters=3, random_state=42)
# 使用训练集进行训练
kmeans.fit(X_train)
# 定义评估指标
scoring = {
'accuracy': make_scorer(accuracy_score),
'precision': make_scorer(precision_score, average='weighted'),
'recall': make_scorer(recall_score, average='weighted'),
'f1': make_scorer(f1_score, average='weighted')
}
# 进行五折交叉验证
scores = {metric: cross_val_score(kmeans, X_train, y_train, cv=5, scoring=scoring[metric]) for metric in scoring}
# 输出每个指标的平均值
for metric, score in scores.items():
print(f"{metric} : {score.mean():.4f} ± {score.std():.4f}")
# 使用测试集进行预测
y_pred = kmeans.predict(X_test)
# 输出分类报告
report = classification_report(y_test, y_pred)
print(report)
3. 训练结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
四、实验结果分析
1. 测试结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
2. 对比分析
K 均值聚类算法在此数据集上的表现不佳,可能是因为该算法主要用于无监督学习,而 iris 数据集的标签信息未能有效利用。