K-Means聚类分析-无标签

模型亮点

  1. 初始测试集上评分为0.36,调参后测试集上评分为0.77
  2. 数据集由sklearn生成

-----------------------------------------以下为模型具体实现-----------------------------------------

Step1.数据读取

how 数据读取?

  • 使用make_blobs命令,生成数据集
  • 可指定样本数、特征数、聚类簇数等,以测试聚类算法
from sklearn.datasets import make_blobs
x,y=make_blobs(n_samples=600,n_features=10,centers=6,random_state=1) #10个特征值,可分为6簇

Step2.数据整理

import pandas as pd
df_x=pd.DataFrame(x)
df_x.columns=['feature1','feature2','feature3','feature4','feature5','feature6','feature7','feature8','feature9','feature10']
df_y=pd.DataFrame(y)
df_y.columns=['class']

Step3.划分训练集和测试集

why 划分训练集和测试集?

  • 把所有样本当作训练集,做过的题都是旧题,都会~
  • 把部分样本当作训练集,在新题上做测试,起到检测效果~
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.3,random_state=1)

Step4.启动聚类分析

how 启动聚类分析?

  1. 设定初始化参数
  2. 拟合训练集数据
from sklearn.cluster import KMeans
n=2 #初始参数设定
def kmeans(n,x_train,y_train):
    model=KMeans(n_clusters=n)
    model.fit(x_train,y_train)
    return model
model=kmeans(n,x_train,y_train)

Step5.模型评估-无标签(其实严格来说不算)

how 模型评估?

  • 有标签,用兰德指数
  • 无标签,用轮廓系数
from sklearn.metrics import silhouette_score
dic={} #定义空字典,存放轮廓系数
def lunkuo(model,x_test):
    y_pred=model.predict(x_test)
    print("轮廓系数:",round(silhouette_score(x_test,y_pred),2))
    dic[n]=(round(silhouette_score(x_test,y_pred),2))
    return model
print("-----初始聚成 2 簇-----")
model=lunkuo(model,x_test)

Step6.优化参数

why 优化参数?how 优化参数?

  1. 以提高测试集上评分
  2. 注意,这里不可用网格或随机搜索
  3. 因为两者以score最大化为目标,但无标签聚类,以轮廓系数最大化为目标
for n in range(3,9):
    print("-----聚成",n,"簇-----")
    model=kmeans(n,x_train,y_train) #训练模型
    model=lunkuo(model,x_test) #评估模型
print("-----最优参数-----")
print("最优簇数:",list(dic.keys())[list(dic.values()).index(max(dic.values()))]) #字典由value反查key
print("最优轮廓系数",max(dic.values())) #字典value中最大值

Step7.保存最优模型

why 保存模型?how 保存模型?

  1. for job-lib(工作自由)~
  2. dump转存模型,以pkl格式
  3. load加载模型
n=list(dic.keys())[list(dic.values()).index(max(dic.values()))] #最优簇数
model=kmeans(n,x_train,y_train) #训练最优模型
from sklearn.externals import joblib
joblib.dump(model,'d:\kmeans_nolabels.pkl')
new_model=joblib.load('d:\kmeans_nolabels.pkl')
new_model.predict(x_test)

-END

posted @ 2023-06-13 17:26  找回那所有、  阅读(151)  评论(0)    收藏  举报
这里到底了哦~(●'◡'●)