AETA地震预测 AI 算法大赛——Helloworld队比赛方案(亚军)

AETA地震预测 AI 算法大赛——Helloworld队比赛方案(亚军)

       首先很幸运拿到AETA地震预测AI数据分析大赛的亚军,非常感谢我的大佬队友(也是我的学弟)。我第一次参赛没有思路也没有经验,想先做一个可行性分析,做一个大而全的方案,导致的后果就是无从下手。队友直接给我上了一课,别想太多,先定一个简单的方案先试着,后期再做改进,不管三七二十一,一顿操作猛如虎,先肝再说,肝出了我们队的baseline,然后在比赛过程中一点点的改进,有了最终的方案。
       在这里也非常感谢主办方,给我们耐心地讲解,提供了很多研究资料,给了我很多启发。希望我的分享与总结能给大家带来些许帮助,并且一起交流学习。

1. 赛题分析

       选手通过分析电磁和地声数据,发现其中与临震相关的异常信号和特征,挖掘前兆观测数据与地震三要素的相关性,并基于历史观测数据和地震目录,构建地震预测模型。

        比赛要求:使用四川云南地区的历史观测数据预测未来该地区的地震事件,包括地震有无和地震发生的时间,经纬度,震级。主办方每周日更新本周的观测数据,要求提交下周四川云南地区的地震发生事件,包括地震有无和地震发生的时间,经纬度,震级。

比赛数据

19号台站的地声数据(蓝色最大值、黄色均值、绿色最小值)

87号台站的电磁数据(蓝色最大值、黄色均值、绿色最小值)

2. 赛题难点

        (1)数据特征构建:原数据是典型的时序数据,其大量的信息藏在它的结构中,不仅仅体现在其数值上。构建新特征,并寻找其中的强特征是比赛的难点之一。

        (2)地震机制复杂:不同的地区(如不同的断裂带)由于地质构造、地形地貌等不同,其地震的产生机理和发震特点也是有差异的。地震前,当地的电磁和地声会出现出现的现象没有明确的相通性,如何细分这些现象,并建立这些现象与地震的关联关系是比赛的难点。

3. 分类问题

        按照地区划分:鲜水河地震带、安宁河-则木河地震带、金沙江地震带、松潘-较场地震带、龙门山地震带、理塘地震带、木里-盐源地震区、名山-马边-昭通地震带、小江地震带、中甸—南涧地震带、大关—马边地震带、澜沧—耿马地震带、泸水—腾冲地震带、普洱—宁洱地震带、通海—石屏地震带。
        按时间划分:地震事件发生前一周
        按震级划分:经过统计以上区域的三年内历史地震多发在3~6之间,所以按照震级影响范围和频次划分为四档。
例1:打标签

4. 特征工程

        (1)衍生特征:计算电磁和地声数据的临近差值等。

data['magn_var'] = data['average_magn'].diff()
    # 电磁均值的变化
data['sound_var'] = data['average_sound'].diff()
    # 地声均值的变化

        (2)统计特征:统计电磁和地声数据的衍生特征及基础特征一天内的最大值,最小值,均值,方差,偏度,峰度,均方根,波形因子,峰值因子,脉冲因子,裕度因子,最大值与最小值的差、滑动四分位数,以及变异系数。

      #滑动四分位距
 for i in [0.25, 0.75]:
        result['average_magn_' + str(i)] = data['average_magn'].quantile(i)
        result['average_magn_' + str(i)] = data['average_magn'].quantile(i)
def stat_feature(data_ ,flag):
    result_ = {}
    for feature in data_.columns:
        if (feature in {'Date', 'Longitude', 'Longitude','stationID','Day','area','label','Day of Predicting'}):
            continue
        data_min = data_[feature].min()
        data_max = data_[feature].max()
        data_mean = data_[feature].mean()
        data_std = data_[feature].std()
        data_skew = data_[feature].skew()
        data_kurt = data_[feature].kurt()
        # 均方根
        data_rms = math.sqrt(pow(data_mean, 2) + pow(data_std, 2))

        # 波形因子
        data_boxing = data_rms / ((abs(data_[feature]).mean()) + 0.0001)

        # 峰值因子
        data_fengzhi = (max(data_[feature])) / (data_rms + 0.00001)

        # 脉冲因子
        data_maichong = (max(data_[feature])) / ((abs(data_[feature]).mean()) + 0.00001)

        # 裕度因子
        data_yudu = (max(data_[feature])) / (
                    pow((data_[feature].map(lambda x: math.sqrt(abs(x))).sum() / (len(data_))), 2) + 0.00001)
        data_range = data_max - data_min
        data_covar = data_std / (data_mean + 0.0001)

        result__ = {
            feature + '_min': data_min,
            feature + '_max': data_max,
            feature + '_mean': data_mean,
            feature + '_std': data_std,
            feature + '_skew': data_skew,
            feature + '_kurt': data_kurt,
            feature + '_range': data_range,
            feature + '_covar': data_covar,
            feature + '_rms': data_rms,
            feature + '_boxing': data_boxing,
            feature + '_fengzhi': data_fengzhi,
            feature + '_maichong': data_maichong,
            feature + '_yudu': data_yudu,

        }
        result_.update(result__)
    result_ = pd.DataFrame([result_])
    if flag == 'train':
        result_['label'] = data_['label'].max()
    result_['stationID'] = data_['stationID'].max()
    result_['area'] = data_['area'].max()
    result_['Latitude'] = data_['Latitude'].mean()
    result_['Longitude'] = data_['Longitude'].mean()
    result_['Day of Predicting'] = data_['Day of Predicting'].max()
    return result_

        (3)额外衍生特征:通过用随机森林的特征重要性筛选方法选出特征重要性排前50的特征,两两交叉相乘得出新特征。

5. 模型训练

        使用Stacking方法进行建模,第一层基模型为lightgbm、随机森林和catboost,第二层使用逻辑回归。
模型

6. 总结

        方案做的非常仓促,大致的思路是把预测问题转化成分类问题,假设特征值与类标签存在关系。不过我个人认为数据中包含很多信息,从时域、频域和结构等等方面提取出丰富的特征,会使模型得到比较好的结果。在比赛中,有的选手会选择0点到凌晨6点之间干扰比较少的数据,也得到了很好地结果。
        当然,我这种方法仅仅是从分类的角度来转化问题,比赛中也有很多选手用回归的方法来预测,也取得了很好地结果。
        希望能给大家带来一点思路。
下一届比赛
(代码和处理后数据我稍后会上传到CSDN和github)

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值