首页 > 解决方案 > 我可以从这个用 Python 编写的机器学习脚本改变什么?我需要填写我丢失的降雨数据

问题描述

我在HEC-HMS上做水文建模,因为我需要每日降雨数据,研究流域附近有3个气象站,其中2个有2005年至2020年的完整记录,其中1个有大量缺失值,所以我正在考虑使用这个脚本来填充那些缺失的值,到目前为止,我已经尝试只更改数据和训练集的定义,但到目前为止我还没有工作。为什么我从 model.predict() 函数中获取 NaN 值,我需要更改哪些内容才能填充缺失的数据?我正在尝试用 Est2 和 Est3 填充气象站 1(Estación 1 或 Est1)。这是我到目前为止所做的:

导入数据

get_ipython().magic('pylab inline')
import pandas as pd
import numpy as np
TodasEstaciones = pd.read_csv('Est1_Est2_Est3Completos.csv',index_col=0,parse_dates=True)
TodasEstaciones.head()

我使用的数据可以在这里找到

绘制完整数据集

TodasEstaciones.loc['2005-05-01':'2020-05-05'].plot(subplots=True, figsize=(12, 8)); plt.legend(loc='best')
xticks(rotation='vertical')

导入日期/时间

import datetime
#we create a date column to extract the week number
TodasEstaciones['date']=TodasEstaciones.index
#apply a lambda function to the whole panda dataframe column
TodasEstaciones['week'] = TodasEstaciones['date'].apply(lambda x: x.isocalendar()[1])
#drop the date column because we dont need it
del TodasEstaciones['date']
#let see our dataframe
TodasEstaciones.head()

定义训练集

#Definition of training sets
X_train = TodasEstaciones.loc['2016-01-01':'2016-03-02',['Est2','Est3','week']].astype(float32).values#,'week']] # Est 2, 3 and #week
y_train = TodasEstaciones.loc['2016-01-01':'2016-03-02','Est1'].astype(float32).values # Est 1

# Import `StandardScaler` from `sklearn.preprocessing`
from sklearn.preprocessing import StandardScaler

# Define the scaler 
scaler = StandardScaler().fit(X_train)

# Scale the train set
X_train = scaler.transform(X_train)

X_train[:20]

定义模型(这是我得到 NaN 值的地方)

from keras.models import Sequential

from keras.layers import Dense

model = Sequential()

model.add(Dense(12, activation='linear', input_shape=(3,)))
model.add(Dense(8, activation='linear'))
model.add(Dense(1, activation='linear'))
model.summary()

model.compile(loss='mean_squared_error',
              optimizer='adam',
              metrics=['accuracy'])
                   
model.fit(X_train, y_train,epochs=200,verbose=0)

y_pred = model.predict(X_train)
y_pred[:10]

其余代码

plot(TodasEstaciones.loc['2011-05-01':'2016-08-02'].index,y_pred,label='Predicted')
TodasEstaciones['Est1'].loc['2011-05-01':'2016-08-02'].plot()
figsize(12,8)
ylim(0,40)
legend(loc='best')

#Get the prediction for the train set
X_missing = TodasEstaciones.loc['2011-05-01':'2016-08-02',['Est2','Est3','week']].astype(float32).values

# Import `StandardScaler` from `sklearn.preprocessing`
from sklearn.preprocessing import StandardScaler

# Define the scaler 
scaler = StandardScaler().fit(X_missing)

# Scale the train set
X_missing = scaler.transform(X_missing)

y_missing = model.predict(X_missing)
y_missing = y_missing.reshape([50]).tolist()

TodasEstaciones['Est1_Completed']=TodasEstaciones['Est1']
TodasEstaciones['Est1_Completed'].loc['2011-05-01':'2016-08-02']=y_missing

TodasEstaciones.loc['22011-05-01':'2016-08-02',['Est1','Est1_Completed','Est2','Est3']].plot(subplots=True, 
                                                   figsize=(15, 10)); plt.legend(loc='best')
xticks(rotation='vertical')
ylim(0,50)

标签: pythonmachine-learningkeras

解决方案


推荐阅读