目标:本赛题将提供发债企业2019-2020年之间的违约数据用于模型训练,以预测发债企业在2021年发生违约风险的概率,其中发债企业范围为2019-2021年发行过债券的企业。初复赛提供用于预测的发债企业范围不变,在初赛的基础上,复赛将增加发债企业的股东数据、对外投资数据以及相关企业的舆情数据。
初赛提供的数据集如下:
赛题链接:AIWIN - 比赛
暂时不使用舆情特征
小幅度调整参数
改进:增加了舆情特征,但没有对文本进行分析,只是使用了新闻出现的时间和重要程度
新特征包括
遇到的问题:加入新特征后线下正确率提升很大,线上提升却很一般
问题分析:
处理结果:
修复了统计特征导致数据泄露的问题
进一步挖掘舆情特征,这次用上了tf-idf对新闻的来源进行编码,并做了降维处理(这里的处理挺巧妙的,值得学习)
使用AutoGulon重新拟合,相当于模型融合
对indextype重新做CountVectorize编码,得到
对新闻标题做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=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)
将0.9924和0.9919按0.6:0.4的比例融合提交后得到
特征构造:
特征举例说明:年末两个月各类别新闻数量占全年的比率
这个特征可以很好指示企业变坏的趋势,若预测更低频率的债券违约,可以构造最近一周在最近一个月里面负面新闻的占比,通过后续特征重要性分析,此类特征权重较大。
特征举例说明:企业投资关系图谱,对新闻重要性进行传播。
构建图谱,传递投资的企业与企业股东在舆情方面对发债企业的影响。