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.
Histoire
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.
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")
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.
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.
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 |
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".
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.
[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
2020/01/01 Première édition publiée 2020/01/29 Lien suivant ajouté
Recommended Posts