温馨提示:文末有 CSDN 平台官方提供的学长 Wechat / QQ 名片 :)

1. 项目背景

随着用户数据量的激增,传统的数据分析方法和营销方式受到巨大的挑战,急需对海量数据进行深度挖掘, 探索用户消费行为数据的潜在价值。本项目对原有的推荐模型进行优化,基于品牌的性能,价格及用户使用信息,对用户实行换机预测并推荐倾向的终端应用。通过模型对用户换机时机进行预测,并推荐终端模型,换机预测模型运用随机森林算法对数据进行预测,终端偏好推荐模型通过聚类算法,对用户群体进行分类,最终对模型进行输出,总结偏好分析和聚类结果,构造终端选择升级对照库和热机库,对推荐目标机型进行排序获得结果。

2. 功能组成

基于聚类算法与随机森林算法的手机终端换机推荐系统的功能主要包括:

3. 数据读取与预处理

3.1 依赖包导入和数据读取

导入数据分析所需要的依赖包:

%%time
import os
import gc
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib as mpl
import matplotlib.pyplot as plt
from IPython.display import display
np.random.seed(7)
plt.style.use('fivethirtyeight')
from tqdm import tqdmimport warnings
warnings.filterwarnings('ignore')from matplotlib.font_manager import FontProperties
# 读取字体路径,设置字体为思源黑体
myfont=FontProperties(fname=r'/System/Library/Fonts/Hiragino Sans GB.ttc')
sns.set(font=myfont.get_name())

本项目采用某电信服务商近一年的用户终端换机数据,每个月为一个csv文件,pandas读取后,进行数据的拼接:

month_df = pd.concat([month1_df, month2_df, month3_df, month4_df, month5_df, month6_df, month7_df, month8_df, month9_df, month10_df, month11_df, month12_df], axis=0)del month1_df, month2_df, month3_df, month4_df, month5_df, month6_df
del month7_df, month8_df, month9_df, month10_df, month11_df, month12_df

3.2 数据缺失值分析和填充

def contains_null(dataframe):missing_df = dataframe.isnull().sum(axis=0).reset_index()missing_df.columns = ['column_name', 'missing_count']missing_df['missing_rate'] = 1.0 * missing_df['missing_count'] / dataframe.shape[0]missing_df = missing_df[missing_df.missing_count > 0]missing_df = missing_df.sort_values(by='missing_count', ascending=False)return missing_dfcontains_null(month_df)
column_name missing_count missing_rate
6 终端品牌 383568 0.063928
7 终端型号 383566 0.063928
5 ARPU值段 60642 0.010107
8 流量使用量 1940 0.000323

可以看出,部分字段存在一定的缺失情况,对于类别型特征,按照众数进行缺失值填充:

# “ARPU值段” 字段填充为众数 ’0-49‘
month_df['ARPU值段'].fillna("0-49", inplace = True)
month_df['流量使用量'].fillna("0-499", inplace = True)
# 对于终端型号缺失的用户数据需要删除,由于需要判断用户是否换机,终端型号不可缺失
month_df.dropna(inplace=True)

3.3 异常值去除

user_month_df = month_df.groupby('IMSI').count().reset_index()# 对于数据记录存在月份缺失的用户,进行删除
drop_users = set(user_month_df[user_month_df['月份'] != 12]['IMSI'].values.tolist())
print('存在 {} 异常用户的数据缺失部分月份,这类用户进行删除'.format(len(drop_users)))month_df['drop'] = month_df['IMSI'].map(lambda x: x in drop_users)
month_df = month_df[month_df['drop'] != True]
del month_df['drop']

完成预处理后的数据集如下,数据集一共包含 466986 个用户,5603832 条记录:

4. 数据探索式分析

4.1 使用手机的用户的性别、网别的分布

可以看出,本次数据中使用手机的男性较多,并且存在少量性别缺失的数据,对于此类缺失值,考虑填充为性别出现最多的男性。

4.2 用户的年龄值段、ARPU值段(每用户平均收益)的分布情况

4.3 用户使用手机的终端品牌的分布情况

brand_df = month_df['终端品牌'].value_counts().reset_index()
brand_df.columns = ['终端品牌', 'Count']
print('手机品牌数:', brand_df.shape[0])
brand_df.head()print(brand_df['终端品牌'].values.tolist()[:100])
手机品牌数: 2258
['Apple', 'Samsung', '苹果', 'Nokia', '三星', 'Xiaomi', 'Lenovo', 'HUAWEI', '小米', '华为', '**', 'HTC', 'Coolpad', 'OPPO', 'NOT KNOWN', '联想', '诺基亚', 'BBK', 'ZTE', '欧珀', 'Gionee', 'Motorola', '宇龙', '宏达', '微软', 'EMULATIONAL', 'K-Touch', 'LG', 'Sony', 'SonyEricsson', 'Meizu', '中兴', '步步高', 'TCL', 'Cinterion', '金立', '魅族', 'Basicom', '维沃', 'Daxian Pantech', '索尼', 'Bifer', '摩托罗拉', 'Hisense', 'CINTERION', 'AOLE', 'AUX', 'Bird', 'Sharp', 'ETON', 'Haier', '酷派', 'HUAWEI TECHNOLOGY', 'Pioneer', 'Wellphone', 'CECT', 'Telsda', '索尼爱立信', 'F-FOOK', '浪潮乐金', 'Vogo', 'ARES', 'Sunup', '天宇朗通', '宝捷讯', 'Hedy', 'NOTKNOWN', '贝尔丰', 'OUKI', 'Noain', 'OPSSON', 'SICT', 'OZZO', '海信', 'ChangHong', 'Boway', 'Jugate', 'Koobee', 'Blackberry', 'SanCup', '亿通', 'SAGA', 'ECETD', 'Konka', '大显泛泰', '海尔', 'SangFei', '奥乐', 'ASUS', 'TETC', 'Doov', '奥克斯', 'Forme', 'HOSIN', '酷乐', 'AMOI', 'SOP', 'EBEST', '沃歌', 'Elitek']

可以看出,手机品牌多达 2280 个!且有的手机品牌是同一个品牌,只是中英文不同的表达,如 苹果和Apple。因此需要做数据归一化处理!

plt.figure(figsize=(16, 5))
plt.subplot(121)
plt.scatter(range(brand_df.shape[0]), brand_df['Count'])plt.subplot(122)
tmp = brand_df[brand_df['Count'] > 50000]
plt.scatter(range(tmp.shape[0]), tmp['Count'])
plt.show()print('终端品牌个数大于 50000 的有 {} 种'.format(tmp.shape[0]))

终端品牌个数大于 50000 的有 15 种,手机品牌个数呈现严重的长尾分布,将品牌数小于一定阈值的手机设置为’其他‘类别。

4.4 终端型号的分布情况

        可以看出,终端型号个数大于 10000 的有 50 种,需要注意的是,此处不能对终端型号进行类似出现次数少于一定阈值设置为其他的操作,因为需要根据终端型号的变化情况,决定用户是否进行了换机行为!

4.5 流量使用量、语音通话时长、短信条数的分布情况

plt.figure(figsize=(16, 5))
plt.subplot(121)
tmp = month_df[month_df['语音通话时长'] < 2500]
sns.distplot(tmp['语音通话时长'], bins=50, color='red')
plt.title('语音通话时长的密度分布直方图', fontsize=16, weight='bold')plt.subplot(122)
tmp = month_df[(month_df['短信条数'] > 0) & (month_df['短信条数'] < 1000)]
sns.distplot(tmp['短信条数'], bins=50, color='blue')
plt.title('短信条数的密度分布直方图', fontsize=16, weight='bold')
plt.show()

5. 终端推荐机器学习建模

利用用户 1 - 11 月份的终端使用记录数据,预测第十二月份是否会换机,以及换机的概率。选择 10000 个用户作为训练集、2500 个的用户作为验证集,2500 个用户数据作为测试集。

train_users, valid_users, test_users = all_users[:10000], all_users[10000:12500], all_users[12500:15000]print('训练集个数:', len(train_users))
print('验证集个数:', len(valid_users))
print('测试集个数:', len(test_users))

5.1 特征工程

# 将类别特征进行 one-hot 编码
net_type_df = pd.get_dummies(month_df['网别'], prefix='网别')
month_df = pd.concat([month_df, net_type_df], axis=1)
del month_df['网别']sex_df = pd.get_dummies(month_df['性别'], prefix='性别')
month_df = pd.concat([month_df, sex_df], axis=1)
del month_df['性别']# 将字符类型且存在大小顺序的特征进行 labelencoder 编码
from sklearn.preprocessing import LabelEncoderencoder = LabelEncoder()
month_df['年龄值段'] = encoder.fit_transform(month_df['年龄值段'])
month_df['ARPU值段'] = encoder.fit_transform(month_df['ARPU值段'])
month_df['流量使用量'] = encoder.fit_transform(month_df['流量使用量'])# 对于终端品牌、终端型号类型的特征,由于不同的终端品牌和型号众多,不适合 One-hot 编码,也采用 labelencoder 编码
month_df['终端品牌'] = encoder.fit_transform(month_df['终端品牌'])
month_df['终端型号'] = encoder.fit_transform(month_df['终端型号'])

可以看出,编码后的数据不包含字符串类型的类别特征,均编码成了模型可处理的数值类型的特征。

基于用户历史的换机行为时间序列数据,构造其他特征,受篇幅限制,此处省略。

        训练集中换机的用户占 0.0951,有 951 个用户 验证集中换机的用户占 0.0912,有 228 个用户 测试集中换机的用户占 0.1024,有 256 个用户。

5.2 聚类算法和随机森林算法对用户终端换机进行分析建模

plt.figure(figsize=(16, 6))
plt.bar(['聚类 Train F1', '随机森林 Train F1', '聚类 Valid F1', '随机森林 Valid F1', '聚类 Test F1', '随机森林 Test F1'], [ktrain_f1, rtrain_f1, kvalid_f1, rvalid_f1, ktest_f1, rtest_f1])
plt.show()

5.3 对预测结果进行可视化

可以看出:

  • 随机森林模型预测效果相比聚类算法效果要好
  • 测试集的 F1 值指标为 0.8083-0.9068,结果TSNE聚类后,红色为终端换机的用户,可以看出模型预测效果较好!

6. 总结

本项目对原有的推荐模型进行优化,基于品牌的性能,价格及用户使用信息,对用户实行换机预测并推荐倾向的终端应用。通过模型对用户换机时机进行预测,并推荐终端模型,换机预测模型运用随机森林算法对数据进行预测,终端偏好推荐模型通过聚类算法,对用户群体进行分类,最终对模型进行输出,总结偏好分析和聚类结果,构造终端选择升级对照库和热机库,对推荐目标机型进行排序获得结果。

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。

技术交流认准下方 CSDN 官方提供的学长 QQ 名片 :)

精彩专栏推荐订阅:

1. Python 毕设精品实战案例
2. 自然语言处理 NLP 精品实战案例
3. 计算机视觉 CV 精品实战案例

基于聚类算法与随机森林算法的手机终端换机推荐相关推荐

  1. 基于R语言的随机森林算法运用

    有关数据挖掘中的分类算法有很多,如贝叶斯判别法.Fisher判别法.决策树.支持向量机和随机森林等,本文将对随机森林做一个介绍,并使用R语言实现该算法的应用. 随机森林算法的实质是基于决策树的分类器集 ...

  2. 随机森林的java算法_spark 随机森林算法案例实战

    随机森林算法 由多个决策树构成的森林,算法分类结果由这些决策树投票得到,决策树在生成的过程当中分别在行方向和列方向上添加随机过程,行方向上构建决策树时采用放回抽样(bootstraping)得到训练数 ...

  3. 算法梳理:随机森林算法梳理

    1集成学习概念 集成学习是集成多个"个体学习器". 主要是通过构建并结合多个学习器来完成学习任务,也被称为多分类器系统. 集成学习结构:先产生一组个体学习器,再用某种策略将他们结合 ...

  4. matlab 随机森林算法_随机森林算法

    随机森林是一种灵活,易于使用的机器学习算法,即使没有超参数调整,也能在大多数情况下产生出色的结果.它也是最常用的算法之一,因为它简单,并且可以用于分类和回归任务.在这篇文章中,您将学习随机森林算法如何 ...

  5. 基于sklearn随机森林算法对鸢尾花数据进行分类

    随机森林定义 随机森林(Random Forest,RF),顾名思义就是将多棵相互之间并无关联的决策树整合起来形成一个森林,再通过各棵树投票或取均值来产生最终结果的分类器.在介绍随机森林前需要了解几个 ...

  6. 基于sklearn随机森林算法探究肥胖的成因

    目录 项目背景 数据介绍 数据来源 属性介绍 算法介绍 随机森林算法 决策树 随机森林定义 随机森林构建过程 随机森林算法评价 随机森林算法的发展现状及趋势 实验步骤 1.导入模块与数据 2.查看数据 ...

  7. 基于随机森林算法的人脸数据集分类

    目录 1. 作者介绍 2. 关于理论方面的知识介绍 随机森林 3. 实验过程 3.1 数据集介绍 3.2 实验代码 3.3 运行结果 3.3 实验总结 参考 1. 作者介绍 李佳敏,女,西安工程大学电 ...

  8. 随机森林算法(Random Forest)Python实现

    目录 前言 一.什么是Random Forest ? 1.1 什么是监督式机器学习? 1.2 什么是回归和分类? 1.3 什么是决策树? 1.4 什么是随机森林? 二.Random Forest 的构 ...

  9. gbdt 算法比随机森林容易_用Python实现随机森林算法

    CDA数据分析师 出品 拥有高方差使得决策树(secision tress)在处理特定训练数据集时其结果显得相对脆弱.bagging(bootstrap aggregating 的缩写)算法从训练数据 ...

  10. 保姆级随机森林算法Python教学

    摘要 机器学习算法是数据挖掘.数据能力分析和数学建模必不可少的一部分,而随机森林算法和决策树算法是其中较为常用的两种算法,本文将会对随机森林算法的Python实现进行保姆级教学. 0 绪论       ...

最新文章

  1. pythonjoin函数所在包_Python中的join()函数
  2. UA MATH564 概率论I 求离散型随机变量的分布1
  3. 一篇搞定,分布式系统中唯一主键生成
  4. 无偏PU learning简介
  5. java 根据类名示例化类_Java LocalDateTime类| ofInstant()方法与示例
  6. Python模拟随机漫步
  7. 设计师对孟菲斯设计风还不了解?
  8. 普通地图的六大要素_地图的基本要素是什么 主要是哪三大要素
  9. 下面是编写html语言的工具,thymeleaf是用于编写html模版的编程语言(工具语言)...
  10. base64编码_动画演示 Base 64 编码
  11. JavaScript高级程序设计第四版
  12. java web(java ee)实现wordle猜单词游戏
  13. Win7/8/10系统下Protel 99 SE不能添加元件库 File is not recognized
  14. 手机HiFi嗨不嗨 看完这些才能算是入坑
  15. 全网最全的人类图解析(下)——类型、人生角色、定义等
  16. python爬虫爬取博客_Python爬虫抓取csdn博客
  17. Spring Cloud Eureka源码分析之心跳续约及自我保护机制
  18. java中的match函数_js 正则表达式中的match函数
  19. iso文件连接ftp服务器,使用本机文件浏览器访问FTP服务器 | MOS86
  20. 2022年Java应届生面试之Spring框架基础知识

热门文章

  1. isis软件添加源代码c语言,ProteusISIS和Keil软件入门学习..doc
  2. 小米路由器3 保姆级救砖回忆录及实操技巧演示
  3. 敏感词过滤和谐社会1.0版
  4. Nsight Compute Profile Kernel无法定位源码问题
  5. Bookmarks(2005-4-23)
  6. 学经济为什么学python_工具&方法丨划重点 ! 经济学专业学Python需要学哪些内容?——数据分析处理必知必会的知识点...
  7. 基于MeanShift的Camshift算法原理详解(opencv实现,有源码)
  8. 网页上的html表格导出excel表格,网页表格导出至Excel
  9. 关于compaq visual fortran6.6 安装问题的解决方法
  10. 电赛练习之旋转倒立摆PID调节