AIWIN企业违约预测
作者:互联网
基本情况
目标:本赛题将提供发债企业2019-2020年之间的违约数据用于模型训练,以预测发债企业在2021年发生违约风险的概率,其中发债企业范围为2019-2021年发行过债券的企业。初复赛提供用于预测的发债企业范围不变,在初赛的基础上,复赛将增加发债企业的股东数据、对外投资数据以及相关企业的舆情数据。
初赛提供的数据集如下:
- 企业的基本信息(只包含发债企业)
- 2018-2020年的财务指标数据
- 2019-2020年的违约记录
- 2018-2020年的舆情信息(只包含发债企业)
赛题链接:AIWIN - 比赛
提交总结
04/27/2022 16:53:57|第1次提交|0.938918
暂时不使用舆情特征
04/27/2022 19:26:02|第2次提交|0.94099|0.2071%
小幅度调整参数
04/28/2022 13:14:15|第3次提交|0.958458|1.7468%
改进:增加了舆情特征,但没有对文本进行分析,只是使用了新闻出现的时间和重要程度
新特征包括
- 2019年到2021年不同级别舆情出现的次数
- 舆情事件出现的次数与舆情级别的乘积
遇到的问题:加入新特征后线下正确率提升很大,线上提升却很一般
问题分析:
- 尝试加强正则化
- 可视化特征重要性后发现新加入的特征中时间序列特征的重要性异常高,意识到出现了数据泄露:例如2019年的记录中出现了2020年的舆情特征
- 数据泄露导致线上线下差异很大
处理结果:
- 调整L2参数,重新合并数据,2020年的记录将只有2020年及之前的数据
- 线上auc提高到0.971285
04/28/2022 15:21:06|第4次提交|0.971285|1.2827%
修复了统计特征导致数据泄露的问题
04/28/2022 15:21:06|第5次提交|0.980702|0.9417%
进一步挖掘舆情特征,这次用上了tf-idf对新闻的来源进行编码,并做了降维处理(这里的处理挺巧妙的,值得学习)
04/30/2022 10:31:37|第9次提交|0.986175|0.5473%
使用AutoGulon重新拟合,相当于模型融合
05/02/2022 00:12:35|第12次提交|0.9909|0.4725%
对indextype重新做CountVectorize编码,得到
05/03/2022 13:32:51|第16次提交|0.992404|0.1504%
对新闻标题做TF-IDF,去除了停用词并对一个字的词也进行分析(sklearn默认不处理只有一个字的词),最后降维到128
ent_news['newstitle_cut']=ent_news.newstitle.apply(lambda x: ' '.join(list(jieba.cut(x)))).copy()
tmp=ent_news.groupby(['ent_id_year'])['newstitle_cut'].agg(lambda x: x.str.cat(sep=' ')).reset_index()
tfidf=text.TfidfVectorizer(stop_words=stop_w,token_pattern=r"(?u)\b\w+\b")
tf=tfidf.fit_transform(tmp['newstitle_cut'])
已知的无效特征:
- 使用ent_id_news_count_weight,也就是舆情的数量统计,最后的auc掉到0.97左右
ent_id_news_count_weight=pd.read_pickle('../usrdata/news_count_weight_text_64.pkl')
ent_id_news_count_weight.drop(columns=list(range(64)),inplace=True)
l=[]
time_cols=['2018_weight', '2019_weight', '2020_weight',
'2021_weight', '2018_1_count', '2018_2_count', '2018_3_count',
'2018_4_count', '2019_1_count', '2019_2_count', '2019_3_count',
'2019_4_count', '2020_1_count', '2020_2_count', '2020_3_count',
'2020_4_count', '2021_1_count', '2021_2_count', '2021_3_count',
'2021_4_count']
text_cols=[i for i in ent_id_news_count_weight.columns if isinstance(i,int)]
for year in usrdata.year.unique():
data=usrdata[usrdata.year==year].copy()
cols=[i for i in time_cols if year>=int(i.split('_')[0])]+['ent_id']
news=ent_id_news_count_weight[cols].copy()
l.append(pd.merge(data,news,on='ent_id',how='left'))
usrdata=pd.concat(l)
05/05/2022 18:51:27|第21次提交|0.993095|0.0691%|第16名
将0.9924和0.9919按0.6:0.4的比例融合提交后得到
还可以采用的方案
赛后方案学习
特征构造:
- 按年度频率构建正、负样本和模型特征。
- 剔除违约概率极低的企业,例如:证券、银行、保险、信托、金融租赁相关企业。
- 企业属性信息里面的类别特征进行数字编码。
- 经营(驻在)期限自、经营(驻在)期限至、成立日期、核准日期构建时间差特征。
- 新闻舆情标题TFIDF,奇异值分解降维。
- 舆情新闻的风险标签、风险标签类别计数,以及年末两个月各类别新闻数量占全年的比率。
- 构建企业投资关系图谱,对新闻重要性进行传播,例如每一个企业舆情重要性总分,每一个风险标签类别重要性分数。
- 其他特征,例如违约次数,财报公布次数等特征。
特征举例说明:年末两个月各类别新闻数量占全年的比率
这个特征可以很好指示企业变坏的趋势,若预测更低频率的债券违约,可以构造最近一周在最近一个月里面负面新闻的占比,通过后续特征重要性分析,此类特征权重较大。
特征举例说明:企业投资关系图谱,对新闻重要性进行传播。
构建图谱,传递投资的企业与企业股东在舆情方面对发债企业的影响。
标签:count,预测,特征,违约,2020,舆情,news,ent,AIWIN 来源: https://www.cnblogs.com/anime-enjoy/p/16531942.html