Open Source in Python zum Auswählen von Merkmalen eines neuronalen Netzwerks

7 min read

Auswählen von Merkmalen eines neuronalen Netzwerks

Das maschinelle Lernen besteht aus vielen Teilen, einer der wichtigsten ist aber das Finden und Auswählen der nützlichsten Merkmale im Datensatz. Unnötige Merkmale haben folgende Nachteile: Sie verringern die Geschwindigkeit des Trainings, verschlechtern die Möglichkeiten der Interpretation von Ergebnissen und reduzieren die Arbeitsproduktivität, was am wichtigsten ist.

Frustriert über Spezialverfahren des Auswählens von Merkmalen, die immer wieder für die Aufgaben des maschinellen Lernens verwendet wurden, wurde eine Python Class für die Auswahl von Merkmalen erstellt. FeatureSelector verfügt über einige der häufigsten Auswahlmethoden:

  1. Mit einem hohen Prozentsatz fehlender Werte.
  2. Kollineare (stark korrelierte).
  3. Mit Null-Wichtigkeit im Baummodell.
  4. Mit niedriger Wichtigkeit.
  5. Mit einem einzigartigen Wert.

In diesem Artikel wird die Arbeit des FeatureSelectors beschrieben. Da er zum schnellen Einsatz dieser Methoden führt, wird ein leistungsfähiger Arbeitsablauf gesichert. FeatureSelector ist ein unvollendetes Projekt, das sich je nach den Bedürfnissen der Gemeinschaft weiter verbessern wird.

Datensatz

In diesem Beispiel wird der Datensatz des maschinellen Lernwettbewerbs in Keggle Home Credit Default Risk machine learning competition verwendet. (Informationen zu diesem Wettbewerb finden Sie hier.) Der gesamte Datensatz ist zum Downloaden frei verfügbar und wird als Anschauungsmaterial verwendet.

Datenbeispiel. TARGET ist ein Klassifikationslabel.

Während des Wettbewerbs wurde die Aufgabe der kontrollierten Klassifizierung erforscht. Dies kann man als ein gutes Beispiel für einen Datensatz betrachten, da es viele fehlende, zahlreiche korrelierte (kollineare) Werte und eine Reihe von irrelevanten Merkmalen enthält, die das Modell des maschinellen Lernens stören.

Erstellen des Kodes

Um den FeatureSelector zu erstellen, muss ein strukturierter Datensatz mit Tags in Zeilen und Merkmalen in Spalten übergeben werden. Für einige Methoden sind nur die Merkmale selbst notwendig, aber für die Methoden, die die Wichtigkeit analysieren, sind auch Tags erforderlich. Da die kontrollierte Klassifizierungsaufgabe betrachtet wird, werden zwei Sätze verwendet: ein Satz von Merkmalen und ein Satz von Tags.

(Diese Zeilen müssen in demselben Verzeichnis wie feature_selector.py ausgeführt werden.)

from feature_selector import FeatureSelector
# Features are in train and labels are in train_labels
fs = FeatureSelector(data = train, labels = train_labels)

Es gibt fünf Methoden zum Suchen der zu löschenden Merkmale. Man  erhält Zugriff auf jedes Merkmal und kann es dann manuell aus den Daten entfernen oder die Funktion remove im FeatureSelector verwenden.Hier werden wir jede der Identifikationsmethoden betrachten und zeigen, wie man sie alle gleichzeitig ausführt. FeatureSelector kann zusätzlich mehrere Grafiken erstellen, da die visuelle Datenkontrolle ein wesentlicher Bestandteil des maschinellen Lernens ist.

Fehlende Werte

Die erste Entfernungsmethode ist einfach: Sie sucht nach Merkmalen mit dem Anteil fehlender Werte über dem angegebenen Schwellenwert. Im folgenden Beispiel wird die Suche nach Merkmalen mit mehr als 60% fehlender Werte gezeigt.

fs.identify_missing(missing_threshold = 0.6)
17 features with greater than 0.60 missing values.

In jeder Spalte der Tabelle ist der Anteil fehlender Werte zu sehen:

Um die zu entfernenden Merkmale zu sehen,  greifen wir auf das ops Attribut im FeatureSelector zu:

missing_features = fs.ops['missing']
missing_features[:5]
['OWN_CAR_AGE',
 'YEARS_BUILD_AVG',
 'COMMONAREA_AVG',
 'FLOORSMIN_AVG',
 'LIVINGAPARTMENTS_AVG']

Schließlich kann man die Grafik der Verteilung fehlender Werte in allen Merkmalen erstellen:

fs.plot_missing()
Grafik der Verteilung fehlender Werte in allen Merkmalen

Kollineare Merkmale

Kollineare Merkmale werden so genannt, denn sie korrelieren stark miteinander. Im maschinellen Lernen wird dadurch die Arbeitseffektivität aufgrund der hohen Varianz und weniger Möglichkeiten zur Modellinterpretation gesenkt.

Die Methode identify_collinear findet kollineare Merkmale auf Grund eines angegebenen Wertes des Korrelationskoeffizienten. Für jedes Paar korrelierter Merkmale wählt sie eine davon zum Löschen aus (da nur eines der beiden Merkmale entfernt werden muss):

fs.identify_collinear(correlation_threshold = 0.98)
21 features with a correlation magnitude greater than 0.98.

Als Beispiel einer optimalen Visualisierung, die mit Korrelationen gemacht werden kann, ist die Heatmap / Wärmekarte anzuführen. Sie zeigt alle Merkmale, bei denen wenigstens eine Korrelation oberhalb der Schwelle vorhanden ist:

fs.plot_collinear()

Wie zuvor kann man auf die gesamte Liste der korrelierten Merkmale zugreifen, die entfernt werden, oder stark korrelierte Merkmalspaare in der Tabelle sehen.

# list of collinear features to remove
collinear_features = fs.ops['collinear']
# dataframe of collinear features
fs.record_collinear.head()

Wenn der Datensatz erforscht wird, kann man die Grafik aller Korrelationen in den Daten mit Hilfe des Befehls plot_all = True erstellen:

Merkmale mit Null-Wichtigkeit

Im Vergleich zu den zwei oben beschriebenen Methoden, die zum beliebigen strukturierten Datensatz verwendet werden können und deterministisch sind, d. h. die Ergebnisse sind für eine angegebene Schwelle immer gleich, ist die folgende Methode nur für kontrollierte Aufgaben des maschinellen Lernens vorgesehen, bei denen Tags für das Modelltraining vorhanden sind. Diese Methode ist nicht deterministisch. Die Funktion ident_zero_importance findet Merkmale mit Null-Wichtigkeit gemäß dem GBM-Lernmodell.

Mit Hilfe von Baummodellen des maschinellen Lernens kann die Wichtigkeit des Merkmals berechnet werden. Der absolute Wert der Wichtigkeit ist nicht so wichtig wie der relative Wert, der zur Bestimmung der für die Aufgabe wichtigsten Eigenschaften verwendet werden kann. Dieser Wert wird auch zum Auswählen von Eigenschaften verwendet, die entfernt werden können. Da im Baummodell die Werte mit Null-Wichtigkeit nicht zum Trennen von Knoten verwendet werden, kann man sie entfernen, ohne die Leistung des Modells zu ändern.

FeatureSelector berechnet die Wichtigkeit des Merkmals mithilfe von Gradient Boosting Maching aus der LightGBM-Bibliothek. Für das Reduzieren der Varianz wird die Wichtigkeit des Merkmals über 10 GBM-Zyklen gemittelt. Außerdem wird das Modell mit einem Testdatensatz und mit zeitiger Unterbrechung trainiert (diese Option kann deaktiviert werden), um Übertraining zu verhindern.

Der folgende Kode ruft die Methode auf und sucht nach Merkmalen mit Null-Wichtigkeit:

# Pass in the appropriate parameters
fs.identify_zero_importance(task = 'classification', 
                            eval_metric = 'auc', 
                            n_iterations = 10, 
                             early_stopping = True)
# list of zero importance features
zero_importance_features = fs.ops['zero_importance']
63 features with zero importance after one-hot encoding.

Folgende Parameter werden übergeben:

  • task: entweder „Klassifizierung“ oder „Regression“, je nach Aufgabe;
  • eval_metric: der Indikator der zeitigen Unterbrechung (unnötig, wenn dieser Parameter deaktiviert ist);
  • n_iterations: die Anzahl der Trainingszyklen;
  • early_stopping: Verwendet man die zeitige Unterbrechung zum Training des Modells oder nicht.

Dieses Mal entstehen zwei Grafiken mithilfe des Befehls plot_feature_importances:

# plot the feature importances
fs.plot_feature_importances(threshold = 0.99, plot_n = 12)
124 features required for 0.99 of cumulative importance

Die Kurve links stellt die Wichtigkeit der plot_n-Anzahl der wichtigsten Eigenschaften (Normung auf 1) dar. Die rechte Grafik zeigt die Abhängigkeit der Wichtigkeit von der Anzahl der Eigenschaften. Die vertikale Linie bedeutet den Schwellenwert, in diesem Fall 99%. Es sind zwei wichtige Anweisungen zur Wichtigkeitsmetrik zu betonen:

  • Das GBM-Training ist stochastisch. Die Wichtigkeit der Eigenschaften wird bei jedem Modellstarten unterschiedlich sein.

Dies sollte keinen großen Einfluss ausüben (die wichtigsten Merkmale behalten ihre Eigenschaften), wird aber die Reihenfolge einiger Merkmale ändern. Dies kann auch die Anzahl der Merkmale mit Null-Wichtigkeit beeinflussen. Es ist besonders zu betonen, dass sich die Werte der Eigenschaften jedes Mal ändern!

  • Um ein Modell des maschinellen Lernens zu trainieren, wird die direkte Kodierung von Merkmalen durchgeführt. Dies bedeutet, dass einige Merkmale mit Null-Wichtigkeit direkt von Merkmalen verschlüsselt werden können, die während der Modellierung hinzugefügt werden.

Es gibt die Möglichkeit, beliebige direkt verschlüsselte Merkmale zu entfernen. Wenn wir uns mit dem maschinellen Lernen nach dem Auswählen von Merkmalen weiter beschäftigen werden, muss die direkte Kodierung von Merkmalen ohnehin durchgeführt werden!

Werte mit niedriger Wichtigkeit

Die Methode idend_low_importance sucht nach Merkmalen mit geringster Wichtigkeit, die beim Training des Modells keine wichtige Rolle spielen.

Zum Beispiel gibt der nachfolgend angeführte Kode Merkmale mit einer Wichtigkeit von weniger als 99% aus:

fs.identify_low_importance(cumulative_importance = 0.99)
123 features required for cumulative importance of 0.99 after one hot encoding.
116 features do not contribute to cumulative importance of 0.99.

Aufgrund der Wichtigkeitskurve (siehe oben) und dieser Information kommt GBM zu dem Schluss, dass die Mehrheit der Merkmale für das Training unnötig ist. Wiederum werden sich die Ergebnisse dieser Methode bei jedem Starten ändern.

Um sich alle Wichtigkeitswerte anzuschauen, geben Sie Folgendes ein:

fs.feature_importances.head(10)

Die Methode low_importance wird einer der PCA (Principal Component Analysis) entnommen, wo gewöhnlich nur PC bleibt, der für das Behalten eines bestimmten Prozentsatzes der Abweichung (z. B. 95%) notwendig ist. Der Prozentsatz der Gesamtwichtigkeit beruht auf der gleichen Idee.

Die Methoden auf der Grundlage der Wichtigkeit werden wirklich nur im Fall der Verwendung eines Baumodells für die Vorhersage ausgewählt. Neben der Stochastizität verwenden die Methoden auf der Grundlage der Wichtigkeit den Black-Box-Ansatz, bei dem man nicht wirklich weiß, warum das Modell irgendein Merkmal für wichtig hält. Wenn Sie diese Methoden anwenden, führen Sie sie mehrmals aus, um zu sehen, wie sich die Ergebnisse ändern. Vielleicht muss man dabei mehrere Datensätze erstellen, um verschiedene Parameter zu überprüfen!

Merkmale mit einem einzigartigen Wert

Die letzte Methode ist wirklich sehr einfach: Es müssen alle Spalten mit einem einzigartigen Wert gefunden werden. Merkmale mit einem einzigartigen Wert sind für maschinelles Lernen nutzlos, da sie Null-Dispersion haben. Das Baummodell kann beispielsweise niemals eine Aufgliederung nach dem Merkmal nur mit einem Wert durchführen.

Im Gegensatz zu anderen Methoden gibt es bei dieser Methode keine Parameter für die Initialisierung:

fs.identify_single_unique()
4 features with a single unique value.

Man kann ein Histogramm der Anzahl einzigartiger Werte in jeder Kategorie erstellen:

fs.plot_unique()

Es ist wichtig zu wissen, dass NaN standardmäßig zur Berechnung einzigartiger Werte in Pandas zurückgewiesen wird.

Löschen von Merkmalen

Es gibt zwei Verfahren, die ausgewählten Merkmale zu entfernen. Alle Merkmale zum Löschen werden in Ops gespeichert, so kann man die Listen zum Löschen von Merkmalen manuell verwenden. Das zweite Verfahren besteht in der Verwendung der eingebauten Funktion remove.

Wenn alle Merkmale entfernt werden sollen, die von den fünf Methoden ausgewählt wurden, gibt man methods = ‘all’ ein:

# Remove the features from all methods (returns a df)
train_removed = fs.remove(methods = 'all')
['missing', 'single_unique', 'collinear', 'zero_importance', 'low_importance'] methods have been run

Removed 140 features.

Dieser Kode gibt die Tabelle mit entfernten Merkmalen zurück. Um auch verschlüsselte Merkmale direkt zu entfernen, die während des maschinellen Lernens erstellt wurden, wird folgender Kode verwendet:

train_removed_all = fs.remove(methods = 'all', keep_one_hot=False)
Removed 187 features including one-hot features.

Es könnte nützlich sein, die zu entfernenden Merkmale zu überprüfen, bevor man fortfährt! Der Ausgangsdatensatz wird im data FeatureSelector als Sicherheitskopie gespeichert!

Gleichzeitiges Starten aller Methoden

Anstatt Methoden einzeln zu verwenden, kann man sie alle gleichzeitig mit identify_all verwenden. Dazu benötigt man einen Parametersatz für jede Methode:

fs.identify_all(selection_params = {'missing_threshold': 0.6,    
                                    'correlation_threshold': 0.98, 
                                    'task': 'classification',    
                                    'eval_metric': 'auc', 
                                    'cumulative_importance': 0.99})
151 total features out of 255 identified for removal after one-hot encoding.

Beachten Sie, dass sich die Anzahl der Merkmale geändert hat, da das Modell nochmals gestartet wird. Zum Löschen von Merkmalen wird die Funktion remove aufgerufen.

Fazit

Die Feature Selector-Klasse realisiert einige allgemeine Methoden zum Entfernen von Merkmalen vor dem Training des Modells des maschinellen Lernens. Sie enthält Funktionen zum Erkennen von zu entfernenden Merkmalen sowie zur Visualisierung. Methoden können individuell oder sofort zur effektiven Arbeit ausgeführt werden.

Die Methode fehlender Wertekollineare Methode und die Methode mit einem einzigartigen Wert  sind deterministisch, während sich die Methoden auf der Basis der Wichtigkeit bei jedem Start ändern. Das Auswählen von Merkmalen ist weitgehend empirisch, was für das maschinelle Lernen typisch ist. Um ein optimales Ergebnis zu erzielen, müssen mehrere Kombinationen getestet werden. Am besten ist es, mehrere Konfigurationen im Modellschema auszuprobieren. Der FeatureSelector stellt eine schnelle Analyse der Parameter für das Auswählen von Merkmalen zur Verfügung.

Wenn Sie mehr über die Verwendung von Open Source in Python zum Auswählen von Merkmalen eines neuronalen Netzwerkes erfahren möchten, so können Sie sich an das Team von AI-United.de per Mail oder Q&A wenden.

Quelle

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.