Verwenden Sie die K-fache Validierung, um das Modell effektiver zu evaluieren.
- 24-07-2022
- chuong xuan
- 0 Comments
Das Trainingsmodell hängt nicht nur vom verwendeten Modell ab, sondern auch von vielen anderen Dingen, einschließlich der Datenmenge. Ein bescheidener Datensatz führt zwangsläufig zu einer ineffizienten Modellbewertung. Die K-fache Kreuzvalidierung ist also ein ziemlich cooler Trick, um uns dabei zu helfen, damit umzugehen.
Mục lục
Was ist, wenn wir das Modell mit wenigen Daten evaluieren?
Sicherlich ist jeder damit vertraut, wie man Zug-, Validierungs- und Testdaten aufteilt, oder?
Im Moment müssen Sie sich nur um das Trainingsset und das Val-Set kümmern, und das Testset ermöglicht es uns, das Modell nach Abschluss des Trainings zu evaluieren, um zu sehen, wie das Modell die Daten in der Praxis verarbeiten wird.
Normalerweise werden Sie feststellen, dass wir Zug / Wert oft im Verhältnis 80/20 (80 % Zugdaten, 20 % Testdaten) aufteilen. Eine solche Aufteilung ist ziemlich gut, wenn unsere Daten groß sind. Kleine Daten führen definitiv dazu, dass Ihr Modell schlecht abschneidet. Da einige der für den Trainingsprozess nützlichen Daten von uns zur Validierung und zum Testen geworfen wurden, kann das Modell nicht aus diesen Daten lernen. Ganz zu schweigen davon, dass, wenn unsere Daten nicht garantiert zufällig sind, einige Labels in der Validierung und im Test vorhanden sind, aber nicht im Trainingssatz. Und natürlich ist es nicht gut, das Modell auf der Grundlage dieses Ergebnisses zu bewerten. Es ist, als hätte er nicht Mathematik studiert, sondern ihn dazu gebracht, maschinelles Lernen zu lernen.
Dann brauchen wir die K-Fold Cross Validation.
Was ist die K-Kreuzvalidierung?
K-Flod CV hilft uns, ein Modell vollständiger und genauer zu evaluieren, wenn unser Trainingssatz nicht groß ist.
Der Trainingsdatenteil wird in K-Teile unterteilt (K ist eine ganze Zahl, die oft zu schwierig zu wählen ist, 10). Trainieren Sie dann das Modell K-mal, jedes Mal wählt der Zug 1 Teil als Validierungsdaten und K-1 Unterteil wird der Trainingssatz sein. Das Endergebnis ist der Durchschnitt der Bewertungsergebnisse von K Trainingszeiten. Deshalb ist diese Einschätzung auch objektiver.
Nachdem die Bewertung abgeschlossen ist und Sie die Genauigkeit auf einem „akzeptablen“ Niveau finden, fahren Sie mit der Vorhersage nur mit dem Testdatensatz fort.
Übe mit Keras
Ok grundlegende Theorie erledigt. Jetzt zum Üben! Wir verwenden zum Üben immer den CIFAR10-Datensatz in Keras.
Bibliotheken importieren.
from tensorflow.keras.datasets
import cifar10
from tensorflow.keras.models
import Sequential from tensorflow.keras.layers
import Dense, Flatten, Conv2D, MaxPooling2D from sklearn.model_selection
import KFold import numpy as np
Schreiben Sie eine Funktion zum Laden von Daten:
def load_data():
# Load dữ liệu CIFAR đã được tích hợp sẵn trong Keras
(X_train, y_train), (X_test, y_test) = cifar10.load_data()
# Chuẩn hoá dữ liệu
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_test = X_test / 255
X_train = X_train / 255 # Do CIFAR đã chia sẵn train và test nên ta nối lại để chia K-Fold
X = np.concatenate((X_train, X_test), axis=0)
y = np.concatenate((y_train, y_test), axis=0)
return X, y
Erstellen Sie Modelle in Keras
def get_model():
model = Sequential()
model.add(Conv2D(64, kernel_size=(3, 3), activation='relu', input_shape=(32, 32, 3)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(128, kernel_size=(3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dense(128, activation='relu'))
model.add(Dense(no_classes, activation='softmax')) # Compile model
model.compile(loss="sparse_categorical_crossentropy", optimizer="Adam", metrics=['accuracy'])
return model
Wir verwenden auch die KFold-Bibliothek von Sklearn zum Teilen
kfold = KFold(n_splits=num_folds, shuffle= True )
# K-fold Cross Validation model evaluation
fold_idx = 1
for train_ids, val_ids in kfold.split(X, y):
model = get_model()
print ("Bắt đầu train Fold ", fold_idx)
# Train model
model.fit(X[train_ids], y[train_ids], batch_size=batch_size, epochs=no_epochs, verbose=1) # Test và in kết quả
scores = model.evaluate(X[val_ids], y[val_ids], verbose=0) print ("Đã train xong Fold ", fold_idx) # Thêm thông tin
accuracy và loss vào list accuracy_list.append(scores[1] * 100) loss_list.append(scores[0]) # Sang Fold tiếp theo
fold_idx = fold_idx + 1
Die Idee ist, dass wir KFold verwenden, um den train-Indexsatz und den val-Indexsatz bei jedem Fold zu erhalten, und dann die Elemente gemäß diesem Indexsatz in train, val extrahieren, um besser geeignet zu sein. Genauigkeits- und Verlustergebnisse werden in der Liste gespeichert, um den Durchschnitt anzuzeigen.
Zusammenfassung
Anstatt das Modell direkt mit dem Zugset und dem Val-Set zu evaluieren, konnten wir das Modell mit dem K-Fold CV effizienter evaluieren. Neben K-Fold CV können Sie Stratified K-Fold ausprobieren, das ist besser, weil es eine Erweiterung von K-Fold CV ist.