TODO für Tag 3
- Die Struktur des Datensatzes genauer kennenlernen
- Unterschied zwischen Features und Zielvariablen verstehen
- Feature Scaling
- Kategorische Daten in numerische umwandeln (One-Hot-Encoding)
Iris-Datensatz genauer anschauen
Der Iris-Datensatz ist ein klassischer, multivariater Datensatz in der Statistik und im maschinellen Lernen. Er wurde 1936 vom britischen Statistiker Ronald A. Fisher veröffentlicht, basierend auf Messungen des amerikanischen Botanikers Edgar Anderson. Der Datensatz dient als Beispiel für die lineare Diskriminanzanalyse und wird häufig zum Testen und Vergleichen von Klassifikationsalgorithmen verwendet. Der Datensatz enthält 150 Einträge und dabei jeweils 50 Datensätze je Art (Iris setosa, Iris versicolor, Iris virginica). Jeder Datensatz hat die folgenden 4 Features mit Angabe in Zentimetern:
- Kelchblattlänge (sepal length)
- Kelchblattbreite (sepal width)
- Kronblattlänge (petal length)
- Kronblattbreite (petal width)
Der Iris Datensatz ist in scikit-learn enthalten und kann mit mit dem Aufruf von „iris = datasets.load_iris()“ geladen werden – wie auch schon gestern und vorgestern gesehen. Das Folgende Python Skript lädt die Daten und gibt die Informationen über diesen Datensatz aus.
from sklearn import datasets
iris = datasets.load_iris()
print(iris.DESCR) # Beschreibung des Datensatzes
print("Feature-Namen:", iris.feature_names)
print("Zielnamen:", iris.target_names)
print("Feature-Daten:\n", iris.data[:5]) # die ersten 5 Zeilen der Features
print("Zielwerte:\n", iris.target[:5]) # die zugehörigen Labels
Die Ausgabe sieht dann wie folgt aus:
.. _iris_dataset:
Iris plants dataset
--------------------
**Data Set Characteristics:**
:Number of Instances: 150 (50 in each of three classes)
:Number of Attributes: 4 numeric, predictive attributes and the class
:Attribute Information:
- sepal length in cm
- sepal width in cm
- petal length in cm
- petal width in cm
- class:
- Iris-Setosa
- Iris-Versicolour
- Iris-Virginica
:Summary Statistics:
============== ==== ==== ======= ===== ====================
Min Max Mean SD Class Correlation
============== ==== ==== ======= ===== ====================
sepal length: 4.3 7.9 5.84 0.83 0.7826
sepal width: 2.0 4.4 3.05 0.43 -0.4194
petal length: 1.0 6.9 3.76 1.76 0.9490 (high!)
petal width: 0.1 2.5 1.20 0.76 0.9565 (high!)
============== ==== ==== ======= ===== ====================
:Missing Attribute Values: None
:Class Distribution: 33.3% for each of 3 classes.
:Creator: R.A. Fisher
:Donor: Michael Marshall (MARSHALL%PLU@io.arc.nasa.gov)
:Date: July, 1988
The famous Iris database, first used by Sir R.A. Fisher. The dataset is taken
from Fisher's paper. Note that it's the same as in R, but not as in the UCI
Machine Learning Repository, which has two wrong data points.
This is perhaps the best known database to be found in the
pattern recognition literature. Fisher's paper is a classic in the field and
is referenced frequently to this day. (See Duda & Hart, for example.) The
data set contains 3 classes of 50 instances each, where each class refers to a
type of iris plant. One class is linearly separable from the other 2; the
latter are NOT linearly separable from each other.
.. dropdown:: References
- Fisher, R.A. "The use of multiple measurements in taxonomic problems"
Annual Eugenics, 7, Part II, 179-188 (1936); also in "Contributions to
Mathematical Statistics" (John Wiley, NY, 1950).
- Duda, R.O., & Hart, P.E. (1973) Pattern Classification and Scene Analysis.
(Q327.D83) John Wiley & Sons. ISBN 0-471-22361-1. See page 218.
- Dasarathy, B.V. (1980) "Nosing Around the Neighborhood: A New System
Structure and Classification Rule for Recognition in Partially Exposed
Environments". IEEE Transactions on Pattern Analysis and Machine
Intelligence, Vol. PAMI-2, No. 1, 67-71.
- Gates, G.W. (1972) "The Reduced Nearest Neighbor Rule". IEEE Transactions
on Information Theory, May 1972, 431-433.
- See also: 1988 MLC Proceedings, 54-64. Cheeseman et al"s AUTOCLASS II
conceptual clustering system finds 3 classes in the data.
- Many, many more ...
Feature-Namen: ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
Zielnamen: ['setosa' 'versicolor' 'virginica']
Feature-Daten:
[[5.1 3.5 1.4 0.2]
[4.9 3. 1.4 0.2]
[4.7 3.2 1.3 0.2]
[4.6 3.1 1.5 0.2]
[5. 3.6 1.4 0.2]]
Zielwerte:
[0 0 0 0 0]
Neben dem Iris Datensatz gibt es in scikit-learn noch eine Reihe anderer Datensätze und Funktionen mit denen selber Datensätze generieren und laden kann. Eine Liste aller verfügbaren Datensätze kann man unter https://scikit-learn.org/stable/datasets.html finden.
Unterschied zwischen Features und Zielvariablen versetehen
Wie man an dem Iris Datensatz sieht, gibt es die Features
- sepal length in cm
- sepal width in cm
- petal length in cm
- petal width in cm
und die Zielwerte oder Klassen:
- Iris-Setosa
- Iris-Versicolour
- Iris-Virginica
Beide Teile des des Datensatzes nehmen unterschiedliche Rollen einnehmen. Die Features sind die Eingabevariablen, die einem Modell zur Verfügung stehen, um Vorhersagen zu treffen. Sie repräsentieren messbare Eigenschaften oder Charakteristika der Daten. Die Zielvariable ist die Ausgabe, die das Modell vorhersagen soll. Sie ist das, was man anhand der Features prognostizieren möchte.
Beim Supervised Learning wird ein Modell trainiert, um die Beziehung zwischen den Features und der Zielvariable zu lernen. Ziel ist es, ein Modell zu entwickeln, das auf Basis neuer Eingabedaten (Features) die entsprechende Ausgabe (Zielvariable) korrekt vorhersagen kann.
Neben dem Supervised Learning gibt es im maschinellen Lernen noch die beiden anderen Konzepte des Unsupervised Learning und des Reinforcement Learning.
- Reinforcement Learning (Verstärkendes Lernen)
Hier lernt ein Agent durch Interaktion mit einer Umgebung, wobei er Belohnungen oder Strafen für seine Aktionen erhält. Ziel ist es, eine Strategie zu entwickeln, die den kumulierten Belohnungswert maximiert.
Bei dem Reinforcement Learning gibt es weder Features noch Zielvariablen. Stattdessen gibt es eine Umgebung und die Belohnungen. - Unsupervised Learning
Hier arbeitet das Modell nur mit Features. Mit Hilfe der Features wird versucht, Muster oder Strukturen eigenständig zu erkennen. Typische Anwendungen sind Clustering und Dimensionsreduktion.
Beim Unsupervised Learning gibt es Features, aber keine Zielvariablen.
Feature Scaling
Einige KI-Algorithmen, wie z. B. k-Nearest Neighbors (k-NN), Support Vector Machines (SVM) oder Principal Component Analysis (PCA), basieren auf Abstandsberechnungen oder ähnlichen Optimierungsverfahren. Wenn die Features in einem Datensatz unterschiedliche Skalen haben, können Features mit größeren Skalen die Modellierung dominieren, was zu verzerrten Ergebnissen führt. Feature Scaling stellt sicher, dass jedes Merkmal gleich gewichtet wird und trägt zur Stabilität und Effizienz des Lernprozesses bei.
In scikit-learn gibt es eine Reihe unterschiedliche Feature-Scaling Funktionen wie z.B. MaxAbsScaler, MinMaxScaler, Normalizer, RobustScaler, StandardScaler, etc. die alle in sklearn.preprocessing enthalten sind.
Folgendes kleine Beispiel verdeutlicht die Funktion des StandardScalers:
from sklearn.preprocessing import StandardScaler
data = [[0, -10],
[0, -10],
[1, 10],
[1, 10]]
scaler = StandardScaler()
scaler.fit(data)
print(scaler.transform(data))
In dem 2D Array „data“ sind 4 Datensätze mit je 2 Features. Das erste Feature kennt die Werte 0 und 1. Das zweite Feature die Werte -10 und 10. Damit ist das Feature 2 deutlich stärker ausgeprägt als das erste Feature, was zu einer Verzerrung führen kann.
Mit den Daten wird dann eine StandardScaler trainiert (fit(…) ) der nun anhand der vorliegenden Daten „gelernt“ hat, die Features so zu manipulieren, dass beide Features ausgeglichen sind. Mit „scaler.transform“ wird dann aus dem unausgeglichenen Array „data“ ein ausgeglichener Datensatz erzeugt.
Die Ausgabe des Skripts sieht dann wie folgt aus:
[[-1. -1.]
[-1. -1.]
[ 1. 1.]
[ 1. 1.]]
Wie man sieht sind es immer noch 4 Einträge mit je 2 Features. Allerdings sind die Werte nun bei beiden Features zwischen -1 und 1, so dass beide Features gleich stark ausgeprägt sind.
Weiter Details zum Feature Scaling in scikit-learn kann man unter https://scikit-learn.org/stable/auto_examples/preprocessing/plot_all_scaling.html#sphx-glr-auto-examples-preprocessing-plot-all-scaling-py nachlesen.
Kategorische Daten in numerische umwandeln
Die meisten Algorithmen sind darauf ausgelegt, mit numerischen Daten zu arbeiten. Daher ist es unerlässlich, kategorische Daten – wie z. B. Farben, Länder oder Produktkategorien in eine numerische Form zu transformieren, bevor sie in ein Modell eingespeist werden. Genau zu diesem Zweck gibt es das One-Hot-Encoding. Mit dem One-Hot-Encoding kann man Strings oder Objekte, die keine numerische Bedeutung haben so umwandeln, dass Maschinelle Lernmodelle mit solchen Daten arbeiten können und es möglich wird, in den Daten Muster und Beziehungen zu erkennen.
Das One-Hot Encoding erstellt für jede Kategorie eine neue Spalte. Dies ist ideal für nominale Daten, da es keine implizite Ordnung zwischen den Kategorien annimmt.
Beispiel:
from sklearn.preprocessing import OneHotEncoder
import numpy as np
import pandas as pd
df = pd.DataFrame({
'Farbe': ['rot', 'grün', 'blau', 'grün', 'rot'],
})
# One-Hot Encoding für 'Farbe'
ohe = OneHotEncoder(sparse_output=False)
farbe_encoded = ohe.fit_transform(df[['Farbe']])
print (farbe_encoded)
Als Feature wird in dem Beispiel die Farbe angenommen. Gültige Werte für das Feature sind rot, grün und blau. In dem Dataframe gibt es 5 Einträge mit den Werten ‚rot‘, ‚grün‘, ‚blau‘, ‚grün‘, ‚rot‘. Man könnte nun das Feature in eine Zahl umwandeln. Z.B. wie folgt.
- Rot = 1
- Grün = 2
- Blau = 3
Wenn man jeder Farbe einfach eine Zahl gibt – zum Beispiel Rot = 1, Grün = 2, Blau = 3 – könnte das Modell annehmen, dass Blau besser oder größer ist als Rot, nur weil die Zahl größer ist. Aber das stimmt nicht, da jede Farbe ist einfach anders, nicht besser oder schlechter. Deshalb wird beim One-Hot-Encoding für jede Farbe ein eigenes Feature erstellt, dass dann entweder 1 oder 0 ist. Dadurch wird die Anzahl der Dimensionen im Input-Vektor des Modells zwar erheblich vergrößert, aber es gibt keine ungewollten Seiteneffekte durch die Nähe oder die Distanz der zugeordneten Werte zueinander.
Die Ausgabe des oben gezeigten Python Skriptes sieht dann wie folgt aus:
[[0. 0. 1.]
[0. 1. 0.]
[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
Es sind weiterhin 5 Einträge die nun nicht jeweils eine Farbe enthalten sondern 3 Features, die jetzt abhängig von der Farbe 1 oder 0 sind.
Die Umwandlung von nicht numerischen Daten in numerische Werte ist ein weiterer kleine Baustein in der Datenvorverarbeitung für maschinelles Lernen. Mit scikit-learn steht ein passendes Werkzeuge zur Verfügung, um diese Aufgabe zu bewältigen.
OK, so weit so gut. Morgen dann also weiter zu k-Nearest Neighbors 🙂