2022科大讯飞:电信客户流失预测挑战赛
赛题介绍
随着市场饱和度的上升,电信运营商的竞争也越来越激烈,电信运营商亟待解决减少用户流失,延长用户生命周期的问题。对于客户流失率而言,每增加5%,利润就可能随之降低25%-85%。因此,如何减少电信用户流失的分析与预测至关重要。
鉴于此,运营商会经常设有客户服务部门,该部门的职能主要是做好客户流失分析,赢回高概率流失的客户,降低客户流失率。某电信机构的客户存在大量流失情况,导致该机构的用户量急速下降。面对如此头疼的问题,该机构将部分客户数据开放,诚邀大家帮助他们建立流失预测模型来预测可能流失的客户。
赛题任务
给定某电信机构实际业务中的相关客户信息,包含69个与客户相关的字段,其中“是否流失”字段表明客户会否会在观察日期后的两个月内流失。任务目标是通过训练集训练模型,来预测客户是否会流失,以此为依据开展工作,提高用户留存。
代码实现
作为一个研0的小趴菜,学过的技术实在是太少,就决定用最简单的KNN来解决吧,用的方法也都是sklearn里提供的现成的,软件用的jupyter notebook。初次接触,代码写得很不好,但对于我的水平来说能做出结果就可以,所以新手们可以参考一下,大佬请自觉跳过。
导入模块
from sklearn.neighbors import KNeighborsClassifier
import pandas as pd
from sklearn.model_selection import GridSearchCV
数据导入和准备
train = pd.read_csv('./train.csv')
test = pd.read_csv('./test.csv')
#将训练集和测试集连接在一起组成data
data = pd.concat([train, test], axis=0, ignore_index=True)
#训练数据/测试数据准备
display(data)
features = [f for f in data.columns if f not in ['是否流失','客户ID']]
#对’是否流失‘做空值处理,之后重置索引
train = data[data['是否流失'].notnull()].reset_index(drop=True)
test = data[data['是否流失'].isnull()].reset_index(drop=True)
x_train = train[features]
x_test = test[features]
y_train = train['是否流失']
#print(y_train)
使用GridSearchCV寻找最佳参数组合,并进行训练和预测
param = {"n_neighbors": range(5,13),
"weights": ["uniform", "distance"],
}
gs = GridSearchCV(estimator=KNeighborsClassifier(), param_grid=param,
cv=3, scoring="roc_auc", n_jobs=-1, verbose=10)
gs.fit(x_train, y_train)
print(gs.best_params_)
y_test = gs.best_estimator_.predict(x_test)
# 最好的分值。训练集的分值
print("分值:",gs.best_score_)
# 最好的超参数组合。
print("超参数组合:",gs.best_params_)
# 使用最好的超参数训练好的模型。
print("模型:",gs.best_estimator_)
# {'n_neighbors': 5, 'weights': 'distance'}
#查看预测分类结果
y_test
#将预测的概率存入proba中
proba = gs.best_estimator_.predict_proba(x_test)
proba
#提取出我们所需要的那一栏预测概率
proba1=[]
for i in range(0,30000):
proba1.append(proba[i][1])
proba1
#将结果存入文件,后续提交
test['是否流失'] = proba1
test
test[['客户ID','是否流失']].to_csv('test_submit1.csv', index=False)
最终结果
结束时排名40,只有前十名才有奖,不过也没打算拿奖(研0暑假啥都不懂就被导师安排参加这个),对我来说能有个结果就可以了。学的技术太少所以代码有很多不足之处,先记录下来日后学了其他技术再做更改。