这几天偶然参加了这个比赛项目,分享一下个人的想法,能力有限欢迎大家来讨论学习!
数据来源“数字四川创新大赛-诈骗电话识别”
有同学说进入复赛阶段没法获取数据集了,这是我保存的数据集,仅供大家学习使用![百度网盘]提取码:9asc
数据训练集由如下4个部分组成:
user:用户的一些基础资料

voc:8个月内的通话数据

SMS和APP:8个月的短信和上网数据

测试集和训练集组成类似,但手机话费消费的月份只有一个月
针对以上的数据首先从user中统计了用户的phone_no_m,再根据phone_no_m依次整理通话、短信和上网的数据特征
首先整理VOC中每个phone_no_m通话的频率次数分别把呼入呼出次数、通话总时长进行统计
user=pd.read_csv('./train_user.csv')
print(user.info())
sms=pd.read_csv('./train/train_sms.csv')
print(sms.info())
print(sms.head())
user_m = user['phone_no_m'].values
print(user_m)
sms_up=[]
sms_down=[]
for name in tqdm(user_m):
sms_up.append(sms[(sms['phone_no_m'] == name) & (sms['calltype_id']==1)]['phone_no_m'].count())
sms_down.append(sms[(sms['phone_no_m'] == name) & (sms['calltype_id'] == 2)]['phone_no_m'].count())
user_m=np.array(user_m)
sms_up=np.array(sms_up)
sms_down=np.array(sms_down)
user_sms = pd.DataFrame({'phone_no_m':user_m,'sms_up':sms_up,'sms_down':sms_down})
user_sms.to_csv('user_sms.csv',index=False)
其次整理SMS和APP中每个phone_no_m通话的短信发送的次数,上网次数,流量花费等数据
user=pd.read_csv('./train_user.csv')
print(user.info())
sms=pd.read_csv('./train/train_sms.csv')
print(sms.info())
print(sms.head())
user_m = user['phone_no_m'].values
print(user_m)
sms_up=[]
sms_down=[]
for name in tqdm(user_m):
sms_up.append(sms[(sms['phone_no_m'] == name) & (sms['calltype_id']==1)]['phone_no_m'].count())
sms_down.append(sms[(sms['phone_no_m'] == name) & (sms['calltype_id'] == 2)]['phone_no_m'].count())
user_m=np.array(user_m)
sms_up=np.array(sms_up)
sms_down=np.array(sms_down)
user_sms = pd.DataFrame({'phone_no_m':user_m,'sms_up':sms_up,'sms_down':sms_down})
user_sms.to_csv('user_sms.csv',index=False)
#整理用户短信频次状态
user=pd.read_csv('./train_user.csv')
print(user.info())
app=pd.read_csv('./train/train_app.csv')
print(app.info())
print(app.head())
user_m = user['phone_no_m'].values
print(user_m)
app_time=[]
app_flow=[]
for name in tqdm(user_m):
app_time.append(app[(app['phone_no_m'] == name)]['phone_no_m'].count())
app_flow.append(app[(app['phone_no_m'] == name)]['flow'].sum())
user_m=np.array(user_m)
app_time=np.array(app_time)
app_flow=np.array(app_flow)
user_app = pd.DataFrame({'phone_no_m':user_m,'app_time':app_time,'app_flow':app_flow})
user_app.to_csv('user_app.csv',index=False)
#整理用户上网频次和花费的流量
最后将所有的数据整合成训练集数据train_data,城市地区中只保留了城市,训练集中没有标注city_name的统一使用‘未知’补全。

训练时先添加一个呼入呼出的比值作为新的特征,然后对train_data中的呼入呼出次数话费流量等求在8个月里的均值(有点不妥,因为有的诈骗电话号码使用时长并没有8个月且在两使用月份内话费很高,但voc的数据较大统计一次花费的时间比较多所以就没重新整理过,有空再说23333)。
接着将除城市以外的数据进行归一化,最后get_dummies生成最终的训练数据
train_data=pd.read_csv('train_data.csv')
#先不添加城市
quitmonth=['call_out_times','cal_in_times','call_other_times','call_time','sms_up','sms_down','app_time','app_flow']
train_label = pd.read_csv('./train/train_user.csv')['label'].values
train_data.pop('phone_no_m')
train_data.pop('mean_arpu')
train_data['out/in']=train_data['call_out_times']/(train_data['cal_in_times']+1e-8)
data_type = train_data.columns[train_data.dtypes != 'object']
train_data.loc[:,quitmonth]=train_data.loc[:,quitmonth]/8
train_data.loc[:, data_type] = (train_data.loc[:, data_type] - train_data.loc[:, data_type].mean()) / (train_data.loc[:, data_type].std()+1e-4)
train_data = pd.get_dummies(train_data)
train_data=train_data.values
最后将神经网络的层数作为参数自定义一个model,尝试通过调整学习率,层数,正则化,迭代次数等参数来得到一个较好的训练结果。
historys=[]
pres=[]
k=0
model = mymodel([1,2,2,8])
model.compile(optimizer=tf.keras.optimizers.Adam(1e-3),
loss=tf.keras.losses.binary_crossentropy,
metrics = ['accuracy'])
model.build(input_shape=(None,33))
historys=model.fit(train_data,train_label,batch_size=64,epochs=100,validation_split=0.05)
plt.plot(historys.history['val_accuracy'])
plt.plot(historys.history['val_loss'])
plt.legend([str(nets[k])+'val_accuracy',str(nets[k])+'val_loss'])
plt.show()
pre=[]
最后放上完整的代码,欢迎各位大佬指点交流
博主参与了数字四川创新大赛的诈骗电话识别项目,分享了数据来源和处理过程。整理了用户基础资料、通话、短信和上网数据,创建了训练集。在VOC中统计通话频率,短信和上网数据,整合所有信息。训练时添加新特征,归一化数据,使用神经网络模型,通过调整参数优化结果。提供完整代码,欢迎讨论。
222





