机器学习- K-Means聚类-mushroom dataset-蘑菇数据集 python scikit-learn
前言
无监督学习- K-Means聚类
K-Means聚类是一种无监督学习算法。在无监督学习中,机器学习模型在训练过程中没有得到标签。相反,它必须自己找出标签。
K-Means聚类需要在训练前指定簇的数量。这种算法的工作方式超出了本笔记本的范围,但这里有3个主要步骤,这种算法是如何工作的:
- K-Means将随机分配数据样本到所有聚类的初始质心。这个步骤称为初始化。质心也被称为集群中心,它是集群中所有样本数据的平均值。
- 然后将样本重新分配到最近的质心。
- 通过取分配给每个先前质心的所有样本的平均值来找到所有簇的新质心。
重复最后两个步骤,直到满足停止准则或新旧质心之差恒定为止。
1.导入数据
在本实验中,将使用蘑菇数据集。该数据集描述了蘑菇的物理特性,并将它们分为:有毒或可食用。
该数据集还包括23种蘑菇的假设样本的描述。每个物种都被确定为绝对可食用,绝对有毒,或未知的可食用性,不推荐。后一类和有毒的一类混在一起。该指南明确指出,没有简单的规则来确定蘑菇的可食性;
数据集包含标签edibility(可食用性),但为了进行聚类,实验中将删除标签。
import numpy as np
import pandas as pd
import seaborn as sns
import sklearn
import matplotlib.pyplot as plt
%matplotlib inline
import warnings
warnings.filterwarnings('ignore')
from sklearn.datasets import fetch_openml
mushroom_data = fetch_openml(name='mushroom', version=1)
2.探索性数据分析
# 检查缺失值
mushroom_data.isnull().sum()
在特征stalk-root(茎根)中缺少值。
缺失值处理方式通常有三种:
- 完全移除所有缺失的值
- 保持原样
- 用给定的策略填充,比如均值、中数值或众数。Sklearn或Pandas都提供了一种快速填充这些值的方法。
#去除缺失值
mushroom_df = mushroom_data.dropna()
#删除标签
mushroom = mushroom_df.drop('class', axis=1)
mushroom_labels = mushroom_df['class']
#把所有的分类特征转换成数字
from sklearn.preprocessing import OrdinalEncoder
encoder = OrdinalEncoder()
mushroom_prepared = encoder.fit_transform(mushroom)
mushroom_prep_df = pd.DataFrame(mushroom_prepared, columns=mushroom.columns)
3.训练K-Means聚类
将从sklearn.cluster中创建一个KMeans模型,集群的数量是2。
from sklearn.cluster import KMeans
k_clust = KMeans(n_clusters=2, random_state=42)
k_clust.fit(mushroom_prep_df)
4.评价K-Means聚类
首先将真实标签转换为数字或对其进行编码。
map_dict = {
'p':0,
'e':1
}
mushroom_labels_prep = mushroom_labels.map(map_dict)
from sklearn.metrics import accuracy_score
accuracy_score(mushroom_labels_prep, k_labels) #0.673458540042523
结果不是很好,因为KMeans从来没有看过标签,它只是给它提供了有毒蘑菇和可食用蘑菇的不同特征的数据,它的工作是试图在数据中找到模式,从而了解某种蘑菇是有毒的还是可食用的。
KMeans算法在有大量未标记数据的情况下非常有用。