Python GRU模型过拟合

Python GRU模型过拟合,python,tensorflow,machine-learning,keras,Python,Tensorflow,Machine Learning,Keras,为了预测功率输出,我编写了一个GRU模型

为了预测功率输出,我编写了一个GRU模型<不过,我注意到,在5-6个纪元之后,我的价值损失开始增加,并且在每个纪元之后都没有停止,而且超出了相当大的范围
我尝试了很多方法,但都没有真正起作用:

  • 我尝试了
    relu
    sigmoid
    线性
    激活函数
  • 我从1层开始,有不同数量的神经元和增加的层等等
  • 我尝试过使用
    退出
    和L2正则化器,但没有任何效果,它要么在几个时代后过度拟合,要么保持不变
  • 我的特征是不同的物理参数,如温度、电压、风速等,我试图预测输出功率。如果我使用了错误的激活或优化器,我真的不明白为什么它太过合适了

    model10.add(GRU(units=256, return_sequences=True, dropout=0.3,
    recurrent_dropout=0.4, kernel_regularizer=regularizers.l2(0.001), input_shape=(1,12)))
    
    model10.add(GRU(units=256, return_sequences=True,activation='linear',
    dropout=0.25, recurrent_dropout=0.3))
    
    model10.add(GRU(units=128,activation='linear',
    dropout=0.3, recurrent_dropout=0.35))
    
    代码如下:

    import pandas as pd
    import tensorflow as tf
    import matplotlib.pyplot as plt
    from sklearn.model_selection import train_test_split
    from sklearn.preprocessing import MinMaxScaler
    from google.colab import files
    from tensorboardcolab import TensorBoardColab, TensorBoardColabCallback
    tbc=TensorBoardColab() # Tensorboard
    from keras.layers.core import Dense
    from keras.layers.recurrent import GRU
    from keras.models import Sequential
    from keras.callbacks import EarlyStopping
    from keras import regularizers
    from keras.layers import Dropout
    
    
    
    
    
    df10=pd.read_csv('/content/drive/My Drive/Isolation Forest/IF 10 PERCENT.csv',index_col=None)
    df2_10= pd.read_csv('/content/drive/My Drive/2019 Dataframe/2019 10minutes IF 10 PERCENT.csv',index_col=None)
    
    X10_train= df10[['WindSpeed_mps','AmbTemp_DegC','RotorSpeed_rpm','RotorSpeedAve','NacelleOrientation_Deg','MeasuredYawError','Pitch_Deg','WindSpeed1','WindSpeed2','WindSpeed3','GeneratorTemperature_DegC','GearBoxTemperature_DegC']]
    X10_train=X10_train.values
    
    y10_train= df10['Power_kW']
    y10_train=y10_train.values
    
    X10_test= df2_10[['WindSpeed_mps','AmbTemp_DegC','RotorSpeed_rpm','RotorSpeedAve','NacelleOrientation_Deg','MeasuredYawError','Pitch_Deg','WindSpeed1','WindSpeed2','WindSpeed3','GeneratorTemperature_DegC','GearBoxTemperature_DegC']]
    X10_test=X10_test.values
    
    y10_test= df2_10['Power_kW']
    y10_test=y10_test.values
    
    
    
    
    # scaling values for the model
    
    
    x_scale = MinMaxScaler()
    y_scale = MinMaxScaler()
    
    X10_train= x_scale.fit_transform(X10_train)
    y10_train= y_scale.fit_transform(y10_train.reshape(-1,1))
    X10_test=  x_scale.fit_transform(X10_test)
    y10_test=  y_scale.fit_transform(y10_test.reshape(-1,1))
    
    
    X10_train = X10_train.reshape((-1,1,12)) 
    X10_test = X10_test.reshape((-1,1,12))
    
    
    
    Early_Stop=EarlyStopping(monitor='val_loss', patience=5,mode='min',restore_best_weights=True)
    
    
    
    # creating model using Keras
    model10 = Sequential()
    model10.add(GRU(units=256, return_sequences=True, kernel_regularizer=regularizers.l2(0.001), input_shape=(1,12)))
    model10.add(GRU(units=256, return_sequences=True,activation='linear'))
    model10.add(GRU(units=128,activation='linear'))
    #model10.add(GRU(units=256))
    model10.add(Dense(units=1, activation='linear'))
    model10.compile(loss=['mse'], optimizer='adam',metrics=['mse']) 
    model10.summary() 
    
    
    history10=model10.fit(X10_train, y10_train, batch_size=256, epochs=10,validation_split=0.10, verbose=1, callbacks=[TensorBoardColabCallback(tbc),Early_Stop])
    
    
    score = model10.evaluate(X10_test, y10_test)
    print('Score: {}'.format(score))
    
    
    
    y10_predicted = model10.predict(X10_test)
    y10_predicted = y_scale.inverse_transform(y10_predicted)
    
    y10_test = y_scale.inverse_transform(y10_test)
    
    plt.plot( y10_predicted, label='Predicted')
    plt.plot( y10_test, label='Measurements')
    plt.legend()
    plt.savefig('/content/drive/My Drive/Figures/Power Prediction 10 Percent.png')
    plt.show()
    

    过度拟合的一个原因可能是您使用了3个
    GRU层

    您可以从1层
    GRU
    开始,因为堆叠许多
    GRU
    层不仅会导致过度装配,而且成本非常昂贵

    确保正确清洁
    数据
    ,并执行
    功能工程
    (删除不必要的列等…),因为
    模型
    从不需要的
    噪声中学习

    如果
    模型
    与1
    没有
    过度拟合
    ,并且如果在
    准确性
    (或相应的
    度量
    )方面存在改进范围,那么我们可以添加第二个
    GRU层

    我们还需要在每个
    GRU层
    中添加
    辍学
    经常性辍学
    ,如下所示。它们在缓解过度装配方面非常有效

    model10.add(GRU(units=256, return_sequences=True, dropout=0.3,
    recurrent_dropout=0.4, kernel_regularizer=regularizers.l2(0.001), input_shape=(1,12)))
    
    model10.add(GRU(units=256, return_sequences=True,activation='linear',
    dropout=0.25, recurrent_dropout=0.3))
    
    model10.add(GRU(units=128,activation='linear',
    dropout=0.3, recurrent_dropout=0.35))
    

    希望这有帮助。学习愉快

    准确度有多好/有多差?我被告知不要在
    指标中使用准确度,因为我的数据帧是每年第二个数据帧,并且基于不断波动的物理参数。“为什么我的模型过度拟合”不是堆栈溢出的编程问题,而是交叉验证的机器学习问题(stats.stackexchange.com)或数据科学(datascience.stackexhage.com)然而,我也建议在询问之前搜索这两个网站(它们很棒!)以寻找类似的问题……这里有很多关于过度拟合的问题。