ML 新手,我想知道我遗漏了什么或做错了什么。
我试图弄清楚为什么我的数据在应用提前停止和辍学时欠拟合,但是当我不使用提前停止或辍学时,拟合似乎没问题......
我正在使用的数据集:https ://www.kaggle.com/datasets/kanths028/usa-housing
模型参数:数据集有 5 个要训练的特征,目标是我任意选择 4 层的价格 Epochs 为 600(太多了),因为我想测试提前停止优化器和损失,因为这些似乎让我得到最一致的结果与 SKLearns LinearRegression 相比(MAE 约为 81K)
数据预处理:
X = df[df.columns[:-2]].values
y = df['Price'].values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30, random_state=42)
scaler = MinMaxScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
合身看起来不错:
model = Sequential()
model.add(Dense(5, activation='relu'))
model.add(Dense(5, activation='relu'))
model.add(Dense(5, activation='relu'))
model.add(Dense(5, activation='relu'))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mae')
model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=600)
结合 earlystopping 和 dropout,数据看起来不合适:
model = Sequential()
model.add(Dense(10, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(10, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(10, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(10, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(1))
early_stopping = EarlyStopping(monitor='val_loss', mode='min', patience=25)
model.compile(optimizer='adam', loss='mae')
model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=600, callbacks=[early_stopping])
我试图弄清楚为什么当结果如此遥远时提前停止会停止。我猜这个模型会一直持续到 600 个 epoch 结束,但是提前停止会在 300 左右拔掉插头。
我可能做错了什么,但我无法弄清楚,所以任何见解都会受到赞赏。先感谢您 :)
它定义了性能度量并指定是最大化还是最小化它。
然后 Keras 在适当的时期停止训练。指定verbose=1时,可以在keras中停止训练时在屏幕上输出。
es = EarlyStopping(monitor='val_loss', mode='min')
由于性能没有提高,因此立即停止可能无效。耐心定义了允许不提高性能的 epoch 的次数。参与度是一个相当主观的标准。可以根据使用的数据的设计和使用的模型来改变最佳值。
es = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=50)
当训练被模型选择提前停止对象停止时,状态通常会比之前的模型有更高的验证错误。因此,可以控制提前停止,使模型的验证误差不再通过在某个时间点停止模型的训练来降低,但停止状态不会是最好的模型。因此,需要存储验证性能最好的模型,为此,keras 中存在名为 Model Checkpoint 的对象。此对象监控验证错误,如果验证性能优于前一个 epoch,则此时无条件存储参数。通过这个,当训练停止时,可以返回具有最高验证性能的模型。
from keras.callbacks import ModelCheckpoint
mc = ModelCheckpoint ('best_model.h5', monitor='val_loss', mode='min', save_best_only=True)
在回调参数中,允许存储最佳模型。
hist = model.fit(train_x, train_y, nb_epoch=10,
batch_size=10, verbose=2, validation_split=0.2,
callbacks=[early_stopping, mc])
在您的情况下,耐心 25 表示当参考值连续提高不超过 25 次时是否结束。
from keras.callbacks import ModelCheckpoint
model = Sequential()
model.add(Dense(10, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(10, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(10, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(10, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(1))
early_stopping = EarlyStopping(monitor='val_loss', mode='min', patience=25, verbose=1)
mc = ModelCheckpoint ('best_model.h5', monitor='val_loss', mode='min', save_best_only=True)
model.compile(optimizer='adam', loss='mae')
model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=600, callbacks=[early_stopping, mc])
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句