Erste Schritte#
Scikit-learn ist eine Open-Source-Bibliothek für maschinelles Lernen, die überwachtes und unüberwachtes Lernen unterstützt. Sie bietet auch verschiedene Werkzeuge für Modell-Fitting, Datenvorverarbeitung, Modellauswahl, Modellevaluierung und viele andere Hilfsmittel.
Der Zweck dieser Anleitung ist es, einige der Hauptmerkmale von scikit-learn zu veranschaulichen. Sie setzt grundlegende Kenntnisse maschinellen Lernens voraus (Modell-Fitting, Vorhersage, Kreuzvalidierung usw.). Bitte beachten Sie unsere Installationsanweisungen, um scikit-learn zu installieren, oder springen Sie zum Abschnitt Nächste Schritte für zusätzliche Anleitungen zur Verwendung von scikit-learn.
Fitting und Vorhersage: Grundlagen von Estimators#
Scikit-learn bietet Dutzende von integrierten Algorithmen und Modellen für maschinelles Lernen, die als Estimators bezeichnet werden. Jeder Estimator kann mit seiner fit Methode auf Daten angepasst werden.
Hier ist ein einfaches Beispiel, bei dem wir einen RandomForestClassifier an sehr einfache Daten anpassen
>>> from sklearn.ensemble import RandomForestClassifier
>>> clf = RandomForestClassifier(random_state=0)
>>> X = [[ 1, 2, 3], # 2 samples, 3 features
... [11, 12, 13]]
>>> y = [0, 1] # classes of each sample
>>> clf.fit(X, y)
RandomForestClassifier(random_state=0)
Die fit Methode akzeptiert im Allgemeinen 2 Eingaben
Die Stichprobenmatrix (oder Designmatrix) X. Die Größe von
Xist typischerweise(n_samples, n_features), was bedeutet, dass Stichproben als Zeilen und Merkmale als Spalten dargestellt werden.Die Zielwerte y, die reelle Zahlen für Regressionsaufgaben oder ganze Zahlen für Klassifizierungsaufgaben (oder eine andere diskrete Menge von Werten) sind. Für unüberwachte Lernaufgaben muss
ynicht angegeben werden.yist normalerweise ein 1D-Array, bei dem deri-te Eintrag dem Ziel deri-ten Stichprobe (Zeile) vonXentspricht.
Sowohl X als auch y werden normalerweise als Numpy-Arrays oder äquivalente Array-ähnliche Datentypen erwartet, obwohl einige Estimators auch mit anderen Formaten wie spärlichen Matrizen arbeiten.
Sobald der Estimator angepasst wurde, kann er zur Vorhersage von Zielwerten für neue Daten verwendet werden. Sie müssen den Estimator nicht neu trainieren
>>> clf.predict(X) # predict classes of the training data
array([0, 1])
>>> clf.predict([[4, 5, 6], [14, 15, 16]]) # predict classes of new data
array([0, 1])
Sie können Choosing the right estimator konsultieren, um das richtige Modell für Ihren Anwendungsfall auszuwählen.
Transformer und Vorverarbeiter#
Workflows für maschinelles Lernen bestehen oft aus verschiedenen Teilen. Eine typische Pipeline besteht aus einem Vorverarbeitungsschritt, der die Daten transformiert oder imputiert, und einem endgültigen Vorhersagewerkzeug, das Zielwerte vorhersagt.
In scikit-learn folgen Vorverarbeiter und Transformer der gleichen API wie die Estimator-Objekte (sie erben tatsächlich alle von der gleichen BaseEstimator Klasse). Die Transformer-Objekte haben keine predict Methode, sondern eine transform Methode, die eine neu transformierte Stichprobenmatrix X ausgibt
>>> from sklearn.preprocessing import StandardScaler
>>> X = [[0, 15],
... [1, -10]]
>>> # scale data according to computed scaling values
>>> StandardScaler().fit(X).transform(X)
array([[-1., 1.],
[ 1., -1.]])
Manchmal möchten Sie unterschiedliche Transformationen auf unterschiedliche Merkmale anwenden: der ColumnTransformer ist für diese Anwendungsfälle konzipiert.
Pipelines: Verketten von Vorverarbeitern und Estimators#
Transformer und Estimators (Vorhersagewerkzeuge) können zu einem einzigen, einheitlichen Objekt zusammengefasst werden: einer Pipeline. Die Pipeline bietet die gleiche API wie ein regulärer Estimator: sie kann mit fit angepasst und mit predict zur Vorhersage verwendet werden. Wie wir später sehen werden, verhindert die Verwendung einer Pipeline auch Datenlecks, d.h. das Offenlegen von Testdaten in Ihren Trainingsdaten.
Im folgenden Beispiel laden wir den Iris-Datensatz, teilen ihn in Trainings- und Testsets auf und berechnen die Genauigkeit einer Pipeline auf den Testdaten
>>> from sklearn.preprocessing import StandardScaler
>>> from sklearn.linear_model import LogisticRegression
>>> from sklearn.pipeline import make_pipeline
>>> from sklearn.datasets import load_iris
>>> from sklearn.model_selection import train_test_split
>>> from sklearn.metrics import accuracy_score
...
>>> # create a pipeline object
>>> pipe = make_pipeline(
... StandardScaler(),
... LogisticRegression()
... )
...
>>> # load the iris dataset and split it into train and test sets
>>> X, y = load_iris(return_X_y=True)
>>> X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
...
>>> # fit the whole pipeline
>>> pipe.fit(X_train, y_train)
Pipeline(steps=[('standardscaler', StandardScaler()),
('logisticregression', LogisticRegression())])
>>> # we can now use it like any other estimator
>>> accuracy_score(pipe.predict(X_test), y_test)
0.97...
Modellevaluierung#
Das Anpassen eines Modells an Daten bedeutet nicht, dass es auf ungesehenen Daten gut vorhersagen wird. Dies muss direkt bewertet werden. Wir haben gerade das Hilfsmittel train_test_split gesehen, das einen Datensatz in Trainings- und Testsets aufteilt, aber scikit-learn bietet viele weitere Werkzeuge zur Modellevaluierung, insbesondere für die Kreuzvalidierung.
Wir zeigen hier kurz, wie eine 5-fache Kreuzvalidierung durchgeführt wird, indem das Hilfsmittel cross_validate verwendet wird. Beachten Sie, dass es auch möglich ist, manuell über die Folds zu iterieren, verschiedene Datenaufteilungsstrategien zu verwenden und benutzerdefinierte Scoring-Funktionen zu nutzen. Weitere Details finden Sie in unserem Benutzerhandbuch.
>>> from sklearn.datasets import make_regression
>>> from sklearn.linear_model import LinearRegression
>>> from sklearn.model_selection import cross_validate
...
>>> X, y = make_regression(n_samples=1000, random_state=0)
>>> lr = LinearRegression()
...
>>> result = cross_validate(lr, X, y) # defaults to 5-fold CV
>>> result['test_score'] # r_squared score is high because dataset is easy
array([1., 1., 1., 1., 1.])
Automatische Parametersuche#
Alle Estimators haben Parameter (in der Fachliteratur oft als Hyperparameter bezeichnet), die abgestimmt werden können. Die Generalisierungsfähigkeit eines Estimators hängt oft entscheidend von einigen wenigen Parametern ab. Zum Beispiel hat ein RandomForestRegressor einen Parameter n_estimators, der die Anzahl der Bäume im Wald bestimmt, und einen Parameter max_depth, der die maximale Tiefe jedes Baumes bestimmt. Oft ist nicht klar, welche genauen Werte diese Parameter haben sollten, da sie von den vorliegenden Daten abhängen.
Scikit-learn bietet Werkzeuge, um automatisch die besten Parameterkombinationen zu finden (mittels Kreuzvalidierung). Im folgenden Beispiel durchsuchen wir zufällig den Parameterraum eines Random Forest mit einem RandomizedSearchCV-Objekt. Nach Abschluss der Suche verhält sich RandomizedSearchCV wie ein RandomForestRegressor, der mit dem besten Satz von Parametern angepasst wurde. Lesen Sie mehr im Benutzerhandbuch.
>>> from sklearn.datasets import make_regression
>>> from sklearn.ensemble import RandomForestRegressor
>>> from sklearn.model_selection import RandomizedSearchCV
>>> from sklearn.model_selection import train_test_split
>>> from scipy.stats import randint
...
>>> # create a synthetic dataset
>>> X, y = make_regression(n_samples=20640,
... n_features=8,
... noise=0.1,
... random_state=0)
>>> X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
...
>>> # define the parameter space that will be searched over
>>> param_distributions = {'n_estimators': randint(1, 5),
... 'max_depth': randint(5, 10)}
...
>>> # now create a searchCV object and fit it to the data
>>> search = RandomizedSearchCV(estimator=RandomForestRegressor(random_state=0),
... n_iter=5,
... param_distributions=param_distributions,
... random_state=0)
>>> search.fit(X_train, y_train)
RandomizedSearchCV(estimator=RandomForestRegressor(random_state=0), n_iter=5,
param_distributions={'max_depth': ...,
'n_estimators': ...},
random_state=0)
>>> search.best_params_
{'max_depth': 9, 'n_estimators': 4}
>>> # the search object now acts like a normal random forest estimator
>>> # with max_depth=9 and n_estimators=4
>>> search.score(X_test, y_test)
0.84...
Hinweis
In der Praxis möchten Sie fast immer eine Pipeline durchsuchen, anstatt nur einen einzelnen Estimator. Einer der Hauptgründe dafür ist, dass Sie, wenn Sie einen Vorverarbeitungsschritt auf den gesamten Datensatz anwenden, ohne eine Pipeline zu verwenden, und dann eine Art von Kreuzvalidierung durchführen, die grundlegende Annahme der Unabhängigkeit zwischen Trainings- und Testdaten brechen würden. Da Sie die Daten mit dem gesamten Datensatz vorverarbeitet haben, sind einige Informationen über die Testsets für die Trainingssets verfügbar. Dies führt zu einer Überschätzung der Generalisierungsfähigkeit des Estimators (mehr dazu in diesem Kaggle-Post).
Die Verwendung einer Pipeline für Kreuzvalidierung und Suche wird Sie weitgehend vor diesem häufigen Fehler bewahren.
Nächste Schritte#
Wir haben kurz die Anpassung und Vorhersage von Estimators, Vorverarbeitungsschritte, Pipelines, Kreuzvalidierungswerkzeuge und automatische Hyperparameter-Suchen behandelt. Diese Anleitung sollte Ihnen einen Überblick über einige der Hauptmerkmale der Bibliothek geben, aber scikit-learn hat noch viel mehr zu bieten!
Bitte konsultieren Sie unser Benutzerhandbuch für Details zu allen von uns bereitgestellten Werkzeugen. Eine vollständige Liste der öffentlichen API finden Sie auch in der API-Referenz.
Sie können sich auch unsere zahlreichen Beispiele ansehen, die die Verwendung von scikit-learn in vielen verschiedenen Kontexten veranschaulichen, oder einen Blick auf die Externen Ressourcen, Videos und Vorträge für Lernmaterialien werfen.