摘要:
合集:AI案例-ML-零售业
赛题:5G移动用户使用预测挑战赛
主办方:科大讯飞xDatawhale
主页:https://challenge.xfyun.cn/topic/info?type=5G-user&option=phb&ch=vWxQGFU
AI问题:二分类问题
数据集:用户基本信息和通信相关数据、比如用户话费信息、流量、活跃行为、套餐类型、区域信息等特征字段
数据集价值:预测用户是否为5G用户
解决方案:LightGBM
一、赛题描述
在2022世界互联网大会乌镇峰会期间发布的《世界互联网发展报告2022》显示,2022年第一季度,全球5G用户数增加7000万人,总数达到6.2亿人左右,5G人口覆盖率超25%。据爱立信及全球移动通信系统协会(GSMA)预测,到2022年底,全球5G用户数量将突破10亿人。对于通信运营商来说,面对如此庞大的5G市场,如何基于一些用户侧的信息进行用户画像,再进一步对于潜在的5G使用者进行精准的推销也是非常有帮助的。
本次比赛任务是根据用户基本信息和通信相关数据、比如用户话费信息、流量、活跃行为、套餐类型、区域信息等特征字段,然后通过训练数据训练模型,预测测试集中每个样本是否属于5G用户。
二、数据集说明
赛题数据由训练集train.csv、测试集据test.csv组成,包含60个字段,其中target字段为预测目标,主要特征字段分为两类cat和num,分别是离散型特征和数值型特征。
特征字段 | 字段描述 |
---|---|
id | 样本标识id |
cat_0 ~ cat_19 | 离散型特征 |
num_0 ~ num_37 | 数值型特征 |
target | 目标变量,是否为5G用户 |
数据集版权许可协议
BY-NC-SA 4.0
https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh-hans
三、解决方案样例
工作原理
- 数据流:
- 原始数据 → 特征工程 → 训练/测试集 → 模型训练 → 预测 → 评估
- 预测任务:
- 二分类问题:预测用户是否为5G用户
- 基于用户侧信息构建用户画像
- 模型特点:
- 梯度提升决策树算法
- 高效处理大规模数据
- 自动处理缺失值
- 内置特征选择能力
业务价值
该项目帮助通信运营商:
- 理解5G用户特征
- 识别潜在5G用户
- 实现精准营销
- 优化5G市场策略
导入相关系统库
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import lightgbm as lgb
import numpy as np
from sklearn.model_selection import train_test_split, GridSearchCV, cross_val_score
from sklearn.utils import class_weight
import joblib
【本样例运行环境的关键版本信息】
python 3.12.3
lightgbm 3.3.0
1、读入数据集
- 从CSV文件读取训练数据(train.csv)和测试数据(test.csv)
- 使用pandas、numpy等库进行数据处理
train_data = pd.read_csv("data/train.csv")
test_data = pd.read_csv("data/test.csv")
2、分析数据
- 使用seaborn和matplotlib进行数据可视化
- 分析用户基本信息、通信数据等特征字段
# 计算相关系数矩阵并四舍五入到小数点后三位
corr_matrix = train_data.corr().round(3)
# 设置绘图的尺寸
plt.figure(figsize=(12, 10))
# 绘制热力图
heatmap = sns.heatmap(
corr_matrix,
annot=False, # 不在每个单元格中显示相关系数值
cmap='coolwarm', # 使用 'coolwarm' 颜色映射
linewidths=0.5, # 设置单元格之间的线宽
linecolor='white', # 设置单元格之间的线颜色
vmin=-1, vmax=1 # 设置颜色映射的范围
)
# 添加标题
plt.title('Feature Correlation Heatmap', fontsize=16)
# 显示图形
plt.show()
3、创建并训练模型
- 使用LightGBM作为预测模型
- 进行数据分割(train_test_split)
- 使用网格搜索(GridSearchCV)进行超参数调优
- 采用交叉验证(cross_val_score)评估模型
# X 和 y 的分离
X = train_data.drop(['id', 'target'], axis=1)
y = train_data['target']
# 分割训练集和验证集
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)
# 参数调优
param_grid = {
'learning_rate': [0.01, 0.1, 0.2],
'n_estimators': [100, 200],
'max_depth': [3, 5, 7],
'subsample': [0.8, 1.0],
'colsample_bytree': [0.8, 1.0]
}
grid_search = GridSearchCV(estimator=lgb.LGBMClassifier(random_state=42),
param_grid=param_grid,
cv=3,
scoring='accuracy',
n_jobs=-1,
verbose=2)
grid_search.fit(X_train, y_train)
print("Best parameters:", grid_search.best_params_)
best_model = grid_search.best_estimator_
# 评估模型
cv_scores = cross_val_score(best_model, X_train, y_train, cv=5, scoring='accuracy')
print("Cross-validated accuracy scores:", cv_scores)
print("Mean accuracy:", cv_scores.mean())
4、输出预测结果
使用joblib保存训练好的模型
pd.DataFrame(
{
"id": test_data['id'],
# predict_proba 方法返回每个样本属于各个类别的概率。对于二分类问题,通常返回一个二维数组(负类的概率、正类的概率)
# [:, 1] 提取了所有样本的正类概率
"target": (best_model.predict_proba(test_data.drop(['id'], axis=1))[:, 1].round(4) > 0.5).astype(int)
}
).to_csv('submit.csv', index=None)
源码开源协议
GPL-v3