[PYTHON] Essayez tous les modèles de scikit-learn avec le Titanic de Kaggle (kaggle ⑤)

introduction

Voici l’histoire de la participation au concours Kaggle </ b> pour la première fois. Dans le précédent "Sélection de modèles avec le Titanic de Kaggle" (https://qiita.com/sudominoru/items/1c21cf4afaf67fda3fee), nous avons pu évaluer certains modèles et augmenter un peu le score. Cette fois, j'aimerais essayer tous les modèles de scikit-learn.

table des matières

  1. Résultat
  2. À propos de tous les modèles de scicit-learn
  3. Vérification croisée
  4. Évaluer tous les modèles par validation croisée
  5. Réglage des paramètres
  6. Soumettre à Kaggle
  7. Résumé

Histoire

1. Résultat

Selon le résultat, le score est remonté un peu à "0,78947". Le résultat est le top 25% (au 30 décembre 2019). J'aimerais voir le déroulement de la soumission.

2. À propos de tous les modèles de scicit-learn

Tous les modèles scikit-learn peuvent être obtenus avec "all_estimators". Lors de l'obtention, vous pouvez réduire les 4 suivants avec le paramètre "type_filter". 「classifier / regressor / cluster / transformer」 Cette fois, c'est un problème de classification, donc filtrez par "classificateur".

from sklearn.utils.testing import all_estimators
all_estimators(type_filter="classifier")

3. Vérification croisée

Vérifions le modèle acquis ci-dessus avec "vérification d'intersection". Cette fois, nous allons effectuer une «vérification d'intersection de division K». K-Split Crossing Verification divise d'abord les données d'entraînement en K. Ensuite, l'une d'elles est utilisée comme données de test, et le K-1 restant est utilisé comme données d'apprentissage. K - Entraînez-vous avec une donnée d'entraînement et évaluez avec les données de test restantes. Il s'agit d'une méthode pour répéter ces k fois et faire la moyenne des résultats k fois obtenus (score) pour évaluer le modèle. scikit-learn fournit une classe pour la validation d'intersection K-split. "KFold" et "cross_validate".

from sklearn.model_selection import KFold
from sklearn.model_selection import cross_validate
kf = KFold(n_splits=3, shuffle=True, random_state=1)
scores = cross_validate(model, x_train, y_train, cv=kf, scoring=['accuracy'])

Spécifiez le nombre de fractionnements avec "n_splits" de KFold. Utilisez cross_validate pour spécifier les données d'entraînement, KFold et la méthode d'évaluation. L'évaluation spécifiée par le scoring est renvoyée comme valeur de retour de cross_validate. La valeur de retour sera renvoyée sous forme de tableau pour le montant divisé par n_splits.

4. Évaluer tous les modèles par validation croisée

Maintenant, je voudrais évaluer tous les modèles par vérification d'intersection K-split. Le code est ci-dessous. Le code "préparation" est le même que précédemment.

Préparation


import numpy 
import pandas 

##############################
#Prétraitement des données
#Extraire les éléments requis
# Data preprocessing
# Extract necessary items
##############################
# train.Charger csv
# Load train.csv
df = pandas.read_csv('/kaggle/input/titanic/train.csv')
df = df[['Survived', 'Pclass', 'Sex', 'Fare']]

Préparation


from sklearn.preprocessing import LabelEncoder
##############################
#Prétraitement des données
#Quantifier l'étiquette (nom)
# Data preprocessing
# Digitize labels
##############################
#df = pandas.get_dummies(df)
encoder_sex = LabelEncoder()
df['Sex'] = encoder_sex.fit_transform(df['Sex'].values)

Préparation


from sklearn.preprocessing import StandardScaler
##############################
#Prétraitement des données
#Normaliser les nombres
# Data preprocessing
# Standardize numbers
##############################

#Standardisation
standard = StandardScaler()
df_std = pandas.DataFrame(standard.fit_transform(df[['Pclass', 'Fare']]), columns=['Pclass', 'Fare'])

df['Pclass'] = df_std['Pclass']
df['Fare'] = df_std['Fare']

K-Vérification d'intersection fractionnée


import sys
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_validate
from sklearn.utils.testing import all_estimators
##############################
#K sur tous les modèles-Effectuer la vérification des intersections fractionnées
# K-fold cross-validation with all estimators.
##############################
x_train = df.drop(columns='Survived').values
y_train = df[['Survived']].values
y_train = numpy.ravel(y_train)

kf = KFold(n_splits=3, shuffle=True, random_state=1)

writer = open('./all_estimators_classifier.txt', 'w', encoding="utf-8")
writer.write('name\taccuracy\n')

for (name,Estimator) in all_estimators(type_filter="classifier"):

    try:
        model = Estimator()
        if 'score' not in dir(model):
            continue;
        scores = cross_validate(model, x_train, y_train, cv=kf, scoring=['accuracy'])
        accuracy = scores['test_accuracy'].mean()
        writer.write(name + "\t" + str(accuracy) + '\n')
    except:
        print(sys.exc_info())
        print(name)
        pass

writer.close()

J'obtiens le modèle du problème de classification avec "all_estimators (type_filter =" classifier ")" et boucle. Seuls les modèles qui ont un score avec "if'score 'not in dir (model):" sont ciblés. Évaluez la validation croisée avec "cross_validate". Spécifiez le "KFold" spécifié ci-dessus pour le paramètre. Sortez le nom du modèle et la valeur d'évaluation dans le nom de fichier "all_estimators_classifier.txt".

Je vais essayer. Lorsque le processus est terminé, "all_estimators_classifier.txt" sera affiché. Jetons un coup d'œil au contenu. Environ 30 noms de modèles sont générés. Voici les 10 modèles choisis par ordre décroissant de «précision».

name accuracy
ExtraTreeClassifier 0.82155
GradientBoostingClassifier 0.82043
HistGradientBoostingClassifier 0.81706
DecisionTreeClassifier 0.81481
ExtraTreesClassifier 0.81481
RandomForestClassifier 0.80920
GaussianProcessClassifier 0.80471
MLPClassifier 0.80471
KNeighborsClassifier 0.80022
LabelPropagation 0.80022

Il existe 5 modèles avec un taux de précision plus élevé que "Random Forest Classifier" de Dernière fois.

5. Réglage des paramètres

Vérifions les paramètres de chacun des 5 meilleurs modèles par recherche de grille. C'est devenu le suivant.

modèle Paramètres
ExtraTreeClassifier criterion='gini', min_samples_leaf=10, min_samples_split=2, splitter='random'
GradientBoostingClassifier learning_rate=0.2, loss='deviance', min_samples_leaf=10, min_samples_split=0.5, n_estimators=500
HistGradientBoostingClassifier learning_rate=0.05, max_iter=50, max_leaf_nodes=10, min_samples_leaf=2
DecisionTreeClassifier criterion='entropy', min_samples_split=2, min_samples_leaf=1
ExtraTreesClassifier n_estimators=25, criterion='gini', min_samples_split=10, min_samples_leaf=2, bootstrap=True

6. Soumettre à Kaggle

Je le soumettrai à Kaggle pour chaque modèle. Les paramètres doivent être les paramètres vérifiés par la recherche de grille. Le score est le suivant.

modèle score
ExtraTreeClassifier 0.78947
GradientBoostingClassifier 0.75598
HistGradientBoostingClassifier 0.77990
DecisionTreeClassifier 0.77511
ExtraTreesClassifier 0.78468

ExtraTreeClassifier a donné le meilleur score avec un résultat de "0,78947".

7. Résumé

Tous les modèles scikit-learn ont été évalués par validation croisée. Pour ces données d'entrée, ExtraTreeClassifier a le meilleur score Le résultat était "0,78947". La prochaine fois, je voudrais vérifier visuellement les données. En vérifiant les données brutes, je voudrais examiner si la précision des données d'entrée peut être encore améliorée par le dépistage.

référence

[Choisissez le meilleur modèle all_estimators ()](https://betashort-lab.com/%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B5%E3%82%A4 % E3% 82% A8% E3% 83% B3% E3% 82% B9 /% E6% A9% 9F% E6% A2% B0% E5% AD% A6% E7% BF% 92 /% E6% 9C% 80 % E9% 81% A9% E3% 81% AA% E3% 83% A2% E3% 83% 87% E3% 83% AB% E9% 81% B8% E3% 81% B3all_estimators /) Python: calculez votre propre index d'évaluation avec la fonction cross_validate () de scikit-learn Types de validation croisée de sklearn et leur comportement

Histoire

2020/01/01 Première édition publiée 2020/01/29 Lien suivant ajouté

Recommended Posts

Essayez tous les modèles de scikit-learn avec le Titanic de Kaggle (kaggle ⑤)
Certains modèles de Kaggle's Titanic (kaggle ④)
Essayez le didacticiel Titanic de Kaggle
Prédire le Titanic de Kaggle avec Keras (Kaggle ⑦)
Vérifiez les données brutes avec Kaggle's Titanic (Kaggle ⑥)
Essayez SVM avec scikit-learn sur Jupyter Notebook
J'ai essayé d'apprendre avec le Titanic de Kaggle (kaggle②)
Vérifiez la corrélation avec le Titanic de Kaggle (kaggle③)
Défiez Kaggle Titanic