[PYTHON] Examinez les paramètres de RandomForestClassifier dans le didacticiel Kaggle / Titanic

introduction

Dans le tutoriel Kaggle / Titanic, nous apprenons avec RandomForestClassifier (). Ajustez ce paramètre pour voir si la précision d'apprentissage s'améliore.

Préparation des données

import numpy as np
import pandas as pd
import seaborn
import matplotlib.pyplot as plt

train_data = pd.read_csv("../train.csv")

from sklearn.model_selection import train_test_split

train_data_orig = train_data
train_data, cv_data = train_test_split(train_data_orig, test_size=0.3, random_state=1)

En utilisant train_test_split, divisez les données en train: cv = 7: 3 (cv; validation croisée).

train_data.info()

<class 'pandas.core.frame.DataFrame'>
Int64Index: 623 entries, 114 to 37
Data columns (total 12 columns):
 #   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  
 0   PassengerId  623 non-null    int64  
 1   Survived     623 non-null    int64  
 2   Pclass       623 non-null    int64  
 3   Name         623 non-null    object 
 4   Sex          623 non-null    object 
 5   Age          496 non-null    float64
 6   SibSp        623 non-null    int64  
 7   Parch        623 non-null    int64  
 8   Ticket       623 non-null    object 
 9   Fare         623 non-null    float64
 10  Cabin        135 non-null    object 
 11  Embarked     622 non-null    object 
dtypes: float64(2), int64(5), object(5)
memory usage: 63.3+ KB
cv_data.info()

<class 'pandas.core.frame.DataFrame'>
Int64Index: 268 entries, 862 to 92
Data columns (total 12 columns):
 #   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  
 0   PassengerId  268 non-null    int64  
 1   Survived     268 non-null    int64  
 2   Pclass       268 non-null    int64  
 3   Name         268 non-null    object 
 4   Sex          268 non-null    object 
 5   Age          218 non-null    float64
 6   SibSp        268 non-null    int64  
 7   Parch        268 non-null    int64  
 8   Ticket       268 non-null    object 
 9   Fare         268 non-null    float64
 10  Cabin        69 non-null     object 
 11  Embarked     267 non-null    object 
dtypes: float64(2), int64(5), object(5)
memory usage: 27.2+ KB

Il y a 623 trains, 268 cvs et un total de 891.

Apprenez selon le tutoriel

from sklearn.ensemble import RandomForestClassifier

features = ["Pclass", "Sex", "SibSp", "Parch"]

y = train_data["Survived"]
y_cv = cv_data["Survived"]
X = pd.get_dummies(train_data[features])
X_cv = pd.get_dummies(cv_data[features])

model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=1, max_features="auto")
model.fit(X, y)
predictions = model.predict(X_cv)

print('Train score: {}'.format(model.score(X, y)))
print('CV score: {}'.format(model.score(X_cv, y_cv)))
Train score: 0.8394863563402889
CV score: 0.753731343283582

Le train est correct à environ 84%, mais le CV n'est correct qu'à 75%.

Modifier manuellement les paramètres de RandomForestClassifier

n_estimator Essayez de changer la valeur de n_estimator.

rfc_results = pd.DataFrame(columns=["train", "cv"])

for iter in [1, 10, 100]:
    model = RandomForestClassifier(n_estimators=iter, max_depth=5, random_state=1, max_features="auto")
    model.fit(X, y)
    predictions = model.predict(X_cv)
    rfc_results.loc[iter] = model.score(X, y), model.score(X_cv, y_cv)
train cv
1 0.826645 0.753731
10 0.833066 0.753731
100 0.839486 0.753731

À mesure que le nombre d'arbres de décision augmente, le score du train augmente légèrement, mais le score cv ne change pas.

max_depth

Essayez de changer la valeur de max_depth.

max_depth = 2

for iter in [1, 10, 100]:
    model = RandomForestClassifier(n_estimators=iter, max_depth=2, random_state=1, max_features="auto")
    model.fit(X, y)
    predictions = model.predict(X_cv)
    rfc_results.loc[iter] = model.score(X, y), model.score(X_cv, y_cv)
train cv
1 0.813804 0.731343
10 0.81862 0.753731
100 0.817014 0.761194

J'ai obtenu un score CV de 76%.

max_depth = 3

for iter in [1, 10, 100]:
    model = RandomForestClassifier(n_estimators=iter, max_depth=3, random_state=1, max_features="auto")
    model.fit(X, y)
    predictions = model.predict(X_cv)
    rfc_results.loc[iter] = model.score(X, y), model.score(X_cv, y_cv)
train cv
1 0.81862 0.753731
10 0.82504 0.776119
100 0.82504 0.768657

J'ai obtenu un score CV de 77,6%.

max_depth = 4

for iter in [1, 10, 100]:
    model = RandomForestClassifier(n_estimators=iter, max_depth=4, random_state=1, max_features="auto")
    model.fit(X, y)
    predictions = model.predict(X_cv)
    rfc_results.loc[iter] = model.score(X, y), model.score(X_cv, y_cv)
train cv
1 0.823435 0.764925
10 0.82825 0.761194
100 0.826645 0.764925

Le score du cv est d'environ 76,5%.

D'après ce qui précède, avec max_depth = 3, n_estimators = 10 avait le score le plus élevé.

Modifier automatiquement les paramètres de RandomForestClassifier

Trouvez le meilleur paramètre avec une méthode appelée GridSearch (GridSearchCV). Il s'agit d'une méthode pour tester la combinaison des paramètres répertoriés et trouver le meilleur.

from sklearn.model_selection import GridSearchCV

param_grid = {"max_depth": [2, 3, 4, 5, None],
              "n_estimators":[1, 3, 10, 30, 100],
              "max_features":["auto", None]}

model_grid = GridSearchCV(estimator=RandomForestClassifier(random_state=1),
                 param_grid = param_grid,   
                 scoring="accuracy",  # metrics
                 cv = 3,              # cross-validation
                 n_jobs = 1)          # number of core

model_grid.fit(X, y) #fit

model_grid_best = model_grid.best_estimator_ # best estimator
print("Best Model Parameter: ", model_grid.best_params_)

Notez la ligne from. Quand j'ai cherché sur le net, il y avait un moyen d'écrire depuis sklearn.grid_search import GridSearchCV, mais dans mon cas, c'était NG.

Best Model Parameter:  {'max_depth': 3, 'max_features': 'auto', 'n_estimators': 10}

Comme j'ai essayé manuellement, max_depth = 3 et n_estimators = 10 étaient les meilleurs. J'ai aussi essayé deux types de max_features, mais"auto"était bon.

print('Train score: {}'.format(model.score(X, y)))
print('CV score: {}'.format(model.score(X_cv, y_cv)))

Train score: 0.826645264847512
CV score: 0.7649253731343284

Soumettre à Kaggle / Titanic

J'ai prédit le résultat en utilisant ce paramètre et l'ai soumis à Kaggle. Cependant, la précision était de 0,77751 et *** était le même que le paramètre comme dans le tutoriel ***. Bien.

en conclusion

Avant d'essayer d'améliorer la quantité de caractéristiques, nous avons pu l'améliorer un peu en ajustant les hyper paramètres de l'apprentissage, puis nous aimerions considérer la quantité de caractéristiques.

référence

Recommended Posts

Examinez les paramètres de RandomForestClassifier dans le didacticiel Kaggle / Titanic
Kaggle Tutorial Le savoir-faire Titanic pour être dans le top 2%
[Kaggle] J'ai fait une collection de problèmes en utilisant le didacticiel Titanic
Explication d'approche pour que les débutants soient dans le top 1,5% (0,83732) dans Kaggle Titanic_3
Explication d'approche pour que les débutants soient dans le top 1,5% (0,83732) dans Kaggle Titanic_1
Explication d'approche pour que les débutants soient dans le top 1,5% (0,83732) dans Kaggle Titanic_2
Comptez le nombre de paramètres dans le modèle d'apprentissage en profondeur
Regardez de plus près le tutoriel Kaggle / Titanic
Kaggle Tutorial Titanic Précision 80.9% (Top 7% 0.80861)
Examiner la plage d'erreur dans le nombre de décès dus à la pneumonie
[Kaggle] Participation au concours du mélanome
L'histoire de la participation à AtCoder
Échappement automatique des paramètres MySQL en python
L'histoire du "trou" dans le fichier
Examiner la classe d'un objet avec python
(Kaggle) Le modèle de prédiction des survivants du Titanic a évalué l'impact de l'ajustement des paramètres aléatoires de la forêt
[Comprendre en 3 minutes] Le début de Linux
Vérifiez le comportement du destroyer en Python
Défis de la compétition Titanic pour les débutants de Kaggle
Le résultat de l'installation de python sur Anaconda
Principes de base pour exécuter NoxPlayer en Python
À la recherche du FizzBuzz le plus rapide en Python
Visualisation de l'état de tir de la couche cachée du modèle appris dans le tutoriel TensorFlow MNIST
Sortie du nombre de cœurs de processeur en Python
Signification de {numéro de version} dans le package mysql rpm
[Python] Trier la liste de pathlib.Path dans l'ordre naturel
Le contenu du didacticiel Python (chapitre 5) est résumé dans une puce.
Changer la taille de police de la légende dans df.plot
Le contenu du didacticiel Python (chapitre 4) est résumé dans une puce.
Le contenu du didacticiel Python (chapitre 2) est résumé dans une puce.
Faites correspondre la distribution de chaque groupe en Python
Afficher le résultat du traitement de la géométrie en Python
Le contenu du didacticiel Python (chapitre 8) est résumé dans une puce.
Le contenu du didacticiel Python (chapitre 1) est résumé dans une puce.
Copiez la liste en Python
Trouvez le nombre de jours dans un mois
Le contenu du didacticiel Python (chapitre 10) est résumé dans une puce.
Lire la sortie du sous-processus, ouvrir en temps réel
Découvrez la fraction de la valeur saisie en python
L'histoire de la recherche du n optimal dans N poing
Correction des arguments de la fonction utilisée dans map
Trouvez la solution de l'équation d'ordre n avec python
L'histoire de la lecture des données HSPICE en Python
[Note] À propos du rôle du trait de soulignement "_" en Python
Résolution d'équations de mouvement en Python (odeint)
Visualisation de l'état d'utilisation de l'évier dans l'entreprise
Sortie sous la forme d'un tableau python
L'histoire de l'affichage des fichiers multimédias dans Django
Rechercher par la valeur de l'instance dans la liste
Le contenu du didacticiel Python (chapitre 6) est résumé dans une puce.
Rendre la progression de dd visible sur la barre de progression
Le contenu du didacticiel Python (chapitre 3) est résumé dans une puce.
Jour 66 [Introduction à Kaggle] Les prévisions Titanic les plus faciles
[Statistiques] Expliquons en détail l'exécution de la régression logistique en stan (avec jeu de données Titanic)