create account

Prédire les survivants du Titanic à l'aide de l'intelligence artificielle by rerere

View this thread on steemit.com
· @rerere · (edited)
$12.88
Prédire les survivants du Titanic à l'aide de l'intelligence artificielle
<center>https://www.technologieintelligente.fr/wp-content/uploads/2019/07/sunset-675847_1920.jpg</center> <br/><p>Avec nos connaissances actuelles, nous pouvons, à l’aide de l’intelligence artificielle, prévoir des conséquences résultantes de certaines données que nous avions à l’origine. Dans cet article, nous allons essayer de déterminer les personnes survivantes lors de la catastrophe du Titanic. Pour réaliser cette étude, nous allons nous servir <a href="https://www.kaggle.com/c/titanic">des données mises à disposition par Kaggle</a>. Tout au long de cet article, nous utiliserons <a href="https://colab.research.google.com">Google Colab</a>. Nous vous invitons à l’utiliser afin de suivre avec nous la réalisation de ce projet. Bien entendu, vous pouvez, si vous le souhaitez, réaliser ce projet sur votre machine personnelle.</p>
<h2>Présentation du problème</h2>
<p>Nous connaissons tous le terrible accident qu’il y a eu avec le fameux bateau nommé le Titanic. Nous avons récupéré diverses informations sur les personnes ayant pris un ticket sur ce bateau et si elles ont survécu ou non à l’accident. Cependant, nous avons en notre possession une liste d’information de personnes dont nous ne savons pas si elles ont survécu. Notre objectif est donc de réaliser un système intelligent qui pourra nous déterminer si ces personnes ont survécu ou non à ce désastre. </p>
<h2>Téléchargement des données</h2>
<p>La première étape consiste à télécharger les données. Pour ce faire, nous allons nous rendre sur <a href="https://www.kaggle.com/c/titanic">Kaggle</a>. Il vous faudra vous créer un compte si ce n’est pas déjà le cas pour pouvoir télécharger les données nécessaires. </p>
<p>Une fois télécharger, vous devriez avoir deux fichiers qui vont nous intéresser, à savoir le fichier <em>test.csv</em> et le fichier <em>train.csv</em>. Comme vous pouvez vous en doutez, nous avons ici un fichier qui correspond à notre base d’entraînement et un autre fichier qui correspond à notre base de validation. </p>
<h2>Comprendre les données</h2>
<p>Avant de foncer dans une recherche de solution, nous allons visualiser nos données. Pour cela, nous allons, à l’aide de la librairie pandas, visualiser quelques éléments de notre base d’entraînement. </p>
<pre class="wp-block-code"><code>import pandas as pd
# Import all the data.
test_data = pd.read_csv('test.csv')
train_data = pd.read_csv('train.csv')
# Print some example of our data.
train_data.head()</code></pre>

<img src="https://lh3.googleusercontent.com/tS46cQ_g6ZfbKWoVyX4k6hT0rpTTC9eRr6Jhrb6UnAMIwQfeOtGMq0fL0vcPCC3VwvGcOreX_f_yhx_zi92GN-YJhdx6QWPrhX_3Kw9sE83dKxdUTSk5WQ1iTZm8GIyt87Snpsx8" alt=""/><br/><i>Affichage de quelques données.</i>
<p>Comme nous pouvons le constater, sur la base d’entraînement, nous avons au total 12 attributs. Nous allons, dans un premier temps, comprendre la signification de chacune de ces variables et voir comment elles sont représentées.</p>
<h3>PassengerId</h3>
<p>Le <em>passengerId</em> représente un identifiant unique pour nos données. Ainsi, cet identifiant n’influencera pas le résultat de notre étude. Nous pouvons donc exclure cette variable de notre étude.</p>
<h3>Survived </h3>
<p><em>Survived</em> correspond à une valeur booléenne représentant la valeur 0 si la personne n’a pas survécu et la valeur 1 si elle a survécu. Durant notre étude, c’est cette valeur que nous allons chercher à prédire. Pour ce faire, nous allons chercher des relations possibles en fonction des différents attributs que nous avons à notre disposition.</p>
<h3>Pclass</h3>
<p><em>Pclass</em> représente la classe du ticket. Cette variable est représentée par trois classes distinctes : la classe 1, 2 et 3. Sous python, nous pouvons visualiser la quantité des différentes catégories en utilisant : </p>
<pre class="wp-block-code"><code>train_data["Pclass"].value_counts()</code></pre>
<center><img src="https://lh5.googleusercontent.com/nstULqZ_jK9_XCqRPjmEns4CkHV8xcjX7LoNRo_8-kkDaXKBENb720bbs2mmBdfhW6HgeNB9Km6_OotFVCL_qJaE9UgwVgyR08asuF5JO5a8gXaaaKqLJGM2zsGv8wM3OY9Hq-Gx" alt=""/><br/><i><em>Nombre de personnes pour chaque classe de tickets.</em></i></center>

<p>Comme nous pouvons le constater, nous avons davantage de personnes appartenant à la catégorie 3. On pourrait se poser la question de savoir si la classe du ticket influe sur le fait de survivre ou non. Pour cela, nous allons visualiser cela en affichant le pourcentage de survivant en fonction de leur classe de ticket. Pour ce faire, nous allons utiliser la commande suivante :</p>
<pre class="wp-block-code"><code>train_data[['Pclass', 'Survived']].groupby(['Pclass'], as_index=False).mean().sort_values(by='Survived', ascending=False</code></pre>
<center><img src="https://lh4.googleusercontent.com/dyqKBsqf-83yCuYpilyCvLzvDKy_kukGrd2CmuzV5IhwU2gZfZ1YLC-bBwvTXIxeLc2qO3yXV5OsPqXvRKy9JZV2v0XIkEG-nfU258LBaCBWVJTndD-TfCn1Wh53ZXWKsj_O9n24" alt=""/><br/><i><em>Pourcentage de survivant en fonction de la classe du ticket.</em></i></center>

<p>Comme vous pouvez le remarquer, en fonction de la classe du ticket, nous avons plus ou moins de chances de survivre. Ainsi, nous pouvons supposer que la classe du ticket de la personne a une importance.</p>
<h3>Name</h3>
<p>Pour chacune des personnes présentes, nous avons accès à son nom. Il peut être intéressant de récupérer des informations sur le nom. En effet, nous avons remarqué que pour certaines valeurs, nous avons la catégorie sociale de la personne. Cependant, dans cet article, pour des raisons de simplicité, nous ne nous intéresserons pas au nom de la personne.</p>
<h3>Sex</h3>
<p>Nous avons aussi à notre disposition le sexe de la personne. Ainsi, on peu savoir si la personne est un homme ou une femme. Une des premières suppositions que nous pouvons émettre est qu’une personne de type masculin aurait une chance de survie plus importante. Cependant, en analysant nos données, nous nous rendons compte que les femmes ont davantage survécu durant ce drame. Ainsi, notre supposition initiale se révèle erronée. </p>
<center><img src="https://lh4.googleusercontent.com/EomVJZ9gBc9D2jSUFPrULs7qTppLlKXqfSi5u2HQOWoUQ9hWl-QSqHDc4So615xncyYNaNNnpa1M3izv_4tToNmQhyca1YOczzZiAfD14QRelciP6Z8nk3mZMRf-1rnh5qyHKMWk" alt=""/><br/><i><em>Étude sur le sexe des survivants.</em></i></center>

<p>Ainsi, lorsque nous arrivons sur un jeu de données, nous pouvons avoir des a priori sur nos données. Cependant, il nous faut les confirmer avant de pouvoir les affirmer. </p>
<h3>Age</h3>
<p>Afin de visualiser l’âge des personnes présentes, nous pouvons nous aider en utilisant un histogramme. Pour ce faire, nous allons utiliser la librairie <em>matplotlib</em> de python. Attention, il nous faudra enlever les valeurs <em>Nan </em>présentes dans notre ensemble de données. En effet, pour 177 personnes, l’âge n’est pas défini.</p>
<pre class="wp-block-code"><code>
%matplotlib inline
import matplotlib as mpl
import matplotlib.pyplot as plt
plt.hist(train_data["Age"], 50, density=True, facecolor='b', alpha=0.75)
plt.show()
</code></pre>


<center><img src="https://lh3.googleusercontent.com/ebg0A8ixJroqHCKTV7stv-_icxpCJPg13w6HJ7A9MW5bjbuJSo3yFNq3aVMBA6_eu5t9LEVk38By85f47ldFErGSl0_FWTHqW5tHTPNvH0cwk0SwM9PQpbY5aIF6npKxaLScHsL1" alt=""/><br/><i><em>Répartition de l'âge des personnes présentent sur le Titanic.</em></i></center>

<p>Une autre méthode de visualisation consiste à dessiner une aire nous indiquant les personnes qui ont survécu et les personnes qui n’ont pas survécu en fonction de leur âge. Pour ce faire, nous allons utiliser la librairie python <em>seaborn</em>. </p>
<pre class="wp-block-code"><code>
import seaborn as sns
import pandas as pd
g = sns.kdeplot(train_data["Age"][(train_data["Survived"] == 0) &amp; (train_data["Age"].notnull())], color="Red", shade = True)
g = sns.kdeplot(train_data["Age"][(train_data["Survived"] == 1) &amp; (train_data["Age"].notnull())], ax =g, color="Blue", shade= True)
g.set_xlabel("Age")
g.set_ylabel("Frequency")
g = g.legend(["Not Survived","Survived"])
</code></pre>

<center><img src="https://lh6.googleusercontent.com/GDUDB-y91qyTrN6Tf1QRd7y72tFzqmWT5pZBZ3yqDvNZSv486_YgjUfUKAxMZhSpDUWfHSGyVX4UlyPQfie3uzmVQ1XVlXoXPO9P131xo2Tk5-MHcoKB5kt48cxOBOBN_-5c3I8-" alt=""/><br/><i><em>Fréquence de personnes ayant survécu ou non par rapport à leur âge.</em></i></center>

<p>Avec la dernière figure, nous pouvons constater qu'une grande partie des personnes ayant un âge compris entre 0 et environ 16 ans ont survécu. Nous pouvons apercevoir qu’une plus grande partie des personnes ayant 20 ans n'ont pas survécu. De plus, nous constatons que les personnes qui ont plus de 60 ans n'ont pas survécu aussi. Ainsi, nous pourrions créer 4 groupes de personnes. Les enfants qui seraient les personnes âgées de 0 à 16 ans, les jeunes qui seraient âgés de 16 à 30 ans, les moins jeunes de 30 à 60 et les personnes âgées qui seraient les personnes de plus de 60 ans.</p>
<p>Enfin, nous avons un problème vis-à-vis des données manquantes. En effet, cela peut-être problématique lors de la phase d’apprentissage, car notre système ne sera pas comment interpréter une donnée manquante. L’une des solutions serait d’utiliser la médiane ou la moyenne afin d’obtenir une valeur. Cependant, cela peut insérer un biais dans nos données. Une autre possibilité serait d’utiliser un système intelligent afin de réaliser une prédiction de cette valeur manquante. Pour ce faire, nous pourrions nous baser sur les informations à notre disposition afin de pouvoir déterminer l’âge de la personne.</p>
<h3>SibSp</h3>
<p>Cet attribut nous indique le nombre de frères et sœurs présent sur le navire, ainsi que le nombre de conjoints. Lorsque nous analysons cette donnée, nous pouvons apercevoir qu’une grande majorité de personne présente sur le navire ne possède pas de frères, de sœurs ou de conjoint.</p>
<center><img src="https://lh3.googleusercontent.com/-0oUKH79IGsXeUMqhdgQO70w8d_4pHOXxZY8xIBtkmD9FEtqPVS0pHhuVevk0UfGbuMc6qhyl7vvc5agAkWxKiVXZ-7jPWxWWmG2VvLcBhaTVhfScAYymKbp9KilB9FNjlR6zyrZ" alt=""/><br/><i>Étude sur le nombre de frères, de sœurs et de conjoints. </i></center>

<p>Encore une fois, nous allons chercher à savoir si cette variable a un effet sur le fait de survivre ou non.</p>
<center><img src="https://lh5.googleusercontent.com/b2ba1gxAiFdXjUp1ucwHA09C01xFk_QrWQVKTm5me5Xq-v0VgdYNUfHEPCoy0UGkGoESUWH0gNuh4OdleJkdNj5RPMbiotYYOyLSptWFs9ji-DRu0FybXa-XPb1ziy-m_IFycjFT" alt=""/><br/><i>Étude sur le nombre de frères, de sœurs et de conjoints des survivants. </i></center>

<p>À l'aide de la figure précédente, nous pouvons nous rendre compte que les personnes ayant un ou deux frères et/ou sœurs et/ou conjoints ont plus de chance de survivre. En revanche, au-delà, ils ont de moins en moins de chance de survivre.</p>
<h3>Parch</h3>
<p>La variable <em>Parch</em> correspond au nombre de parents/enfants présent sur le navire lors du drame. </p>
<center><img src="https://lh5.googleusercontent.com/Sod5_c-Fo_n6WprzTexjcZLHEsi6CBFDwI524p86THkp6FPX3ehj9imfStZiKhujK4MzIatbhkpuRRd5KsfP2mfY58qdTW_KVcogNyDXoOYUlD2tKEPd2rpjhHjGnYbtw9gT6mLE" alt=""/><br/><i>Étude sur le nombre de parents/enfants.</i></center>

<center><img src="https://lh4.googleusercontent.com/ca7ZwW8jN2tla69_yeSaK6ZPOpFWn1TXBm09s2sASb0eGBXQSEksJAi4Hdvo0hWU65AhxC5sehue9aUf2SxxzKUSSH_OcdCxYbS2koIdqmJLHgB-GTxwTyCgAuEvJwA40TfXYFJy" alt=""/><br/><i>Étude sur le nombre de parents/enfants des survivants.</i></center>

<p>À l'aide du dernier graphique, nous pouvons constater que les passagers ayant 1 à 3 parents/enfants ont plus de chances de survivre que les autres. Cependant, il faut faire attention au nombre de personnes que nous prenons en compte. En effet, dans le cas où la variable <em>Parch</em> est égale à 3, nous pouvons constater que nous avons seulement 5 personnes. Ainsi, 3 personnes suffisent pour avoir une probabilité élevée. Cependant, nous ne pouvons pas dire avec certitude qu'avoir une valeur de 3 pour cette variable nous donne une probabilité plus haute de survivre.</p>
<h3>Ticket</h3>
<p>Nous avons accès à l’information sur le ticket des personnes. Ainsi, pour chaque personne, nous avons une chaîne de caractères composée soit que de chiffres, soit de lettres puis de chiffres. On peut constater qu’il y a seulement 681 unique ticket sur les 891 données que nous avons dans notre base d’entraînement. Cependant, un ticket devrait être unique pour tous les passagers de notre bateau. Ainsi, ce ne serait pas intéressant de garder cette information. Cependant, le fait que certains éléments soient composés de préfixe est intéressant. En effet, nous pouvons penser qu’en fonction de ce préfixe, nous pourrons déterminer une zone regroupant les mêmes cabines. Ainsi, lors du drame, les conséquences liées à certaines cabines dans une zone seront répercutées sur les autres cabines appartenant à la même zone. Ainsi, dans notre étude, nous pourrions récupérer cette information.</p>
<h3>Fare</h3>
<p>L’attribut <em>Fare</em> représente le prix du ticket. La première chose que nous pouvons constater est que nous avons dans notre base d’entraînement une valeur pour chaque élément. Cependant, nous pouvons constater qu’il nous manque une donnée pour notre base de test. Dans un premier temps, nous allons chercher à analyser les valeurs présentes dans notre base d’entraînement. </p>
<pre class="wp-block-code"><code>train_data["Fare"].describe()</code></pre>
<center><img src="https://lh6.googleusercontent.com/btY2J6yj7IJ-zLorsvifrwqQL3cVpfWJImcB6saSiUOPG1hVgPbzYSVE-o2pTD6uPTvj1c6l7-43g7mdWFLIjlDMwXitHzis1NVl0KP4Zd4vahR_9LVwdDQmAjjgAj6ynfWQvjsR" alt=""/><br/><i>Analyse du prix des tickets. </i></center>

<p>La première chose que nous pouvons remarquer est que le prix d’un ticket est très concentré. En effet, on peut voir que la médiane est d’environ 14,5. Puis, la valeur d’un ticket devient de plus en plus conséquente. Cependant, étant donné que nous avons des valeurs concentrées, une des approches que nous pouvons faire afin de prédire la valeur manquante serait de prendre la médiane. Bien entendu, nous aurions pu prendre un autre indicateur comme la moyenne. Dans notre cas, nous ne prenons pas la moyenne, car si nous regardons la valeur de l'écart-type, nous pouvons constater qu'elle est assez conséquente. Cela signifie donc que nos valeurs sont très éparpillées et qu'il est possible que nous ayons des valeurs aberrantes et peut-être fausses. Ainsi, nous préférons prendre la médiane. </p>
<h3>Cabin</h3>
<p>L’attribut Cabin représente les cabines où sont les passagers lors de leurs voyages. Cet attribut va nous poser problème. En effet, nous avons de nombreuses données manquantes. De plus, les données manquantes sont à la fois dans notre base d’entraînement et notre base de test. Elles sont présentes dans environ ¼ de nos données de test et presque 2/9 de nos données d’entraînement. Ainsi, dans notre étude, nous allons ignorer ces données. Cependant, cette donnée semble intéressante pour cette étude. En effet, en fonction de l’emplacement de la cabine du passager, la personne aurait pu mettre davantage de temps pour être évacué et ces chances de survie auraient pu être impactées.</p>
<h3>Embarked</h3>
<p>L'attribut "Embarked" correspond au port d'embarcation des personnes. Pour le cas de l’attribut “Embarked”, nous pouvons remarquer que nous avons deux valeurs non définies dans notre base d’entraînement. Cependant, dans notre base de test, nous pouvons apercevoir que nous avons l’ensemble de nos éléments. Afin de ne pas nous compliquer la tâche, nous pouvons simplement supprimer les deux données où nous avons l’attribut manquant.</p>
<center><img src="https://lh3.googleusercontent.com/AzxNYV4R9MSFdh2pYC7xzzf-hSQ0MAI5SXE1tRLzXWXIW5vMQOhyAe-r98h7APaSJC5-HWS_iHpaXRscmdbedYXFkn40JqnG7_xqFkVwnuTzCkT4vW5wHhbYs3g4PTViCn1wTyzo" alt=""/><br/><i>Étude sur le port d'embarquement des survivants.</i></center>

<p>En étudiant l'influence de cet attribut, nous pouvons constater que les personnes embarquant au port de Cherbourg ont plus de chance de survivre que les personnes embarquant à Queenstown ou à Southampton. </p>
<h3>Rétrospection de notre analyse</h3>
<p>Lors de cette analyse, assez fastidieuse, je vous l'accorde, nous avons cherché à comprendre chacune de nos données. De plus, nous avons aussi cherché à trouvé un lien entre les attributs et l'attribut recherché, ici le fait de survivre ou non. Nous nous sommes aussi concentrés sur le nombre d'attributs présents. En effet, afin de pouvoir traiter nos données, nous avons besoin d'information. Or, si cette dernière est manquante ou incomplète, nous ne pouvons pas nous appuyer dessus. Ainsi, il nous faut soit retirer de notre étude certains attributs ou associer une valeur à nos données manquantes.</p>
<p>Nous pouvons critiquer notre méthode, car lors de notre étude, nous recherchons une correspondance de manière visuelle sans trop nous appuyer sur des outils mathématiques nous permettant de quantifier cette correspondance. De plus, lors de notre aperçu des variables, nous avons cherché à mettre en relation uniquement une variable et le résultat. Or, il se peut que certaines variables aient du sens que lorsque nous les associons avec d'autres. Par exemple, l'âge et le nombre de frères et sœurs ont peut-être de meilleur résultat ensemble que pris séparément. </p>
<p>Bien entendu, dans un cas réel, il nous faudrait prendre tous cela en compte. Faire une étude des différentes variables que nous avons à notre disposition et les mettre en relation. Dans cet article, nous voulons simplement vous montrer la démarche à entreprendre. Dans de futurs articles, nous nous attarderons davantage sur cette partie délaissée ici. </p>
<h2>Transformation des données</h2>
<p>Après notre analyse, nous avons vu que certaines variables étaient intéressantes. Cependant, elles n'étaient pas forcément exploitables directement. Il va donc nous falloir appliquer un traitement afin de pouvoir les exploiter par la suite. </p>
<h3>Modification des tickets</h3>
<p>Dans notre étude, nous avons fait le choix de conserver la variable liée au ticket. Afin de pouvoir l'exploiter, nous avons décidé d'enlever les caractères posant problème. En effet, en étudiant les différents tickets possibles, nous nous rendons compte que certains tickets ont parfois les mêmes valeurs. Cela s'explique par le fait que le nombre n'est parfois pas conservé et que nous avons un préfixe indiquant potentiellement un emplacement sur le navire. Ainsi, nous avons voulu exploiter cela. Pour ce faire, nous réalisons une transformation en exécutant le code qui suit :</p>
<pre class="wp-block-code"><code>
Ticket = []
for i in list(train_data["Ticket"]):
    if not i.isdigit() :
        Ticket.append(i.replace(".","").replace("/","").strip().split(' ')[0])
    else:
        Ticket.append("X")
train_data["Ticket"] = Ticket
train_data["Ticket"].value_counts()
</code></pre>

<h3>Piste d'améliorations</h3>
<p>Il est possible de traiter d'autres variables comme l'âge qui peut être un facteur intéressant dans notre étude. Pour cette dernière, plusieurs choix s'offrent à nous.  La première consiste à normaliser la variable âge pour qu'elle soit comprise entre 0 et 1. La seconde consiste à créer des catégories d'âges en fonction de la proportion survivant ou non. Il nous suffira ensuite d'encoder la catégorie sous le format One-hot. </p>
<p>Bien entendu, d'autres variables peuvent être utilisé même si certaines ont des données manquantes. Sur ces dernières, il faudrait en définir une de base par calcul de la moyenne ou de la médiane... ou par prédiction. En effet, rien ne nous empêche de réaliser un système intermédiaire permettant de déterminer la valeur manquante.  </p>
<h2>Préparation de notre production</h2>
<p>Avec la librairie python <em>sklearn</em>, nous avons la possibilité de créer des <em>pipelines</em>. Cela nous permet d'appliquer un traitement sur nos données en le spécifiant au préalable. Cette méthode est très avantageuse, car si nous avons beaucoup d'ensemble de données que nous souhaitons tester, nous pouvons réaliser le traitement en appelant une seule fonction. Or, si nous réalisons pour chacun des ensembles un traitement séparer, cela peut être très fastidieux. De plus, nous avons des risques d'erreur lors de la réalisation du traitement à la main. Bien évidemment, la création de ce traitement est parfois complexe et peut prendre un peu de temps. Cependant, de mon point vue, cela est largement rentabiliser sur le long terme.</p>
<p>Ainsi, dans cette étude, nous allons réaliser une <em>pipeline</em> pour ce jeu de données. Nous allons créer une classe python permettant de sélectionner les données, sans appliquer de traitement sur celle-ci.</p>
<pre class="wp-block-code"><code>class DataFrameSelector(BaseEstimator, TransformerMixin):
    def __init__(self, attribute_names):
        self.attribute_names = attribute_names
    def fit(self, X, y=None):
        return self
    def transform(self, X):
        return X[self.attribute_names]</code></pre>
<p>Avec cette classe, nous allons pouvoir sélectionner les variables que nous souhaitons conserver sans appliquer de traitement sur elles.</p>
<pre class="wp-block-code"><code>from sklearn.pipeline import Pipeline
try:
    from sklearn.impute import SimpleImputer # Scikit-Learn 0.20+
except ImportError:
    from sklearn.preprocessing import Imputer as SimpleImputer
num_pipeline = Pipeline([
        ("select_numeric", DataFrameSelector(["SibSp", "Parch", "Fare"])),
        ("imputer", SimpleImputer(strategy="median")),
    ])</code></pre>
<p>Nous allons créer une autre classe de sélection, qui cette fois-ci va appliquer aux valeurs manquantes la valeur la plus fréquente. </p>
<pre class="wp-block-code"><code>class MostFrequentImputer(BaseEstimator, TransformerMixin):
    def fit(self, X, y=None):
        self.most_frequent_ = pd.Series([X[c].value_counts().index[0] for c in X],
                                        index=X.columns)
        return self
    def transform(self, X, y=None):
        return X.fillna(self.most_frequent_)</code></pre>
<p>Et nous allons appliquer cela sur les éléments qui nous intéresse :</p>

<pre class="wp-block-code"><code>
cat_pipeline = Pipeline([
        ("select_cat", DataFrameSelector(["Pclass", "Sex", "Embarked", "Ticket"])),
        ("imputer", MostFrequentImputer()),
        ("cat_encoder", OneHotEncoder(sparse=False)),
    ])
</code></pre>

<p>Enfin, nous allons rassembler ces deux <em>pipelines</em> dans une seule. Ainsi, lorsque nous appellerons cette dernière, elle appliquera les deux traitements. </p>
<pre class="wp-block-code"><code>from sklearn.pipeline import FeatureUnion
preprocess_pipeline = FeatureUnion(transformer_list=[
        ("num_pipeline", num_pipeline),
        ("cat_pipeline", cat_pipeline),
    ])</code></pre>
<h2>Entraînement de notre modèle</h2>
<p>Avant de pouvoir entraîner notre modèle, il nous faut récupérer nos données, mais aussi sélectionner un modèle pertinent pour notre étude. Pour récupérer nos données d'entraînement, nous faisons : </p>
<pre class="wp-block-code"><code>X_train = preprocess_pipeline.fit_transform(train_data)
y_train = train_data["Survived"]</code></pre>
<p>Pour ce cas d'étude, plusieurs types de réseaux sont possibles comme les  <em>Support Vector Classifier</em> ou les <em>Random Forest Classifier</em>. Ici, nous allons essayer ces deux modèles et les comparer.</p>
<h3>Support Vector Classifier </h3>
<p>Nous allons dans un premier temps, à l'aide de la librairie <em>sklearn</em> de python, initialiser notre classifier.</p>
<pre class="wp-block-code"><code>from sklearn.svm import SVC
svm_clf = SVC(gamma="auto")
svm_clf.fit(X_train, y_train)</code></pre>
<p>Puis, nous allons réaliser une validation croisée : </p>
<pre class="wp-block-code"><code>from sklearn.model_selection import cross_val_score
svm_scores = cross_val_score(svm_clf, X_train, y_train, cv=10)
svm_scores.mean()</code></pre>
<p>Nous obtenons un score d'environ 0.78, ce qui est plutôt bon pour une première approche plutôt basique.</p>
<h3>Random Forest Classifier</h3>
<p>Nous allons faire la même chose que pour le précédent classifier. Nous allons créer notre modèle et réaliser une validation croisée.</p>
<pre class="wp-block-code"><code>from sklearn.ensemble import RandomForestClassifier
forest_clf = RandomForestClassifier(n_estimators=100, random_state=42)
forest_scores = cross_val_score(forest_clf, X_train, y_train, cv=10)
forest_scores.mean()</code></pre>
<p>Ici, nous obtenons un score d'environ 0.80, un meilleur score que précédemment.</p>
<h3>Comparaison des deux modèles </h3>
<p>Maintenant, ce qui peut-être intéressant est de comparer nos deux réseaux. En effet, d'après les résultats précédents, nous pouvons dire que le classificateur par Random Forest est meilleur. Cependant, nous allons chercher à visualiser cet écart. Pour ce faire, nous allons nous intéresser à la précision.  </p>
<pre class="wp-block-code"><code>
%matplotlib inline
import matplotlib as mpl
import matplotlib.pyplot as plt
mpl.rc('axes', labelsize=14)
mpl.rc('xtick', labelsize=12)
mpl.rc('ytick', labelsize=12)
plt.figure(figsize=(8, 4))
plt.plot([1]*10, svm_scores, ".")
plt.plot([2]*10, forest_scores, ".")
plt.boxplot([svm_scores, forest_scores], labels=("SVM","Random Forest"))
plt.ylabel("Accuracy", fontsize=14)
plt.show()
</code></pre>

<center><img src="https://www.technologieintelligente.fr/wp-content/uploads/2019/07/image.png" alt="" class="wp-image-215"/><br/><i>Boîtes à moustache des deux classificateurs.</i></center>

<p>À l'aide de ces boîtes à moustache, nous pouvons visualiser la précision de nos deux classificateurs. En effet, nous pouvons constater que la précision de notre SVM est très concentrée, alors que celle de notre Random Forest est très étalée. Ainsi, nous avons un modèle plus stable qu'un autre. Il faut en prendre compte. En effet, en fonction de notre cas d'application, cela peut avoir de grandes répercutions.</p>
<h3>Rétrospective sur nos classificateurs</h3>
<p>Lors de la réalisation de nos modèles, nous ne nous sommes pas attardés sur l'étude des hyper-paramètres. En effet, en modifiant ces paramètres, nous pouvons avoir des résultats très différents. Ainsi, pour avoir un modèle très performant sur nos données, il nous faudrait sélectionner ces hyper-paramètres en testant les différentes possibilités. De plus, dans notre analyse, nous nous sommes limités à deux modèles. Cependant, rien ne nous empêche d'en tester davantage. </p>
<h2>Conclusion</h2>
<p>Dans cet article, nous avons tenté de prédire les survivant du Titanic en se basant sur un jeu de données. Lors de cette étude, nous avons étudié les différentes variables présentes et transformé les variables qui nous intéresser afin de pouvoir les exploiter. Puis, nous avons réalisé deux systèmes de prédictions en effectuant une validation croisée. </p>
<p>À travers cette étude, nous avons vu les bases de la création d'un système implémentant un système de prédictions. Bien entendu, nous pouvons critiquer notre modèle étant donné que nous pouvions grandement l'améliorer en prenant en considération d'autres variables comme l'âge dans notre système.  De plus, d'autres modifications auraient pu être apportées si nous avions analysé davantage les différentes relations entre les variables. Enfin, concernant le système choisi, nous aurions pu en utiliser d'autres, voir améliorer ce que nous avions utiliser en ajustant les hyper-paramètres.</p>
<p>J'espère que cet article, plutôt long, vous aura plus. N'hésitez pas à poser des questions dans les commentaires. Il se peut que certains points ne soient pas clair pour vous. Merci et à bientôt dans un prochain article. </p>
<h2>Bibliographie</h2>
<p><a href="https://www.kaggle.com/c/titanic/data">https://www.kaggle.com/c/titanic/data</a></p>
<p><a href="https://github.com/ageron/handson-ml/blob/master/03_classification.ipynb">https://github.com/ageron/handson-ml/blob/master/03_classification.ipynb</a></p>
<p><a href="https://www.kaggle.com/ldfreeman3/a-data-science-framework-to-achieve-99-accuracy/log">https://www.kaggle.com/ldfreeman3/a-data-science-framework-to-achieve-99-accuracy/log</a></p>
<p><a href="https://www.kaggle.com/arthurtok/introduction-to-ensembling-stacking-in-python">https://www.kaggle.com/arthurtok/introduction-to-ensembling-stacking-in-python</a></p>
<p><a href="https://www.kaggle.com/startupsci/titanic-data-science-solutions">https://www.kaggle.com/startupsci/titanic-data-science-solutions</a></p>
<p><a href="https://www.kaggle.com/yassineghouzam/titanic-top-4-with-ensemble-modeling">https://www.kaggle.com/yassineghouzam/titanic-top-4-with-ensemble-modeling</a></p>
 <br /> 
<br /> 
Lien original : https://www.technologieintelligente.fr/intelligence-artificielle/cas-dapplication/predire-les-survivants-du-titanic-a-l-aide-de-lintelligence-artificielle/
👍  , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , and 706 others
properties (23)
post_id77,574,867
authorrerere
permlinkprdirelessurvivantsdutitaniclaidedelintelligenceartificielle-aiut0ivqow
categoryfr
json_metadata{"community":"busy","app":"busy\/2.5.6","image":["https:\/\/www.technologieintelligente.fr\/wp-content\/uploads\/2019\/07\/sunset-675847_1920.jpg","https:\/\/lh3.googleusercontent.com\/tS46cQ_g6ZfbKWoVyX4k6hT0rpTTC9eRr6Jhrb6UnAMIwQfeOtGMq0fL0vcPCC3VwvGcOreX_f_yhx_zi92GN-YJhdx6QWPrhX_3Kw9sE83dKxdUTSk5WQ1iTZm8GIyt87Snpsx8","https:\/\/lh5.googleusercontent.com\/nstULqZ_jK9_XCqRPjmEns4CkHV8xcjX7LoNRo_8-kkDaXKBENb720bbs2mmBdfhW6HgeNB9Km6_OotFVCL_qJaE9UgwVgyR08asuF5JO5a8gXaaaKqLJGM2zsGv8wM3OY9Hq-Gx","https:\/\/lh4.googleusercontent.com\/dyqKBsqf-83yCuYpilyCvLzvDKy_kukGrd2CmuzV5IhwU2gZfZ1YLC-bBwvTXIxeLc2qO3yXV5OsPqXvRKy9JZV2v0XIkEG-nfU258LBaCBWVJTndD-TfCn1Wh53ZXWKsj_O9n24","https:\/\/lh4.googleusercontent.com\/EomVJZ9gBc9D2jSUFPrULs7qTppLlKXqfSi5u2HQOWoUQ9hWl-QSqHDc4So615xncyYNaNNnpa1M3izv_4tToNmQhyca1YOczzZiAfD14QRelciP6Z8nk3mZMRf-1rnh5qyHKMWk","https:\/\/lh3.googleusercontent.com\/ebg0A8ixJroqHCKTV7stv-_icxpCJPg13w6HJ7A9MW5bjbuJSo3yFNq3aVMBA6_eu5t9LEVk38By85f47ldFErGSl0_FWTHqW5tHTPNvH0cwk0SwM9PQpbY5aIF6npKxaLScHsL1","https:\/\/lh6.googleusercontent.com\/GDUDB-y91qyTrN6Tf1QRd7y72tFzqmWT5pZBZ3yqDvNZSv486_YgjUfUKAxMZhSpDUWfHSGyVX4UlyPQfie3uzmVQ1XVlXoXPO9P131xo2Tk5-MHcoKB5kt48cxOBOBN_-5c3I8-","https:\/\/lh3.googleusercontent.com\/-0oUKH79IGsXeUMqhdgQO70w8d_4pHOXxZY8xIBtkmD9FEtqPVS0pHhuVevk0UfGbuMc6qhyl7vvc5agAkWxKiVXZ-7jPWxWWmG2VvLcBhaTVhfScAYymKbp9KilB9FNjlR6zyrZ","https:\/\/lh5.googleusercontent.com\/b2ba1gxAiFdXjUp1ucwHA09C01xFk_QrWQVKTm5me5Xq-v0VgdYNUfHEPCoy0UGkGoESUWH0gNuh4OdleJkdNj5RPMbiotYYOyLSptWFs9ji-DRu0FybXa-XPb1ziy-m_IFycjFT","https:\/\/lh5.googleusercontent.com\/Sod5_c-Fo_n6WprzTexjcZLHEsi6CBFDwI524p86THkp6FPX3ehj9imfStZiKhujK4MzIatbhkpuRRd5KsfP2mfY58qdTW_KVcogNyDXoOYUlD2tKEPd2rpjhHjGnYbtw9gT6mLE","https:\/\/lh4.googleusercontent.com\/ca7ZwW8jN2tla69_yeSaK6ZPOpFWn1TXBm09s2sASb0eGBXQSEksJAi4Hdvo0hWU65AhxC5sehue9aUf2SxxzKUSSH_OcdCxYbS2koIdqmJLHgB-GTxwTyCgAuEvJwA40TfXYFJy","https:\/\/lh6.googleusercontent.com\/btY2J6yj7IJ-zLorsvifrwqQL3cVpfWJImcB6saSiUOPG1hVgPbzYSVE-o2pTD6uPTvj1c6l7-43g7mdWFLIjlDMwXitHzis1NVl0KP4Zd4vahR_9LVwdDQmAjjgAj6ynfWQvjsR","https:\/\/lh3.googleusercontent.com\/AzxNYV4R9MSFdh2pYC7xzzf-hSQ0MAI5SXE1tRLzXWXIW5vMQOhyAe-r98h7APaSJC5-HWS_iHpaXRscmdbedYXFkn40JqnG7_xqFkVwnuTzCkT4vW5wHhbYs3g4PTViCn1wTyzo","https:\/\/www.technologieintelligente.fr\/wp-content\/uploads\/2019\/07\/image.png"],"tags":["fr","francostem","steemstem","steempress","blog"],"original_link":"https:\/\/www.technologieintelligente.fr\/intelligence-artificielle\/cas-dapplication\/predire-les-survivants-du-titanic-a-l-aide-de-lintelligence-artificielle\/","format":"markdown","users":[],"links":["https:\/\/www.kaggle.com\/c\/titanic","https:\/\/colab.research.google.com","https:\/\/www.kaggle.com\/c\/titanic","https:\/\/www.kaggle.com\/c\/titanic\/data","https:\/\/github.com\/ageron\/handson-ml\/blob\/master\/03_classification.ipynb","https:\/\/www.kaggle.com\/ldfreeman3\/a-data-science-framework-to-achieve-99-accuracy\/log","https:\/\/www.kaggle.com\/arthurtok\/introduction-to-ensembling-stacking-in-python","https:\/\/www.kaggle.com\/startupsci\/titanic-data-science-solutions","https:\/\/www.kaggle.com\/yassineghouzam\/titanic-top-4-with-ensemble-modeling","https:\/\/www.technologieintelligente.fr\/intelligence-artificielle\/cas-dapplication\/predire-les-survivants-du-titanic-a-l-aide-de-lintelligence-artificielle\/"]}
created2019-07-06 15:36:03
last_update2019-07-06 16:25:48
depth0
children7
net_rshares34,584,881,120,015
last_payout2019-07-13 15:36:03
cashout_time1969-12-31 23:59:59
total_payout_value9.301 SBD
curator_payout_value3.576 SBD
pending_payout_value0.000 SBD
promoted0.000 SBD
body_length28,885
author_reputation4,786,300,923,226
root_title"Prédire les survivants du Titanic à l'aide de l'intelligence artificielle"
beneficiaries
0.
accountsteempress
weight1,500
max_accepted_payout1,000,000.000 SBD
percent_steem_dollars10,000
author_curate_reward""
vote details (770)
@french-tech ·
Article passionnant sur un domaine tout aussi passionnant. Pourtant c'était pas gagné car suis vraiment pas un fan de Titanic Hahahaha.
properties (22)
post_id77,594,056
authorfrench-tech
permlinkre-rerere-prdirelessurvivantsdutitaniclaidedelintelligenceartificielle-aiut0ivqow-20190707t013915470z
categoryfr
json_metadata{"tags":["fr"],"app":"steempeak\/1.13.6"}
created2019-07-07 01:39:21
last_update2019-07-07 01:39:21
depth1
children1
net_rshares0
last_payout2019-07-14 01:39:21
cashout_time1969-12-31 23:59:59
total_payout_value0.000 SBD
curator_payout_value0.000 SBD
pending_payout_value0.000 SBD
promoted0.000 SBD
body_length135
author_reputation5,288,510,041,882
root_title"Prédire les survivants du Titanic à l'aide de l'intelligence artificielle"
beneficiaries[]
max_accepted_payout1,000,000.000 SBD
percent_steem_dollars10,000
@rerere ·
Merci beaucoup :)
C'est vrai que le sujet du Titanic n'est pas forcément le meilleur sujet, mais c'est un cas d'étude assez intéressant qui prend en compte différents aspects de l'analyse de données.
properties (22)
post_id77,898,919
authorrerere
permlinkre-french-tech-re-rerere-prdirelessurvivantsdutitaniclaidedelintelligenceartificielle-aiut0ivqow-20190713t160209650z
categoryfr
json_metadata{"community":"busy","app":"busy\/2.5.6","format":"markdown","tags":["fr"],"users":[],"links":[]}
created2019-07-13 16:02:09
last_update2019-07-13 16:02:09
depth2
children0
net_rshares0
last_payout2019-07-20 16:02:09
cashout_time1969-12-31 23:59:59
total_payout_value0.000 SBD
curator_payout_value0.000 SBD
pending_payout_value0.000 SBD
promoted0.000 SBD
body_length199
author_reputation4,786,300,923,226
root_title"Prédire les survivants du Titanic à l'aide de l'intelligence artificielle"
beneficiaries[]
max_accepted_payout1,000,000.000 SBD
percent_steem_dollars10,000
@fr-stars ·
re-rerere-prdirelessurvivantsdutitaniclaidedelintelligenceartificielle-aiut0ivqow-20190707t150316596z
Ce post a été supporté par notre initiative de curation francophone @fr-stars. 
Rendez-vous sur notre serveur [**Discord**](https://discord.gg/CcNs5uP) pour plus d'informations
properties (22)
post_id77,617,931
authorfr-stars
permlinkre-rerere-prdirelessurvivantsdutitaniclaidedelintelligenceartificielle-aiut0ivqow-20190707t150316596z
categoryfr
json_metadata{"app":"trail-bot"}
created2019-07-07 15:03:18
last_update2019-07-07 15:03:18
depth1
children0
net_rshares0
last_payout2019-07-14 15:03:18
cashout_time1969-12-31 23:59:59
total_payout_value0.000 SBD
curator_payout_value0.000 SBD
pending_payout_value0.000 SBD
promoted0.000 SBD
body_length176
author_reputation853,318,401,451
root_title"Prédire les survivants du Titanic à l'aide de l'intelligence artificielle"
beneficiaries[]
max_accepted_payout1,000,000.000 SBD
percent_steem_dollars10,000
@aidefr ·
<h3>Félicitations ! Votre post a été sélectionné de part sa qualité et upvoté par le trail de curation de [@aidefr](https://steemit.com/@aidefr) !</h3>

**La catégorie du jour était :** #technologie

---

Si vous voulez aider le projet, vous pouvez rejoindre le trail de curation [ici](https://steemauto.com/dash.php?i=15&id=1&user=aidefr)!

_Bonne continuation !_

**_Rendez-vous sur le nouveau site web de FrancoPartages ! [https://francopartages.xyz](https://francopartages.xyz)_**
👍  
properties (23)
post_id77,713,644
authoraidefr
permlinkre-rerere-prdirelessurvivantsdutitaniclaidedelintelligenceartificielle-aiut0ivqow-20190709t085050242z
categoryfr
json_metadata{"tags":["fr"],"app":"steempeak\/1.13.6"}
created2019-07-09 08:50:51
last_update2019-07-09 08:50:51
depth1
children0
net_rshares624,725,461
last_payout2019-07-16 08:50:51
cashout_time1969-12-31 23:59:59
total_payout_value0.000 SBD
curator_payout_value0.000 SBD
pending_payout_value0.000 SBD
promoted0.000 SBD
body_length484
author_reputation9,847,666,521,101
root_title"Prédire les survivants du Titanic à l'aide de l'intelligence artificielle"
beneficiaries[]
max_accepted_payout1,000,000.000 SBD
percent_steem_dollars10,000
author_curate_reward""
vote details (1)
@steemstem ·
re-rerere-prdirelessurvivantsdutitaniclaidedelintelligenceartificielle-aiut0ivqow-20190712t075312006z
<div class='text-justify'> <div class='pull-left'> <center> <br /> <img width='200' src='https://res.cloudinary.com/drrz8xekm/image/upload/v1553698283/weenlqbrqvvczjy6dayw.jpg'> </center>  <br/> <br /> </div>

This post has been voted on by the **SteemSTEM** curation team and voting trail. It is elligible for support from <b><a href='https://www.steemstem.io/#!/@curie'>@curie</a></b> and <b><a href='https://www.steemstem.io/#!/@utopian-io'>@utopian-io</a></b>.<br /> 

If you appreciate the work we are doing, then consider supporting our witness [**stem.witness**](https://steemconnect.com/sign/account_witness_vote?approve=1&witness=stem.witness). Additional witness support to the [**curie witness**](https://steemconnect.com/sign/account_witness_vote?approve=1&witness=curie) and [**utopian-io witness**](https://steemconnect.com/sign/account_witness_vote?approve=1&witness=utopian-io) would be appreciated as well.<br /> 

For additional information please join us on the [**SteemSTEM discord**]( https://discord.gg/BPARaqn) and to get to know the rest of the community!<br />

Please consider setting <b><a href='https://www.steemstem.io/#!/@steemstem'>@steemstem</a></b> as a beneficiary to your post to get a stronger support.<br />

Please consider using the <b><a href='https://www.steemstem.io'>steemstem.io</a></b> app to get a stronger support.</div>
properties (22)
post_id77,845,288
authorsteemstem
permlinkre-rerere-prdirelessurvivantsdutitaniclaidedelintelligenceartificielle-aiut0ivqow-20190712t075312006z
categoryfr
json_metadata{"app":"bloguable-bot"}
created2019-07-12 07:53:15
last_update2019-07-12 07:53:15
depth1
children0
net_rshares0
last_payout2019-07-19 07:53:15
cashout_time1969-12-31 23:59:59
total_payout_value0.000 SBD
curator_payout_value0.000 SBD
pending_payout_value0.000 SBD
promoted0.000 SBD
body_length1,367
author_reputation187,643,417,195,608
root_title"Prédire les survivants du Titanic à l'aide de l'intelligence artificielle"
beneficiaries[]
max_accepted_payout1,000,000.000 SBD
percent_steem_dollars10,000
@steemitboard ·
Congratulations @rerere! You have completed the following achievement on the Steem blockchain and have been rewarded with new badge(s) :

<table><tr><td><img src="https://steemitimages.com/60x70/http://steemitboard.com/@rerere/voted.png?201907120929"></td><td>You received more than 7000 upvotes. Your next target is to reach 8000 upvotes.</td></tr>
</table>

<sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@rerere) and compare to others on the [Steem Ranking](https://steemitboard.com/ranking/index.php?name=rerere)_</sub>
<sub>_If you no longer want to receive notifications, reply to this comment with the word_ `STOP`</sub>



###### [Vote for @Steemitboard as a witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1) to get one more award and increased upvotes!
properties (22)
post_id77,850,001
authorsteemitboard
permlinksteemitboard-notify-rerere-20190712t101308000z
categoryfr
json_metadata{"image":["https:\/\/steemitboard.com\/img\/notify.png"]}
created2019-07-12 10:13:06
last_update2019-07-12 10:13:06
depth1
children0
net_rshares0
last_payout2019-07-19 10:13:06
cashout_time1969-12-31 23:59:59
total_payout_value0.000 SBD
curator_payout_value0.000 SBD
pending_payout_value0.000 SBD
promoted0.000 SBD
body_length837
author_reputation33,282,981,394,546
root_title"Prédire les survivants du Titanic à l'aide de l'intelligence artificielle"
beneficiaries[]
max_accepted_payout1,000,000.000 SBD
percent_steem_dollars10,000
@utopian-io ·
#### Hi @rerere!

Your post was upvoted by Utopian.io in cooperation with @steemstem - supporting knowledge, innovation and technological advancement on the Steem Blockchain.

#### Contribute to Open Source with utopian.io
Learn how to contribute on <a href='https://join.utopian.io'>our website</a> and join the new open source economy.

**Want to chat? Join the Utopian Community on Discord https://discord.gg/h52nFrV**
properties (22)
post_id77,865,428
authorutopian-io
permlinkre-prdirelessurvivantsdutitaniclaidedelintelligenceartificielle-aiut0ivqow-20190712t163935z
categoryfr
json_metadata{"app":"beem\/0.20.17"}
created2019-07-12 16:39:36
last_update2019-07-12 16:39:36
depth1
children0
net_rshares0
last_payout2019-07-19 16:39:36
cashout_time1969-12-31 23:59:59
total_payout_value0.000 SBD
curator_payout_value0.000 SBD
pending_payout_value0.000 SBD
promoted0.000 SBD
body_length421
author_reputation152,913,012,544,965
root_title"Prédire les survivants du Titanic à l'aide de l'intelligence artificielle"
beneficiaries[]
max_accepted_payout1,000,000.000 SBD
percent_steem_dollars10,000