[PYTHON] Optuna, Keras und Titanic

Einführung

Um maschinelles Lernen und Bayes'sche Optimierung zu studieren, habe ich versucht, k, Kaggles Tutorial-ähnlichen Wettbewerb "Titanic: Maschinelles Lernen aus Katastrophen" mit einem neuronalen Netzwerk zu bewerten. Für eine hohe Para-Optimierung verwenden wir die Optuna-Bibliothek von Preferred Networks (offizielle Website) (https://preferred.jp/en/projects/optuna/'optuna library ').

Ergebnis

Public Score : 0.7655

Hinweis

Ich werde den Link der Kaggle-Notiz setzen. kaggle note

Code

Vorverarbeitung

Die erste ist die Vorverarbeitung zum Löschen von Merkmalsmengen, die wahrscheinlich nicht mit einer fehlerhaften Landverarbeitung zusammenhängen. Ich habe es aus Intuition gemacht.

train = train.fillna({'Age':train['Age'].mean()})
X_df = train.drop(columns=['PassengerId','Survived', 'Name', 'Ticket', 'Cabin', 'Embarked'])
y_df = train['Survived']

Als nächstes erfolgt die Erfassung von Dummy-Variablen.

X_df = X_df.replace('male', 0)
X_df = X_df.replace('female', 1)

Trennen Sie die Daten für Training und Auswertung.

from sklearn.model_selection import train_test_split
X_train, X_val, y_train, y_val = train_test_split(X_df.values, y_df.values, test_size=0.25, shuffle=True, random_state=0)

Werfen wir einen Blick auf den Inhalt von X_train. Die Spaltennamen sind Pclass, Geschlecht, Alter, SibSp, Parch, Fare.

[[ 3.          0.         28.          0.          0.          7.8958    ]
 [ 3.          1.         17.          4.          2.          7.925     ]
 [ 3.          0.         30.          1.          0.         16.1       ]
 ...
 [ 3.          0.         29.69911765  0.          0.          7.7333    ]
 [ 3.          1.         36.          1.          0.         17.4       ]
 [ 2.          0.         60.          1.          1.         39.        ]]

neurales Netzwerk

Wir werden ein neuronales Netzwerkmodell erstellen. Nur vollständig verbundene Schicht. Optuna optimiert auch die Anzahl der verborgenen Schichten und die Anzahl der Einheiten.

def create_model(activation, num_hidden_layer, num_hidden_unit):
    inputs = Input(shape=(X_train.shape[1],))
    model = inputs
    for i in range(1,num_hidden_layer):
        model = Dense(num_hidden_unit, activation=activation,)(model)
        
        
    model = Dense(1, activation='sigmoid')(model)
    model = Model(inputs, model)

    return model

Bestimmen Sie den Bereich der Parameter, die mit optuna optimiert werden sollen. Es minimiert oder maximiert den Rückgabewert der Funktion. Der Standardwert wird minimiert. Wenn Sie es maximieren möchten, können Sie dies mit "create_study (" direction = maxim)) tun, das später angezeigt wird.

def objective(trial):
    K.clear_session()
    
    activation = trial.suggest_categorical('activation',['relu','tanh','linear'])
    optimizer = trial.suggest_categorical('optimizer',['adam','rmsprop','adagrad', 'sgd'])

    
    num_hidden_layer = trial.suggest_int('num_hidden_layer',1,5,1)
    num_hidden_unit = trial.suggest_int('num_hidden_unit',10,100,10)
    

    
    learning_rate = trial.suggest_loguniform('learning_rate', 0.00001,0.1)
    if optimizer == 'adam':
      optimizer = Adam(learning_rate=learning_rate)
    elif optimizer == 'adagrad':
      optimizer = Adagrad(learning_rate=learning_rate)
    elif optimizer =='rmsprop':
      optimizer = RMSprop(learning_rate=learning_rate)
    elif optimizer =='sgd':
      optimizer = SGD(learning_rate=learning_rate)
    
    
    model = create_model(activation, num_hidden_layer, num_hidden_unit)
    model_list.append(model)
    model.compile(optimizer=optimizer, loss='binary_crossentropy', metrics=['acc', 'mape'],)
    
    es = EarlyStopping(monitor='val_acc', patience=50)
    history = model.fit(X_train, y_train, validation_data=(X_val, y_val), verbose=0, epochs=200, batch_size=20, callbacks=[es])
    
   
    history_list.append(history)
    
    val_acc = np.array(history.history['val_acc'])
    
    return 1-val_acc[-1]

Lernen und optimieren. Nach der Optimierung habe ich jedes Modell in eine Liste aufgenommen, um es einfach neu zu lernen. Es dauerte ungefähr 6 Minuten und 12 Sekunden.

model_list=[]
history_list=[]
study_name = 'titanic_study'
study = optuna.create_study(study_name=study_name,storage='sqlite:///../titanic_study.db', load_if_exists=True)
study.optimize(objective, n_trials=50, )

Sehen Sie das Ergebnis der Optimierung.

print(study.best_params)
print('')
print(study.best_value)

Das Ergebnis der Optimierung. Es tut mir leid für das Verschiedenes. Das obere ist jedes hohe Abs und das untere ist die richtige Antwortrate.

{'activation': 'relu', 'learning_rate': 0.004568302718922509, 'num_hidden_layer': 5, 'num_hidden_unit': 50, 'optimizer': 'rmsprop'}

0.17937219142913818

Vorhersage anhand von Testdaten. Machen Sie vorher eine ausreichende Menge an Lernen mit den besten Parametern. Die Vorverarbeitung der Testdaten entspricht fast den Trainingsdaten, die PassengerId wird jedoch zur Übermittlung der Punktzahl in einem separaten Datenrahmen gespeichert.

model_list[study.best_trial._number-1].compile(optimizer=study.best_trial.params['optimizer'], loss='binary_crossentropy', metrics=['acc', 'mape'],)  
es = EarlyStopping(monitor='val_acc', patience=100)
history = model_list[study.best_trial._number-1].fit(X_train, y_train, validation_data=(X_val, y_val), verbose=1, epochs=400, batch_size=20, callbacks=[es])
predicted = model_list[study.best_trial._number-1].predict(X_test.values)
predicted_survived = np.round(predicted).astype(int)

Vorhersageergebnis

Das Passagier- und das Überlebensprognoseergebnis werden verknüpft und zur Vervollständigung an csv ausgegeben.

df = pd.concat([test_df_index,pd.DataFrame(predicted_survived, columns=['Survived'])], axis=1)
df.to_csv('gender_submission.csv', index=False)
df
PassengerId Survived
0 892 0
1 893 0
2 894 0
3 895 0
4 896 0
... ... ...
413 1305 0
414 1306 1
415 1307 0
416 1308 0
417 1309 0

418 rows × 2 columns

Public Score : 0.7655

Impressionen

Es war ein subtiles Ergebnis. Aber es war sehr einfach. Ich mache mir Sorgen, dass ich mich noch lange auf Optuna verlassen werde, und ich mache mir Sorgen, dass sich meine Tuning-Fähigkeiten nicht verbessern werden. Ist es in Ordnung, alles automatisch zu optimieren?

Referenzseite

Es war sehr leicht zu verstehen und hilfreich. [Einführung in Optuna](https://qiita.com/studio_haneya/items/2dc3ba9d7cafa36ddffa'Einführung in Optuna ')

Recommended Posts

Optuna, Keras und Titanic
Ich berührte Tensorflow und Keras
Vergleichen Sie DCGAN und pix2pix mit Keras
Vergleichen Sie rohen TensorFlow mit tf.contrib.learn und Keras
Klassifizierte ImageNet Hamburger und Fahrräder von Keras
Verwenden Sie TPU und Keras mit Google Colaboratory
Differenz- und Kompatibilitätsprüfung zwischen Keras und tf.keras # 1