diff --git a/WeatherOceanForecasts/README.md b/WeatherOceanForecasts/README.md index 72cc620..2c35112 100644 --- a/WeatherOceanForecasts/README.md +++ b/WeatherOceanForecasts/README.md @@ -1 +1,29 @@ -Baseline +## 任务安排 + +开营时间:02月16日21:00 + +比赛地址:https://tianchi.aliyun.com/s/d3bcf37c856703fec5903c40ea323710 + +开源内容:https://github.com/datawhalechina/team-learning-data-mining/tree/master/WeatherOceanForecasts + +### Task00:熟悉规则(1天) + +* 组队、修改群昵称。 +* 熟悉打卡规则。 +* 打卡截止时间:02月18日03:00 + +### Task01:比赛全流程体验(3天) + +* 学习如何使用Docker提交代码及比赛上分。 +* 记录比赛中遇到的问题,并在学习笔记中插入初始分数截图。 +* 打卡截止时间:02月21日03:00 + +### Task02:Baseline学习及改进(5天) + +* 学习baseline,并提出自己的改进策略,提交代码并更新自己的分数排名。 +* 在学习笔记中插入改进baseline之后分数排名截图。 +* 打卡截止时间:02月26日03:00 + +### Task03:学习者分享(2天) + +* 我们根据截图,邀请提分比较多的学习者进行分享。 \ No newline at end of file diff --git a/WeatherOceanForecasts/baseline相关.md b/WeatherOceanForecasts/baseline相关.md new file mode 100644 index 0000000..a770d24 --- /dev/null +++ b/WeatherOceanForecasts/baseline相关.md @@ -0,0 +1,337 @@ +“AI Earth”人工智能创新挑战赛Baseline + + + +赛题背景 + +![](https://mmbiz.qpic.cn/mmbiz_png/US10Gcd0tQEfcffueY0reDaT8agHibMbkl6VPJicIaSLBOMT46hKst5wjTztibed2dJsrke6B0nRpRPvJXnC2mlSg/640?wx_fmt=png) + + + +![](https://mmbiz.qpic.cn/mmbiz_svg/LwcbhAmMnZBibnjHfa5Dbkk7tP04JCicCSQTxgyGQTicyGIU7M0P5BVzNibgJOO9BU7K91hTpQDPkc1eFEZiaXlGhuoBYTGTn3vc6/640?wx_fmt=svg) + +01 + +赛题简介 + +发生在热带太平洋上的厄尔尼诺-南方涛动\(ENSO\)现象是地球上最强、最显著的年际气候信号。通过大气或海洋遥相关过程,经常会引发洪涝、干旱、高温、雪灾等极端事件,对全球的天气、气候以及粮食产量具有重要的影响。准确预测ENSO,是提高东亚和全球气候预测水平和防灾减灾的关键。本次赛题是一个时间序列预测问题。基于历史气候观测和模式模拟数据,利用T时刻过去12个月\(包含T时刻\)的时空序列(气象因子),构建预测ENSO的深度学习模型,预测未来1-24个月的Nino3.4指数,如下图所示: + +![](https://mmbiz.qpic.cn/mmbiz_jpg/ZQhHsg2x8ficqo4ibQMBLLlIDzHtDotd8aQ4nTGTxuNQeAicZBa9KPgqT95tsd0shdwQVdQEQJg4AXWvM642G6Pug/640?wx_fmt=jpeg) + +![](https://mmbiz.qpic.cn/mmbiz_svg/LwcbhAmMnZBibnjHfa5Dbkk7tP04JCicCSQTxgyGQTicyGIU7M0P5BVzNibgJOO9BU7K91hTpQDPkc1eFEZiaXlGhuoBYTGTn3vc6/640?wx_fmt=svg) + +02 + +背景数据描述 + +### 1\. 数据简介 + +本次比赛使用的数据包括CMIP5/6模式的历史模拟数据和美国SODA模式重建的近100多年历史观测同化数据。每个样本包含以下气象及时空变量:海表温度异常\(SST\),热含量异常\(T300\),纬向风异常(Ua),经向风异常(Va),数据维度为(year,month,lat,lon)。对于训练数据提供对应月份的Nino3.4 index标签数据。 + +### 2\. 训练数据说明 + +每个数据样本第一维度(year)表征数据所对应起始年份,对于CMIP数据共4645年,其中1-2265为CMIP6中15个模式提供的151年的历史模拟数据(总共:151年 \*15 个模式=2265);2266-4645为CMIP5中17个模式提供的140年的历史模拟数据(总共:140年 \*17 个模式=2380)。对于历史观测同化数据为美国提供的SODA数据。其中每个样本第二维度(mouth)表征数据对应的月份,对于训练数据均为36,对应的从当前年份开始连续三年数据(从1月开始,共36月),比如:SODA\_train.nc中\[0,0:36,:,:\]为第1-第3年逐月的历史观测数据;SODA\_train.nc中\[1,0:36,:,:\]为第2-第4年逐月的历史观测数据;…, SODA\_train.nc中\[99,0:36,:,:\]为第100-102年逐月的历史观测数据。和 CMIP\_train.nc中\[0,0:36,:,:\]为CMIP6第一个模式提供的第1-第3年逐月的历史模拟数据;…, CMIP\_train.nc中\[150,0:36,:,:\]为CMIP6第一个模式提供的第151-第153年逐月的历史模拟数据;CMIP\_train.nc中\[151,0:36,:,:\]为CMIP6第二个模式提供的第1-第3年逐月的历史模拟数据;…, CMIP\_train.nc中\[2265,0:36,:,:\]为CMIP5第一个模式提供的第1-第3年逐月的历史模拟数据;…, CMIP\_train.nc中\[2405,0:36,:,:\]为CMIP5第二个模式提供的第1-第3年逐月的历史模拟数据;…, CMIP\_train.nc中\[4644,0:36,:,:\]为CMIP5第17个模式提供的第140-第142年逐月的历史模拟数据。其中每个样本第三、第四维度分别代表经纬度(南纬55度北纬60度,东经0360度),所有数据的经纬度范围相同。 + +### 3\. 训练数据标签说明 + +标签数据为Nino3.4 SST异常指数,数据维度为(year,month)。CMIP\(SODA\)\_train.nc对应的标签数据当前时刻Nino3.4 SST异常指数的三个月滑动平均值,因此数据维度与维度介绍同训练数据一致注:三个月滑动平均值为当前月与未来两个月的平均值。 + +### 4\. 测试数据说明 + +测试用的初始场(输入)数据为国际多个海洋资料同化结果提供的随机抽取的n段12个时间序列,数据格式采用NPY格式保存,维度为(12,lat,lon, 4),12为t时刻及过去11个时刻,4为预测因子,并按照SST,T300,Ua,Va的顺序存放。测试集文件序列的命名规则:test\_编号\_起始月份\_终止月份.npy,如test\_00001\_01\_12\_.npy。 + +![](https://mmbiz.qpic.cn/mmbiz_svg/LwcbhAmMnZBibnjHfa5Dbkk7tP04JCicCSQTxgyGQTicyGIU7M0P5BVzNibgJOO9BU7K91hTpQDPkc1eFEZiaXlGhuoBYTGTn3vc6/640?wx_fmt=svg) + +03 + +评估指标 + + +评分细则说明:根据所提供的n个测试数据,对模型进行测试,得到n组未来1-24个月的序列选取对应预测时效的n个数据与标签值进行计算相关系数和均方根误差,如下图所示。并计算得分。![](https://mmbiz.qpic.cn/mmbiz_jpg/ZQhHsg2x8ficqo4ibQMBLLlIDzHtDotd8aXaGlo3zrPU7Hq6XfcVNrrwXdsPQsg9k3HoCojhezjAI5EAWWJUZeFQ/640?wx_fmt=jpeg)计算公式为: + +$$ +Score = \frac{2}{3} * accskill - RMSE +$$ + +其中, + +$$ +accskill = \sum_{i=1}^{24} a * ln(i) * cor_i, \\ +(i \le,a = 1.5; 5 \le i \le 11, a= 2; 12 \le i \le 18,a=3;19 \le i, a = 4) +$$ + +而: + +$$ +cor = \frac{\sum(X-\bar(X))\sum(Y-\bar(Y)}{\sqrt{\sum(X-\bar{X})^2)\sum(Y-\bar{Y})^2)}} +$$ + + + +线下数据转换 + +![](https://mmbiz.qpic.cn/mmbiz_png/US10Gcd0tQEfcffueY0reDaT8agHibMbkl6VPJicIaSLBOMT46hKst5wjTztibed2dJsrke6B0nRpRPvJXnC2mlSg/640?wx_fmt=png) + + + + - 将数据转化为我们所熟悉的形式,每个人的风格不一样,此处可以作为如何将nc文件转化为csv等文件 + +``` +## 工具包导入&数据读取 +``` + +### 1\. 数据读取 + +#### SODA\_label处理 + + 1. 标签含义 + +``` +标签数据为Nino3.4 SST异常指数,数据维度为(year,month)。  CMIP(SODA)_train.nc对应的标签数据当前时刻Nino3.4 SST异常指数的三个月滑动平均值,因此数据维度与维度介绍同训练数据一致注:三个月滑动平均值为当前月与未来两个月的平均值。 +``` + + 2. 将标签转化为我们熟悉的pandas形式 + +``` +label_path       = './data/SODA_label.nc'label_trans_path = './data/' nc_label         = Dataset(label_path,'r') years            = np.array(nc_label['year'][:])months           = np.array(nc_label['month'][:])year_month_index = []vs               = []for i,year in enumerate(years):    for j,month in enumerate(months):        year_month_index.append('year_{}_month_{}'.format(year,month))        vs.append(np.array(nc_label['nino'][i,j]))df_SODA_label               = pd.DataFrame({'year_month':year_month_index}) df_SODA_label['year_month'] = year_month_indexdf_SODA_label['label']      = vsdf_SODA_label.to_csv(label_trans_path + 'df_SODA_label.csv',index = None) +``` + +``` +df_label.head() +``` + +| + | year\_month | label | +| :-- | :-- | :-- | +| 0 | year\_1\_month\_1 | \-0.40720701217651367 | +| 1 | year\_1\_month\_2 | \-0.20244435966014862 | +| 2 | year\_1\_month\_3 | \-0.10386104136705399 | +| 3 | year\_1\_month\_4 | \-0.02910841442644596 | +| 4 | year\_1\_month\_5 | \-0.13252995908260345 | + +### 2\. 数据格式转化 + +#### 2.1 SODA\_train处理 + +``` +SODA_train.nc中[0,0:36,:,:]为第1-第3年逐月的历史观测数据;SODA_train.nc中[1,0:36,:,:]为第2-第4年逐月的历史观测数据;…,SODA_train.nc中[99,0:36,:,:]为第100-102年逐月的历史观测数据。 +``` + +``` +SODA_path        = './data/SODA_train.nc'nc_SODA          = Dataset(SODA_path,'r')  +``` + +- 自定义抽取对应数据\&转化为df的形式; + +> index为年月; columns为lat和lon的组合 + +``` +def trans_df(df, vals, lats, lons, years, months):    '''        (100, 36, 24, 72) -- year, month,lat,lon     '''     for j,lat_ in enumerate(lats):        for i,lon_ in enumerate(lons):            c = 'lat_lon_{}_{}'.format(int(lat_),int(lon_))              v = []            for y in range(len(years)):                for m in range(len(months)):                     v.append(vals[y,m,j,i])            df[c] = v    return df +``` + +``` +year_month_index = []years              = np.array(nc_SODA['year'][:])months             = np.array(nc_SODA['month'][:])lats             = np.array(nc_SODA['lat'][:])lons             = np.array(nc_SODA['lon'][:])for year in years:    for month in months:        year_month_index.append('year_{}_month_{}'.format(year,month))df_sst  = pd.DataFrame({'year_month':year_month_index}) df_t300 = pd.DataFrame({'year_month':year_month_index}) df_ua   = pd.DataFrame({'year_month':year_month_index}) df_va   = pd.DataFrame({'year_month':year_month_index}) +``` + +``` +%%timedf_sst = trans_df(df = df_sst, vals = np.array(nc_SODA['sst'][:]), lats = lats, lons = lons, years = years, months = months)df_t300 = trans_df(df = df_t300, vals = np.array(nc_SODA['t300'][:]), lats = lats, lons = lons, years = years, months = months)df_ua   = trans_df(df = df_ua, vals = np.array(nc_SODA['ua'][:]), lats = lats, lons = lons, years = years, months = months)df_va   = trans_df(df = df_va, vals = np.array(nc_SODA['va'][:]), lats = lats, lons = lons, years = years, months = months) +``` + +``` +label_trans_path = './data/'df_sst.to_csv(label_trans_path  + 'df_sst_SODA.csv',index = None)df_t300.to_csv(label_trans_path + 'df_t300_SODA.csv',index = None)df_ua.to_csv(label_trans_path   + 'df_ua_SODA.csv',index = None)df_va.to_csv(label_trans_path   + 'df_va_SODA.csv',index = None) +``` + +#### 2.2 CMIP\_label处理 + +``` +label_path       = './data/CMIP_label.nc'label_trans_path = './data/'nc_label         = Dataset(label_path,'r') years            = np.array(nc_label['year'][:])months           = np.array(nc_label['month'][:])year_month_index = []vs               = []for i,year in enumerate(years):    for j,month in enumerate(months):        year_month_index.append('year_{}_month_{}'.format(year,month))        vs.append(np.array(nc_label['nino'][i,j]))df_CMIP_label               = pd.DataFrame({'year_month':year_month_index}) df_CMIP_label['year_month'] = year_month_indexdf_CMIP_label['label']      = vsdf_CMIP_label.to_csv(label_trans_path + 'df_CMIP_label.csv',index = None) +``` + +``` +df_CMIP_label.head() +``` + +| + | year\_month | label | +| :-- | :-- | :-- | +| 0 | year\_1\_month\_1 | \-0.26102548837661743 | +| 1 | year\_1\_month\_2 | \-0.1332537680864334 | +| 2 | year\_1\_month\_3 | \-0.014831557869911194 | +| 3 | year\_1\_month\_4 | 0.10506672412157059 | +| 4 | year\_1\_month\_5 | 0.24070978164672852 | + +#### 2.3 CMIP\_train处理 + +``` +CMIP_train.nc中[0,0:36,:,:]为CMIP6第一个模式提供的第1-第3年逐月的历史模拟数据;…,CMIP_train.nc中[150,0:36,:,:]为CMIP6第一个模式提供的第151-第153年逐月的历史模拟数据;CMIP_train.nc中[151,0:36,:,:]为CMIP6第二个模式提供的第1-第3年逐月的历史模拟数据;…,CMIP_train.nc中[2265,0:36,:,:]为CMIP5第一个模式提供的第1-第3年逐月的历史模拟数据;…,CMIP_train.nc中[2405,0:36,:,:]为CMIP5第二个模式提供的第1-第3年逐月的历史模拟数据;…,CMIP_train.nc中[4644,0:36,:,:]为CMIP5第17个模式提供的第140-第142年逐月的历史模拟数据。其中每个样本第三、第四维度分别代表经纬度(南纬55度北纬60度,东经0360度),所有数据的经纬度范围相同。 +``` + +``` +CMIP_path       = './data/CMIP_train.nc'CMIP_trans_path = './data'nc_CMIP  = Dataset(CMIP_path,'r')  +``` + +``` +nc_CMIP.variables.keys() +``` + +``` +dict_keys(['sst', 't300', 'ua', 'va', 'year', 'month', 'lat', 'lon']) +``` + +``` +nc_CMIP['t300'][:].shape +``` + +``` +(4645, 36, 24, 72) +``` + +``` +year_month_index = []years              = np.array(nc_CMIP['year'][:])months             = np.array(nc_CMIP['month'][:])lats               = np.array(nc_CMIP['lat'][:])lons               = np.array(nc_CMIP['lon'][:])last_thre_years = 1000for year in years:    '''        数据的原因,我们    '''    if year >= 4645 - last_thre_years:        for month in months:            year_month_index.append('year_{}_month_{}'.format(year,month))df_CMIP_sst  = pd.DataFrame({'year_month':year_month_index}) df_CMIP_t300 = pd.DataFrame({'year_month':year_month_index}) df_CMIP_ua   = pd.DataFrame({'year_month':year_month_index}) df_CMIP_va   = pd.DataFrame({'year_month':year_month_index}) +``` + + - 因为内存限制,我们暂时取最后1000个year的数据 + +``` +def trans_thre_df(df, vals, lats, lons, years, months, last_thre_years = 1000):    '''        (4645, 36, 24, 72) -- year, month,lat,lon     '''     for j,lat_ in (enumerate(lats)):#         print(j)        for i,lon_ in enumerate(lons):            c = 'lat_lon_{}_{}'.format(int(lat_),int(lon_))              v = []            for y_,y in enumerate(years):                '''                    数据的原因,我们                '''                if y >= 4645 - last_thre_years:                    for m_,m in  enumerate(months):                         v.append(vals[y_,m_,j,i])            df[c] = v    return df +``` + +``` +%%timedf_CMIP_sst  = trans_thre_df(df = df_CMIP_sst,  vals   = np.array(nc_CMIP['sst'][:]),  lats = lats, lons = lons, years = years, months = months)df_CMIP_sst.to_csv(CMIP_trans_path + 'df_CMIP_sst.csv',index = None)del df_CMIP_sstgc.collect()df_CMIP_t300 = trans_thre_df(df = df_CMIP_t300, vals   = np.array(nc_CMIP['t300'][:]), lats = lats, lons = lons, years = years, months = months)df_CMIP_t300.to_csv(CMIP_trans_path + 'df_CMIP_t300.csv',index = None)del df_CMIP_t300gc.collect()df_CMIP_ua   = trans_thre_df(df = df_CMIP_ua,   vals   = np.array(nc_CMIP['ua'][:]),   lats = lats, lons = lons, years = years, months = months)df_CMIP_ua.to_csv(CMIP_trans_path + 'df_CMIP_ua.csv',index = None)del df_CMIP_uagc.collect()df_CMIP_va   = trans_thre_df(df = df_CMIP_va,   vals   = np.array(nc_CMIP['va'][:]),   lats = lats, lons = lons, years = years, months = months)df_CMIP_va.to_csv(CMIP_trans_path + 'df_CMIP_va.csv',index = None)del df_CMIP_vagc.collect() +``` + +``` +(36036, 1729) +``` + +数据建模 + +![](https://mmbiz.qpic.cn/mmbiz_png/US10Gcd0tQEfcffueY0reDaT8agHibMbkl6VPJicIaSLBOMT46hKst5wjTztibed2dJsrke6B0nRpRPvJXnC2mlSg/640?wx_fmt=png) + + + +![](https://mmbiz.qpic.cn/mmbiz_svg/LwcbhAmMnZBibnjHfa5Dbkk7tP04JCicCSQTxgyGQTicyGIU7M0P5BVzNibgJOO9BU7K91hTpQDPkc1eFEZiaXlGhuoBYTGTn3vc6/640?wx_fmt=svg) + +01 + +工具包导入\&数据读取 + +1\. 工具包导入 + +``` +import pandas as pdimport numpy  as npimport tensorflow as tffrom tensorflow.keras.optimizers import Adamimport matplotlib.pyplot as pltimport scipy import joblibfrom netCDF4 import Datasetimport netCDF4 as nc from tensorflow.keras.callbacks import LearningRateScheduler, Callbackimport tensorflow.keras.backend as Kfrom tensorflow.keras.layers import *from tensorflow.keras.models import *from tensorflow.keras.optimizers import *from tensorflow.keras.callbacks import *from tensorflow.keras.layers import Input import gc%matplotlib inline      +``` + +### 2\. 数据读取 + +#### SODA\_label处理 + + 1. 标签 + +``` +标签数据为Nino3.4 SST异常指数,数据维度为(year,month)。  CMIP(SODA)_train.nc对应的标签数据当前时刻Nino3.4 SST异常指数的三个月滑动平均值,因此数据维度与维度介绍同训练数据一致注:三个月滑动平均值为当前月与未来两个月的平均值。 +``` + +``` +label_path       = './data/SODA_label.nc' nc_label         = Dataset(label_path,'r')tr_nc_labels     = nc_label['nino'][:]  +``` + +### 2\. 原始特征数据读取 + +``` +SODA_path        = './data/SODA_train.nc'nc_SODA          = Dataset(SODA_path,'r') nc_sst           = np.array(nc_SODA['sst'][:])nc_t300          = np.array(nc_SODA['t300'][:])nc_ua            = np.array(nc_SODA['ua'][:])nc_va            = np.array(nc_SODA['va'][:]) +``` + +![](https://mmbiz.qpic.cn/mmbiz_svg/LwcbhAmMnZBibnjHfa5Dbkk7tP04JCicCSQTxgyGQTicyGIU7M0P5BVzNibgJOO9BU7K91hTpQDPkc1eFEZiaXlGhuoBYTGTn3vc6/640?wx_fmt=svg) + +02 + +模型构建 + +1\. 神经网络框架 + +``` +def RMSE(y_true, y_pred):    return tf.sqrt(tf.reduce_mean(tf.square(y_true - y_pred)))def RMSE_fn(y_true, y_pred):    return np.sqrt(np.mean(np.power(np.array(y_true, float).reshape(-1, 1) - np.array(y_pred, float).reshape(-1, 1), 2)))def build_model():      inp    = Input(shape=(12,24,72,4))          x_4    = Dense(1, activation='relu')(inp)       x_3    = Dense(1, activation='relu')(tf.reshape(x_4,[-1,12,24,72]))    x_2    = Dense(1, activation='relu')(tf.reshape(x_3,[-1,12,24]))    x_1    = Dense(1, activation='relu')(tf.reshape(x_2,[-1,12]))         x = Dense(64, activation='relu')(x_1)      x = Dropout(0.25)(x)     x = Dense(32, activation='relu')(x)       x = Dropout(0.25)(x)      output = Dense(24, activation='linear')(x)       model  = Model(inputs=inp, outputs=output)    adam = tf.optimizers.Adam(lr=1e-3,beta_1=0.99,beta_2 = 0.99)     model.compile(optimizer=adam, loss=RMSE)    return model +``` + +#### 2\. 训练集验证集划分 + +``` +### 训练特征,保证和训练集一致tr_features = np.concatenate([nc_sst[:,:12,:,:].reshape(-1,12,24,72,1),nc_t300[:,:12,:,:].reshape(-1,12,24,72,1),\                              nc_ua[:,:12,:,:].reshape(-1,12,24,72,1),nc_va[:,:12,:,:].reshape(-1,12,24,72,1)],axis=-1)### 训练标签,取后24个tr_labels = tr_nc_labels[:,12:] ### 训练集验证集划分tr_len     = int(tr_features.shape[0] * 0.8)tr_fea     = tr_features[:tr_len,:].copy()tr_label   = tr_labels[:tr_len,:].copy() val_fea     = tr_features[tr_len:,:].copy()val_label   = tr_labels[tr_len:,:].copy()  +``` + +#### 3\. 模型训练 + +``` +#### 构建模型model_mlp     = build_model()#### 模型存储的位置model_weights = './model_baseline/model_mlp_baseline.h5'checkpoint = ModelCheckpoint(model_weights, monitor='val_loss', verbose=0, save_best_only=True, mode='min',                             save_weights_only=True)plateau        = ReduceLROnPlateau(monitor='val_loss', factor=0.5, patience=5, verbose=1, min_delta=1e-4, mode='min')early_stopping = EarlyStopping(monitor="val_loss", patience=20)history        = model_mlp.fit(tr_fea, tr_label,                    validation_data=(val_fea, val_label),                    batch_size=4096, epochs=200,                    callbacks=[plateau, checkpoint, early_stopping],                    verbose=2) +``` + +#### 4\. 模型预测 + +``` +prediction = model_mlp.predict(val_fea) +``` + +#### 5\. Metrics + +``` +from   sklearn.metrics import mean_squared_errordef rmse(y_true, y_preds):    return np.sqrt(mean_squared_error(y_pred = y_preds, y_true = y_true))def score(y_true, y_preds):    accskill_score = 0    rmse_scores    = 0    a = [1.5] * 4 + [2] * 7 + [3] * 7 + [4] * 6    y_true_mean = np.mean(y_true,axis=0)     y_pred_mean = np.mean(y_preds,axis=0) #     print(y_true_mean.shape, y_pred_mean.shape)    for i in range(24):         fenzi = np.sum((y_true[:,i] -  y_true_mean[i]) *(y_preds[:,i] -  y_pred_mean[i]) )         fenmu = np.sqrt(np.sum((y_true[:,i] -  y_true_mean[i])**2) * np.sum((y_preds[:,i] -  y_pred_mean[i])**2) )         cor_i = fenzi / fenmu            accskill_score += a[i] * np.log(i+1) * cor_i        rmse_score   = rmse(y_true[:,i], y_preds[:,i])#         print(cor_i,  2 / 3.0 * a[i] * np.log(i+1) * cor_i - rmse_score)        rmse_scores += rmse_score         return  2 / 3.0 * accskill_score - rmse_scores  +``` + +``` +print('score', score(y_true = val_label, y_preds = prediction)) +``` + +模型预测 + +![](https://mmbiz.qpic.cn/mmbiz_png/US10Gcd0tQEfcffueY0reDaT8agHibMbkl6VPJicIaSLBOMT46hKst5wjTztibed2dJsrke6B0nRpRPvJXnC2mlSg/640?wx_fmt=png) + +在上面的部分,我们已经训练好了模型,接下来就是提交模型并在线上进行预测,这块可以分为三步: + +- 导入模型; +- 读取测试数据并且进行预测; +- 生成提交所需的版本; + + + +![](https://mmbiz.qpic.cn/mmbiz_svg/LwcbhAmMnZBibnjHfa5Dbkk7tP04JCicCSQTxgyGQTicyGIU7M0P5BVzNibgJOO9BU7K91hTpQDPkc1eFEZiaXlGhuoBYTGTn3vc6/640?wx_fmt=svg) + +01 + +模型导入 + +``` +import tensorflow as tfimport tensorflow.keras.backend as Kfrom tensorflow.keras.layers import *from tensorflow.keras.models import *from tensorflow.keras.optimizers import *from tensorflow.keras.callbacks import *from tensorflow.keras.layers import Input import numpy as npimport osimport zipfiledef RMSE(y_true, y_pred):    return tf.sqrt(tf.reduce_mean(tf.square(y_true - y_pred)))def build_model():      inp    = Input(shape=(12,24,72,4))          x_4    = Dense(1, activation='relu')(inp)       x_3    = Dense(1, activation='relu')(tf.reshape(x_4,[-1,12,24,72]))    x_2    = Dense(1, activation='relu')(tf.reshape(x_3,[-1,12,24]))    x_1    = Dense(1, activation='relu')(tf.reshape(x_2,[-1,12]))         x = Dense(64, activation='relu')(x_1)      x = Dropout(0.25)(x)     x = Dense(32, activation='relu')(x)       x = Dropout(0.25)(x)      output = Dense(24, activation='linear')(x)       model  = Model(inputs=inp, outputs=output)    adam = tf.optimizers.Adam(lr=1e-3,beta_1=0.99,beta_2 = 0.99)     model.compile(optimizer=adam, loss=RMSE)    return model model = build_model()model.load_weights('./user_data/model_data/model_mlp_baseline.h5') +``` + +![](https://mmbiz.qpic.cn/mmbiz_svg/LwcbhAmMnZBibnjHfa5Dbkk7tP04JCicCSQTxgyGQTicyGIU7M0P5BVzNibgJOO9BU7K91hTpQDPkc1eFEZiaXlGhuoBYTGTn3vc6/640?wx_fmt=svg) + +02 + +模型预测 + +``` +test_path = './tcdata/enso_round1_test_20210201/'### 1. 测试数据读取files = os.listdir(test_path)test_feas_dict = {}for file in files:    test_feas_dict[file] = np.load(test_path + file)    ### 2. 结果预测test_predicts_dict = {}for file_name,val in test_feas_dict.items():    test_predicts_dict[file_name] = model.predict(val).reshape(-1,)#     test_predicts_dict[file_name] = model.predict(val.reshape([-1,12])[0,:])### 3.存储预测结果for file_name,val in test_predicts_dict.items():     np.save('./result/' + file_name,val)  +``` + + + +![](https://mmbiz.qpic.cn/mmbiz_svg/LwcbhAmMnZBibnjHfa5Dbkk7tP04JCicCSQTxgyGQTicyGIU7M0P5BVzNibgJOO9BU7K91hTpQDPkc1eFEZiaXlGhuoBYTGTn3vc6/640?wx_fmt=svg) + +03 + +预测结果打包 + +``` +#打包目录为zip文件(未压缩)def make_zip(source_dir='./result/', output_filename = 'result.zip'):    zipf = zipfile.ZipFile(output_filename, 'w')    pre_len = len(os.path.dirname(source_dir))    source_dirs = os.walk(source_dir)    print(source_dirs)    for parent, dirnames, filenames in source_dirs:        print(parent, dirnames)        for filename in filenames:            if '.npy' not in filename:                continue            pathfile = os.path.join(parent, filename)            arcname = pathfile[pre_len:].strip(os.path.sep)   #相对路径            zipf.write(pathfile, arcname)    zipf.close()make_zip()  +``` + +提升方向 + +![](https://mmbiz.qpic.cn/mmbiz_png/US10Gcd0tQEfcffueY0reDaT8agHibMbkl6VPJicIaSLBOMT46hKst5wjTztibed2dJsrke6B0nRpRPvJXnC2mlSg/640?wx_fmt=png) + + + +- 模型角度:我们只使用了简单的MLP模型进行建模,可以考虑使用其它的更加fancy的模型进行尝试; +- 数据层面:构建一些特征或者对数据进行一些数据变换等; +- 针对损失函数设计各种trick的提升技巧; \ No newline at end of file diff --git a/WeatherOceanForecasts/docker相关.md b/WeatherOceanForecasts/docker相关.md new file mode 100644 index 0000000..9e39c5c --- /dev/null +++ b/WeatherOceanForecasts/docker相关.md @@ -0,0 +1,94 @@ +“AI Earth”人工智能创新挑战赛Docker提交 + + + +![](https://mmbiz.qpic.cn/mmbiz_svg/LwcbhAmMnZBibnjHfa5Dbkk7tP04JCicCSQTxgyGQTicyGIU7M0P5BVzNibgJOO9BU7K91hTpQDPkc1eFEZiaXlGhuoBYTGTn3vc6/640?wx_fmt=svg) + +01 + +简介 + + +本次竞赛的Docker提交大致可以分为两小块: + +1. 线下文件准备好:包括**DockerFile,代码,预测的代码**; +2. Build,pull,提交,等待好消息; + +如果之前没有提交过docker,可以根据这篇教程熟悉一下:https://tianchi.aliyun.com/forum/postDetail\?spm=5176.12586969.1002.9.51df4127FoZKeL\&postId=165595 + +![](https://mmbiz.qpic.cn/mmbiz_svg/LwcbhAmMnZBibnjHfa5Dbkk7tP04JCicCSQTxgyGQTicyGIU7M0P5BVzNibgJOO9BU7K91hTpQDPkc1eFEZiaXlGhuoBYTGTn3vc6/640?wx_fmt=svg) + +02 + +文件准备 + +### 1\. requirement.txt + + - 运行代码所依赖的python库,缺什么就把需要装的文件放在requirement下面 + +``` +numpytensorflow==2.2.0  +``` + +### 2\. 运行的代码 + +#### 放在code下面即可 + +``` +import tensorflow as tfimport tensorflow.keras.backend as Kfrom tensorflow.keras.layers import *from tensorflow.keras.models import *from tensorflow.keras.optimizers import *from tensorflow.keras.callbacks import *from tensorflow.keras.layers import Input import numpy as npimport osimport zipfiledef RMSE(y_true, y_pred):    return tf.sqrt(tf.reduce_mean(tf.square(y_true - y_pred)))def build_model():      inp    = Input(shape=(12,24,72,4))          x_4    = Dense(1, activation='relu')(inp)       x_3    = Dense(1, activation='relu')(tf.reshape(x_4,[-1,12,24,72]))    x_2    = Dense(1, activation='relu')(tf.reshape(x_3,[-1,12,24]))    x_1    = Dense(1, activation='relu')(tf.reshape(x_2,[-1,12]))         x = Dense(64, activation='relu')(x_1)      x = Dropout(0.25)(x)     x = Dense(32, activation='relu')(x)       x = Dropout(0.25)(x)      output = Dense(24, activation='linear')(x)       model  = Model(inputs=inp, outputs=output)    adam = tf.optimizers.Adam(lr=1e-3,beta_1=0.99,beta_2 = 0.99)     model.compile(optimizer=adam, loss=RMSE)    return model model = build_model()model.load_weights('./user_data/model_data/model_mlp_baseline.h5')test_path = './tcdata/enso_round1_test_20210201/'### 1. 测试数据读取files = os.listdir(test_path)test_feas_dict = {}for file in files:    test_feas_dict[file] = np.load(test_path + file)    ### 2. 结果预测test_predicts_dict = {}for file_name,val in test_feas_dict.items():    test_predicts_dict[file_name] = model.predict(val).reshape(-1,)#     test_predicts_dict[file_name] = model.predict(val.reshape([-1,12])[0,:])### 3.存储预测结果for file_name,val in test_predicts_dict.items():     np.save('./result/' + file_name,val)#打包目录为zip文件(未压缩)def make_zip(source_dir='./result/', output_filename = 'result.zip'):    zipf = zipfile.ZipFile(output_filename, 'w')    pre_len = len(os.path.dirname(source_dir))    source_dirs = os.walk(source_dir)    print(source_dirs)    for parent, dirnames, filenames in source_dirs:        print(parent, dirnames)        for filename in filenames:            if '.npy' not in filename:                continue            pathfile = os.path.join(parent, filename)            arcname = pathfile[pre_len:].strip(os.path.sep)   #相对路径            zipf.write(pathfile, arcname)    zipf.close()make_zip()  +``` + +#### 3\. run.sh + + - 运行预测的代码 + +``` +#!/bin/shCURDIR="`dirname $0`" #获取此脚本所在目录echo $CURDIRcd $CURDIR #切换到该脚本所在目录python /code/mlp_predict.py +``` + +### 4\. DockerFile + +``` +# Base Images## 从天池基础镜像构建 FROM registry.cn-shanghai.aliyuncs.com/tcc-public/tensorflow:latest-cuda10.0-py3## 把当前文件夹里的文件构建到镜像的根目录下(.后面有空格,不能直接跟/)ADD . /## 指定默认工作目录为根目录(需要把run.sh和生成的结果文件都放在该文件夹下,提交后才能运行)WORKDIR /## Install Requirements(requirements.txt包含python包的版本)## 这里使用清华镜像加速安装RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade pipRUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt#RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt## 镜像启动后统一执行 sh run.shCMD ["sh", "run.sh"] +``` + +### 5\. 其它 + +- 按照官方要求把所需的文件全部按要求准备好即可。 + +![](https://mmbiz.qpic.cn/mmbiz_svg/LwcbhAmMnZBibnjHfa5Dbkk7tP04JCicCSQTxgyGQTicyGIU7M0P5BVzNibgJOO9BU7K91hTpQDPkc1eFEZiaXlGhuoBYTGTn3vc6/640?wx_fmt=svg) + +03 + +线上提交 + + +在所有的文件都准备之后,下面一步就是进行线上的提交,这里又分为三块。 + +1. 按照要求进行线上配置 +2. 进行build和pull; +3. 提交,等待好消息; + +### 1\. 按照要求进行线上配置 + + +![](https://mmbiz.qpic.cn/mmbiz_jpg/ZQhHsg2x8fib3qBx5Q6WmmCxOtSSveGnETiaRbPCic3ZQNhYL3Fgicw7P1EFfjeMZJTX5L2UMyXlApYiaoEic7pLpxpg/640?wx_fmt=jpeg) +![](https://mmbiz.qpic.cn/mmbiz_jpg/ZQhHsg2x8fib3qBx5Q6WmmCxOtSSveGnEYnS8QFqx2EaIj9T8tAhLLiaAQlhGjTqIicr4QCcW6qbIiaM9RRN2u30QQ/640?wx_fmt=jpeg) + +### 2\. 进行build和pull\(按照自己的机器的操作系统进行docker的安装并在命令行操作\) + +![](https://mmbiz.qpic.cn/mmbiz_jpg/ZQhHsg2x8fib3qBx5Q6WmmCxOtSSveGnE0dgGoVnux3qYNiarxYNpibiaYAJsR7yKUa3bkkH6fLTrpPLLvd7zWESCA/640?wx_fmt=jpeg) +![](https://mmbiz.qpic.cn/mmbiz_jpg/ZQhHsg2x8fib3qBx5Q6WmmCxOtSSveGnEvNp9pNvdYd72gxoBcXvofqRm6KlpCMopTWVCRr1VHcYOiaAO5NAuHmA/640?wx_fmt=jpeg) +![](https://mmbiz.qpic.cn/mmbiz_jpg/ZQhHsg2x8fib3qBx5Q6WmmCxOtSSveGnESoECd9mCibJ1cn6K6fE319EEgZGXG41roanDAzlYgmoAYoyDJYlUDfg/640?wx_fmt=jpeg) + +``` +#### 1.登录sudo docker login --username="自己的用户名" registry.cn-shenzhen.aliyuncs.com#### 2.builddocker build registry.cn-shenzhen.aliyuncs.com/ai_earth_baseline/test_ai_earth_submit:1.0 .#### 3.pushdocker push registry.cn-shenzhen.aliyuncs.com/ai_earth_baseline/test_ai_earth_submit:1.0 +``` + +### 3\. 提交 + +![](https://mmbiz.qpic.cn/mmbiz_jpg/ZQhHsg2x8fib3qBx5Q6WmmCxOtSSveGnEwqDQDT1j7WBtPTvT8Gp8kCnN8RzRm5JvfPNma44P3AsJdqdOBdL5qQ/640?wx_fmt=jpeg) + +根据自己的不同进行提交即可,如果不出意外,等待一会儿,线上跑完了就会有结果了。 + +![](https://mmbiz.qpic.cn/mmbiz_jpg/ZQhHsg2x8fib3qBx5Q6WmmCxOtSSveGnEic95uxYwUaf5az8DItFf2wFicIu8XKFem8Oq5MhlzAcaq4CTjcWr24NQ/640?wx_fmt=jpeg) \ No newline at end of file