项目分享:机器学习电信套餐个性化推荐模型

1. 项目简介

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

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套餐。

项目分享

项目分享:

https://gitee.com/asoonis/feed-neo

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值