【问题标题】:Machine Learning Model overfitting机器学习模型过拟合
【发布时间】:2020-06-19 19:48:27
【问题描述】:

所以我构建了一个 GRU 模型,并在同一模型上比较了 3 个不同的数据集。我只是在运行第一个数据集并将 epoch 数设置为 25,但我注意到我的验证损失在第 6 个 epoch 之后就在增加,这是否表明过度拟合,我做错了什么吗?

import pandas as pd
import tensorflow as tf
from keras.layers.core import Dense
from keras.layers.recurrent import GRU
from keras.models import Sequential
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


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 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))







# creating model using Keras
model10 = Sequential()
model10.add(GRU(units=512, return_sequences=True, input_shape=(1,12)))
model10.add(GRU(units=256, return_sequences=True))
model10.add(GRU(units=256))
model10.add(Dense(units=1, activation='sigmoid'))
model10.compile(loss=['mse'], optimizer='adam',metrics=['mse']) 
model10.summary() 

history10=model10.fit(X10_train, y10_train, batch_size=256, epochs=25,validation_split=0.20, verbose=1, callbacks=[TensorBoardColabCallback(tbc)])


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()

【问题讨论】:

    标签: python pandas tensorflow machine-learning keras


    【解决方案1】:

    LSTM(以及 GRU,尽管它们的结构更轻)因容易过拟合而臭名昭著。

    减少每层(32(layer1)-64(layer2)中的单元数(输出大小);您也可以完全消除最后一层。

    其次,您使用的是激活“sigmoid”,但您的损失函数 + 度量是mse

    确保您的问题是regressionclassification 之一。如果确实是回归,那么最后一步的激活函数应该是'linear'。如果是分类,您应该将 loss_function 更改为 binary_crossentropy 并将您的指标更改为 'accuracy'。

    因此,显示的情节暂时只是误导。如果您按照我的建议进行修改,但仍然得到这样的 train-val 损失图,那么我们可以确定您有过度拟合的情况。

    【讨论】:

    • 对不起,这是我第一次这样做,所以很难坚持下去。据我了解,我应该将第一层的单位从 512 更改为 32,然后将第二层的单位从 256 更改为 64,并移除密集层?这是我的另一个问题,我的损失函数和度量函数是否相同有关系吗?我已经阅读了一段时间的回归,但我发现使用 dropout 、L2 正则化和减少层数可以减少回归问题。我真的不知道什么是分类。也非常感谢您的回复!
    • 好吧,在回归的情况下,可以同时使用 mse 作为损失和度量。确实,使用诸如 Dropout 或 L2 正则化之类的正则化技术可以帮助您减少过拟合问题。但是,如果您稍微想象一下,那会更好吗?有 10 层有很多神经元并在它们上使用 dropout?或者减少层数,从而在很大程度上缓解从一开始的过度拟合问题?如果您观察到您的模型无法学习训练集(欠拟合),解决方案是逐渐添加层。逐渐地,从一开始就不是一个巨大的模型。
    • 不客气,永远不要忘记我们都是初学者,我们所有人都在这里学习并帮助他人学习!
    • 每一层的单元数应该是2的幂(不一定)。使用一层 GRU(32 个单元)并逐步添加层。在您对网络(新层/神经元数量)进行的每一次小修改之后,测试并查看它在训练过程中的表现。训练验证拆分取决于数据集的数量。如果你有一个非常小的数据集,66%---train, 33%---val 的分割是可以接受的。如果您有一个非常大的数据集(数十万个示例),即使将 95% 训练 5% val 拆分也是好的。所以这实际上取决于数据集中的样本数量。
    • 如果您需要预测一个实数值(一个数字),您需要将激活更改为“线性”,并让其他参数与 model.fit 中的完全一致。如果需要预测一个类别(是/否,1/0),则需要使用 binary_crossentropy(loss_function) + 'sigmoid' 激活和 'accuracy' 作为指标。
    猜你喜欢
    • 1970-01-01
    • 2022-12-10
    • 2018-08-16
    • 2018-06-03
    • 2020-06-11
    • 2019-01-06
    • 1970-01-01
    • 1970-01-01
    • 2014-05-20
    相关资源
    最近更新 更多