亲宝软件园·资讯

展开

K-means用户画像聚类模型

拼命_小李 人气:0

一、概述

使用K-means进行用户聚类划分主要的目的是实现用户画像的电影推荐系统,该推荐包括两部分,第一部分通过协同过滤实现电影推荐 ,第二部分,构建用户画像实现电影推荐,实现通过静态属性实现:用户性别,年龄,地域,角色(学生、上班族、待业)、地域、婚姻状态,使用聚类(K-mens)算法对人群进行划分,实现相同人群的电影推荐,其次动态属性:通过记录用户行为数据,搜索记录使用word2vec模型实现相似搜索关键词推荐影片。(推荐系统我后续会进行讲解)

文中使用语言为python3.6以上实现,使用的工具是jupyter-notebook进行开发,主要利用python的sklearn、pandas、faker、matplotlib等库实现。

摘要:本文主要讲述的是第二部分使用K-means聚类构建用户画像模型从而实现相同用户喜爱电影的推荐

二、理论

K-means是一种无监督的聚类算法,主要思想就是先随机选取K个对象作为初始的聚类中心。然后计算每个对象与各个种子聚类中心之间的距离,从而找出相似对象。

三、实现

数据获取

我们聚类前需要数据信息:包括姓名、年龄、性别、地址、工作类别、婚姻状态等等,但是我们棘手的问题,数据从哪里来呢,获取数据有目前有两种方式:第一种你可以通过网络爬虫技术去爬取信息相关个人信息,第二种python拥有强大的库faker能够帮助我们实现用户信息自动模拟生成。faker的使用方法可以参照我之前写的博客哦~faker生成用户信息

from faker import Faker
import pandas as pd
import numpy as np
from collections import OrderedDict
fake = Faker(locale='zh_CN')
sex_dict = OrderedDict([('男', 0.52), ('女', 0.48)])
married_dict = OrderedDict([('未婚', 0.4), ('已婚', 0.5), ('离异', 0.1), ])
work_dict = OrderedDict([('在职', 0.7), ('自由职业', 0.3), ])
type_dict = OrderedDict([('白领', 0.45), ('教师', 0.1), ('工人', 0.2), ('公务员', 0.1), ('销售', 0.15)])
name = []
age = []
address = []
sex = []
work = []
married = []
type = []
# 生成人数
num = 1000
# 生成name age address 
for i in range(num):
    name.append(fake.name())
    age.append(fake.random_int(min=16,max=45))
    address.append(fake.province())
    sex.append(fake.random_element(sex_dict))
    work.append(fake.random_element(work_dict))
    type.append(fake.random_element(type_dict))
    married.append(fake.random_element(married_dict))
data = {'name':name,'age':age,'sex':sex,'address':address,'work':work,'married':married,'type':type}
users = pd.DataFrame.from_dict(data)

数据处理

上面我们已经成功利用faker库生成了用户信息,但是我们想想,计算机算法是不可能明白中文含义的,那么如何让kmeans模型知道这些数据的含义意义呢?我们需要将上述产生的数据进行向量化操作,文本向量化有很多方法,例如:one-hot、tfidf等等,当然不同的向量化方式有个自的优劣,感兴趣大家可以去单独了解,此处不做详细解答。

本文中就是使用one-hot思想将不同维度的数据利用字典映射的方式将其转化为数据向量。

sex_map = {'男':0, '女':1}
married_map = {'未婚':0,'已婚':1,'离异':2}
work_map = {'在职':0, '自由职业':1}
type_map = {'白领':0,'教师':1,'工人':2,'公务员':3,'销售':4}
addr_map = {'上海市':0,'云南省':1,'内蒙古自治区':2,'北京市':3,'台湾省':4,'吉林省':5,'四川省':6,'天津市':7,'宁夏回族自治区':8
,'安徽省':9,'山东省':10,'山西省':11,'广东省':12,
'广西壮族自治区':13,'新疆维吾尔自治区':14,'江苏省':15,'江西省':16,'河北省':17,'河南省':18,'浙江省':19,'海南省':20,'湖北省':21,'湖南省':22,'澳门特别行政区':23,'甘肃省':24,
'福建省':25,'西藏自治区': 26,'贵州省':27,'辽宁省':28,'重庆市':29,'陕西省':30,'青海省':31,'香港特别行政区':32,'黑龙江省':33}

然后使用pandas中的map方法将每个维度数据按照上述字典类型进行向量化操作 ,转化后如下图所示:

users['married'] = users['married'].map(married_map)

模型实现

我们使用sklearn机器学习库创建kmeans模型,需要注意的是在使用kmeans分类前,向量做了一次数据标准化。

数据标准化的目的是通过对数据的每一个维度的值进行重新调节,使得最终的数据向量落在 [0,1]区间内,经过标准化处理后,原始数据转化为无量纲化指标测评值,各指标值处于同一数量级别,可进行综合测评分析。如果直接用原始指标值进行分析,就会突出数值较高的指标在综合分析中的作用,相对削弱数值水平较低指标的作用。

我将标准化步骤和kmeans模型做了一个连接所以都放到了一起,实现代码如下:

model = Pipeline([
    ('BN',preprocessing.StandardScaler()),('KMS',KMeans())
])
model.fit(X)
# 保存模型
joblib.dump(model,  "./model/model.pkl")
model = joblib.load("./model/model.pkl")
y_pred = model.predict(X)
# 将预测结果放入向量化的总数据里存储
users['lable'] = y_pred

模型保存并测试

model = joblib.load("./model/model.pkl")
y_pred = model.predict([X[0]])
y_pred

聚类结果可视化

使用adviz可视化原理是将一系列多维空间的点通过非线性方法映射到二维空间的可视化技术来实现可视化展示。

import matplotlib.pyplot as plt
from pandas.plotting import radviz
"""
adviz可视化原理是将一系列多维空间的点通过非线性方法映射到二维空间的可视化技术,是基于圆形平行坐标系的设计思想而提出的多维可视化方法。圆形的m条半径表示m维空间,使用坐标系中的一点代表多为信息对象,其实现原理参照物理学中物体受力平衡定理。
       mm维空间的点{Ai1,Ai2,...,AimAi1,Ai2,...,Aim}映射到二维可视空间的位置由弹簧引力分析模型确定。
      首先将一个圆等分成 mm份,等分点的个数由数据维度决定,记各等分点为{R1,R2,...,RnR1,R2,...,Rn},每个等分点上固定一个弹簧,各个弹簧的弹性系数不同,弹簧 jj的弹性系数是AijAij,也就是第 jj维的值,所有mm个弹簧的另一端军固定在一个小圆上,如果这个小圆最终达到一个平衡位置 Bi={Xi,Yi}TBi={Xi,Yi}T,则弹力平衡点 {Xi,Yi}{Xi,Yi}就是m维空间点{ Ai1,Ai2,...,AimAi1,Ai2,...,Aim}在二维空间的投影点。
      博客:https://blog.csdn.net/Haiyang_Duan/article/details/78985225
"""
plt.figure('用户画像聚类',figsize=(15, 7.5), dpi=80)
plt.title('radviz')
radviz(users.loc[:,'age':], class_column='lable')
plt.show()

加载全部内容

相关教程
猜你喜欢
用户评论