Python 机器学习模型过拟合

Python 机器学习模型过拟合,python,pandas,tensorflow,machine-learning,keras,Python,Pandas,Tensorflow,Machine Learning,Keras,所以我建立了一个GRU模型,在同一个模型上比较了3个不同的数据集。我刚刚运行了第一个数据集,并将历元数设置为25,但我注意到,在第六个历元之后,我的验证丢失正在增加,这是否表明拟合过度,我是否做错了什么 LSTM(以及GRU,尽管其结构较轻)因容易过度装配而臭名昭著 减少每个层(32(layer1)-64(layer2)中的单位数(输出大小);也可以完全消除最后一层 第二,您正在使用激活“sigmoid”,但您的损失函数+度量是mse 确保您的问题是回归或分类问题。如果确实是回归,则在最后一步

所以我建立了一个GRU模型,在同一个模型上比较了3个不同的数据集。我刚刚运行了第一个数据集,并将历元数设置为25,但我注意到,在第六个历元之后,我的验证丢失正在增加,这是否表明拟合过度,我是否做错了什么

LSTM(以及GRU,尽管其结构较轻)因容易过度装配而臭名昭著

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

第二,您正在使用激活“
sigmoid
”,但您的损失函数+度量是
mse

确保您的问题是
回归
分类
问题。如果确实是回归,则在最后一步激活函数应为“
线性
”。如果是分类函数,则应将损失函数更改为
二进制交叉熵
,并将度量更改为“
精度”


因此,显示的图目前只是误导。如果您按照我的建议进行修改,并且仍然得到这样一个train val loss图,那么我们可以确定您有一个过度装配的箱子。

抱歉,这是我第一次这样做,所以很难跟上。据我所知,我应该将第一层的单位从512改为512第二个是32,第二个是256,第二个是64,第二个是去掉密集层?这是我的另一个问题,如果我的损失函数和度量函数相同,这有关系吗?我已经读了一段时间关于回归的书,我不明白使用辍学、L2正则化和减少层数可以减少回归问题。我真的不知道那么分类是什么呢?也非常感谢你的回答!好吧,在回归的情况下,使用mse作为损失和度量都是可以的。事实上,使用正则化技术,如辍学或L2正则化,可以帮助你减少过度拟合的问题。但是,如果你稍微想象一下,有什么更好的方法?有10层,包含许多神经元,并在其上使用辍学?或者减少层数,以便从一开始就在很大程度上缓解过度拟合问题?如果您观察到您的模型无法学习训练集(拟合不足),则解决方案是逐步添加层。逐渐地,从一开始就不是一个巨大的模型。欢迎您,永远不要忘记我们都是初学者,我们所有人都是来学习和帮助他人学习的!每层的单位数应该是2的幂(不一定)。使用一层GRU(32个单位)并逐步添加层。在您对网络进行每一次小的修改之后(新的层/神经元数量)测试并查看其在训练过程中的行为。训练验证拆分取决于数据集的数量。如果数据集非常小,可以接受66%--train,33%--val的拆分。如果数据集非常大(数十万个示例),即使是95%序列5%val的分割也是好的。因此,这实际上取决于数据集中的样本数。如果需要预测真实值(数字),则需要将激活更改为“线性”,并让其他参数与model.fit中的参数完全相同。如果需要预测类别(是/否,1/0),则需要使用二进制交叉熵(损失函数)+“S形”激活和“准确度”作为度量。
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()