[PYTHON] optuna, keras et titanic

introduction

Pour étudier l'apprentissage automatique et l'optimisation bayésienne, j'ai essayé de marquer k, le concours de type tutoriel de Kaggle "Titanic: Machine Learning from Disaster" avec un réseau neuronal. Pour une optimisation élevée, nous utilisons la bibliothèque optuna de Preferred Networks (site officiel) (https://preferred.jp/en/projects/optuna/'optuna library ').

résultat

Public Score : 0.7655

Remarque

Je vais mettre le lien de la note kaggle. note kaggle

code

Prétraitement

Le premier est le prétraitement pour supprimer des quantités d'entités qui ne sont probablement pas liées à un traitement des terres défectueux. Je l'ai fait par intuition.

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

Vient ensuite l'acquisition de variables fictives.

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

Divisez les données en formation et évaluation.

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)

Jetons un coup d'œil au contenu de X_train. Les noms des colonnes sont Pclass, Sex, Age, 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.        ]]

réseau neuronal

Nous allons construire un modèle de réseau neuronal. Seulement couche entièrement connectée. Optuna optimise également le nombre de couches cachées et le nombre d'unités.

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

Déterminez la plage de paramètres à optimiser avec optuna. Il minimise ou maximise la valeur de retour de la fonction. La valeur par défaut est réduite. Si vous voulez le maximiser, vous pouvez le faire avec create_study ('direction = maximiser) qui apparaîtra plus tard.

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]

Apprenez et optimisez. Après optimisation, j'ai mis chaque modèle dans une liste pour un réapprentissage facile. Cela a pris environ 6 minutes et 12 secondes.

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, )

Voir le résultat de l'optimisation.

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

Le résultat de l'optimisation. Je suis désolé pour les divers. Le haut est chaque para haut, et le bas est le taux de réponse correct.

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

0.17937219142913818

Prédire à l'aide des données de test. Avant cela, faites un apprentissage suffisant avec les meilleurs paramètres. Le prétraitement des données de test est presque le même que les données d'entraînement, mais le PassengerId est enregistré dans une trame de données distincte pour la soumission des scores.

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)

Résultat de la prédiction

Le passager et le résultat de la prédiction de survie sont liés et sortis vers csv pour terminer.

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

Impressions

C'était un résultat subtil. Mais c'était très simple. J'ai peur de compter sur optuna pour le reste de ma vie et j'ai peur que mes compétences de réglage ne s'améliorent pas. Est-il acceptable de tout optimiser automatiquement?

Site de référence

C'était très facile à comprendre et utile. [Introduction à Optuna](https://qiita.com/studio_haneya/items/2dc3ba9d7cafa36ddffa'Introduction à Optuna ')

Recommended Posts

optuna, keras et titanic
J'ai touché Tensorflow et keras
Comparez DCGAN et pix2pix avec Keras
Comparez le TensorFlow brut avec tf.contrib.learn et Keras
Hamburgers et vélos ImageNet classés par Keras
Utilisez TPU et Keras avec Google Colaboratory
Vérification de la différence et de la compatibilité entre keras et tf.keras # 1