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 ').
Public Score : 0.7655
Je vais mettre le lien de la note kaggle. note kaggle
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. ]]
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)
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
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?
C'était très facile à comprendre et utile. [Introduction à Optuna](https://qiita.com/studio_haneya/items/2dc3ba9d7cafa36ddffa'Introduction à Optuna ')
Recommended Posts