数据说明
目标要求是实现wine数据集的聚类算法
实现思路及步骤
(1)使用pandas库读取wine数据集
(2)将wine数据集的数据和标签拆分开。
(3)将wine数据集划分为训练集和测试集。
(4)标准化wine数据集。
(5)对wine数据集进行PCA降维。
(6)构建聚类数目为3的K-Means模型。
(7)对比真实标签和聚类标签求取FMI。
(8)在聚类数目为2~10类时,确定最优聚类数目。
(9)求取模型的轮廓系数,绘制轮廓系数折线图,确定最优聚类数目。
(10)求取Calinski-Harabasz指数,确定最优聚类数目。
具体实现
(1)使用pandas库读取wine数据集。
import pandas as pd
import numpy as np
wine = pd.read_csv(r'C:\Users\alan\Desktop\归档课后实训\第6章\wine.csv')
print('wine:',wine.shape)
(2)将wine数据集的数据和标签拆分开。
根据数据说明,我们发现wine数据集的标签为class
wine数据集的标签
wine_target = wine['Class']#酒类的标签为类别
print('wine数据集的标签为:\n',wine_target)
wine数据集的特征
wine_names = wine.iloc[:,1:]#wine数据集的特征名
print(wine_names.head(n = 2))#输出前两列
(3)将wine数据集划分为训练集和测试集。
使用train_test_split()函数,如果传入的是一组数据(2个,分别为训练集和测试集),那么生成的就是这一组数据随机划分后的训练集和测试集总共两组(4个)。
接受的参数test_size若为浮点数代表测试集占总数的百分比,若为int型则为测试集的指定数目。
random_state参数代表随机种子编号
print('原始数据集标签的形状为: ',wine_target.shape)
print('原始数据集特征的形状为: ',wine_names.shape)
from sklearn.model_selection import train_test_split
wine_data_train, wine_data_test, \
wine_target_train, wine_target_test = \
train_test_split(wine_names, wine_target, test_size = 0.2, random_state = 42)
#测试集和训练集2,8分,随机种子代码为42
print('训练集数据的形状为: ',wine_data_train.shape)
print('训练集标签的形状为: ',wine_target_train.shape)
print('测试集数据的形状为: ',wine_data_test.shape)
print('测试集标签的形状为: ',wine_target_test.shape)
(4)标准化wine数据集。
转换器主要有两个方法。
fit()通过分析特征和目标值提取有价值的信息
transform()对特征进行转换
from sklearn.preprocessing import StandardScaler
stdScale = StandardScaler().fit(wine_data_train)#生成规则
#将规则应用于训练集
wine_trainScaler = stdScale.transform(wine_data_train)
#将规则应用于测试集
wine_testScaler = stdScale.transform(wine_data_test)
print('标准差标准化后训练集数据的方差为:',np.var(wine_trainScaler))
print('标准差标准化后训练集数据的均值为:',np.mean(wine_trainScaler))
print('标准差标准化后测试集数据的方差为:',np.var(wine_testScaler))
print('标准差标准化后测试集数据的均值为:',np.mean(wine_testScaler))
(5)对wine数据集进行PCA降维。
from sklearn.decomposition import PCA
#生成规则
pca = PCA(n_components = 5).fit(wine_trainScaler)
#应用于测试集
wine_trainPca = pca.transform(wine_trainScaler)
#应用于训练集
wine_testPca = pca.transform(wine_testScaler)
print('降维后数据集测试集的形状为:',wine_testPca.shape)
print('降维后数据集训练集的形状为:',wine_trainPca.shape)
(6)构建聚类数目为3的K-Means模型。
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters = 3, random_state = 123).fit(wine_trainPca)#构建并训练模型
print('构建的k-Means模型为:\n',kmeans);
同时进行了聚类结果的可视化
#聚类结果可视化
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
#使用TSNE进行数据降维,降成两维
tsne = TSNE(n_components = 2, init = 'random', random_state = 177).fit(wine_trainPca)
df = pd.DataFrame(tsne.embedding_)#将原始数据转换为DataFrame
df['labels'] = kmeans.labels_#将聚类结果存储进df数据表
#提取不同标签的数据
df1 = df[df['labels'] == 0]
df2 = df[df['labels'] == 1]
df3 = df[df['labels'] == 2]
#绘制图像
fig = plt.figure(figsize = (9, 6))#设定空白画布并制定大小
#用不同颜色表示不同数据
plt.plot(df1[0], df1[1], 'bo', df2[0], df2[1], 'r*', df3[0], df3[1], 'gD')
plt.show()
(7)对比真实标签和聚类标签求取FMI。
from sklearn.metrics import fowlkes_mallows_score
score = fowlkes_mallows_score(wine_target_train,kmeans.labels_)
print('wineTrain数据集类FMI评价分值为: %f'%(score))
(8)在聚类数目为2~10类时,确定最优聚类数目。
for i in range(2, 11):
#构建并训练模型
kmeans = KMeans(n_clusters = i, random_state = 123).fit(wine_trainPca)#构建并训练模型
score = fowlkes_mallows_score(wine_target_train,kmeans.labels_)
print('wineTrain数据集%d类FMI评价分值为: %f'%(i, score))
(9)求取模型的轮廓系数,绘制轮廓系数折线图,确定最优聚类数目。
通过图标发现当聚类数目为3时,效果最佳
from sklearn.metrics import silhouette_score
import matplotlib.pyplot as plt
sillhouettteScore = []
for i in range(2, 11):
#构建并训练模型
kmeans = KMeans(n_clusters = i, random_state = 123).fit(wine_trainPca)#构建并训练模型
# print(wine_trainPca.shape, ' ' ,kmeans.labels_.shape)
score = silhouette_score(wine_trainPca,kmeans.labels_)
sillhouettteScore.append(score)
plt.figure(figsize=(10, 6))
plt.plot(range(2, 11), sillhouettteScore, linewidth = 1.5, linestyle = '-')
plt.show()
(10)求取Calinski-Harabasz指数,确定最优聚类数目。
from sklearn import metrics
for i in range(2, 11):
kmeans = KMeans(n_clusters = i, random_state = 123).fit(wine_trainPca)#构建并训练模型
score = metrics.calinski_harabasz_score(wine_trainPca,kmeans.labels_)
print('wineTrain数据集%d类calinski_harabaz指数为: %f'%(i, score))