minisom分类功能
这个例子展示了如何使用 MiniSom 来解决分类问题。分类机制将使用 MiniSom 实现,评估将使用 sklearn。
首先,让我们加载一个数据集(在本例中是著名的 Iris 数据集)并应用归一化:
from minisom import MiniSom import numpy as np data = np.genfromtxt('iris.csv', delimiter=',', usecols=(0, 1, 2, 3)) data = np.apply_along_axis(lambda x: x/np.linalg.norm(x), 1, data) labels = np.genfromtxt('iris.csv', delimiter=',', usecols=(4), dtype=str)
这是一个简单的分类函数,它使用分配给相关获胜神经元的标签对数据中的样本进行分类。一个标签 C 如果映射到该神经元中的大多数样本具有标签,则与该神经元相关联 C. 该函数将分配数据集中最常见的标签,以防样本映射到未分配类别的神经元。
: def classify(som, data): """Classifies each sample in data in one of the classes definited using the method labels_map. Returns a list of the same length of data where the i-th element is the class assigned to data[i]. """ winmap = som.labels_map(X_train, y_train) default_class = np.sum(list(winmap.values())).most_common()[0][0] result = [] for d in data: win_position = som.winner(d) if win_position in winmap: result.append(winmap[win_position].most_common()[0][0]) else: result.append(default_class) return result
现在我们可以 1) 拆分训练和测试集中的数据,2) 训练 som,3) 打印包含所有指标的分类报告以评估分类结果。
from sklearn.model_selection import train_test_split from sklearn.metrics import classification_report X_train, X_test, y_train, y_test = train_test_split(data, labels, stratify=labels) som = MiniSom(7, 7, 4, sigma=3, learning_rate=0.5, neighborhood_function='triangle', random_seed=10) som.pca_weights_init(X_train) som.train_random(X_train, 500, verbose=False) print(classification_report(y_test, classify(som, X_test)))
precision recall f1-score support setosa 1.00 1.00 1.00 13
versicolor 0.92 1.00 0.96 12
virginica 1.00 0.92 0.96 13
accuracy 0.97 38
macro avg 0.97 0.97 0.97 38
weighted avg 0.98 0.97 0.97 38