Self Organizing Maps

Im folgenden Beispiel setzen wir uns mit Self Organizing Maps (SOM) auseinander.

Self Organinzing Maps sind sehr einfache Künstliche Neuronale Netze. Sie sind in der Lage komplexe, nicht lineare Zusammenhänge, in eine einfache geometrische Beziehungen darzustellen.

Wir werden für unsere Beispiel MiniSom verwenden. Dank dieser Anwednung lassen sich SOM relativ leicht erstellen. Dank gilt an dieser Stelle an Giuseppe Vettigli, da nach meinem Wissen der Entwickler von MiniSom ist. Seine Github Seite ist hier: https://github.com/JustGlowing/minisom

Zu Beginn werden wir die notwendigen Bibliotheken und Daten laden. Wir werden für unser Beispiel den gapminder Datensatz verwenden, den wir etwas anpassen werden. Diese Beispiel wurde in Python programmiert.

#Install gapminder Dataset
pip install gapminder
from gapminder import gapminder
gapminder.head()
export = gapminder.to_excel(r"gapminder.xlsx")

#Install MiniSom
pip install minisom 

Wenn man den oben genannten Code laufen lässt hat man den gapminder Datensatz jetzt zur Verfügung und man hat MiniSom installiert. Darüber hinaus hat man den gapminder Datensatz jetzt auch als Excel Datei vorliegen, was man aber nicht unbedingt braucht – jetzt hat man aber auch Code gelernt, der zeigt wie man etwas nach Excel exportieren kann.

Wir laden jetzt die Bibliotheken. Es handel sich hier um die Bibliotheken das fast immer bei Data Science Anwendungen in Python geladen werden. NumPy für scientific computing. pandas zum arbeiten und manipulieren von Daten und Matplotlib zur Datenvisualisierung.

#Import Libraries
Import Libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

Jetzt werden jetzt die gapminder Daten verändern, um Sie in eine Form zu bringen, die es uns erlaubt eine SOM zu berechnen.

#Wrangle with gapminder 
dataset = gapminder dataset.head() 
dataset = gapminder.groupby("country")["lifeExp","pop","gdpPercap"].mean() dataset.loc[dataset["lifeExp"] < 70, "Nice_Place"] = 0 dataset.loc[dataset["lifeExp"] > 70, "Nice_Place"] = 1     dataset["Nice_Place"] = dataset["Nice_Place"].astype(int) dataset.head(n=20) 
X = dataset.iloc[:,0:3] 
y = dataset.iloc[:,3]

Durch den Code von oben ist folgendes passiert. Wir haben uns den gapminder Datensatz angesehen und folgendes bemerkt:

   country           continent  year  lifeExp   pop      gdpPercap
 0  Afghanistan      Asia       1952   28.801   8425333  779.445314
 1  Afghanistan      Asia       1957   30.332   9240934  820.853030
 2  Afghanistan      Asia       1962   31.997  10267083  853.100710
 3  Afghanistan      Asia       1967   34.020  11537966  836.197138
 4  Afghanistan      Asia       1972   36.088  13079460  739.981106

Es ist die jährliche Veränderung der jeweiligen Länder in den Bereichen lifeExp (Lebenserwartung), pop (Population) und gdpPercap (Pro-Kopf Einkommen) aufgelistet. Für unsere SOM benötigen wir aber Durchschnittswerte pro Land. Wir haben dazu die Länder gruppiert und die Durchschnittswerte der einzelnen variablen berechnen lassen. Als nächste wurde eine weitere Spalte in die Tabelle eingefügt um zu erkennen, welche Länder eine Lebenserwartung von über, bzw. unter 70 Jahren haben. Ich habe diese Spalte als „Nice_Place“ bezeichnet, da die Länder mit einer hohen Lebenserwartung vermutlich eine bessere Lebenssituation für deren Einwohner bieten.

„Nice_Pace“ wurde dann noch von float in integer umgewandelt, was auch notwendig zur Erstellung der SOM ist. Als letztes wurden die Daten noch in X (explanatory variable) und y (response variable) eingeteilt. Diese Einteilung ist bei fast allen K.I. / maschinellen Anwendungen notwendig.

Als nächstes werden die Daten skaliert.

#Feature Scaling gapminder
from sklearn.preprocessing import MinMaxScaler
sc = MinMaxScaler(feature_range = (0,1))
X = sc.fit_transform(X)

Jetzt kann die SOM erstellt bzw. trainiert werden.

#Training the SOM gapminder
from minisom import MiniSom
som = MiniSom(x =14 , y =14 , input_len = 3, sigma = 1.0, 
              learning_rate = 0.5 ) 
som.random_weights_init(X)
som.train_random(data = X , num_iteration = 1000)

Als nächstes folgt der Code zur visuellen Darstellung der Ergebnisse.

#Visualize the Results gapminder
from pylab import bone, pcolor, colorbar, plot, show
bone()
pcolor(som.distance_map().T)
colorbar()
markers = ["o","s"]
colors = ["r","g"]
for i, x in enumerate(X):
    w = som.winner(x)
    plot(w[0] + 0.5,
         w[1] + 0.5,
         markers[y[i]],
         markeredgecolor = colors[y[i]],
         markerfacecolor = "None",
         markersize = 10,
         markeredgewidth = 2)
show()

Man erkennt, dass Länder mit einer Lebenserwartung von über 70 Jahren (grüne Vierecke) alle vom neuronalen netz, nahe beieinander angeordnet wurden. Sie sind also ähnlich. Das Land bei X = 6 und Y = 0 ist übrigens Kuwait. Es ist nahe an den Ländern mit einer hohen Lebenserwartung. Die Erklärung ist folgende: Kuwait hat ein relativ hohes Pro Kopf Einkommen (65332,91) – was sicherlich westlicher Standard ist, allerdings liegt die Lebenserwartung bei 68,9 Jahren. In diesem Land scheint man reich zu sein aber früh zu sterben. Man muss aber bedenken, dass es sich hier um Durchschnittswerte handelt. Man könnte hier z.B. die Hypothese erstellen, dass es sich um ein Land handelt mit einer relativ kleinen Elite von super reichen und vielen armen normal Bürger.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.