【发布时间】:2021-02-07 12:06:23
【问题描述】:
我想以与 Keras 相同的方式为我的训练和验证集绘制损失曲线,但使用的是 Scikit。我选择了一个回归问题的具体数据集,该数据集可在以下位置获得:
http://archive.ics.uci.edu/ml/machine-learning-databases/concrete/compressive/
所以,我已将数据转换为 CSV,我的程序的第一个版本如下:
模型 1
df=pd.read_csv("Concrete_Data.csv")
train,validate,test=np.split(df.sample(frac=1),[int(.8*len(df)),int(.90*len(df))])
Xtrain=train.drop(["ConcreteCompStrength"],axis="columns")
ytrain=train["ConcreteCompStrength"]
Xval=validate.drop(["ConcreteCompStrength"],axis="columns")
yval=validate["ConcreteCompStrength"]
mlp=MLPRegressor(activation="relu",max_iter=5000,solver="adam",random_state=2)
mlp.fit(Xtrain,ytrain)
plt.plot(mlp.loss_curve_,label="train")
mlp.fit(Xval,yval) #doubt
plt.plot(mlp.loss_curve_,label="validation") #doubt
plt.legend()
结果图如下:
在这个模型中,我怀疑它是否是正确的标记部分,因为只要我知道应该将验证集或测试集分开,那么拟合函数可能在那里不正确。我得到的分数是 0.95。
模型 2
在这个模型中,我尝试使用如下验证分数:
df=pd.read_csv("Concrete_Data.csv")
train,validate,test=np.split(df.sample(frac=1),[int(.8*len(df)),int(.90*len(df))])
Xtrain=train.drop(["ConcreteCompStrength"],axis="columns")
ytrain=train["ConcreteCompStrength"]
Xval=validate.drop(["ConcreteCompStrength"],axis="columns")
yval=validate["ConcreteCompStrength"]
mlp=MLPRegressor(activation="relu",max_iter=5000,solver="adam",random_state=2,early_stopping=True)
mlp.fit(Xtrain,ytrain)
plt.plot(mlp.loss_curve_,label="train")
plt.plot(mlp.validation_scores_,label="validation") #line changed
plt.legend()
而对于这个模型,我不得不添加early stopping set 为true 和validation_scores_ 的部分进行绘制,但是图形结果有点奇怪:
我得到的分数是 0.82,但我了解到,当模型发现预测验证集中的数据比预测训练集中的数据更容易时,就会发生这种情况。我相信这是因为我使用了 validation_scores_ 部分,但我无法找到任何关于此特定指令的在线参考。
绘制这些损失曲线以在 Scikit 中调整我的超参数的正确方法是什么?
更新 我已经按照这样的建议对模块进行了编程:
mlp=MLPRegressor(activation="relu",max_iter=1,solver="adam",random_state=2,early_stopping=True)
training_mse = []
validation_mse = []
epochs = 5000
for epoch in range(1,epochs):
mlp.fit(X_train, Y_train)
Y_pred = mlp.predict(X_train)
curr_train_score = mean_squared_error(Y_train, Y_pred) # training performances
Y_pred = mlp.predict(X_valid)
curr_valid_score = mean_squared_error(Y_valid, Y_pred) # validation performances
training_mse.append(curr_train_score) # list of training perf to plot
validation_mse.append(curr_valid_score) # list of valid perf to plot
plt.plot(training_mse,label="train")
plt.plot(validation_mse,label="validation")
plt.legend()
但得到的图是两条平线:
我好像漏掉了什么。
【问题讨论】:
标签: python machine-learning scikit-learn