sklearn使用KMeans聚类算法对消费行为特征数据进行分类

样本数据选取的是消费行为数据,包括4列:主键,最近一次消费间隔,消费频率,消费总金额。k-means算法在收敛时采用的是欧式距离算法。

代码如下:

1
import pandas as pd

In [2]:

1
inputfile = '/Users/frontc/book/ppdam/consumption_data.xls'

In [3]:

1
outputfile = '/Users/frontc/book/ppdam/data_type.xls'

In [4]:

1
k = 3 # 分成3类

In [5]:

1
iteration = 500 # 聚类最大循环次数

In [6]:

1
data = pd.read_excel(inputfile,index_col='Id') # 读取样本数据

In [8]:

1
data[:3] # 样本示例,r为最近一次消费时间间隔,f为消费频率,m为消费的总金额

Out[8]:

R F M
Id
1 27 6 232.61
2 3 5 1507.11
3 4 16 817.62

In [9]:

1
data_zs = 1.0 * (data - data.mean())/data.std() #采用零均值法对数据进行标准化,标准化后的数据均值为0,标准差为1

In [10]:

1
from sklearn.cluster import KMeans # 导入kmeans算法包

In [11]:

1
model = KMeans(n_clusters=k,n_jobs=4,max_iter=iteration) #初始化模型.分成3类,并发4,最大迭代500次

In [12]:

1
model.fit(data_zs) # 开始聚类

Out[12]:

1
2
3
KMeans(copy_x=True, init='k-means++', max_iter=500, n_clusters=3, n_init=10,
n_jobs=4, precompute_distances='auto', random_state=None, tol=0.0001,
verbose=0)

In [19]:

1
2
r = pd.concat([data,pd.Series(model.labels_,index=data.index)],axis=1) # 将分类结果model.labels_打到数据data上去,axis=1代表横向连接
r.columns=list(data.columns)+[u'聚类类别'] # 给新加的列赋一个列名

In [23]:

1
r[:3] # 查看一下

Out[23]:

R F M 聚类类别
Id
1 27 6 232.61 2
2 3 5 1507.11 2
3 4 16 817.62 1

In [20]:

1
r.to_excel(outputfile) # 输出到excel中