Datenwissenschaftler verwenden Künstliche Intelligenz (KI) für… fast alles. KI kann Kontrollsysteme betreiben, um den Energieverbrauch von Gebäuden zu senken, Empfehlungen für den Kauf von Kleidung oder Shows zum Anschauen geben, dazu beitragen, landwirtschaftliche Praktiken zu verbessern, um die Menge an Nahrungsmitteln zu erhöhen, die wir nachhaltig anbauen können, und eines Tages könnte ein KI-Algorithmus sogar unsere Autos fahren.
Glücklicherweise ist der Einstieg in die KI für diejenigen, die bereits Erfahrung mit Python und Datenanalyse haben, keine allzu große Herausforderung. Sie können das leistungsstarke scikit-learn-Paket nutzen, um die meiste harte Arbeit für Sie zu erledigen.
Scikit-learn ist ein Python-Paket, das entwickelt wurde, um die Verwendung von maschinellem Lernen und KI-Algorithmen zu erleichtern. Dieses Paket enthält Algorithmen für Klassifizierung, Regression und Clustering, wie z. B. Random Forests und Gradient Boosting. Scikit-learn wurde entwickelt, um sich leicht mit den gängigen wissenschaftlichen Paketen NumPy und SciPy zu verbinden. Obwohl scikit-learn nicht speziell dafür entwickelt wurde, lässt es sich auch hervorragend mit Pandas verbinden.
Was ist Scikit-Learn?
Scikit-learn enthält nützliche Tools, um die Verwendung von Machine-Learning-Algorithmen zu erleichtern. Die Entwicklung von Pipelines für maschinelles Lernen, die das Verhalten eines Systems genau vorhersagen, erfordert die Aufteilung der Daten in Trainings- und Testsätze, das Bewerten der Algorithmen, um zu bestimmen, wie gut sie funktionieren, und sicherzustellen, dass die Modelle weder über- noch unterangepasst sind.
Wie funktionieren Scikit-Learn-Algorithmen?
Wir können Scikit-Learn-Algorithmen in drei allgemeinen Schritten entwickeln und testen.
3 Schritte zum Entwickeln und Testen von Scikit-Learn-Algorithmen
- Trainieren Sie das Modell mit einem vorhandenen Datensatz, der die Phänomene beschreibt, die das Modell vorhersagen soll.
- Testen Sie das Modell an einem anderen vorhandenen Datensatz, um sicherzustellen, dass es gut funktioniert.
- Verwenden Sie das Modell, um Phänomene nach Bedarf für Ihr Projekt vorherzusagen.
Die scikit-learn Application Programming Interface (API) stellt Befehle bereit, um jeden dieser Schritte mit einem einzigen Funktionsaufruf auszuführen. Alle scikit-learn-Algorithmen verwenden die gleichen Funktionsaufrufe für diesen Prozess. Wenn Sie es also für einen lernen, lernen Sie es für alle.
Der Funktionsaufruf zum Trainieren eines Scikit-Learn-Algorithmus lautet .fit()
. Um jedes Modell zu trainieren, rufen Sie die .fit
-Funktion und übergeben Sie ihr zwei Komponenten des Trainingsdatensatzes. Die beiden Komponenten sind die x
Datensatz, der die Daten liefert, die die Merkmale des Datensatzes beschreiben, und die y
data, die die Daten liefert, die die Ziele des Systems beschreiben.
Hinweis: Wenn wir über Funktionen und Ziele sprechen, sind dies im Wesentlichen Begriffe für maschinelles Lernen für x
und y
Daten.
Der Algorithmus erstellt dann ein mathematisches Modell, das durch den ausgewählten Algorithmus und die Parameter des Modells bestimmt wird. Das mathematische Modell stimmt so gut wie möglich mit den bereitgestellten Trainingsdaten überein. Der Algorithmus speichert dann die Parameter im Modell, sodass Sie die angepasste Version des Modells nach Bedarf für Ihr Projekt aufrufen können.
Die Funktion zum Testen der Anpassung des Modells ist .score()
. Um diese Funktion zu verwenden, rufen Sie die Funktion erneut auf und übergeben ein x
Datensatz, der die Merkmale darstellt, und entsprechende y
Datensatz, der die Ziele darstellt.
Es ist wichtig, dass sich der Datensatz, den Sie beim Testen der Daten verwenden (Ihr Testdatensatz), von dem Datensatz unterscheidet, den Sie zum Trainieren des Modells verwenden. Es ist sehr wahrscheinlich, dass ein Modell sehr gut abschneidet, wenn es anhand der Trainingsdaten bewertet wird, weil Sie es mathematisch gezwungen haben, diesem Datensatz zu entsprechen. Der eigentliche Test besteht darin, wie gut das Modell bei einem anderen Datensatz funktioniert, was der Zweck des Testdatensatzes ist. Beim Aufruf der .score()
scikit-learn gibt den r²-Wert zurück, der angibt, wie gut das Modell die bereitgestellten Werte vorhergesagt hat y
Datensatz mit dem x
Datensatz.
Sie können die Ausgaben eines Systems anhand der bereitgestellten Eingaben vorhersagen, indem Sie scikit-learn’s verwenden .predict()
Funktion. Wichtig ist, dass Sie dies erst nach der Anpassung des Modells tun. Beim Anpassen passen Sie das Modell an den Datensatz an. Wenn Sie es also nicht zuerst anpassen, liefert das Modell keine wertvolle Vorhersage. Sobald Sie das Modell angepasst haben, können Sie eine x
Datensatz auf den .predict()
Funktion und es wird a . zurückgegeben y
Datensatz wie vom Modell vorhergesagt. Auf diese Weise können Sie vorhersagen, wie sich ein System in Zukunft verhalten wird.
Diese drei Funktionen bilden den Kern der scikit-learn API und tragen wesentlich dazu bei, KI auf Ihre technischen Probleme anzuwenden.
Wie erstelle ich Trainings- und Testdatensätze?
Das Erstellen separater Trainings- und Testdatensätze ist eine kritische Komponente beim Training von KI-Modellen. Ohne diesen Schritt können wir weder ein Modell erstellen, das dem System entspricht, das wir vorhersagen möchten, noch können wir die Genauigkeit unserer Vorhersagen überprüfen. Glücklicherweise bietet scikit-learn ein nützliches Werkzeug, um diesen Prozess zu erleichtern: train_test_split()
Funktion.
Train_test_split()
macht genau das was es klingt. Es teilt einen bereitgestellten Datensatz in Trainings- und Testdatensätze auf. Sie können damit die Datensätze erstellen, die Sie benötigen, um sicherzustellen, dass Ihr Modell das untersuchte System korrekt vorhersagt. Sie stellen einen Datensatz bereit für train_test_split()
und es stellt die Trainings- und Testdatensätze bereit, die Sie benötigen.
Bei der Verwendung sind einige Dinge zu beachten train_test_split()
. Zuerst, train_test_split()
ist zufälliger Natur, was bedeutet, dass nicht dieselben Trainings- und Testdatensätze zurückgegeben werden, wenn Sie mehrmals mit denselben Eingabedaten laufen. Dies kann gut sein, wenn Sie die Variabilität der Genauigkeit des Modells testen möchten, aber es kann auch schlecht sein, wenn Sie wiederholt denselben Datensatz für das Modell verwenden möchten. Um sicherzustellen, dass Sie jedes Mal das gleiche Ergebnis erhalten, können Sie die random_state
Parameter. Die zufällige Statuseinstellung erzwingt train_test_split()
um bei jeder Ausführung denselben Randomisierungs-Seed zu verwenden und dieselben Datensatzaufteilungen bereitzustellen. Beim Benutzen random_state
es ist üblich, es auf 42 zu setzen, wahrscheinlich als humorvolle Anspielung auf Per Anhalter durch die Galaxis mehr als aus irgendeinem technischen Grund.
Wie funktioniert das alles zusammen?
Zusammengenommen schaffen diese Tools eine optimierte Benutzeroberfläche zum Erstellen und Verwenden von Scikit-Learn-Tools. Lassen Sie uns das am Beispiel des linearen Regressionsmodells von scikit-learn durchgehen.
Um diesen Prozess zu implementieren, müssen wir zuerst unsere Werkzeuge importieren: das scikit-learn-Modell, das train_test_split()
Funktion und Pandas für den Datenanalyseprozess. Wir importieren die Funktionen wie folgt:
from scikit-learn.linear_model import LinearRegression
from scikit-learn.model_selection import train_test_split
import pandas as pd
Wir können dann einen Datensatz einlesen, damit er zum Trainieren und Testen des Modells verfügbar ist. Ich habe einen realistischen Datensatz erstellt, der die Leistung von Warmwasserbereitern mit Wärmepumpe (HPWH) in Abhängigkeit von ihren Betriebsbedingungen demonstriert, um Menschen dabei zu helfen, datenwissenschaftliche und technische Fähigkeiten zu erlernen. Angenommen, Sie haben diesen Datensatz heruntergeladen und im selben Ordner wie Ihr Skript gespeichert, können Sie ihn mit der folgenden Codezeile öffnen. Wenn nicht, können Sie diese Schritte nach Bedarf anpassen, um mit jedem beliebigen Datensatz zu üben.
data = pd.read_csv('COP_HPWH_f_Tamb&Tavg.csv', index_col = 0)
Der nächste Schritt besteht darin, den Datensatz in die x
und y
Daten. Dazu erstellen wir neue Datenrahmen, die die Spalten des Datensatzes angeben, die die Features und die Ziele darstellen. Im Fall von HPWHs sind dies die Merkmale Tanktemperatur und Umgebungstemperatur, während das Ziel der Stromverbrauch ist.
Der Datensatz enthält acht Spalten, die die Wassertemperatur in acht verschiedenen Tiefen im Wasserspeicher anzeigen, die jeweils benannt sind Tx (deg F)
wo x
ist eine Zahl, die den Ort der Messung repräsentiert.
Der Datensatz enthält auch eine Spalte mit der gemessenen Umgebungstemperatur im Raum um den Warmwasserbereiter, genannt T_Amb (deg F)
. Schließlich enthält der Datensatz eine Spalte, in der die Stromverbrauchsdaten gespeichert sind, genannt P_Elec (W)
. In diesem Fall ist es auch wichtig, unseren Datensatz so zu filtern, dass wir nur Daten verwenden, wenn das System Strom verbraucht. Wenn wir diesen Schritt überspringen, führen wir Nichtlinearität in ein lineares Modell ein, wodurch das Modell fehlschlägt.
Wir können all diese Schritte mit dem folgenden Code ausführen:
# Filter the data to only include points where power > 0
data = data[data['P_Elec (W)'] > 0]
# Identify X columns and create the X data set
x_columns = ['T_Amb (deg F)']
for i in range(1, 9):
x_columns.append('T{} (deg F)'.format(i))
x = data[x_columns]
# Create the y data set
y = data['P_Elec (W)']
Jetzt haben wir x
und y
Datensätze können wir sie in Trainings- und Testdatensätze aufteilen. Wir tun dies, indem wir scikit-learn’s aufrufen train_test_split()
Funktion wie folgt.
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state = 42)
Nachdem wir nun Trainings- und Testdatensätze bereit haben, können wir das lineare Regressionsmodell erstellen und an den Datensatz anpassen. Zuerst erstellen wir eine Instanz des Modells und rufen dann die .fit()
Funktion wie folgt.
model = LinearRegression()
model = model.fit(x_train, y_train)
Beachten Sie, dass diese Implementierung die Standardparameter des linearen Regressionsmodells verwendet. Dies kann eine gute Anpassung an die Daten ergeben oder auch nicht, und wir müssen möglicherweise die Parameter ändern, um eine gute Anpassung zu erhalten. Lassen Sie uns zunächst die Standardparameter verwenden, um diese Konzepte zu erlernen.
Der nächste Schritt besteht darin, das Modell anhand des Testdatensatzes zu bewerten, um sicherzustellen, dass es gut zum Datensatz passt. Sie können dies tun, indem Sie anrufen .score()
und Übergeben der Testdaten.
score = model.score(x_test, y_test)
Wenn das Modell im Testdatensatz gut abschneidet, haben Sie wahrscheinlich ein Modell, das sowohl gut trainiert als auch für den Datensatz geeignet ist. Wenn das Modell nicht gut abschneidet, müssen Sie erwägen, mehr Daten zu sammeln, die Parameter des Modells anzupassen oder ein anderes Modell vollständig zu verwenden.
Wenn das Modell gut funktioniert, können Sie das Modell einsatzbereit erklären und mit der Vorhersage des Systemverhaltens beginnen. Da wir derzeit keinen zusätzlichen Datensatz vorhersagen können, können wir einfach die Ausgabe des Testdatensatzes vorhersagen. Dazu rufst du die .predict()
Funktion wie folgt.
predict = model.predict(x_test)
Die Vorhersagevariable enthält jetzt die vorhergesagte Ausgabe des Systems, wenn sie den Eingaben ausgesetzt wird, wie durch . definiert X_test
. Mit diesen Ausgängen können Sie dann die Werte in vergleichen y
direkt testen, wodurch Sie die Modellanpassung und Vorhersagegenauigkeit genauer untersuchen können.
Wie gut funktioniert dieses Modell?
Da wir den Score des Modells berechnet und in der Variablen Score gespeichert haben, können wir schnell sehen, wie gut das Modell den Stromverbrauch des WKW vorhersagt. In diesem Fall beträgt die Bewertung des Modells 0,58.
R² ist eine Metrik, die bei eins maximal ist, weil man angibt, dass das Modell das Verhalten des Systems perfekt erklärt. Je niedriger der Wert, desto schlechter die Anpassung (und ja, er kann negativ sein). Ein r²-Wert von 0,58 zeigt an, dass das Modell ein wenig des beobachteten Verhaltens erklärt, aber nicht großartig ist.
Zur Erinnerung: Um Verbesserungen vorzunehmen, können wir:
-
Sammeln Sie mehr Daten
-
Passen Sie die Parameter des Modells an
-
Verwenden Sie ein komplett anderes Modell
Wir könnten sicherlich mehr Daten sammeln oder die Parameter des linearen Regressionsmodells anpassen, aber das Kernproblem hier ist, dass die Beziehung zwischen dem Stromverbrauch der Wärmepumpe und der Wassertemperatur wahrscheinlich nicht linear ist. Es ist schwer für ein lineares Modell, etwas vorherzusagen, das nicht linear ist!
Wir können dieselbe Methode mit einem Modell ausprobieren, das für nichtlineare Systeme entwickelt wurde, und sehen, ob wir bessere Ergebnisse erzielen. Ein mögliches Modell ist der Random Forest Regressor. Wir können es versuchen, indem wir den folgenden Code am Ende des Skripts hinzufügen.
from sklearn.ensemble import RandomForestRegressor
model = RandomForestRegressor()
model.fit(x_train, y_train)
score = model.score(x_test, y_test)
Diese Methode ergibt einen sehr hohen Score von 0,9999, was im Gegenteil verdächtig ist. Es besteht eine vernünftige Chance, dass dieses Modell zu stark an den Datensatz angepasst ist und in Zukunft keine realistischen Vorhersagen liefert. Leider können wir dies anhand des verfügbaren Datensatzes nicht wirklich feststellen. Wenn Sie dieses Modell verwenden, um mit der Vorhersage des Systems zu beginnen, müssen Sie das Modell sorgfältig überwachen, um zu sehen, wie es funktioniert, wenn mehr Daten verfügbar werden, und um es weiter zu trainieren. Das Auftragen der Vorhersagen gegen die gemessenen Daten würde auch Einblicke in das Verhalten des Modells geben.
Für diesen speziellen Datensatz sage ich, dass ich diesem Modell vertraue, da dieser Datensatz keine tatsächlichen Messdaten enthält; Es ist ein Beispieldatensatz, den ich durch Implementieren einer Regressionsgleichung erstellt habe, um zu zeigen, wie sich ein HPWH unter diesen Bedingungen verhält. Dies bedeutet, dass der Random Forest-Regressor wahrscheinlich so gut mit den Daten übereinstimmt, weil er die Gleichung identifiziert hat, die ich zum Erstellen des Datensatzes verwendet habe.
Und damit sollten Sie in einer guten Verfassung sein, um mit scikit-learn zu beginnen, um maschinelles Lernen und KI zu implementieren! Wenn Sie sich daran erinnern, dass alle scikit-learn-Algorithmen verwenden fit()
, score()
und predict()
Funktionen und Sie können Ihre Datensätze erstellen mit train_test_split()
, dann sind Sie auf dem besten Weg, das Systemverhalten vorherzusagen.
Dieser Artikel wurde ursprünglich auf Towards Data Science veröffentlicht.