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 ').
Public Score : 0.7655
Ich werde den Link der Kaggle-Notiz setzen. kaggle note
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. ]]
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)
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
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?
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