摘要:
本文通过使用wine数据集来构建K-Means聚类模型,先对wine数据集的原始样本进行数据预处理,得到预处理后的数据作为我们的新数据样本,通过sklearn的估计器接收进行学习的数据用于训练算法,构建聚类模型;完成模型构建对模型进行评价分析,本文具体对FMI评价法、轮廓系数评价法、Calinski-Harabasz指数评价法三种评价方法进行具体的介绍和操作。通过metrics模块提供的聚类模型评价指标,我们可以对比真实target和聚类tatget求取FMI评分,同时对于范围内的类别数目我们也可以通过评价指标得到模型的最优解,确定聚类的最优数目;求取范围内的类别数目我们求取轮廓系数,绘制对应系数的折线图,确定最优聚类数目;第三种对范围内的类别数目求取Calinski-Harabasz指数,确定最优的聚类数目。三种评估方法对实际模型评估方式皆有不同,结合三种评价方法与模型的实际情况我们进行对比可以发现FMI评价方法对于此模型的评估参考价值最高。
前言:
skleran数据分析的基本任务主要体现在分类、聚类、回归三类上,而不同的类又有许多种评估方法,用以对我们所构建的模型进行评价,得到最优模型。
目标:
对winedataset构建K-Means聚类模型:
具体步骤:
1、首先通过pandas文件读取方法读取wine数据集的数据,代码如下:
2、通过观察数据的字段我们可以将wine数据区分成两个部分,即数据部分和target部分,代码如下:
3、得到wine数据的两个部分以后我们开始对数据进行分割成训练集train和测试集test,代码如下:
其中我们的train_test_split()方法参数分别是wine的数据部分和wine的target部分,两个参数分别分割成对应的训练集和测试集,所以return的有四个参数,我们分别以wineDataTrain、wineDataTest、wineTargetTrain、wineTargetTest代表wine数据训练集、wine数据测试集、wineTarget训练集、wineTarget测试集,test_size=0.1意义是将训练集和测试集以1:9的比例进行划分,random_state=23保证结果重现
4、数据预处理过程,对特征进行标准差标准化,即sklearn中模块StandardScaler进行规则生成,代码如下:
这部分主要是对数据特征进行标准差标准化操作,逻辑步骤是我们根据步骤三得到的有wineDataTrain和wineDataTest,在生成规则的时候我们需要根据训练集的数据来对规则进行“训练”,得到我们需要的Scaler之后分别应用于训练集和测试集,最后再用transformer转换器的transform方法对特征进行转换返回给我们的wineDataTrainScaler和wineDataTestScaler两个样本,这样就完成了我们的数据预处理的基本操作
5、数据预处理的最后一个步骤,我们对得到的两个样本需要进行PCA降维,代码如下:
降维的逻辑和标准化操作相似,首先根据我们步骤四得到的wineDataTrainScaler和wineDataTestScaler两个样本作为我们此处操作的初始样本,载用pca的转换器对特征进行转换返回,完成降维。即通过Scaler训练样本对pca“规则”进行训练,然后将pcs分别应用于Scaler的训练集样本和测试集样本,以上五步我们就完成了我们的全部预处理过程。
完成数据预处理后我们可以开始对wine数据进行建模,首先我们通过步骤一可以发现在数据中并没有tag,所以我们可以构建一个聚类模型,同时对模型的好坏进行评估。
6、根据上面的逻辑我们先对模型进行构建,构建一个聚类数目为3的KMeans模型,代码如下:
通过wineDataTrainScaler,也就是我们在数据预处理最后一步中的转换数据作为我们的建模初始样本
7、模型聚类数目为3的模型构建完毕,我们需要通过对比wine数据的真实标签,即wineTagetTrain和聚类后的标签进行比较,对模型进行评价,代码如下:
因为我们聚类数目是根据自己的经验来选取,但是该数目不一定是最优,我们要怎么判断KMeans聚类模型的最优聚类数目是多少,所以还需要进一步分析。FMI评价法本身需要真实值,也就是我们的wineTargetTrain样本数据。
8、我们在2-10次聚类数目中进行分析比较,为了保证准确也可以扩大聚类数目范围,但是聚类数目为3本身就是最优解,为了减少我们的机器运行时间,这里取2-10为例,代码如下:
从FMI评分中我们可以看出评分最高的聚类数目为第三次聚类模型,达到了0.925的评分(最佳值为1.0),所以我们的选取数目3即为FMI认可的最优聚类次数
9、但是仅用一种评价方法的说服力不足,所以我们在用轮廓系数评价法来对聚类次数进行选择,代码如下:
这里我们可以看到我们评价中fit的给定参数与FMI的参数不同,原因在于FMI需要真实值,而轮廓系数评价法不需要真实值,根据其畸变程度越大越优我们可以观察到图中3、5时畸变程度最大,所以轮廓系数评价法认为聚类次数为3和5的时候为最优解,而3畸变略大于5,但是根据图像并不能很直观看出区别
10、在这里我们再通过另一个不需要真实值的评价方法来对模型聚类次数进行分析,代码如下:
Calinski-Harabasz指数评价法最佳值为相较最大时为最优解,其数值大部分与聚类的种类呈正相关,我们可以发现最优的聚类次数为10次
总结:
三种方法我们可以分析,FMI评价法认为的最优解为3次聚类数目,而轮廓系数评价法认为最优解为3和5,其中3略胜于5的聚类数目,在Calinski-Harabasz指数评价法中最优聚类数目为10次,通过增大我们的范围可以判断出第三种,即Calinski-Harabasz指数评价法不适用该聚类模型。后两者的聚类模型评估方法在没有真实值作为参考的时候能够达到我们预期效果,但是在这个wine模型中我们很明显的是有Target部分,即我们的数据标签,所以本身有真实值,自然使用FMI评价法可以很好的评估我们此聚类模型。没有真实值的时候后两者结合则可以得到一个很好的结果。
wine的K-Means聚类模型总代码如下:
import pandas as pd
wine=pd.read_csv('wine.csv')
wine.head()
#data daparting
wineData=wine.iloc[:,1:]
wineTarget=wine.iloc[:,0]
print('wineData:n',wineData.head(2))
print("wineTarget:n",wineTarget.head(2))
#data spliting
from sklearn.model_selection import train_test_split
wineDataTrain,wineDataTest,wineTargetTrain,wineTargetTest=train_test_split(wineData,wineTarget,test_size=0.1,random_state=23)
print("wineDataTrain",wineDataTrain.shape)
print("wineDataTest",wineDataTest.shape)
print("wineTargetTrain",wineTargetTrain.shape)
print("wineTargetTest",wineTargetTest.shape)
#data preprocessing
import numpy as np
from sklearn.preprocessing import StandardScaler
#generate the stdScaler by wineDataTrain
stdScaler=StandardScaler().fit(wineDataTrain)
#stdScaler应用于训练集
wineDataTrainScaler=stdScaler.transform(wineDataTrain)
#stdScaler应用于测试集
wineDataTestScaler=stdScaler.transform(wineDataTest)
print("after trainsforming:")
print("np.var of :wineDataTrainScaler",np.var(wineDataTrainScaler))
print("np.mean of :wineDataTrainScaler",np.mean(wineDataTrainScaler))
print("np.var of :wineDataTestScaler",np.var(wineDataTestScaler))
print("np.mean of :wineDataTestScaler",np.mean(wineDataTestScaler))
#pca.transform
from sklearn.decomposition import PCA
#generate the pca by the wineDataTrainScaler
pca=PCA(n_components=5).fit(wineDataTrainScaler)
#将pca应用于训练集
wineDataTrainPca=pca.transform(wineDataTrainScaler)
#将pca应用于测试集
wineDataTestPca=pca.transform(wineDataTestScaler)
print('after pca.transform:')
print("wineDataTrainPca.shape",wineDataTrainPca.shape)
print("wineDataTestPca.shape",wineDataTestPca.shape)
#构建模型
from sklearn.cluster import KMeans
kmeans=KMeans(n_clusters=3,random_state=23).fit(wineDataTrainScaler)
print("The modeln",kmeans)
#FMI score
from sklearn.metrics import fowlkes_mallows_score
score=fowlkes_mallows_score(wineTargetTrain,kmeans.labels_)
print("The score:n",score)
#2-10次聚类数目最优类次数
for i in range(2,11):
kmeans=KMeans(n_clusters=i,random_state=23).fit(wineDataTrainScaler)
score=fowlkes_mallows_score(wineTargetTrain,kmeans.labels_)
print("第{}次聚类模型的FMI评分是:{}".format(i,score))
from sklearn.metrics import silhouette_score
import matplotlib.pyplot as plt
silhouettteScore=[]
for i in range(2,11):
kmeans=KMeans(n_clusters=i,random_state=23).fit(wine)
score=silhouette_score(wine,kmeans.labels_)
silhouettteScore.append(score)
plt.figure(figsize=(12,6))
plt.plot(range(2,11),silhouettteScore,linewidth=1.5,linestyle='-',color='red')
plt.show()
from sklearn.metrics import calinski_harabaz_score
for i in range(2,11):
kmeans=KMeans(n_clusters=i,random_state=23).fit(wine)
score=calinski_harabaz_score(wine,kmeans.labels_)
print("第{}次聚类模型的Calinski-Harabasz指数评分是:{}".format(i,score))
wine的K-Means聚类模型效果如下:
The model:
The result:
The figure:
The Calinski-Harabasz:
欢迎大家加入人工智能圈参与交流
人工智能学习圈 - 知乎www.zhihu.com