1目标
本次主要介绍机器学习之聚类,主要解决分类的问题。
通过KMean算法、KNN算法、MeanShift算法这三个算法的实战,通过对比,来了解和掌握各个算法的特点。
机器学习之聚类介绍
无监督学习
聚类
聚类分析
常用的聚类算法
K近邻分析模型(KNN)
均值漂移聚类
实战准备
任务介绍
实战一:采用Kmeans算法实现2D数据类别划分
1、采用Kmeans算法实现2D数据自动聚类,预测V1=80,V2=60数据类别
2、完成结果矫正,计算预测准确率,
实战二:采用KNN算法实现2D数据类别划分
1、采用KNN算法实现2D数据的分类,预测V1=80,V2=60数据类别
2、计算预测准确率
实战三:采用MeanShift算法实现2D数据类别划分
1、采用MeanShift算法实现2D数据自动聚类,预测V1=80,V2=60数据类别
2、完成结果矫正,计算预测准确率,
流程
1、导入文件
2、定义X和y
3、可视化数据
4、创建模型
5、查看聚类的中心点
6、将中心点可视化
7、预测测试数据
8、基于训练数据进行预测
9、查看模型的准确率
10、可视化数据结果
11、矫正聚类结果
12、矫正后的结果重新进行准确率评估
13、重新将结果可视化
具体步骤
实战一:采用Kmeans算法实现2D数据类别划分
1、导入文件数据
import numpy as np
import pandas as pd
path='Desktop/artificial_intelligence/Chapter4/data.csv'
data=pd.read_csv(path)
data.head()
2、定义X和y
X=data.drop('labels',axis=1)
y=data['labels']
x1=X['V1']
x2=X['V2']
print(x1.shape,x2.shape,X.shape,y.shape)
y.value_counts()
(3000,) (3000,) (3000, 2) (3000,)
2 1156
1 954
0 890
Name: labels, dtype: int64
通过y的数据可以看到y有三个标签。
3、可视化数据
1、可视化不带标签的数据分布情况
from matplotlib import pyplot as plt
fig1=plt.figure()
plt.scatter(x1,x2)
plt.xlabel('V1')
plt.ylabel('V2')
plt.show()
2、可视化带标签的数据分布情况
fig2=plt.figure()
label0=plt.scatter(x1[y==0],x2[y==0])
label1=plt.scatter(x1[y==1],x2[y==1])
label2=plt.scatter(x1[y==2],x2[y==2])
plt.legend((label0,label1,label2),('label0','label1','label2'))
plt.xlabel('V1')
plt.ylabel('V2')
plt.show()
4、创建模型
from sklearn.cluster import KMeans
km=KMeans(n_clusters=3,random_state=0)
km.fit(X)
5、找到聚类的中心点
km.cluster_centers_
array([[ 69.92418447, -10.11964119],
[ 40.68362784, 59.71589274],
[ 9.4780459 , 10.686052 ]])
6、将中心点放到散点图中进行可视化
fig3=plt.figure()
label0=plt.scatter(x1[y==0],x2[y==0])
label1=plt.scatter(x1[y==1],x2[y==1])
label2=plt.scatter(x1[y==2],x2[y==2])
plt.scatter(center[:,0],center[:,1])
plt.legend((label0,label1,label2),('label0','label1','label2'))
plt.xlabel('V1')
plt.ylabel('V2')
plt.show()
7、预测测试数据:V1=80,V2=60
test_pred=km.predict([[80,60]])
test_pred
array([1], dtype=int32)
得到的结果是1,但是我们可以看到1是橙色的,结果为橙色的到底对不对呢,我们后面会有分析。
8、基于训练数据进行预测
y_predict=km.predict(X)
print(pd.value_counts(y_predict))
print(pd.value_counts(y))
1 1149
0 952
2 899
dtype: int64
2 1156
1 954
0 890
Name: labels, dtype: int64
9、查看模型准确率
from sklearn.metrics import accuracy_score
accu=accuracy_score(y,y_predict)
accu
0.0023333333333333335
可以看到几乎没有准确率,是真的预测不准,还是什么原因导致的呢,下面我们通过可视化数据对比查找原因。
10、可视化数据结果
fig4=plt.figure(figsize=(20,7))
plt.subplot(121)
label0=plt.scatter(x1[y==0],x2[y==0])
label1=plt.scatter(x1[y==1],x2[y==1])
label2=plt.scatter(x1[y==2],x2[y==2])
plt.legend((label0,label1,label2),('label0','label1','label2'))
plt.title('label data')
plt.xlabel('V1')
plt.ylabel('V2')
plt.subplot(122)
label0=plt.scatter(x1[y_predict==0],x2[y_predict==0])
label1=plt.scatter(x1[y_predict==1],x2[y_predict==1])
label2=plt.scatter(x1[y_predict==2],x2[y_predict==2])
plt.scatter(center[:,0],center[:,1])
plt.legend((label0,label1,label2),('label0','label1','label2'))
plt.title('predict data')
plt.xlabel('V1')
plt.ylabel('V2')
plt.show()
从上图可以看出来预测结果跟原始结果对比,可以发现,预测的图形是几乎一样的,但是颜色也就是标签的类别不一样,我们把预测的标签类别改成跟原始数据的标签类别一样,再测试下准确率。
11、矫正聚类结果
从上面可以得知,模型存在的问题是自动分类了,但是标签是模型自己定义的,跟我们自定义的标签不一致,所以要矫正标签结果,矫正后再进行准确率评估
y_corrected=[]
for i in y_predict:
if i==2:
y_corrected.append(0)
elif i==0:
y_corrected.append(1)
else:
y_corrected.append(2)
print(pd.value_counts(y_corrected),pd.value_counts(y))
2 1149
1 952
0 899
dtype: int64
2 1156
1 954
0 890
Name: labels, dtype: int64
12、重新进行准确率评估
accu_corrected=accuracy_score(y,y_corrected)
accu_corrected
0.997
可以看到矫正标签结果后的预测准确率达到了99.7%。说明整个模型的对这次数据的分类效果还是可以的。
13、重新可视化数据结果
1、先将数据转成numpy向量或者pandas的Series
y_corrected=np.array(y_corrected)
y_corrected
2、重新可视化
fig5=plt.figure(figsize=(20,7))
plt.subplot(121)
label0=plt.scatter(x1[y==0],x2[y==0])
label1=plt.scatter(x1[y==1],x2[y==1])
label2=plt.scatter(x1[y==2],x2[y==2])
plt.legend((label0,label1,label2),('label0','label1','label2'))
plt.title('label data')
plt.xlabel('V1')
plt.ylabel('V2')
plt.subplot(122)
label0=plt.scatter(x1[y_corrected==0],x2[y_corrected==0])
label1=plt.scatter(x1[y_corrected==1],x2[y_corrected==1])
label2=plt.scatter(x1[y_corrected==2],x2[y_corrected==2])
plt.scatter(center[:,0],center[:,1])
plt.legend((label0,label1,label2),('label0','label1','label2'))
plt.title('corrected data')
plt.xlabel('V1')
plt.ylabel('V2')
plt.show()
可以看到数据的标签更改后,模型的预测结果跟原始数据几乎一样,正确率达到了99.7%。
实战二:采用KNN算法实现2D数据类别划分
1、检查下数据
X.head()
y.head()
0 0
1 0
2 0
3 0
4 0
Name: labels, dtype: int64
print(X.shape,y.shape)
(3000, 2) (3000,)
数据没问题
2、建立KNN的模型
from sklearn.neighbors import KNeighborsClassifier
knn=KNeighborsClassifier(n_neighbors=3)
knn.fit(X,y)
3、预测测试数据 V1=80,V2=60
test_pre=knn.predict([[80,60]])
test_pre
array([2])
结果为2,也就是预测的标签为2
4、准确率评估
y_knn_pred=knn.predict(X)
accu_knn=accuracy_score(y,y_knn_pred)
accu_knn
1.0
正确率为100%。
5、对比原数据,可视化预测的结果
fig6=plt.figure(figsize=(20,7))
plt.subplot(121)
label0=plt.scatter(x1[y==0],x2[y==0])
label1=plt.scatter(x1[y==1],x2[y==1])
label2=plt.scatter(x1[y==2],x2[y==2])
plt.legend((label0,label1,label2),('label0','label1','label2'))
plt.title('label data')
plt.xlabel('V1')
plt.ylabel('V2')
plt.subplot(122)
label0=plt.scatter(x1[y_knn_pred==0],x2[y_knn_pred==0])
label1=plt.scatter(x1[y_knn_pred==1],x2[y_knn_pred==1])
label2=plt.scatter(x1[y_knn_pred==2],x2[y_knn_pred==2])
plt.legend((label0,label1,label2),('label0','label1','label2'))
plt.title('knn data')
plt.xlabel('V1')
plt.ylabel('V2')
plt.show()
可以看到是预测标签结果跟原数据是一模一样的。
实战三:采用MeanShift算法实现2D数据类别划分
MeanShift算法是无监督学习算法,训练数据只需有X,需要计算出带宽(区域半径)R。
优点是:不指定分类的个数。
1、导入模块
from sklearn.cluster import MeanShift
2、导入估算带宽的算法并生成带宽
from sklearn.cluster import estimate_bandwidth
bw=estimate_bandwidth(X,quantile=0.25,n_samples=500)
bw
22.316516974831334
参数的含义是:从X中随机选取500个样本,计算每一对样本的距离,然后选取这些距离的0.25分位数作为返回值
3、建立模型
ms=MeanShift(bandwidth=bw)
ms.fit(X)
4、查看预测结果有几个类别
y_pred_ms=ms.predict(X)
pd.value_counts(y_pred_ms)
也可以用查看center的方法查看又个center就有几个类别
center2=ms.cluster_centers_
center2
array([[ 40.76028371, 60.02078311],
[ 70.0425046 , -10.01220699],
[ 9.28397274, 10.79930746]])
5、可视化数据结果
fig7=plt.figure(figsize=(20,7))
plt.subplot(121)
label0=plt.scatter(x1[y==0],x2[y==0])
label1=plt.scatter(x1[y==1],x2[y==1])
label2=plt.scatter(x1[y==2],x2[y==2])
plt.legend((label0,label1,label2),('label0','label1','label2'))
plt.title('label data')
plt.xlabel('V1')
plt.ylabel('V2')
plt.subplot(122)
label0=plt.scatter(x1[y_pred_ms==0],x2[y_pred_ms==0])
label1=plt.scatter(x1[y_pred_ms==1],x2[y_pred_ms==1])
label2=plt.scatter(x1[y_pred_ms==2],x2[y_pred_ms==2])
plt.scatter(center2[:,0],center2[:,1])
plt.legend((label0,label1,label2),('label0','label1','label2'))
plt.title('meanshift data')
plt.xlabel('V1')
plt.ylabel('V2')
plt.show()
6、结果矫正
y_new=[]
for i in y_pred_ms:
if i==0:
y_new.append(2)
elif i==2:
y_new.append(0)
else:
y_new.append(1)
print(pd.value_counts(y_new),pd.value_counts(y))
2 1149
1 952
0 899
dtype: int64
2 1156
1 954
0 890
Name: labels, dtype: int64
7、查看矫正后的准确率
accu_ma=accuracy_score(y,y_new)
accu_ma
0.997
8、将矫正后的结果可视化
1、先将数据转成numpy向量或者pandas的Series
y_new=np.array(y_new)
y_new
array([0, 0, 0, …, 1, 1, 1])
2、可视化矫正后的结果和原始数据结果对比图
fig8=plt.figure(figsize=(20,7))
plt.subplot(121)
label0=plt.scatter(x1[y==0],x2[y==0])
label1=plt.scatter(x1[y==1],x2[y==1])
label2=plt.scatter(x1[y==2],x2[y==2])
plt.legend((label0,label1,label2),('label0','label1','label2'))
plt.title('label data')
plt.xlabel('V1')
plt.ylabel('V2')
plt.subplot(122)
label0=plt.scatter(x1[y_new==0],x2[y_new==0])
label1=plt.scatter(x1[y_new==1],x2[y_new==1])
label2=plt.scatter(x1[y_new==2],x2[y_new==2])
plt.scatter(center2[:,0],center2[:,1])
plt.legend((label0,label1,label2),('label0','label1','label2'))
plt.title('meanshift data')
plt.xlabel('V1')
plt.ylabel('V2')
plt.show()
总结
1、KMean算法、KNN算法、MeanShift算法是解决分类问题的算法
2、KMean算法里面建模的时候random_state代表随机种子值,只要选定一个数字,哪怕是0,下次重新运行的时候结果是固定不变的,但是当赋值为None或者不赋值的时候,每次都会随机分配数据,有可能结果的标签数值【0,1,2】会来回变动。但这个算法里生成的中心点始终是不变的。
3、KMean算法是无监督学习算法,需要给定分类的个数,训练数据只需有X,根据数据自己生成标签,所以跟初始的标签可能不同,矫正结果后,可以看到分类的准确在这次的数据中还是挺高的。
4、KMean需要指定分类的数量。
5、KNN算法是有监督的学习算法,训练数据有X和y标签。
6、MeanShift算法是无监督学习算法,训练数据只需有X,需要计算出带宽(区域半径)R,可以不指定分类的个数。
7、MeanShift算法指定的带宽不一样,得到的结果也会有差别,中心点也会有变动。
Original: https://blog.csdn.net/dfly_zx/article/details/124457272
Author: flare zhao
Title: 人工智能:第四章 机器学习之聚类
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/549762/
转载文章受原作者版权保护。转载请注明原作者出处!