最全!导入csv文件+归一化+PCA降维+K-Means聚类+效果评估+可视化 项目实战

数据说明

最全!导入csv文件+归一化+PCA降维+K-Means聚类+效果评估+可视化 项目实战_第1张图片

 目标要求是实现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

最全!导入csv文件+归一化+PCA降维+K-Means聚类+效果评估+可视化 项目实战_第2张图片 wine数据集的标签

wine_target = wine['Class']#酒类的标签为类别
print('wine数据集的标签为:\n',wine_target)

最全!导入csv文件+归一化+PCA降维+K-Means聚类+效果评估+可视化 项目实战_第3张图片

 wine数据集的特征

wine_names = wine.iloc[:,1:]#wine数据集的特征名
print(wine_names.head(n = 2))#输出前两列

最全!导入csv文件+归一化+PCA降维+K-Means聚类+效果评估+可视化 项目实战_第4张图片

(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)

最全!导入csv文件+归一化+PCA降维+K-Means聚类+效果评估+可视化 项目实战_第5张图片

(4)标准化wine数据集。

转换器主要有两个方法。

fit()通过分析特征和目标值提取有价值的信息

transform()对特征进行转换

最全!导入csv文件+归一化+PCA降维+K-Means聚类+效果评估+可视化 项目实战_第6张图片

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))

最全!导入csv文件+归一化+PCA降维+K-Means聚类+效果评估+可视化 项目实战_第7张图片

(5)对wine数据集进行PCA降维。

最全!导入csv文件+归一化+PCA降维+K-Means聚类+效果评估+可视化 项目实战_第8张图片

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模型。

最全!导入csv文件+归一化+PCA降维+K-Means聚类+效果评估+可视化 项目实战_第9张图片

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()

最全!导入csv文件+归一化+PCA降维+K-Means聚类+效果评估+可视化 项目实战_第10张图片

 

(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))

最全!导入csv文件+归一化+PCA降维+K-Means聚类+效果评估+可视化 项目实战_第11张图片

 

(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()

最全!导入csv文件+归一化+PCA降维+K-Means聚类+效果评估+可视化 项目实战_第12张图片

(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))

最全!导入csv文件+归一化+PCA降维+K-Means聚类+效果评估+可视化 项目实战_第13张图片

 

你可能感兴趣的:(kmeans,聚类,python,1024程序员节,机器学习)