1. 程式人生 > >評估深度學習模型-基於keras的python學習筆記(二)

評估深度學習模型-基於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)))