Un site où vous pouvez tester vos compétences en participant à la résolution de divers problèmes à l'aide de l'analyse de données. Vous pouvez obtenir un ensemble de données et voir les explications d'autres personnes (noyau), afin d'étudier l'analyse des données.
Une des compétitions de Kaggle. Il est utilisé par de nombreux débutants comme un tutoriel. Prédisez quels passagers du Titanic ont survécu. Le thème est de prédire la survie des 418 autres personnes à partir des données passagers de 891 personnes.
Nous expliquerons systématiquement les techniques pour les débutants jusqu'à un score de soumission de 0,83732 (équivalent aux 1,5% supérieurs) en utilisant une forêt aléatoire. Cette fois, j'expliquerai jusqu'à ce que le score soumis atteigne 0,78468. La prochaine fois a augmenté le score à 0,81339, et La prochaine fois correspond au top 1,5 Le score de soumission est de 0,83732. Tout le code utilisé est publié sur Github. Le code utilisé cette fois est titanesque (0.83732) _1.
Importer les bibliothèques requises
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.ensemble import RandomForestRegressor
from sklearn.pipeline import Pipeline,make_pipeline
from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_selection import SelectKBest
from sklearn import model_selection
from sklearn.model_selection import GridSearchCV
import warnings
warnings.filterwarnings('ignore')
Lisez CSV et vérifiez le contenu
#Lire CSV
train= pd.read_csv("train.csv")
test= pd.read_csv("test.csv")
#Intégration de données
dataset = pd.concat([train, test], ignore_index = True)
#Pour soumission
PassengerId = test['PassengerId']
#Vérifiez jusqu'au troisième contenu du train
train.head(3)
Une brève description de chaque colonne est la suivante.
· PassengerId - ID unique d'identification du passager ・ Survived - Drapeau de survie (0 = mort, 1 = survie) ・ Pclass - Classe de billet · Nom - Nom du passager ・ Sexe - Genre (homme = homme, femme = femme) ・ Âge - Âge · SibSp - Nombre de frères et sœurs / conjoints à bord du Titanic · Parch - Nombre de parents / enfants sur le Titanic ・ Ticket - Numéro de ticket ・ Tarif - tarif ・ Cabine - Numéro de chambre ・ Embarqué - Point de départ (port sur Titanic)
Je vais également donner une brève description de chaque variable. pclass = classe de billet 1 = classe supérieure (riche) 2 = classe intermédiaire (classe générale) 3 = classe inférieure (classe ouvrière)
Embarqué = La définition de chaque variable est la suivante C = Cherbourg Q = Queenstown S = Southampton NaN représente une perte de données. (Dans le tableau ci-dessus, vous pouvez voir deux NaN dans la cabine.) Vérifions le nombre total de données manquantes.
#Vérifiez le nombre de données manquantes
dataset_null = dataset.fillna(np.nan)
dataset_null.isnull().sum()
Age 263 Cabin 1014 Embarked 2 Fare 1 Name 0 Parch 0 PassengerId 0 Pclass 0 Sex 0 SibSp 0 Survived 418 Ticket 0 dtype: int64
Avec Cabin, vous pouvez voir qu'il y a jusqu'à 1014 données manquantes. Ensuite, vérifions les données statistiques globales.
#Vérifier les données statistiques
dataset.describe()
Tout d'abord, vérifiez l'exactitude en substituant la valeur médiane, etc. aux données manquantes.
#La cabine est temporairement exclue
del dataset["Cabin"]
# Age(âge)Et tarif(Frais)Est la valeur médiane de chacun, Embarqué(Point de départ)Est-ce que S(Southampton)Remplacer
dataset["Age"].fillna(dataset.Age.mean(), inplace=True)
dataset["Fare"].fillna(dataset.Fare.mean(), inplace=True)
dataset["Embarked"].fillna("S", inplace=True)
#Vérifiez le nombre total de données manquantes
dataset_null = dataset.fillna(np.nan)
dataset_null.isnull().sum()
Age 0 Embarked 0 Fare 0 Name 0 Parch 0 PassengerId 0 Pclass 0 Sex 0 SibSp 0 Survived 418 Ticket 0 dtype: int64
Il n'y a aucune donnée manquante. Les 418 de Survived correspondent à 418 dans les données de test, cela ne devrait donc pas poser de problème. Organisez vos données pour les prévisions. Tout d'abord, utilisez la classe P, le sexe, l'âge, le tarif, embarqué. Il la convertit également en variable fictive afin que la machine puisse la prédire. (Actuellement, il existe deux éléments de sexe, masculin et féminin, mais ce faisant, ils sont convertis en sex_male et sex_female. Pour male, sex_male est attribué 1 et s'ils sont différents, 0 est attribué.)
#Extraire uniquement les variables à utiliser
dataset1 = dataset[['Survived','Pclass','Sex','Age','Fare','Embarked']]
#Créer une variable factice
dataset_dummies=pd.get_dummies(dataset1)
dataset_dummies.head(3)
Laissez la machine apprendre. Créez le meilleur modèle prédictif en modifiant les n_estimators et max_depth de RandomForestClassifier.
#Décomposer les données en train et tester
#( 'Survived'Existe en train,Pas de test)
train_set = dataset_dummies[dataset_dummies['Survived'].notnull()]
test_set = dataset_dummies[dataset_dummies['Survived'].isnull()]
del test_set["Survived"]
#Séparez les données du train en variables et les bonnes réponses
X = train_set.as_matrix()[:, 1:] #Variables après Pclass
y = train_set.as_matrix()[:, 0] #Corriger les données de réponse
#Créer un modèle prédictif
clf = RandomForestClassifier(random_state = 10, max_features='sqrt')
pipe = Pipeline([('classify', clf)])
param_test = {'classify__n_estimators':list(range(20, 30, 1)), #Essayez 20-30 par incréments
'classify__max_depth':list(range(3, 10, 1))} #Essayez 3 à 10 par incréments
grid = GridSearchCV(estimator = pipe, param_grid = param_test, scoring='accuracy', cv=10)
grid.fit(X, y)
print(grid.best_params_, grid.best_score_, sep="\n")
{'classify__max_depth': 8, 'classify__n_estimators': 23} 0.8316498316498316 Lorsque max_depth vaut 8 et n_estimators vaut 23, il s'avère être le meilleur modèle avec une précision de prédiction de 83% pour les données d'entraînement. Ce modèle prédit les données de test et crée un fichier de soumission (submit1.csv).
#Prédiction des données de test
pred = grid.predict(test_set)
#Création d'un fichier csv pour la soumission Kaggle
submission = pd.DataFrame({"PassengerId": PassengerId, "Survived": pred.astype(np.int32)})
submission.to_csv("submission1.csv", index=False)
Lorsque je l'ai soumis, le score était de 0,78468. Soudain, une prédiction élevée est sortie.
Cette fois, ajoutez Parch (nombre de parents / enfants à bord) et SibSp (nombre de frères et sœurs / conjoints à bord) pour faire une prédiction.
#Extraire les variables à utiliser
dataset2 = dataset[['Survived','Pclass','Sex','Age','Fare','Embarked', 'Parch', 'SibSp']]
#Créer une variable factice
dataset_dummies = pd.get_dummies(dataset2)
dataset_dummies.head(3)
#Décomposer les données en train et tester
#( 'Survived'Existe en train,Pas de test)
train_set = dataset_dummies[dataset_dummies['Survived'].notnull()]
test_set = dataset_dummies[dataset_dummies['Survived'].isnull()]
del test_set["Survived"]
#Séparez les données du train en variables et les bonnes réponses
X = train_set.as_matrix()[:, 1:] #Variables après Pclass
y = train_set.as_matrix()[:, 0] #Corriger les données de réponse
#Créer un modèle prédictif
clf = RandomForestClassifier(random_state = 10, max_features='sqrt')
pipe = Pipeline([('classify', clf)])
param_test = {'classify__n_estimators':list(range(20, 30, 1)), #Essayez 20-30 par incréments
'classify__max_depth':list(range(3, 10, 1))} #Essayez 3 à 10 par incréments
grid = GridSearchCV(estimator = pipe, param_grid = param_test, scoring='accuracy', cv=10)
grid.fit(X, y)
print(grid.best_params_, grid.best_score_, sep="\n")
#Prédiction des données de test
pred = grid.predict(test_set)
#Création d'un fichier csv pour la soumission Kaggle
submission = pd.DataFrame({"PassengerId": PassengerId, "Survived": pred.astype(np.int32)})
submission.to_csv("submission2.csv", index=False)
{'classify__max_depth': 7, 'classify__n_estimators': 25} 0.8417508417508418 Lorsque max_depth vaut 7 et n_estimators vaut 25, il s'avère être le meilleur modèle avec une précision de prédiction de 84% pour les données d'entraînement. Bien que ce soit plus précis qu'avant, lorsque j'ai soumis la prédiction des données de test (soumission2.csv) pour ce modèle, le score est tombé à 0,76076. Il semble que cela ait provoqué un surapprentissage. Il semble préférable de ne pas utiliser Parch (nombre de parents / enfants à bord) et SibSp (nombre de frères et sœurs / conjoints à bord).
J'ai fait une prédiction pour le concours de tutoriels de Kaggle Titanic. Le score le plus élevé soumis était de 0,78468. La prochaine fois visualisera les données et expliquera le processus au score de soumission 0.83732.
Recommended Posts