Aufbau einer Pipeline für maschinelles Lernen mit Datenleckbehandlung | von Muhammad Nanda | Juni 2023

0
26


Lassen Sie uns nun tiefer in jede Section der Pipeline-Entwicklung eintauchen und die wichtigsten Konzepte und Techniken verstehen.

1. Daten abrufen

Die Pipeline beginnt mit dem Abrufen des Datensatzes von einem Distant-Server, z. B. dem UCI-Repository für maschinelles Lernen. Dieser Prozess kann mithilfe von Bibliotheken wie Pandas durchgeführt werden, die Folgendes bereitstellen read_csv Methode zum Lesen von Daten aus CSV-Dateien.

# Getting information
self.col_names = ['sepal_length', 'sepal_width',
'petal_length', 'petal_width',
'class']
self.information = pd.read_csv(
'https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.information',
names=self.col_names
)

Um potenzielle Ausnahmen zu behandeln, die während des Datenerfassungsprozesses auftreten können, empfiehlt es sich, den Code in eine zu packen try-except Block. Dieser Block stellt sicher, dass alle Verbindungsfehler oder Probleme beim Laden der Daten in einen Datenrahmen ordnungsgemäß behandelt werden.

strive:
# Acquisition information course of...
# ...
# ...
besides ConnectionError:
print('Error: Couldn't hook up with server.')
besides ValueError:
print('Error: Couldn't load information into DataFrame.')

2. Datenvorverarbeitung

Die Datenvorverarbeitung spielt eine entscheidende Rolle bei der Vorbereitung der Daten für die Modellierung. In dieser Section werden mehrere Vorverarbeitungsschritte durchgeführt, um sicherzustellen, dass die Daten das richtige Format haben und relevante Funktionen enthalten.

Die wichtigsten Teilschritte der Datenvorverarbeitung sind folgende:

  • Kodierung der Klassenbezeichnungen. Wenn die Klassenbezeichnungen im String-Format vorliegen, müssen sie in numerische Werte kodiert werden. Dieser Prozess wird normalerweise mit Techniken wie durchgeführt Etikettenkodierung oder One-Scorching-Codierungabhängig von der Artwork des Issues und den verwendeten Algorithmen.
self.label_encoder = LabelEncoder()
self.label_encoder.match(self.information['class'])
self.information['class_label'] = self.label_encoder.remodel(self.information['class'])
  • Aufteilen der Daten. Die Aufteilung der Daten zu Beginn ist entscheidend, um sicherzustellen, dass keine Informationen aus dem Validierungssatz in den Trainingsprozess gelangen. Wenn die Daten an der Vorderseite aufgeteilt werden, können wir Vorverarbeitungsschritte wie Characteristic-Engineering oder Skalierung (später) nur für die Trainingsdaten durchführen und die Informationen aus diesem Prozess behalten. Wenden Sie dann dieselben Schritte auf die Validierungs- oder Testdaten an. Technisch gesehen können wir das nutzen train_test_split Methode aus der sk-learn-Bibliothek, um die Daten einfach aufzuteilen. Wir können das angeben stratify Parameter, um das Klassengleichgewicht für den Zug und den Validierungssatz aufrechtzuerhalten. Auch der random_state Der Parameter kann ausgefüllt werden, um sicherzustellen, dass die Aufteilungsdaten bei jedem Lauf gleich sind.
train_test_split(X, y, test_size=.2, stratify=y, random_state=self.random_state)
  • Characteristic-Engineering. Beim Characteristic-Engineering werden neue Options aus dem vorhandenen Datensatz erstellt, um die Vorhersagefähigkeiten des Modells zu verbessern. In diesem Schritt könnten wir Characteristic-Engineering-Techniken durch Erstellen implementieren sepal_area Und petal_area Merkmale basierend auf den Abmessungen der Kelch- und Blütenblätter. Mithilfe dieser neuen Funktionen stellen wir Modellinformationen bereit, die dabei helfen können, zugrunde liegende Muster in den Daten zu erfassen und das Modell zu vereinfachen.
# Create space characteristic for sepal and petal
self.fe_source_columns = {'sepal_area': ['sepal_width', 'sepal_length'],
'petal_area': ['petal_width', 'petal_length']}

information['sepal_area'] = information[self.fe_source_columns['sepal_area']].prod(axis=1)
information['petal_area'] = information[self.fe_source_columns['petal_area']].prod(axis=1)

  • Datenskalierung. Die Datenskalierung ist wichtig, um sicherzustellen, dass alle Options eine ähnliche Skalierung haben. Die Skalierung verhindert, dass Options mit großen Werten die Entfernungsberechnungen dominieren, und trägt dazu bei, ein ausgewogeneres und zuverlässigeres Modell zu erstellen. Eine Möglichkeit ist die Verwendung eines Normal-Skalierers. Diese Skalierungstechnik sorgt dafür, dass die Options keinen Mittelwert und keine Einheitsvarianz aufweisen, wodurch sie vergleichbar und für das Coaching von Modellen für maschinelles Lernen geeignet sind.
# Information scaling
self.scaler = StandardScaler()
self.scaler.match(self.x_train)
self.x_train = self.scaler.remodel(self.x_train)

3. Modellbau

Sobald die Datenvorverarbeitung abgeschlossen ist, geht die Pipeline zur Modellerstellung über. In dieser Section trainieren wir verschiedene Modelle des maschinellen Lernens anhand der vorverarbeiteten Trainingsdaten.

Wir verwenden verschiedene Algorithmen wie logistische Regression, Entscheidungsbäume und Help-Vektor-Maschinen, um verschiedene Modellierungsansätze zu untersuchen.

# Instance, construct Logistic Regression mannequin
model_lr = LogisticRegression(random_state=self.random_state)
model_lr.match(self.x_train, self.y_train)
self.lr = model_lr

4. Modellbewertung

Nach dem Coaching der Modelle ist die Bewertung ihrer Leistung anhand der Validierungsdaten von entscheidender Bedeutung. Um die Konsistenz sicherzustellen, müssen die gleichen Vorverarbeitungsschritte wie bei den Trainingsdaten auf die Validierungsdaten angewendet werden.

Leistungsmetriken wie Genauigkeit, Präzision, Rückruf und F1-Rating werden berechnet, um die Vorhersagefähigkeiten der Modelle zu bewerten. Es werden Verwirrungsmatrizen generiert, um die Vorhersageleistung der Modelle zu visualisieren und mögliche Fehler oder Fehlklassifizierungen hervorzuheben.

# put together validation information
self.x_val = self._feature_engineering(information=self.x_val)
self.x_val = self.scaler.remodel(self.x_val)

# make predictions and calculate metrics
outcomes = {}
fashions = [self.lr, self.dtc, self.svc]
for mannequin in fashions:
y_pred = mannequin.predict(self.x_val)
outcomes[type(model).__name__] = {
'accuracy': acc(y_true=self.y_val, y_pred=y_pred),
'precision': prec(y_true=self.y_val, y_pred=y_pred, common='macro'),
'recall': rec(y_true=self.y_val, y_pred=y_pred, common='macro'),
'f1-score': f1(y_true=self.y_val, y_pred=y_pred, common='macro'),
'confusion_matrix': cm(y_true=self.y_val, y_pred=y_pred)
}

5. Dateiexport

Um die Modellbereitstellung zu erleichtern, exportiert die Pipeline wichtige Pipeline-Objekte, einschließlich der trainierten Daten und Modelle, Encoder und Skalierer. Durch den Export der Pipeline-Objekte stellen wir einen nahtlosen Übergang zwischen der Entwicklungs- und der Bereitstellungsphase her und stellen so sicher, dass die Modelle in verschiedenen Umgebungen konsistent funktionieren.

self.pipeline_object = {
'scaler': self.scaler,
'label_encoder': self.label_encoder,
'model_lr': self.lr,
'model_dtc': self.dtc,
'model_svc': self.svc,
'trained_data': self.x_train,
'trained_label': self.information.loc[self.train_index]['class'].tolist(),
'feature_engineering': self.fe_source_columns
}

joblib.dump(self.pipeline_object, './pipeline.bin' )

6. Berichterstellung

Zuletzt generiert die Pipeline einen umfassenden Bericht, der Einblicke in das Verhalten und die Leistung des Modells bietet. Dieser Bericht hilft bei der Entscheidungsfindung und weiteren Modellverfeinerung.

Der Bericht enthält eine Excel-Datei, die die Ausführungszeit der Pipeline, trainierte Dateninformationen und Modellleistungsmetriken zusammenfasst. Darüber hinaus werden verschiedene Diagramme erstellt, die den Datenverteilungsvergleich, Modellleistungsmetriken und Verwirrungsmatrizen darstellen.

Der umfassende Bericht dient Datenwissenschaftlern als wertvolle Ressource und ermöglicht ihnen ein tieferes Verständnis der Stärken, Schwächen und Verbesserungsbereiche des Modells.



Source link

HINTERLASSEN SIE EINE ANTWORT

Please enter your comment!
Please enter your name here