How Much Did It Rain? Ⅱ 使用机器学习进行预测(三)
预测(二)中对缺失值和异常值进行了处理,接下来我们需要分析Features之间、Feature和Label之间的相关性关系,并确定一个初步的模型进行预测。
相关性分析
Features与Label的相关系分析是特征质量评价中非常重要的一环,合理的选取特征,找到与拟合目标相关性最强的特征,往往能够快速获得效果;
Features之间的相关性分析,可以知道特征之间的信息量相关性,如果两个特征之间强线性相关,说明这两个特征的信息量很近似。
Features之间相关性分析
corr = train.iloc[:,3,-1].corr()
sns.set()
plt.rcParams['font.sans-serif']=['SimHei']
fig = plt.figure(figsize=(20,10))
sns.heatmap(corr)
plt.show()
output:
前八列强线性相关,其实因为数据量大,可以考虑降维的,这样可以减小计算量,但是需要我们先确定一个baseline后,再考虑进一步的数据处理。
Features和Labels相关性分析
fig = plt.figure(figsize=(12,6))
abs_feature_corr = abs(train.corr()['Expected']).drop('Expected')
abs_feature_corr.sort_values(ascending=True).plot.bar()
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.show()
output:
Ref和RefComposite类特征对降雨量的预测相关性相较其它特征而言之下,比较高
初步建模
我们会后续用很多个模型进行预测分析,并且相互比较优劣性,这里我们先定下第一个模型。
模型选择分析
我们最开始使用较简单的模型:LR多元线性回归进行预测
模型 | 常见算法 |
---|---|
基于线性 | LR、SVM |
基于树模型 | DT |
集成学习 | Adaboost、gdbt、xgboost |
我们的目的是做降雨量,是线性预测,可以从最简单的LR (Linear Regression) 进行多因子模型,去掉Id和minist_past后进行训练;
确定好模型后,我们还需要对一些超参数进行调参,一种方法是我们自身对模型有一定的了解,在这个基础上尝试去改变一些超参数,另一种方法是使用网络搜索暴力找到最优参数值。
训练完毕需要模型评估:我们选择MAE和MSE进行模型评估,将trian
按照8 : 2分为训练集和测试集
M S E = 1 n ∑ i = 1 n w i ( y i − y ^ i ) 2 M A E = 1 n ∑ i = 1 n ∣ y i − y ^ i ∣ MSE=\frac{1}n \sum_{i=1}^{n}w_i(y_i-\widehat{y}_i)^2 \\ MAE=\frac{1}n \sum_{i=1}^{n}|y_i-\widehat{y}_i| MSE=n1i=1∑nwi(yi−y i)2MAE=n1i=1∑n∣yi−y i∣
评估方式 | 常见算法 |
---|---|
RMSE | 衡量观测值与真实值之间的偏差 |
MSE | 真实值与预测值的差值的平方然后求和平均 |
MAE | 绝对误差的平均值 |
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import minmax_scale
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error # MAE
import time
data = train.drop(labels=['Id','minutes_past','Expected'],axis=1)
stdsc = StandardScaler()
data = stdsc.fit_transform(data)
data= minmax_scale(data)
X = pd.DataFrame(data)
y = train['Expected']
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=0)
model = LinearRegression()
t0 = time.time()
model.fit(X_train,y_train)
time = time.time() - t0
y_test_pred = model.predict(X_test)
mae = mean_absolute_error(y_test,y_test_pred)
mse = mean_square_error(y_test,y_test_pred)
print(f"MAE of test data is {mae}, MSE of test data is {mse}")
y_test = pd.DataFrame(y_test)
y_test_pred = pd.DataFrame(y_test_pred)
y_test.reset_index(drop=True, inplace=True)
y_comp = pd.concat([y_test,y_test_pred],axis=1)
plt.figure(figsize=(20,8),dpi=80)
plt.plot([i for i in range(100)],y_test.iloc[0:100],'-r',label = 'y_test')
plt.plot([i for i in range(100)],y_test_pred.iloc[0:100],'-b',label = 'y_test_pred')
plt.xlabel('order_num')
plt.ylabel('rain(mm)')
plt.title("rainfall prediction and real value", fontdict={'size': 20})
plt.legend(loc='upper right')
plt.show()
model.coef_
output:
MAE of test data is 2.1369088599651804
MSE of test data is 9.636538725685924
LR模型训练耗时:1.7940309047698975
array([ 2.96820226, -0.29848804, 4.23014651, -2.37472558, 2.87775803,
-1.42154033, -2.11950521, 2.63717558, 8.94134443, 0.13429653,
-0.10657206, 0.39007033, -0.18653644, 0.10141807, 0.72446361,
1.90372903, 0.52602944, 0.11272174, 3.26672259, 0.85920266,
-6.98069335])
绘制了前100组数据的散点折线图,可以比较直观地看出其预测变化走向和真实值的走向趋势是相同的,但是由于LR多元线性回归模型比较简单,而我们Label与Features之间的线性相关性并不是很强,所以预测和真实值之间还是存在比较大的偏差的,并且对那些异常大的值的预测并不是很接近。
缺点:LR模型容易欠拟合且预测的精度不高
优点:LR模型实现简单,便于理解且计算代价不高,参数少,耗时少
并且我们这里使用到的是SKlearn中的LinearRegression()进行训练,参数全部设置为默认。
注意:在数据需要进行归一化时,对数据偏度处理是需要的:
data = train.drop(labels=['Id','minutes_past','Expected'],axis=1)
stdsc = StandardScaler()
data = stdsc.fit_transform(data)
data= minmax_scale(data)
X = pd.DataFrame(data)
y = train['Expected']