[PYTHON] [Kaggle pour les super débutants] Titanic (retour logistique)

■ Présentation

J'ai travaillé sur un concours pour les débutants de Kaggle J'ai essayé de le résumer brièvement.

【Aperçu】 ・ Titanic: Machine Learning from Disaster ・ Sur la base des informations sur les passagers du navire en train de couler "Titanic", faites la distinction entre ceux qui sont sauvés et ceux qui ne le sont pas.

Cette fois, nous allons créer un modèle utilisant la régression logistique.

1. Préparation du module


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

from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_curve, roc_auc_score
from sklearn.metrics import accuracy_score, f1_score
from sklearn.metrics import confusion_matrix, classification_report
from sklearn.feature_selection import RFE

%matplotlib inline

## 2. Préparation des données

train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')

print(train.shape)
print(test.shape)

# (891, 12)
# (418, 11)

train.head()

image.png 【élément de données】 ・ PassengerId: ID du passager ・ Survived: s'il a survécu (0: non enregistré, 1: enregistré) ・ Pclass - Classe de billets (1: Classe supérieure, 2: Classe intermédiaire, 3: Classe inférieure) ・ Nom: nom du passager ・ Sexe: sexe ・ Âge: Âge ・ SibSp: nombre de frères et de conjoints à bord ・ Parch: nombre de parents / enfants à bord ・ Ticket: numéro de ticket ・ Tarif: Frais ・ Cabine: numéro de chambre ・ Embarqué: Port à bord (C: Cherbourg, Q: Queenstown, S: Southampton)


test.head()

image.png Enregistrez le numéro de passager (PassengerId) des données de test.


PassengerId = test['PassengerId']

En fait, le modèle est créé uniquement avec des données de train La même quantité de caractéristiques est requise lors de la saisie de données de test dans le modèle.

Lorsqu'un encodage à chaud, etc. est utilisé pour le prétraitement Parce que le nombre de fonctionnalités des données de train et de test est différent Les deux données sont combinées et prétraitées ensemble.

Premièrement, les données de train ont un élément supplémentaire (variable objective: survécu), donc séparez-le.


y = train['Survived']
train = train[[col for col in train.columns if col != 'Survived']]

print(train.shape)
print(test.shape)

# (891, 11)
# (418, 11)

Maintenant que le nombre d'éléments (caractéristiques) dans les données de train et les données de test est le même, combinez-les.


X = pd.concat([train, test], axis=0)

print(X.shape)
X.head()

# (1309, 11)

image.png

3-1. Prétraitement (entier)

Tout d'abord, vérifiez le nombre de valeurs manquantes.


X.isnull().sum()

'''
PassengerId       0
Pclass            0
Name              0
Sex               0
Age             263
SibSp             0
Parch             0
Ticket            0
Fare              1
Cabin          1014
Embarked          2
dtype: int64
'''

Parce qu'il n'est pas possible de créer un modèle avec les données de chaîne de caractères telles quelles Nous le convertirons en valeurs numériques au besoin.

Pour le sexe, convertissez en "homme: 0, femme: 1".


def code_transform(x):
    
    if x == 'male':
        y = 0
    else:
        y = 1
        
    return y

X['Sex'] = X['Sex'].apply(lambda x: code_transform(x))
X.head()

image.png Convertit le port sur lequel le navire est abordé en "0: C, 1: Q, 2: S".


def code_transform(x):
    
    if x == 'C':
        y = 0
    elif x == 'Q':
        y = 1
    else:
        y = 2
        
    return y

X['Embarked'] = X['Embarked'].apply(lambda x: code_transform(x))
X.head()

image.png Examinons maintenant les colonnes qui ne contiennent que des chiffres et les colonnes qui ne contiennent que des lettres.


numerical_col = [col for col in X.columns if X[col].dtype != 'object']
categorical_col = [col for col in X.columns if X[col].dtype == 'object']

print(numerical_col)
print(categorical_col)

# ['PassengerId', 'Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked']
# ['Name', 'Ticket', 'Cabin']

Je souhaite effectuer un prétraitement séparé pour la colonne numérique et la colonne de chaîne de caractères, je vais donc les séparer.

X_num = X[numerical_col]
X_cat = X[categorical_col]

print(X_num.shape)
print(X_cat.shape)

# (1309, 8)
# (1309, 3)

3-2. Prétraitement (colonne numérique)

Vérifiez le contenu des données.


X_num.head()

image.png Remplissez les valeurs manquantes avec la valeur médiane de chaque colonne.

X_num.fillna(X_num.median(), inplace=True)

Vérifiez l'état des valeurs manquantes.


X_num.isnull().sum()

'''
PassengerId    0
Pclass         0
Sex            0
Age            0
SibSp          0
Parch          0
Fare           0
Embarked       0
dtype: int64
'''

3-3. Prétraitement (colonne de chaînes de caractères)

Vérifiez le contenu des données.

X_cat.head()

image.png Les valeurs manquantes incluent systématiquement le mot «manquant».


X_cat.fillna(value='missing', inplace=True)

Vérifiez l'état des valeurs manquantes.


X_cat.isnull().sum()

'''
Name      0
Ticket    0
Cabin     0
dtype: int64
'''

Effectuez un encodage à chaud pour convertir toutes les chaînes en nombres.


X_cat = pd.get_dummies(X_cat)

print(X_cat.shape)
X_cat.head()

# (1309, 2422)

image.png

3-4. Prétraitement (entier)

Puisque X_num et X_cat n'ont aucune valeur manquante et ne sont que des données numériques. Combinez et revenez à l'ensemble des données.


X_total = pd.concat([X_num, X_cat], axis=1)

print(X_total.shape)
X_total.head()

# (1309, 2431)

image.png Je souhaite créer un modèle en utilisant uniquement des données de train Puisque X_total contient également des données de test, seule la partie nécessaire est extraite.

train_rows = train.shape[0]
X = X_total[:train_rows]

std = StandardScaler()
X = std.fit_transform(X)

print(X.shape)
print(y.shape)

# (891, 2431)
# (891,)

# 4. Créez un modèle Étant donné que la quantité de caractéristiques et la variable objective correspondant aux données du train sont disponibles De plus, nous créerons un modèle en le divisant en données d'entraînement et en données de test.

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=123)

print(X_train.shape)
print(y_train.shape)
print(X_test.shape)
print(y_test.shape)

# (623, 2431)
# (623,)
# (268, 2431)
# (268,)

logreg = LogisticRegression(class_weight='balanced')
logreg.fit(X_train, y_train)

'''
LogisticRegression(C=1.0, class_weight='balanced', dual=False,
                   fit_intercept=True, intercept_scaling=1, l1_ratio=None,
                   max_iter=100, multi_class='auto', n_jobs=None, penalty='l2',
                   random_state=None, solver='lbfgs', tol=0.0001, verbose=0,
                   warm_start=False)
'''

Ensuite, recherchez la valeur prévue.

En spécifiant [:, 1] pour y_proba, la probabilité de devenir Class1 (Survived = 1) est prédite. y_pred affecte 1 s'il est supérieur à 0,5 et 0 s'il est inférieur à 0,5.


y_proba = logreg.predict_proba(X_test)[: , 1]
print(y_proba[:5])

y_pred = logreg.predict(X_test)
print(y_pred[:5])

# [0.90784721 0.09948558 0.36329043 0.18493678 0.43881127]
# [1 0 0 0 0]

## 5. Évaluation des performances Évaluer à l'aide de la courbe ROC et de l'ASC.

fpr, tpr, thresholds = roc_curve(y_test, y_proba)
auc_score = roc_auc_score(y_test, y_proba)
plt.plot(fpr, tpr, label='AUC = %.3f' % (auc_score))
plt.legend()
plt.title('ROC curve')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.grid(True)

print('accuracy:',accuracy_score(y_test, y_pred))
print('f1_score:',f1_score(y_test, y_pred))

# accuracy: 0.7723880597014925
# f1_score: 0.6013071895424837

image.png Aussi, évaluons en utilisant une matrice de confusion.


classes = [1, 0]
cm = confusion_matrix(y_test, y_pred, labels=classes)

cmdf = pd.DataFrame(cm, index=classes, columns=classes)

sns.heatmap(cmdf, annot=True)
print(classification_report(y_test, y_pred))
'''
              precision    recall  f1-score   support

           0       0.76      0.95      0.84       170
           1       0.84      0.47      0.60        98

    accuracy                           0.77       268
   macro avg       0.80      0.71      0.72       268
weighted avg       0.79      0.77      0.75       268

'''

image.png
6. Submit Depuis que j'ai pu créer et évaluer un modèle à l'aide de données de train Donnez les informations des données de test et donnez la valeur prévue.

Commencez par extraire la partie correspondant aux données de test des données totales (X_total).

X_submit = X_total[train_rows:]
X_submit = std.fit_transform(X_submit)

print(X_train.shape)
print(X_submit.shape)

# (623, 2431)
# (418, 2431)

Comparé au X_train qui a créé le modèle, il a le même nombre de fonctionnalités (2431). Soumettez X_submit dans le modèle pour obtenir la valeur prévue.


y_proba_submit = logreg.predict_proba(X_submit)[: , 1]
print(y_proba_submit[:5])

y_pred_submit = logreg.predict(X_submit)
print(y_pred_submit[:5])

# [0.02342065 0.18232356 0.06760457 0.06219097 0.76277487]
# [0 0 0 0 1]

Préparez les données CSV à soumettre à Kaggle.

Commencez par créer un bloc de données avec les informations nécessaires.


df_submit = pd.DataFrame(y_pred_submit, index=PassengerId, columns=['Survived'])
df_submit.head()

image.png Puis convertissez-le en données CSV.


df_submit.to_csv('titanic_submit.csv')

C'est la fin de la soumission. image.png

■ Enfin

Cette fois, nous avons compilé un article pour les débutants de Kaggle. J'espère que cela vous a même un peu aidé.

Merci pour la lecture.

Recommended Posts

[Kaggle pour les super débutants] Titanic (retour logistique)
[Pour les débutants de Kaggle] Titanic (LightGBM)
Retour logistique (pour les débutants) -Code Edition-
Défis de la compétition Titanic pour les débutants de Kaggle
[Pour les débutants] kaggle exercice (merucari)
C'est normal de tomber sur Titanic! Présentation de la stratégie Kaggle pour les super débutants
Python #function 2 pour les super débutants
Python #function 1 pour les super débutants
#List Python pour les super débutants
Python pour les super débutants Super débutants Python # dictionnaire type 1
Python #index pour les super débutants, tranches
Fonction Python #len pour les super débutants
Python #Hello World pour les super débutants
Régression linéaire (pour les débutants) -Édition de code-
Python pour les super débutants Super débutants Python # dictionnaire type 2
Ridge Return (pour les débutants) -Code Edition-
Retour logistique
Retour logistique
Mettons ensemble Python pour les super débutants
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
Python pour les super débutants Super débutants Python # Facile à éliminer
Défiez Kaggle Titanic
Compréhension facile de Python pour les tableaux et (pour les super débutants)
À propos de l'importation de modules externes Python <Pour les super débutants>
Comment convertir le type Python # pour les super débutants de Python: str
Python # Comment vérifier le type et le type pour les super débutants
Paramètres Spacemacs (pour les débutants)
Régression logistique d'apprentissage automatique
Manuel python pour les débutants
Algorithme Dikstra pour les débutants
OpenCV pour les débutants en Python
■ Kaggle Practice pour les débutants - Introduction de Python - par Google Colaboratory
Comment convertir le type Python # pour les super débutants de Python: int, float