keras学习之深度学习模型评估

自动评估

keras将数据集的一部分分成评估数据集,在每个epoch中使用评估数据集对模型进行评估。实现可以通过fit()函数的validation_split设置数据集大小的百分比a来进行实现,评估数据集大小=全量数据集*a获取,训练数据集大小=全量数据集*(1-a)。

#keras 深度模型评估
from keras.models import Sequential
from keras.layers import Dense
import numpy as np

np.random.seed(7)

dataset = np.loadtxt("pima-indians-diabetes.csv",delimiter=",")
x = dataset[:, 0 : 8]
y = dataset[:, 8 ]

#构造模型
model = Sequential()
model.add(Dense(12, input_dim = 8, activation = "relu" ))
model.add(Dense(8,activation = "relu"))
model.add(Dense(1,activation="sigmoid"))

#编译模型
model.compile(loss="binary_crossentropy",optimizer="adam",metrics=["accuracy"])

#训练模型并自动评估
model.fit(x=x_train,y=y_train,epochs=150,batch_size=10,validation_split=0.2)

训练结果中多了val_loss和val_acc两个项目的输出。

手动评估

1、手动分隔数据集进行评估

使用scikit机器学习库中的train_test_split()函数将数据分为训练数据集和评估数据集。使用80%的数据进行训练,20%的数据进行评估。

from keras.models import Sequential
from keras.layers import Dense
from sklearn.model_selection import train_test_split
from sklearn import metrics 
import numpy as np

#设置随机数种子
np.random.seed(7)
dataset = np.loadtxt("pima-indians-diabetes.csv",delimiter=",")
x = dataset[:, 0 : 8]
y = dataset[:, 8 ]
#数据集划分
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2,random_state=10)


#构造模型
model = Sequential()
model.add(Dense(12, input_dim = 8, activation = "relu" ))
model.add(Dense(8,activation = "relu"))
model.add(Dense(1,activation="sigmoid"))

#编译模型
model.compile(loss="binary_crossentropy",optimizer="adam",metrics=["accuracy"])

#训练模型
model.fit(x=x_train,y=y_train,epochs=150,batch_size=10,validation_data=(x_test,y_test))

2、k折交叉验证评估

k折交叉验证是把数据集分成k份,一份作为评估数据集,剩下k-1份作为训练集,共得到k份训练集数据和评估数据。使用k个模型的平均值作为最终的评估结果。

使用scikit-learn中的StratifiedKFold类将数据分成k个子集。

from keras.models import Sequential
from keras.layers import Dense
import numpy as np
from sklearn.model_selection import StratifiedKFold

seed=7
np.random.seed(seed)

dataset = np.loadtxt("pima-indians-diabetes.csv",delimiter=",")
x = dataset[:, 0 : 8]
y = dataset[:, 8 ]

kfold = StratifiedKFold(n_splits=10,random_state=seed,shuffle=True)
cvscores = []

for train,validation in kfold.split(x,y):
    #构造模型
    model = Sequential()
    model.add(Dense(12, input_dim = 8, activation = "relu" ))
    model.add(Dense(8,activation = "relu"))
    model.add(Dense(1,activation="sigmoid"))
    #编译模型
    model.compile(loss="binary_crossentropy",optimizer="adam",metrics=["accuracy"])
    #训练模型
    model.fit(x=x[train],y=y[train],epochs=150,batch_size=10,verbose=0)
    #评估模型
    scores = model.evaluate(x[validation],y[validation],verbose=0)
    #输出评估结果
    print('%s: %.2f%%' % (model.metrics_names[1],scores[1]*100))
    cvscores.append(scores[1]*100)
    
#输出均值和标准差
print('%.2f%% (+/- %.2f%%)' % (np.mean(cvscores),np.std(cvscores)))

k折共训练了k个模型,如果模型训练时间很长,这大大增加了计算代价。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值