9.27
(1)从 scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注
意同分布取样);
(2)使用训练集训练 K 均值聚类算法,类别数为 3;
(3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选
择;
(4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验七的
部分。
import numpy as np from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split, KFold from sklearn.cluster import KMeans from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, adjusted_rand_score # 加载iris数据集 iris = load_iris() X = iris.data y = iris.target # 使用留出法划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/3, random_state=42, stratify=y) # 训练K均值聚类模型 kmeans = KMeans(n_clusters=3, random_state=42) kmeans.fit(X_train) # 由于聚类无真实标签,这里使用ARI(调整兰德指数)评估聚类效果,而不是准确度、精度、召回率和F1值(这些指标通常用于分类任务) # 五折交叉验证评估模型性能(使用ARI) kf = KFold(n_splits=5, shuffle=True, random_state=42) ari_scores = [] for train_index, test_index in kf.split(X_train): X_fold_train, X_fold_test = X_train[train_index], X_train[test_index] y_fold_train, y_fold_test = y_train[train_index], y_train[test_index] kmeans_fold = KMeans(n_clusters=3, random_state=42) kmeans_fold.fit(X_fold_train) y_pred_fold = kmeans_fold.predict(X_fold_test) ari_score = adjusted_rand_score(y_fold_test, y_pred_fold) ari_scores.append(ari_score) print("五折交叉验证ARI平均值:", np.mean(ari_scores)) # 使用测试集测试模型性能(使用ARI) y_pred = kmeans.predict(X_test) ari = adjusted_rand_score(y_test, y_pred) print("测试集ARI:", ari) # 测试结果分析 # 比较交叉验证和测试集的ARI if abs(ari - np.mean(ari_scores)) < 0.1: print("模型在训练集交叉验证和测试集上的聚类效果较为稳定。") else: print("模型在训练集交叉验证和测试集上的聚类效果差异较大,可能存在过拟合或欠拟合问题。") # 可以进一步分析聚类结果的分布情况等 cluster_labels = kmeans.labels_ cluster_sizes = [np.sum(cluster_labels == i) for i in range(3)] print("聚类结果分布:", cluster_sizes)

浙公网安备 33010602011771号