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.
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
train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')
print(train.shape)
print(test.shape)
# (891, 12)
# (418, 11)
train.head()
【é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()
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)
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()
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()
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)
Vérifiez le contenu des données.
X_num.head()
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
'''
Vérifiez le contenu des données.
X_cat.head()
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)
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)
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,)
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]
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
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
'''
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()
Puis convertissez-le en données CSV.
df_submit.to_csv('titanic_submit.csv')
C'est la fin de la soumission.
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