[PYTHON] [Apprentissage automatique] Comprenez à partir des mathématiques que la normalisation se traduit par une moyenne de 0 et un écart type de 1.

1. Objet

Si vous voulez essayer l'apprentissage automatique, n'importe qui peut utiliser scicit-learn etc. pour l'implémenter relativement facilement. Cependant, afin d'obtenir des résultats au travail ou d'améliorer votre niveau ** "Je ne connais pas le fond, mais j'ai obtenu ce résultat" ** Vous pouvez voir qu'il est clairement faible.

Cette fois, nous reprendrons la ** «standardisation» ** qui apparaît en prétraitement.

D'après l'explication précédente, "J'ai entendu parler de la normalisation, pourquoi le faites-vous?" Et "Comment l'utilisez-vous avec scikit-learn?", "La normalisation est seulement un processus qui rend la moyenne 0 et l'écart type 1". Cependant, le but est de faire un article qui puisse répondre à la question, "Je veux comprendre quel type de calcul est réellement fait à partir de formules mathématiques."

Tout d'abord, nous donnerons un aperçu de la normalisation au chapitre 2, et au chapitre 3, nous utiliserons en fait scikitlearn pour la normalisation. Enfin, au chapitre 4, je voudrais aborder la formule de normalisation (si la normalisation aboutit réellement à une moyenne de 0 et un écart type de 1).

2. Qu'est-ce que la normalisation?

(1) Qu'est-ce que la normalisation?

En conclusion, c'est ** le processus de traitement de chaque variable pour qu'elle rentre dans la «moyenne 0, écart-type 1» **.

Il est souvent utilisé dans le prétraitement en apprentissage automatique.

En gros, c'est une image qui ** aligne les unités de chaque donnée **. Par exemple, lorsqu'il y a des données sur les ventes et la température, les échelles sont complètement différentes lorsque les ventes sont de 100 millions d'unités et que la température est d'environ 40 (℃) au maximum, alors convertissez ces deux données de sorte qu'elles aient chacune une moyenne de 0 et un écart type de 1. Je vais le faire. (Plus précisément, après normalisation, les ventes sont de 0,4 et la température est de 0,1. * Les valeurs sont appropriées)

(2) Pourquoi normaliser?

Il semble y avoir plusieurs raisons, mais l'une d'entre elles est ** "De nombreux algorithmes d'apprentissage automatique supposent que chaque variable a la même échelle" **.

Par exemple, dans l'exemple des ventes (en supposant 400 millions de yens) et de la température (en supposant 35 ° C) mentionné plus tôt, nous les humains savons à l'avance que chaque donnée est «ventes» et «température», il y en a donc deux. Même si l'échelle de la variable (échelle de l'unité) est différente, vous pouvez la comprendre sans aucune gêne.

Cependant, comme l'ordinateur n'est pas au courant d'une telle chose, elle peut être considérée comme une simple valeur numérique de «400 000 000» et «35» et mal comprise dans l'apprentissage automatique.

Afin d'éliminer ces effets indésirables, nous normaliserons en ajustant à l'avance l'échelle de chaque variable.

(3) Existe-t-il un autre moyen que la normalisation?

En plus de la standardisation, il existe une méthode appelée ** normalisation ** pour correspondre à l'échelle de chaque variable.

Je n'entrerai pas dans les détails cette fois, mais il semble qu'il existe de nombreuses situations où la standardisation est effectuée parce que ** "elle n'est pas facilement affectée par les valeurs aberrantes" et "elle devient une distribution normale lorsqu'elle est normalisée" **.

3. Standardisé avec scicit-learn

Comme exemple concret cette fois, je prendrai les projets kickstarter de kaggle que j'utilise toujours comme exemple. https://www.kaggle.com/kemical/kickstarter-projects

Ce chapitre est long, mais ** la standardisation essentielle n'est que (v) **, c'est donc une bonne idée d'y jeter un coup d'œil en premier.

(I) Importer

#numpy,Importer des pandas
import numpy as np
import pandas as pd

#Importer pour effectuer certains traitements sur les données de date
import datetime

#Importation des données d'entraînement et fractionnement des données de test
from sklearn.model_selection import train_test_split

#Importer pour la normalisation
from sklearn.preprocessing import StandardScaler

#Importer pour la vérification de l'exactitude
from sklearn.model_selection import cross_val_score

#Importer pour la régression logistique
from sklearn.linear_model import SGDClassifier
from sklearn.metrics import log_loss, accuracy_score, confusion_matrix

(Ii) Lecture des données


df = pd.read_csv("ks-projects-201801.csv")

(Iii) Confirmation du nombre de données

De ce qui suit, vous pouvez voir qu'il s'agit de l'ensemble de données de (378661, 15).

df.shape

(Iv) Mise en forme des données

◆ Nombre de jours de recrutement

Je vais omettre les détails, mais puisque l'heure de début du recrutement et l'heure de fin du financement cloud sont dans les données, nous allons convertir cela en "jours de recrutement".

df['deadline'] = pd.to_datetime(df["deadline"])
df["launched"] = pd.to_datetime(df["launched"])
df["days"] = (df["deadline"] - df["launched"]).dt.days

◆ À propos de la variable objectif

Je vais également omettre les détails ici, mais il y a des catégories autres que succès ("réussi") et échec ("échec") pour la variable objective "état", mais cette fois je n'utiliserai les données que pour le succès et l'échec.

df = df[(df["state"] == "successful") | (df["state"] == "failed")]

Remplacez ensuite le succès par 1 et l'échec par 0.

df["state"] = df["state"].replace("failed",0)
df["state"] = df["state"].replace("successful",1)

◆ Supprimer les lignes inutiles

Avant de créer le modèle, supprimez l'identifiant et le nom dont vous pensez ne pas avoir besoin (cela devrait être conservé, mais cette fois, nous le supprimerons), et les variables que vous ne connaissez qu'après le financement du cloud. ..

df = df.drop(["ID","name","deadline","launched","backers","pledged","usd pledged","usd_pledged_real","usd_goal_real"], axis=1)

◆ Traitement des variables de catégorie

Effectuez le traitement des variables catégorielles avec pd.get_dummies.

df = pd.get_dummies(df,drop_first = True)

(V) Normalisation

C'est finalement la standardisation. Avant cela, jetons un coup d'œil rapide aux données actuelles.

キャプチャ1.PNG

Comme mentionné dans l'exemple au début, vous pouvez voir que les échelles unitaires «objectif (montant cible)» et «jours (période de recrutement)» sont assez différentes.

Cette fois, normalisons ces deux variables.

stdsc = StandardScaler()
df["goal"] = stdsc.fit_transform(df[["goal"]].values)
df["days"] = stdsc.fit_transform(df[["days"]].values)

Après cela, affichons à nouveau les données.

キャプチャ2.PNG

Les données d'objectif et de jours ont été standardisées!

(V) Implémentation de la régression logistique

Le processus de standardisation lui-même se termine par (V), mais dans le but d'appréhender la série de flux, Nous construisons même un modèle de régression logistique.

#Divisé en données d'entraînement et données de test
y = df["state"].values
X = df.drop("state", axis=1).values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1234)

#Construction d'un modèle de régression logistique
clf = SGDClassifier(loss = "log", penalty = "none",random_state=1234)
clf.fit(X_train,y_train)

#Vérifier l'exactitude avec les données de test
clf.score(X_test, y_test)

Maintenant, la précision est de 0,665.

4. Comprendre la normalisation à partir des mathématiques

Jusqu'à présent, nous avons utilisé scicit-learn pour la normalisation afin de pouvoir l'implémenter pour le moment.

Dans ce chapitre, nous aimerions comprendre le traitement effectué par la normalisation d'un point de vue mathématique.

(1) Formule de normalisation

Donnons ici un exemple concret. Un exemple de température et de ventes, comme mentionné au début.

Température Ventes (yens)
1 10 400,000,000
2 15 390,000,000
3 30 410,000,000
4 20 405,000,000
5 40 395,000,000

Commençons par la conclusion. La normalisation est calculée par la formule suivante.

z =  \frac{x -u}{σ}

Je ne suis pas sûr. $ x $ est la valeur de chaque variable, $ u $ est la moyenne de chaque variable et $ σ $ est l'écart type de chaque variable.

Pour le dire de manière très approximative, la moyenne est soustraite de chaque valeur et divisée par l'écart type de chaque variable, c'est-à-dire le degré de dispersion, de sorte que l'image est que les données dispersées dans différentes plages sont rassemblées.

・ ・ Je ne comprends pas mieux. Trouvons en fait la valeur numérique.

■ Moyenne $ u $ Puisque $ u $ est une moyenne, la moyenne des cinq données de température est $ (10 + 15 + 30 + 20 + 40) / 5 = 23 $.

De même, si vous calculez les ventes moyennes, $ (400,000,000 + 390,000,000 + 410,000,000 + 405,000,000 + 395,000,000) / 5 = 400,000,000 $ Ce sera.

■ Écart type $ σ $ Je vais omettre le processus de calcul, L'écart type de la température est d'environ 12.

L'écart type des ventes est de 7 905 694.

■ Une fois normalisé ... Les résultats de calcul suivants seront obtenus, et les valeurs de colonne de température normalisées et les valeurs de colonne de ventes normalisées seront utilisées dans l'apprentissage automatique.

Température Ventes (yens) 標準化したTempérature Ventes standardisées
1 10 400,000,000 (10-23)/12 (400,000,000-400,000,000)/7905694
2 15 390,000,000 (15-23)/12 (390,000,000-400,000,000)/7905694
3 30 410,000,000 (30-23)/12 (410,000,000-400,000,000)/7905694
4 20 405,000,000 (20-23)/12 (405,000,000-400,000,000)/7905694
5 40 395,000,000 (40-23)/12 (395,000,000-400,000,000)/7905694

(2) Pourquoi la moyenne est-elle de 0 et l'écart type de 1?

La formule de standardisation est décrite comme $ z = \ frac {x -u} {σ} $, mais prouvons que la moyenne est 0 et l'écart type est 1 lorsque ce calcul est effectué.

Ici, nous allons considérer la formule $ y = ax + b $.


Moyenne et écart-type non normalisés de la formule d'origine

Tout d'abord, trouvons simplement la moyenne et l'écart type de pré-standardisation. Comme vous pouvez le voir, ni la moyenne ni l'écart type ne sont de 0 ou 1. ■ Moyenne Comme indiqué ci-dessous, la moyenne de ** $ y $ peut être exprimée en $ aµ + b $ **. キャプチャ3.PNG

■ Écart type Nous recherchons d'abord la variance et le résultat est ** $ a ^ 2σ ^ 2 $. (L'écart type est $ aσ $) ** キャプチャ4.PNG


Moyenne et écart type des équations standardisées

Ensuite, trouvons la moyenne et l'écart type après normalisation. Le concept de transformation de formule est fondamentalement le même que celui de transformation de formule avant normalisation.

Si vous transformez la formule comme indiqué ci-dessous, vous pouvez voir que la moyenne est de 0 et l'écart type est de 1 après normalisation!

■ Moyenne キャプチャ5.PNG

■ Écart type Comme précédemment, nous recherchons d'abord la dispersion. Puisque la variance est 1, l'écart type est également 1. キャプチャ6.PNG

Avec ce qui précède, il peut être prouvé à partir de la formule que la moyenne de chaque variable après normalisation est de 0 et l'écart-type est de 1.

5. Conclusion

Comment était-ce? Ma pensée est: "Je ne peux pas interpréter même si on me montre un code très compliqué depuis le début, donc je ne me soucie pas de la précision une fois, alors essayez d'abord d'implémenter une série de flux de base avec scicit-learn, etc." Je pense que c'est très important.

Cependant, une fois que je m'y suis habitué, je pense qu'il est très important de comprendre à partir d'un fond mathématique comment ils fonctionnent dans les coulisses.

Je pense que de nombreux contenus sont difficiles à comprendre, mais j'espère que cela aidera à approfondir ma compréhension.

Recommended Posts

[Apprentissage automatique] Comprenez à partir des mathématiques que la normalisation se traduit par une moyenne de 0 et un écart type de 1.
Code simple qui donne un score de 0,81339 dans Kaggle's Titanic: Machine Learning from Disaster
Un exemple de mécanisme qui renvoie une prédiction par HTTP à partir du résultat de l'apprentissage automatique
Notez que je comprends l'algorithme du classificateur Naive Bayes. Et je l'ai écrit en Python.
Touchons une partie de l'apprentissage automatique avec Python
Calcul de l'écart type et du coefficient de corrélation en Python
[Apprentissage automatique] Comprendre la SVM à la fois à partir de scikit-learn et des mathématiques
Installation de TensorFlow, une bibliothèque d'apprentissage automatique de Google
Introduction à l'apprentissage automatique à partir de Simple Perceptron
MALSS (introduction), un outil qui prend en charge l'apprentissage automatique en Python
[Apprentissage automatique] Comprendre les arbres de décision de scikit-learn et des mathématiques
Trouvez l'écart moyen / standard des valeurs de luminosité dans l'image
[Apprentissage automatique] Comprendre la régression logistique à partir de scikit-learn et des mathématiques
Python démarré: échangez le tableau de valeurs obtenu dans le résultat SQL vers le type de liste et utilisez-le dans IN d'une autre requête
J'ai créé un robot Line qui devine le sexe et l'âge d'une personne à partir de l'image
J'ai essayé de comprendre l'apprentissage supervisé de l'apprentissage automatique d'une manière facile à comprendre, même pour les ingénieurs serveurs 1
J'ai essayé de comprendre l'apprentissage supervisé de l'apprentissage automatique d'une manière facile à comprendre, même pour les ingénieurs serveurs 2
Créer une instance d'une classe prédéfinie à partir d'une chaîne en Python
[Apprentissage automatique] Comprendre la régression linéaire simple à partir de scikit-learn et des mathématiques
[Apprentissage automatique] Comprenez à partir des mathématiques pourquoi le coefficient de corrélation varie de -1 à 1.
[Apprentissage automatique] Comprendre la régression multiple linéaire à partir de scikit-learn et des mathématiques
Une histoire d'essayer de LT pour effectuer le codage en direct du traitement du langage naturel et de l'analyse des dépendances en un instant à partir d'un endroit vide
Importance de l'apprentissage automatique et de l'apprentissage par mini-lots
[Apprentissage automatique] Comprendre la décorrélation des mathématiques
Devenez bientôt un ingénieur IA! Apprenez complètement Python / AI / Machine learning / Deep learning / Analyse statistique en quelques jours!
Classification et régression dans l'apprentissage automatique
J'ai écrit un livre qui vous permet d'apprendre les implémentations et les algorithmes d'apprentissage automatique de manière équilibrée.
Python: prétraitement en machine learning: gestion des données manquantes / aberrantes / déséquilibrées
Un mémorandum de commandes de filtrage que vous pourriez oublier en un instant
[Python] Enregistrement des résultats d'apprentissage (modèles) dans l'apprentissage automatique
Version gratuite de DataRobot! ?? Introduction à «PyCaret», une bibliothèque qui automatise l'apprentissage automatique
Liste des principales distributions de probabilité utilisées en apprentissage automatique et statistiques et code en python
Mise en place d'un modèle de prédiction des taux de change (taux dollar-yen) par machine learning
Un mémorandum de méthode souvent utilisé dans l'apprentissage automatique utilisant scikit-learn (pour les débutants)
Un mémo pour générer des variables dynamiques de classe à partir de données de dictionnaire (dict) qui n'ont que des données de type standard en Python3