Kaggle上的比赛介绍链接为: How Much Did It Rain?Ⅱ,可以在Kaggle上下载相关的数据集。
在Kaggle上有详细的关于本次比赛的背景以及数据等具体介绍,这里会着重 ML 对比赛介绍等进行分析。
在气象雷达用于广泛的降雨量的预测在实际情况中并不完全吻合的背景下,提出了极化雷达,雷达发出竖直与水平方向的无线电脉冲,从而推断降雨的大小与类型:雨滴随着大小的增加而变平,而冰晶则倾向于垂直拉长
这很重要,说明数据处理一定需要进行异常值分析,但其实没有提示,在拿到一个陌生数据时,缺失值、异常值分析处理肯定是必不可少的。
百度了一下关于雨量等级的划分:(这里是1d的,但我们预测的为1h的)
等级 | 降雨量 |
---|---|
小雨 | 1d降雨量小于10mm |
中雨 | 1d降雨量10~25mm |
大雨 | 1d降雨量25~50mm |
暴雨 | 1d降雨量50~100mm |
大暴雨 | 1d降雨量100~250mm |
特大暴雨 | 1d降雨量在250mm以上 |
大暴雨的情况已经算是比较少了,但其降雨量1h为4~10mm之间,在对降雨量有一定认识的情况下,再去看我们数据里的1h的降雨量,能对其数值有一定理解。
从Kaggle上下载的文件有四类:train.zip、test.zip、sample_solution.zip 、sample_dask.py,这里我们只用到train.zip
,因为test.zip
中没有标签,我们也无法得知预测出来的效果如何。
解压train.zip
得到一个train.csv
文件,数据量很大,有一千三百多万组数据,有二十三列 feature 和一列 label 。
查看数据可以看到数据的features的特征名,在分析数据前,我们可以查找资料分析各个数据对预测降雨量的影响以及一些定义。下面是train.csv
中的标签,其中Expected
为Label。
Index(['Id', 'minutes_past', 'radardist_km', 'Ref', 'Ref_5x5_10th',
'Ref_5x5_50th', 'Ref_5x5_90th', 'RefComposite', 'RefComposite_5x5_10th',
'RefComposite_5x5_50th', 'RefComposite_5x5_90th', 'RhoHV',
'RhoHV_5x5_10th', 'RhoHV_5x5_50th', 'RhoHV_5x5_90th', 'Zdr',
'Zdr_5x5_10th', 'Zdr_5x5_50th', 'Zdr_5x5_90th', 'Kdp', 'Kdp_5x5_10th',
'Kdp_5x5_50th', 'Kdp_5x5_90th', 'Expected'],
dtype='object')
这里附上对特征标签查找的文献定义以及自己的理解并且将Kaggle上对部分标签值的解释的定义配在特征名的注释里:
对5x5_10,5x5_50,5x5_90的解释:由于收集在不同空间其反射率等参数值是不一样的,所以采用的是5×5(应该是km)空间中,所采取到的参数数据排序后的第十个百分位、第五十个百分位(类似于中位数)、第九十个百分位
总结一下: Ref、RefComposite关于粒子的大小与密度; RHoHV、Zdr、kdp关于粒子的形状与分布
了解了数据的各类信息后,我们需要写代码读取train.csv
的数据,了解其基本情况:数据特征值类型、缺失值情况、Label分布。
由于数据是.csv
类型,这里采用pandas库的pandas.read_csv
接口进行读写,读取后以DataFrame格式保存(pandas具体教程在这: Pandas读取CSV详细介绍),可以采用.info()
查看DataFrame基本信息和.head(num)
查看前num行数据。
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
train = pd.read_csv("../input/how-much-did-it-rain-ii/train.zip")
x_train = train.iloc[:,1:-1] #Id不计入
object_columns_num = x_train.dtypes[x_train.dtypes != 'object'].value_counts().sum()
print(f"数据有{x_train.shape[1]}列特征值")
print(f"其中有{object_columns_num}个object特征,{x_train.shape[1]-object_columns_num}个非object数据")
print(f"训练集有{train.shape[0]}行")
output:
数据有22列特征值
其中有22个object特征,0个非object数据
训练集有13765201行
数据量极大、所有特征值都是连续值(这里没有将Id算入)
数据的缺失情况是一定要查看的,无论在处理什么数据,缺失值基本都会对训练效果有影响(但 RF 具有很强的处理缺失值的能力)。
pd库中对DataFrame有专门的查看缺失值的函数,可以直接使用
Null_num = x_train.isnull().sum()
Null_percent = x_train.isnull().sum()/x_train.shape[0]*100
Null_condition = pd.concat([pd.DataFrame(Null_num),pd.DataFrame(Null_percent)],axis=1)
Null_condition.columns = ['Null_num','Null_percent']
print(Null_condition)
output:
缺失情况十分严重,数据可用性很低!!!(数据又大又差)
图形统计分析,将缺失值处理后的数据长度生成一组序列作为横坐标,其Label作为纵坐标,绘制散点图观测其标签值分布;
import matplotlib.pyplot as plt
plt.scatter([i for i in range(len(y))],train.iloc[:,23])
plt.show()
异常情况也比较严重!!!特别是竟然还有30000mm的1h降水量,太离谱la
使用seaborn库中的绘图函数绘制Label的直方图和QQ图:QQ图详解参考这里,我绘制了labels和log(labels)的图,方便查看其分布(若自身不为正态分布,对其取log,很有可能偏向正态分布)
# 因为数据中相同Id的预测值是相同的,所以要先删除Expected的相同值
y = train.iloc[:,23].drop_duplicates(keep='first')
fig = plt.figure(figsize=(20,10))
plt.subplot2grid((2,2),(0,0))
sns.distplot(y,color='y',fit=norm)
plt.subplot2grid((2,2),(0,1))
sns.distplot(np.log(y),color='y',fit=norm)
plt.subplot2grid((2,2),(1,0))
res = probplot(y,plot=plt)
plt.subplot2grid((2,2),(1,1))
res = probplot(np.log(y),plot=plt)
plt.show()