[PYTHON] Apprentissage automatique / prétraitement des données

1.Tout d'abord

Je résumerai le prétraitement souvent utilisé en machine learning sous forme de mémorandum au format jupyter_notebook. L'ensemble de données utilise le [prêt_home] de kaggle (https://www.kaggle.com/sazid28/home-loan).

2. Modifier les paramètres d'affichage

L'affichage à l'écran de jupyter notebbok est étrangement étroit, et si vous affichez beaucoup de colonnes et de lignes, le milieu sera omis. Par conséquent, il est pratique de modifier d'abord les paramètres d'affichage si nécessaire.

#Extension de la largeur d'affichage de l'écran
from IPython.core.display import display, HTML
display(HTML("<style>.container { width:100% !important; }</style>"))

#Modifier le nombre maximal de colonnes et de lignes affichées
import pandas as pd
pd.options.display.max_columns = 50  #Paramètre d'affichage maximal de la colonne(Par défaut 20)
pd.options.display.max_rows = 100  #Paramètre d'affichage de ligne maximum(Par défaut 60)

3. Lire les données d'entraînement

Cette fois, les données d'entraînement et les données de test sont lues et traitées séparément. Tout d'abord, lisez les données d'entraînement.

train = pd.read_csv('./train.csv')
train.head()

スクリーンショット 2019-12-18 11.01.48.png Ensuite, séparez la quantité de caractéristiques et la cible.

#Divisé en fonctionnalités et cibles
X_train = train.iloc[ : , :-1]  #Toutes les lignes, colonnes sauf la dernière colonne
y_train = train.iloc[ : , -1]  #Toutes les lignes, dernière colonne
X_train = X_train.drop('Loan_ID', axis=1)  # Loan_Supprimer la colonne ID
y_train = y_train.map( {'Y':1, 'N':0} )  #Y 1,Remplacez N par 0
X_train.head()

スクリーンショット 2019-12-14 12.55.56.png Afin de vérifier facilement la quantité de caractéristiques à chaque fois, définissez le contrôle de fonction (df).

#Vérification des fonctionnalités
def check(df):
    col_list = df.columns.values  #Obtenir le nom de la colonne
    row = []    
    for col in col_list:
        tmp = ( col,  #Nom de colonne
                df[col].dtypes,  #Type de données
                df[col].isnull().sum(),  #Nombre de nuls
                df[col].count(),  #Le nombre de données(Exclure les valeurs manquantes)
                df[col].nunique(),  #Nombre de valeurs uniques(Exclure les valeurs manquantes) 
                df[col].unique() )  #Valeur unique
        row.append(tmp)  #Enregistrer le tmp sur la ligne de manière séquentielle
    df = pd.DataFrame(row)  #Convertir la ligne en format de trame de données
    df.columns = ['feature', 'dtypes', 'nan',  'count', 'num_unique', 'unique']  #Spécifiez le nom de la colonne du bloc de données
    return df

check(X_train)

スクリーンショット 2019-12-17 19.20.24.png feature est le nom de la quantité de caractéristiques, dtypes est le type de données, nan est le nombre de valeurs manquantes, count est le nombre de données (à l'exclusion des valeurs manquantes), num_unique est le nombre de valeurs uniques (à l'exclusion des valeurs manquantes) et unique est la valeur unique.

4. Traitement des variables de catégorie

Fondamentalement, l'objet est une variable catégorielle, mais il existe un moyen d'en faire une variable catégorielle même s'il s'agit d'une valeur numérique. Credit_History est un nombre (float64), mais comme le nombre de valeurs uniques est de 2, faisons-en une variable catégorielle cette fois.

Modifiez le type de données de Credit_History en object.

# Credit_Convertir l'historique en objet
X_train['Credit_History'] = X_train['Credit_History'].astype(object)

Voyons la relation entre la quantité de fonctionnalités du type d'objet et la cible. Tout d'abord, remplacez la valeur manquante de object par "nan".

#Valeur manquante de l'objet'nan'Remplacer par
c_list = X_train.dtypes[X_train.dtypes=='object'].index.tolist()  #Obtenir la liste des noms de colonne de l'objet
X_train[c_list] = X_train[c_list].fillna('nan')

Utilisez sns.barplot pour représenter graphiquement la relation entre chaque caractéristique du type d'objet et Loan_Status. Le graphique montre la valeur moyenne sous forme de hauteur et l'intervalle de confiance sous forme de barre d'erreur.

#Relation entre la quantité de caractéristiques de type d'objet et la cible
import matplotlib.pyplot as plt
import seaborn as sns

fig = plt.figure(figsize=(14,6))
for j , i in enumerate([0, 1, 2, 3, 4, 9, 10]):
    ax = fig.add_subplot(2, 4 , j+1)
    sns.barplot(x=X_train.iloc[:,i], y=y_train, data=X_train, palette='Set3' )

plt.tight_layout()
plt.show()

スクリーンショット 2019-12-17 20.05.30.png Credit_History semble avoir le plus d'influence sur Loan_Status.   Pour les variables catégorielles, il est souvent encodé à chaud. En effet, en décomposant les éléments de quantité d'entités, seuls les éléments de quantité d'entités qui sont efficaces pour la prédiction peuvent être sélectionnés. Encore une fois, on encode l'objet à chaud.

#Un encodage à chaud des variables catégorielles
X_train1 = pd.get_dummies(X_train) 
check(X_train1)

スクリーンショット 2019-12-17 20.01.12.png Le nombre total de fonctionnalités est de 26.

5. Traitement des variables numériques

Pour les variables numériques, les complétions de valeurs manquantes incluent la moyenne, la médiane, la plus fréquente et la constante, mais ici nous utilisons la moyenne.

#Saisie des valeurs manquantes numériques
X_train2 = X_train1.fillna(X_train1.mean())
check(X_train2)

スクリーンショット 2019-12-18 09.44.37.png Maintenant, utilisons sns.FacetGrid pour dessiner un histogramme pour chaque variable numérique lorsque Loan_Status vaut 0 et 1.

X_tmp = X_train2.join(y_train)
for i in [0, 1, 2, 3]:
    facet = sns.FacetGrid(X_tmp, hue='Loan_Status', aspect=2)
    facet.map(sns.kdeplot, X_tmp.columns.values[i], shade= True)
    facet.set(xlim=(0, X_tmp.iloc[:, i].max()))
    facet.add_legend()
    plt.show()

スクリーンショット 2019-12-18 09.48.36.png スクリーンショット 2019-12-18 09.49.25.png Les quatre caractéristiques ont des zones où Loan_Status1 est clairement dominant.

8. Importance des fonctionnalités

Donnons la priorité à 26 fonctionnalités en utilisant le coefficient Random Forest Gini.

import numpy as np
from sklearn.ensemble import RandomForestClassifier

#Monter dans une forêt aléatoire
clf = RandomForestClassifier(n_estimators=100, random_state=0)
clf.fit(X_train2, y_train)

#Affichage de l'importance de la quantité de caractéristiques
labels = X_train2.columns.values  #Acquisition d'étiquettes de fonctionnalités
importances = clf.feature_importances_  #Acquisition numérique de la quantité de caractéristiques
index = np.argsort(importances)  #Obtenir un index croissant

plt.figure(figsize=(8, 5))
plt.barh(range(X_train2.shape[1]), importances[index])
plt.yticks(range(X_train2.shape[1]), labels[index])
plt.title('feature importances')
plt.show()

スクリーンショット 2019-12-18 09.53.31.png Les trois meilleurs sont Credit_History_0.0, ApplicantIncome et LoanAmount.

9. Réduisez le nombre de fonctionnalités

RFE (Recursive Feature Elimination) réduit le nombre de fonctionnalités. L'algorithme crée un modèle en commençant par toutes les fonctionnalités et supprime les fonctionnalités les moins importantes du modèle. Ensuite, le processus de création d'un modèle et de suppression des caractéristiques les moins importantes est répété jusqu'à ce qu'un nombre prédéterminé de caractéristiques soit atteint.

from sklearn.feature_selection import RFE

clf = RandomForestClassifier(n_estimators=100, random_state=0)
selector = RFE(estimator=clf,
                        n_features_to_select=10,  #Nombre de fonctionnalités réduit
                        step=.05)  #Pourcentage d'entités à tronquer à chaque étape

selector.fit(X_train2, y_train)

#Compressez 26 dimensions en 10 dimensions
select = selector.transform(X_train2)
X_train3 = pd.DataFrame(select,
                            columns=X_train2.columns[selector.support_])

check(X_train3)

スクリーンショット 2019-12-18 11.23.22.png Ce sont les données d'entraînement finalement obtenues.

10. Lecture et traitement des données d'essai

Ensuite, chargez les données de test.

#Lire les données de test
test = pd.read_csv('./test.csv')
X_test = test.drop('Loan_ID', axis=1)  # Loan_Supprimer la colonne ID
check(X_test)

スクリーンショット 2019-12-18 10.00.10.png Comme précédemment, convertissez Credit_History en objet, puis effectuez un encodage à chaud avec les valeurs manquantes.

Ici, en ajoutant l'option dummy_na = True à la méthode pd.get_dummies (), l'encodage one-hot incluant les valeurs manquantes est effectué en un seul coup.

# Credit_Convertir l'historique en objet
X_test['Credit_History'] = X_test['Credit_History'].astype(object)

#Saisie des valeurs manquantes et encodage à chaud des variables catégorielles
X_test1 = pd.get_dummies(X_test, 
                         dummy_na = True)  #Inclure les valeurs manquantes
check(X_test1)

スクリーンショット 2019-12-18 10.32.16.png Ah, le nombre de fonctionnalités a augmenté de deux par rapport aux données d'entraînement.

En effet, l'utilisation de l'option dummy_na = True crée XX_nan avec toutes les données 0, même s'il n'y a aucune valeur manquante.

Ici, 9.Married_nan, 17.Education_nan, 27.Property_Area_nan lui correspondent.

Voyons la différence entre les fonctionnalités des données d'entraînement et les données de test.

#Lire les noms des quantités d'entités comme un ensemble
cols_train = set(X_train1.columns.values)
cols_test = set(X_test1.columns.values)

#Fonctionnalités en train mais pas en test
diff1 = cols_train - cols_test
print('train seulement', diff1)

#Fonctionnalités en test mais pas en train
diff2 = cols_test - cols_train
print('test uniquement', diff2)

スクリーンショット 2019-12-18 10.37.08.png Seul le test a beaucoup de Education_nan et Property_Area_nan. Ce qui est arrivé à Married_nan, c'est que Married_nan existe correctement dans les données d'entraînement avec une valeur unique [0,1].

Fondamentalement, les entités qui ne sont pas dans le test mais dans le train sont restaurées et les entités qui sont dans le test et non dans le train sont supprimées. Ici, seules les fonctionnalités qui sont en test mais pas en train sont supprimées.

X_test1 = X_test1.drop(['Education_nan', 'Property_Area_nan'], axis=1)
check(X_test1)

スクリーンショット 2019-12-18 13.16.35.png

Maintenant, utilisons la valeur moyenne des données d'entraînement pour compléter la valeur manquante de la variable numérique.

#Saisie des valeurs manquantes numériques
X_test2 = X_test1.fillna(X_train1.mean())

Ensuite, comme pour les données d'entraînement, la quantité de fonctionnalités est finalement réduite à 10. Avant cela, sécurisez l'ordre des quantités de caractéristiques des données d'entraînement et des données de test.

# X_X les fonctionnalités de test2_Faites la même commande que train2
X_test1 = X_test1.reindex(X_train1.columns.values,axis=1)

Enfin, les données de test sont également réduites à l'aide du sélecteur de résultat de filtrage RFE.support_ effectué sur les données d'apprentissage.

X_test3 = X_test2.loc[ : , X_test2.columns[selector.support_]]
check(X_test3)

スクリーンショット 2019-12-18 10.57.54.png Ce sont les données de test finales. Ceci termine le prétraitement des données.

Recommended Posts

Apprentissage automatique / prétraitement des données
Prétraitement dans l'apprentissage automatique 4 Conversion de données
Python: prétraitement en machine learning: acquisition de données
Python: prétraitement dans l'apprentissage automatique: conversion de données
Prétraitement dans l'apprentissage automatique 1 Processus d'analyse des données
Ensemble de données pour l'apprentissage automatique
Prétraitement japonais pour l'apprentissage automatique
[Python] Analyse de données, pratique du machine learning (Kaggle) -Prétraitement des données-
J'ai commencé l'apprentissage automatique avec le prétraitement des données Python
À propos du prétraitement des données des systèmes utilisant l'apprentissage automatique
Apprentissage automatique à l'aide de données d'expression génique
Apprentissage automatique dans Delemas (acquisition de données)
Python: prétraitement dans l'apprentissage automatique: présentation
Procédure d'apprentissage automatique de base: ② Préparer les données
Comment collecter des données d'apprentissage automatique
Vérification des performances du prétraitement des données pour l'apprentissage automatique (données numériques) (partie 2)
Prétraitement dans l'apprentissage automatique 3 Données de valeur manquante / aberrante / de déséquilibre
Vérification des performances du prétraitement des données pour l'apprentissage automatique (données numériques) (partie 1)
Exemple d'apprentissage automatique
Sklearn de données déséquilibrées avec apprentissage automatique k-NN
[Python] Première analyse de données / apprentissage automatique (Kaggle)
Modèle d'apprentissage automatique pour les données numériques manuscrites
Résumé du didacticiel d'apprentissage automatique
Astuces de fourniture de données utilisant deque dans l'apprentissage automatique
Apprentissage automatique sur le surapprentissage
Apprentissage automatique ⑤ Résumé AdaBoost
[Mise à jour Ver1.3.1] J'ai créé une bibliothèque de prétraitement de données DataLiner pour l'apprentissage automatique
Apprentissage automatique: supervisé - AdaBoost
Régression logistique d'apprentissage automatique
Machine de vecteur de support d'apprentissage automatique
Étudier l'apprentissage automatique ~ matplotlib ~
Régression linéaire d'apprentissage automatique
Mémo du cours d'apprentissage automatique
Division des données de formation en apprentissage automatique et apprentissage / prédiction / vérification
Bibliothèque d'apprentissage automatique dlib
Corrélation par prétraitement des données
Apprentissage automatique (TensorFlow) + Lotto 6
Apprenez en quelque sorte le machine learning
Pré-traitement des données préfectorales
Python: prétraitement en machine learning: gestion des données manquantes / aberrantes / déséquilibrées
Histoire de l'analyse de données par apprentissage automatique
Bibliothèque d'apprentissage automatique Shogun
Défi de lapin d'apprentissage automatique
Introduction à l'apprentissage automatique
Apprentissage automatique: k-voisins les plus proches
Qu'est-ce que l'apprentissage automatique?
Prédiction de données chronologiques par AutoML (apprentissage automatique automatique)
xgboost: modèle d'apprentissage automatique efficace pour les données de table
Modèle d'apprentissage automatique prenant en compte la maintenabilité
L'apprentissage automatique appris avec Pokemon
Apprentissage amélioré 7 Sortie du journal des données d'apprentissage
Apprentissage automatique dans Delemas (s'entraîner)
Une introduction à l'apprentissage automatique
Techniques liées à l'apprentissage automatique / à la classification
Machine Learning: Supervision - Régression linéaire
Bases de l'apprentissage automatique (mémoire)
Un débutant en apprentissage automatique a essayé la RBM
[Apprentissage automatique] Comprendre la forêt aléatoire
Apprentissage automatique avec Python! Préparation
Bloc-notes de ressources d'étude d'apprentissage automatique
Apprentissage automatique ② Résumé Naive Bayes