基于机器学习的电信套餐个性化推荐模型的设计与实现

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

1. 项目简介

        随着互联网技术的快速发展和普及,用户消耗的流量也成井喷态势,近年来,电信运营商推出大量的电信套餐用以满足用户的差异化需求,面对种类繁多的套餐,如何选择最合适的一款对于运营商和用户来说都至关重要,尤其是在电信市场增速放缓,存量用户争夺愈发激烈的大背景下。针对电信套餐的个性化推荐问题,本项目通过数据挖掘技术构建了基于用户消费行为的电信套餐个性化推荐模型,根据用户业务行为画像结果,分析出用户消费习惯及偏好,匹配用户最合适的套餐,提升用户感知,带动用户需求,从而达到用户价值提升的目标。

        B站详情与代码下载:基于机器学习的电信套餐个性化推荐模型的设计与实现_哔哩哔哩_bilibili

基于机器学习的电信套餐个性化推荐模型的设计与实现

2. 功能组成

        基于机器学习的电信套餐个性化推荐模型的功能主要包括:

3. 数据读取与预处理

data_df = pd.read_csv('./dataset/train_all.csv')

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_df

contains_null(data_df)

data_df.info()

        数据字段含义如下:

字段中文名数据类型说明
USERID用户IDVARCHAR2(50)用户编码,标识用户的唯一字段
service_type套餐类型VARCHAR2(10)1:2I2C套餐,4:4G套餐
is_mix_service是否固移融合套餐VARCHAR2(10)1.是 0.否
online_time在网时长VARCHAR2(50)/
1_total_fee当月总出账金额_月NUMBER单位:元
2_total_fee当月前1月总出账金额_月NUMBER单位:元
3_total_fee当月前2月总出账金额_月NUMBER单位:元
4_total_fee当月前3月总出账金额_月NUMBER单位:元
month_traffic当月累计-流量NUMBER单位:MB
many_over_bill连续超套VARCHAR2(500)1-是,0-否
contract_type合约类型VARCHAR2(500)ZBG_DIM.DIM_CBSS_ACTIVITY_TYPE
contract_time合约时长VARCHAR2(500)/
is_promise_low_consume是否承诺低消用户VARCHAR2(500)1.是 0.否
net_service网络口径用户VARCHAR2(500)20AAAAAA-2G
pay_times交费次数NUMBER单位:次
pay_num交费金额NUMBER单位:元
last_month_traffic上月结转流量NUMBER单位:MB
local_trafffic_month月累计-本地数据流量NUMBER单位:MB
local_caller_time本地语音主叫通话时长NUMBER单位:分钟
service1_caller_time套外主叫通话时长NUMBER单位:分钟
service2_caller_timeService2_caller_timeNUMBER单位:分钟
gender性别varchar2(100)01.男 02女
age年龄varchar2(100)/
complaint_level投诉重要性VARCHAR2(1000)1:普通,2:重要,3:重大
former_complaint_num交费金历史投诉总量NUMBER单位:次
former_complaint_fee历史执行补救费用交费金额NUMBER单位:分

4. 数据探索式分析

4.1 预测目标为套餐类型 service_type

plt.figure(figsize=(10, 5))
sns.countplot(data_df['service_type'])
plt.title('套餐类型分布', fontsize=16, weight='bold')
plt.show()

4.2 是否固移融合套餐 is_mix_service

4.3 在网时长 online_time 分布

4.4 当月总出账金额_月 1_total_fee

4.5 当月累计-流量 month_traffic 分布

plt.figure(figsize=(15, 5))
sns.distplot(df_4G[df_4G['month_traffic'] < 20000][c], kde=True, color='red')

sns.distplot(df_2I2C[df_2I2C['month_traffic'] < 20000][c], kde=True, color='blue')
plt.title('2I2C套餐 VS 4G套餐-当月累计-流量', fontsize=16, weight='bold')

plt.show()

 4.6 连续超套 many_over_bill 分布

4.7 合约类型 contract_type 与 合约时长分布

4.8 是否承诺低消用户 is_promise_low_consume

4.9 网络口径用户 net_service 分布 

4.10 用户年龄 age 和性别 gender 分布

# 异常数据清洗
data_df['gender'] = data_df['gender'].map(lambda x: int(x) if x != '\\N' else 0)

df_4G['gender'] = df_4G['gender'].map(lambda x: int(x) if x != '\\N' else 0)
df_2I2C['gender'] = df_2I2C['gender'].map(lambda x: int(x) if x != '\\N' else 0)
plt.figure(figsize=(15, 5))

plt.subplot(121)
sns.countplot(df_4G['gender'])
plt.title('4G套餐-用户性别分布', fontsize=16, weight='bold')
plt.subplot(122)
sns.countplot(df_2I2C['gender'])
plt.title('2I2C套餐-用户性别分布', fontsize=16, weight='bold')

plt.show()

5. 电信套餐预测推荐模型

5.1 训练集、验证集和测试集划分

all_y = data_df['service_type']

del data_df['service_type']
del data_df['user_id']

all_x = data_df
# 特征名称列表
df_columns = data_df.columns.values
print('===> feature count: {}'.format(len(df_columns)))

X_train, X_test, y_train, y_test = train_test_split(all_x, all_y, test_size=0.1, random_state=42)
X_train, X_valid, y_train, y_valid = train_test_split(X_train, y_train, test_size=0.1, random_state=42)
print('train: {}, valid: {}, test: {}'.format(X_train.shape[0], X_valid.shape[0], X_test.shape[0]))
train: 602630, valid: 66959, test: 74399

5.2 决策树模型构建

xgb_params = {
    'eta': 0.1,
    'colsample_bytree': 0.1,
    'max_depth': 8,
    'subsample': 0.1,
    'lambda': 10,
    'scale_pos_weight': 100,
    'eval_metric': 'auc',
    'objective': 'binary:logistic',
    'nthread': -1,
    'silent': 1,
    'booster': 'gbtree'
}
model = xgb.train(dict(xgb_params),
                      dtrain,
                      evals=watchlist,
                      verbose_eval=1,
                      early_stopping_rounds=10,
[0]	train-auc:0.890915	valid-auc:0.888521
Multiple eval metrics have been passed: 'valid-auc' will be used for early stopping.

Will train until valid-auc hasn't improved in 10 rounds.
[1]	train-auc:0.918572	valid-auc:0.91634
[2]	train-auc:0.932513	valid-auc:0.930667
[3]	train-auc:0.966103	valid-auc:0.965251
[4]	train-auc:0.983685	valid-auc:0.983068 

5.3 特征重要程度分布

5.4 模型性能评估

# predict train
predict_train = model.predict(dtrain)
train_auc = evaluate_score(predict_train, y_train)

# predict validate
predict_valid = model.predict(dvalid)
valid_auc = evaluate_score(predict_valid, y_valid)

# predict test
predict_test = model.predict(dtest)
test_auc = evaluate_score(predict_test, y_test)

print('训练集 auc = {:.7f} , 验证集 auc = {:.7f} , 测试集 auc = {:.7f}\n'.format(
    train_auc, valid_auc, test_auc)
)
训练集 auc = 0.9836853 , 验证集 auc = 0.9830685 , 测试集 auc = 0.9833130

5.5 ROC 曲线

        可以看出,构建的决策树模型具备很好的预测性能,测试集 auc 达到 98.33%,可以根据不同用户的不同消费行为,有效的推荐 2I2C套餐或4G套餐。

6. 总结

        本项目通过数据挖掘技术构建了基于用户消费行为的电信套餐个性化推荐模型,根据用户业务行为画像结果,分析出用户消费习惯及偏好,匹配用户最合适的套餐,提升用户感知,带动用户需求,从而达到用户价值提升的目标。

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。技术交流、源码获取认准下方 CSDN 官方提供的学长 QQ 名片 :)

精彩专栏推荐订阅:

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

  • 6
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Python极客之家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值