终于也到了炼丹的时候了
前言
老师调整了 训练集占总体的比例(0.5->0.8)
学习率调小了(0.005->0.001)
keras.callbacks.EarlyStopping
- monitor: 监控指标,如val_loss
- min_delta: 认为监控指标有提升的最小提升值。如果变化值小于该值,则认为监控指标没有提升。
- patience: 在监控指标没有提升的情况下,epochs 等待轮数。等待大于该值监控指标始终没有提升,则提前停止训练。
- verbose: log输出方式,日志输出格式 0 1
- mode: 三选一 {“auto”, “min”, “max”},默认auto。min 模式是在监控指标值不再下降时停止训练;max 模式是指在监控指标值不再上升时停止训练;max 模式是指根据 monitor来自动选择。
- baseline: 监控指标需要到达的baseline值。如果监控指标没有到达该值,则提前停止。
- restore_best_weights: 是否加载训练过程中保存的最优模型权重,如果为False,则使用在训练的最后一步获得的模型权重。
调大了num_epochs=5000, batch_size=20,原来是(500,16)
keras中epochs、batch_size、iterations详解 - 知乎 (zhihu.com)
batch_size=1随机梯度下降算法,batch_size=len(数据集) 批量梯度下降算法
epochs指的就是训练过程中数据将被“轮”多少次
我进行了哪些尝试
这里有几个方面需去尝试:
-
数据集怎么分
- cross_val
- 还提到了 针对时序序列的 可以使用
TimeSeriesSplit
探索失败,因为sklearn的库和keras搭的框架,兼容的不是很好,然后第二个我也去看了,他这个训练集是逐步递增的,后面每一个都是前面的超集。
-
学习率
- 1e-5 ~ 0.1
-
隐含层数量
- 1 2 4 8 16
最终跑出来一个8 0.0067 0.894
- 1 2 4 8 16
这里参考的是菜菜TsaiTsai决策树的教程
tr = []
te = []
for i in range(10):
clf = DecisionTreeClassifier(random_state=25
,max_depth=i+1
,criterion="entropy"
)
clf = clf.fit(Xtrain, Ytrain)
score_tr = clf.score(Xtrain,Ytrain)
score_te = cross_val_score(clf,X,y,cv=10).mean()
tr.append(score_tr)
te.append(score_te)
print(max(te))
plt.plot(range(1,11),tr,color="red",label="train")
plt.plot(range(1,11),te,color="blue",label="test")
plt.xticks(range(1,11))
plt.legend()
plt.show()
得到了最优的参数
然后进行测试,发现数据的问题比较大,然后又是对数据进行重新划分。
折腾折腾可就一天了。这几个小时,虽然说模型结构简单,跑得快,但是往往是跑出来之后,才觉得前面有哪里可以改进一下,这就导致现在跑出来的东西可能就不是最好的了。
所以以后训练模型还是依照 数据 然后 模型 最后超参数 ,不能像这次明知数据有大问题的情况还去训练。