Python之kmeans聚类分析

动手前可以先看下这三部分,对于一些数据分析类项目一定要了解对应算法以及相应统计学知识,可参考如下链接:
Kmeans—sklearn—聚类分析详解
Kmeans聚类选择最优K值python实现
Kmeans算法学习笔记
下面的数据划分基于对用户爬虫相关的分类,对于此部分用户考虑其某些风险特征值(涉及风控策略不谈),进行风险剔除后进行相关反爬分析,剔除低频率查询用户,留下风险存疑的用户进行分类。
分类代码如下:

from sklearn.cluster import KMeans
#from sklearn.decomposition import PCA
import pandas as pd
import numpy as np
#import matplotlib.pyplot as plt
from sklearn.metrics import silhouette_score
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']#中文字体
mpl.rcParams['axes.unicode_minus'] = False



df=pd.read_csv(r'C:\Users\116815\Desktop\kk.csv', header=0, encoding='utf-8')
df1=df.iloc[:,2:4]
# '利用SSE选择聚类数'
SSE = []  # 存放每次结果的误差平方和
for k in range(1, 9):
    estimator = KMeans(n_clusters=k)  # 构造聚类器
    estimator.fit(df1)
    SSE.append(estimator.inertia_)
    print (estimator.inertia_)# interation迭代 inertia惯性
X = range(1, 9)
plt.xlabel('k')
plt.ylabel('SSE')
plt.plot(X, SSE, 'o-')
plt.show()  

Scores = []  # 存放轮廓系数
for k in range(2, 9):
    estimator = KMeans(n_clusters=k)  # 构造聚类器
    estimator.fit(df1)
    Scores.append(silhouette_score(df1, estimator.labels_, metric='euclidean'))
X = range(2, 9)
plt.xlabel('k')
plt.ylabel('轮廓系数')
plt.plot(X, Scores, 'o-')
plt.show()

k=3 #聚类数
kmeans = KMeans(n_clusters=k, random_state=10,verbose=False).fit(df1)#构造聚类器 聚类
#print (kmeans.inertia_) #组内平方和 误差平方和 SSE verbose=true时候可以看到
df1['lable']=kmeans.labels_ #获取聚类标签
label_pred=kmeans.labels_ #每个样本对应的簇类别标签

##各个类别的数目
df_count_type=df1.groupby('lable').count()
# print(df_count_type)
##聚类中心
center= pd.DataFrame(kmeans.cluster_centers_) 
# print(center)
new_df=df1[:]
#new_df.to_csv(r'C:\Users\116815\Desktop\new_df.csv',encoding='utf-8-sig')
  
##将用于聚类的数据的特征的维度降至2维,并输出降维后的数据,形成一个dataframe名字new_pca
# pca = PCA(n_components=2)
# new_pca = pd.DataFrame(pca.fit_transform(new_df))
##可视化

for i,colors,mark in zip(range(k),['red','green','blue','orange','pink'],['.','*','+','o','^']):
    d=new_df[label_pred == i].values
    plt.scatter(d[:, 1], d[:, 0], c = colors, marker=mark, label='label'+str(i))
    # print(center[1][i],center[0][i])
    plt.scatter(center[1][i],center[0][i],s=100,c='black',marker='+')#行 列
plt.xlabel('品类量')
plt.ylabel('sku_level量')
plt.legend(loc=2)#左边展示标签
plt.gcf().savefig(r'C:\Users\116815\Desktop\kmeans.png')
plt.show()

因数据偏态可能存在效果不是很好,可以看到簇较为分散。
Python之kmeans聚类分析_第1张图片
根据此图可以划分出低中高风险爬取用户,纳入风控范围,进行相应人脸、短信验证、降频、禁止查询等风控策略,也可以考虑相应爬取时间整体查询量升降情况进行风险值的升降,此处只考虑按天划分数据,后续可对应小时、分钟等风险查询数据划分。

你可能感兴趣的:(python,聚类算法,sql,人工智能,数据挖掘)