評估深度學習模型-基於keras的python學習筆記(二)
版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/weixin_44474718/article/details/86238644
一、自動評估
keras可將資料集一部分分成評估資料集,並在每個epoch中使用該評估資料集對模型進行評估,通過對驗證分割引數(validation_split
)設定為資料集大小的百分比來實現。
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和輸出Y
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, y=Y, epochs=150, batch_size=10, validation_split=0.2)
二、手動評估
在訓練期間進行驗證,使用scikit機器學習庫的train_test_split()
函式將資料分成訓練資料集和評估資料集。
函式解釋:
train_test_split函式用於將矩陣隨機劃分為訓練子集和測試子集,並返回劃分好的訓練集測試集樣本和訓練集測試集標籤。
格式:X_train,X_test, y_train, y_test =cross_validation.train_test_split(train_data,train_target,test_size=0.2, random_state=0)
引數解釋:
train_data
:被劃分的樣本特徵集
train_target
:被劃分的樣本標籤
test_size
:如果是浮點數,在0-1之間,表示樣本佔比;如果是整數的話就是樣本的數量
random_state
:是隨機數的種子。
隨機數種子:其實就是該組隨機數的編號,在需要重複試驗的時候,保證得到一組一樣的隨機數。比如你每次都填1,其他引數一樣的情況下你得到的隨機陣列是一樣的。但填0或不填,每次都會不一樣。
隨機數的產生取決於種子,隨機數和種子之間的關係遵從以下兩個規則:
種子不同,產生不同的隨機數;種子相同,即使例項不同也產生相同的隨機數。
這個例子80%用於訓練,剩餘20%用於評估。
from keras.models import Sequential
from keras.layers import Dense
from sklearn.model_selection import train_test_split
import numpy as np
seed = 7
# 設定隨機數種子
np.random.seed(seed)
# 匯入資料
dataset = np.loadtxt('pima-indians-diabetes.csv', delimiter=',')
# 分割輸入x和輸出Y
x = dataset[:, 0 : 8]
Y = dataset[:, 8]
# 分割資料集
x_train, x_validation, Y_train, Y_validation = train_test_split(x, Y, test_size=0.2, random_state=seed)
# 構建模型
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_train, Y_train, validation_data=(x_validation, Y_validation), epochs=150, batch_size=10)
三、k折交叉驗證
機器學習模型的黃金評估標準。
分為k個子集,1一個評估,剩餘k-1作為訓練。通常k取5-10。
速度極慢!!!
函式解釋:
StratifiedKFold
函式是Kfold的變體,通過演算法來平衡每個子集中每個類的例項數。即將資料分割為多少個子集。
格式:kfold = StratifiedKFold(n_splits=10, random_state=seed, shuffle=True)
引數解釋:
n_splits
:被劃分的子集數量。最少為2,預設為3
random_state
:(int,RandomState例項或None,可選,預設=無)
如果是int,則random_state是隨機數生成器使用的種子;
如果是RandomState例項,則random_state是隨機數生成器;
如果為None,則隨機數生成器是np.random
使用的RandomState例項。 當shuffle
== True時使用。
shuffle
:布林值,可選,是否在拆分之前對資料的每個分層進行洗牌成批。
通過設定verbose為0來關閉模型的fit()和evaluate()函式的詳細輸出
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和輸出Y
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[train], 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)))