Kurzüberblick über Scikit-learn¶
Dieses Notebook steht auch auf underem Github repository um Download bereit!
Scikit-learn ist eine Python-Softwarebiliothek, die eine Vielzahl an klassischen Machine Learning-Algorithmen (kein Deep Learning) über eine einheitliche und simple API bereitstellt. Scikit-learn ist eine quelloffene Bibliothek, die unter der BSD-Lizenz (kommerziell nutzbar) lizensiert ist. Scikit-learn macht Gebrauch von NumPy, SciPy und optional Matplotlib. Scikit-learn selbst umfasst Algorithmen zur Klassifikation, Regression und Clustering. Außerdem gibt es eine Vielzahl an API-konformen Bibliotheken, die Scikit-learn z.B. um Deep Learning-Algorithmen erweitern.
Die Module¶
In diesem Abschnitt sind einige wichtige Module aufgelistet.
Vorverarbeitung und Normalisierung
sklearn.preprocessing
:preprocessing.StandardScaler
: Merkmalsstandardisierung auf einen Mittelwert von 0 und eine Varianz von 1.- ...
Merkmalsauswahl
sklearn.feature_selection
:feature_selection.SelectKBest
: K Merkmale mit dem höchsten Score auswählen.- ...
Clustering
sklearn.cluster
:cluster.KMeans
: K-Means clustering.- ...
Nächste Nachbarn
sklearn.neighbors
:neighbors.KNeighborsRegressor
: KNN Regressor.neighbors.KNeighborsClassifier
: KNN Klassifikator.- ...
Multi-layer Perceptron
sklearn.neural_network
:neural_network.MLPRegressor
: MLP Regressor.neural_network.MLPClassifier
: MLP Klassifikator.- ...
Support Vector Machine
sklearn.svm
:svm.LinearSVC
: Lineare Support Vector Regression.svm.LinearSVC
: Lineare Support Vector Klassifikation.- ...
Entscheidungsbäume
sklearn.tree
:tree.DecisionTreeRegressor
: Entscheidungsbaum-Regressor.tree.DecisionTreeClassifier
: Entscheidungsbaum-Klassifikator.- ...
Das Datenformat¶
Die meisten Algorithmen von Scikit-learn erwarten die Daten in folgendem Format:
Bildquelle (modifiziert): Python Data Science Handbook von Jake VanderPlas
Jede Zeile bildet eine Instanz ab und jede Spalte ein Merkmal.
Dabei können die Matrix und der Vektor ein array-ähnliches Objekt sein. Dies sind z.B.:
- ein Numpy array
- eine Liste von Zahlen
- eine Liste von k langen Listen für ein fixes k
- ein
pandas.DataFrame
mit ausschließlich numerischen Spalten - eine numerische
pandas.Series
Standardmäßig nicht akzeptiert werden:
- eine dünnbesetzte Matrix (sparse matrix)
- ein (Python-) Iterator
- ein (Python-) Generaotor
Das Schätz-Objekt¶
(Abschnitt basierend auf dem Scikit-learn Tutorial von Jake VanderPlas.)
Das Ziel von Scikit-learn ist es ein einheitliches Interface für alle Algorithmen (Schätz-Objekt, estimator) zu haben. Die API von Scikit-learn ist gut dokumentiert und es gibt zahlreiche Tutorials auf der Homepage. Hier wird ein kurzer Überblick über wichtige Methoden von Schätz-Objekten (estimators) gegeben:
Jedes Schätz-Objekt beistzt:
model.fit(X, y)
: Führe das Training des Algorithmus aus. Für überwachtes Lernen werden zwei Argumente benötigt: Die TrainigsdatenX
und die Labely
. Für unüberwachtes Lernen wird ein Argument benötigt: Die TrainingsdatenX
. Hier wirdy
ignoriert und ist optional.model.predict(X_new)
: Sage die Label/Werte von den InstanzenX_new
vorher. Diese Methode gibt die entsprechenden Label/Werte als array-ähnliches Objekt zurück. Das Schätz-Objekt sollte vorher trainiert werden.
Einige Schätzobjekte besitzen:
model.predict_proba(X_new)
: Gibt die Wahrscheinlichkeit für jede Instanz zurück einer Kategorie anzugehören.model.predict(X_new)
gibt die Kategorie mit der höchsten Wahrscheinlichkeit zurück.model.decision_function(X_new)
: Einige Schätz-Objekte berechnen einen "rohen" Konfidenzwert (bei SVMs z.B. der Abstand zur Hyperebene), auf dem die Einordnung der Instanzen basiert. Dieser Wert kann mit dieser Funktion zurückgegeben werden und bietet sich vor allem für Oberflächenplots oder individuelle Schwellwertsetzung an.
Schätz-Objekte für überwachtes Lernen besitzen:
model.score(X_new, y_true)
: Gibt die Durchschnittsgenauigkeit (accuracy) der Daten im Bezug auf die richtigen Labelsy_true
an.
Schätz-Objekte für unüberwachtes Lernen beistzen:
model.transform(X_new)
: Wandle die Instanzen in die neue Basis für den Algorithmus (bei k-Means Clustering z.B. die Distanzen zu den Clustermittelpunkten) um und gebe die neue Repräsentation zurück.model.fit_transform(X_new)
: Effizientere Implementierung vonmodel.fit(X).transform(X)
.
Die Pipeline¶
(Abschnitt basierend auf dem offiziellen Tutorial.)
Scikit-learn unterstütz das Bauen einer Pipeline in der verschiedene Verarbeitungsschritte (z.B. Merkmalsauswahl -> Normalisierung -> Klassifikation) zu einem gesamten Schätz-Objekt zusammengefasst werden können. Alle Schätz-Objekte in einer Pipeline außer dem letzten müssen eine transform
Methode beitzen (also Transformer sein).
Eine Pipeline wird aus einer Liste von (Bezeichnung, Objekt)
Paaren aufgebaut. Dabei ist Bezeichnung
eine beliebige Zeichenkette zur Identifiezierung des Verarbeitungsschritts und Objekt
ein Schätz-Objekt:
from sklearn.pipeline import Pipeline
from sklearn.svm import SVC
from sklearn.decomposition import PCA
#################################################
# Für eine HTML-Darstellung in Jupyter-Notebooks:
from sklearn import set_config
set_config(display='diagram')
#################################################
estimators = [('reduce_dim', PCA()), ('clf', SVC())]
pipe = Pipeline(estimators)
pipe
Pipeline(steps=[('reduce_dim', PCA()), ('clf', SVC())])
PCA()
SVC()
oder ohne Vergabe von Bezeichnungen:
from sklearn.pipeline import make_pipeline
make_pipeline(PCA(), SVC())
Pipeline(steps=[('pca', PCA()), ('svc', SVC())])
PCA()
SVC()
Die Pipelines besitzen die gleichen Methoden, wie die Schätz-Objekte selbst (also model.fit()
, model.predict()
, ...). Um bei Regressionsproblemene eine nicht-lineare Transformation der Zielwerte vorzunehmen kann anstatt der Pipeline ein TransformedTargetRegressor verwendet werden.
Eine Pipeline kann auch so aufgebaut werden, dass Abhängig vom Merkmalstyp (kategorisch oder numerisch) verschiedene Transformationen stattfinden.
Andere wichtige Funktionen und Objekte¶
Scikit-learn bietet noch viele weitere hilfreiche Funktionen und Objekte wie z.B.:
sklearn.model_selection.train_test_split(X[, y, ...], test_size=0.25)
: Gibt eine Aufteilung der Daten in Trainings- und Testdatensatz zurück.sklearn.model_selection.GridSearchCV(estimator, param_grid)
: Objekt um eine Rastersuche über ein Schätz-Objekt mit verschiedenen Hyperparametern durchzuführen. Dabei kannestimator
auch eine Pipeline sein.sklearn.model_selection.cross_validate(estimator, X, y)
: Kreuzvalidation (cross validation) desestimators
für dieX
undy
Daten. Der Score für jeden Lauf der Kreuzvalidation wird zurückgegeben. Standardmäßig wird eine 5-fache Kreuzvalidation durchgeführt.