Wir haben DataLiner 1.2.0 veröffentlicht, eine Vorverarbeitungsbibliothek für maschinelles Lernen. Dieses Mal habe ich ungefähr 6 neue Vorverarbeitungen hinzugefügt, daher möchte ich sie vorstellen.
GitHub: https://github.com/shallowdf20/dataliner PyPI: https://pypi.org/project/dataliner/ Document: https://shallowdf20.github.io/dataliner/preprocessing.html
Mit pip installieren.
! pip install -U dataliner
Verwenden Sie die Titanic-Daten wie gewohnt.
import pandas as pd
import dataliner as dl
df = pd.read_csv('train.csv')
target_col = 'Survived'
X = df.drop(target_col, axis=1)
y = df[target_col]
PassengerId | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked |
---|---|---|---|---|---|---|---|---|---|---|
1 | 3 | Braund, Mr. Owen Harris | male | 22 | 1 | 0 | A/5 21171 | 7.250 | NaN | S |
2 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Thayer) | female | 38 | 1 | 0 | PC 17599 | 71.283 | C85 | C |
3 | 3 | Heikkinen, Miss. Laina | female | 26 | 0 | 0 | STON/O2. 3101282 | 7.925 | NaN | S |
4 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | female | 35 | 1 | 0 | 113803 | 53.100 | C123 | S |
5 | 3 | Allen, Mr. William Henry | male | 35 | 0 | 0 | 373450 | 8.050 | NaN | S |
Lassen Sie uns jetzt einen Blick darauf werfen.
AppendArithmeticFeatures Zwischen den in den Daten enthaltenen Merkmalsmengen werden vier Regeln ausgeführt, und eine neue Merkmalsmenge mit einem höheren Bewertungsindex als der in der Berechnung verwendeten Merkmalsmenge wird neu hinzugefügt. Die Bewertung erfolgt durch logistische Regression. Standardmäßig sind Multiplikations- und Bewertungsindex AUC, aber auch Addition, Subtraktion und Division, Genauigkeit usw. sind verfügbar. Es ist notwendig, die fehlenden Werte vor der Verwendung einzugeben.
process = make_pipeline(
dl.ImputeNaN(),
dl.AppendArithmeticFeatures(metric='roc_auc', operation='multiply')
)
process.fit_transform(X, y)
PassengerId | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | PassengerId_multiply_Age | PassengerId_multiply_SibSp | PassengerId_multiply_Parch | Pclass_multiply_Age |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 3 | Braund, Mr. Owen Harris | male | 22 | 1 | 0 | A/5 21171 | 7.250 | B96 B98 | S | 22 | 1 | 0 | 66 |
2 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Thayer) | female | 38 | 1 | 0 | PC 17599 | 71.283 | C85 | C | 76 | 2 | 0 | 38 |
3 | 3 | Heikkinen, Miss. Laina | female | 26 | 0 | 0 | STON/O2. 3101282 | 7.925 | B96 B98 | S | 78 | 0 | 0 | 78 |
4 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | female | 35 | 1 | 0 | 113803 | 53.100 | C123 | S | 140 | 4 | 0 | 35 |
5 | 3 | Allen, Mr. William Henry | male | 35 | 0 | 0 | 373450 | 8.050 | B96 B98 | S | 175 | 0 | 0 | 105 |
Auf diese Weise werden neue Funktionen hinzugefügt.
RankedEvaluationMetricEncoding Nachdem jede Kategorie zu einer Dummy-Variablen gemacht wurde, wird mit jeder Kategoriespalte und Zielvariablen eine logistische Regression durchgeführt. Erstellen Sie ein Ranking mit der resultierenden Metrik (standardmäßig AUC) und codieren Sie die ursprüngliche Kategorie mit diesem Ranking. Da jeder Kategorie eine fünffache logistische Regression zugeordnet ist, ist der Rechenaufwand für Merkmale mit hoher Kardinalität im Voraus enorm Es wird empfohlen, die Kardinalität mithilfe der Kategorie "Hohe Kardinalität" oder "Seltene Gruppe" zu verringern.
process = make_pipeline(
dl.ImputeNaN(),
dl.RankedEvaluationMetricEncoding()
)
process.fit_transform(X, y)
PassengerId | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked |
---|---|---|---|---|---|---|---|---|---|---|
1 | 3 | 640 | 2 | 22 | 1 | 0 | 288 | 7.250 | 1 | 1 |
2 | 1 | 554 | 1 | 38 | 1 | 0 | 284 | 71.283 | 77 | 2 |
3 | 3 | 717 | 1 | 26 | 0 | 0 | 256 | 7.925 | 1 | 1 |
4 | 1 | 803 | 1 | 35 | 1 | 0 | 495 | 53.100 | 112 | 1 |
5 | 3 | 602 | 2 | 35 | 0 | 0 | 94 | 8.050 | 1 | 1 |
Sie können auch überprüfen, wie wichtig jede Kategorie in der kategorialen Variablen ist, indem Sie das Ranking ausgeben.
process['rankedevaluationmetricencoding'].dic_corr_['Embarked']
Category | Rank | Evaluation_Metric |
---|---|---|
S | 1 | 0.5688 |
C | 2 | 0.5678 |
Q | 3 | 0.4729 |
AppendClassificationModel Der Klassifizierer wird basierend auf den Eingabedaten trainiert und das Vorhersageergebnis wird als neue Merkmalsgröße hinzugefügt. Das Modell kann ein beliebiges sklearn-kompatibles Modell sein. Auch wenn die prädiktive_proba-Methode implementiert ist Sie können anstelle einer Bezeichnung eine Punktzahl hinzufügen, indem Sie das Argument Wahrscheinlichkeit = True angeben. Da das Modell trainiert wird, sind grundsätzlich die Vervollständigung fehlender Werte und die Verarbeitung kategorialer Variablen erforderlich.
process = make_pipeline(
dl.ImputeNaN(),
dl.TargetMeanEncoding(),
dl.AppendClassificationModel(model=RandomForestClassifier(n_estimators=300, max_depth=5),
probability=False)
)
process.fit_transform(X, y)
PassengerId | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | Predicted_RandomForestClassifier |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | 3 | 0.3838 | 0.1889 | 22 | 1 | 0 | 0.3838 | 7.250 | 0.3039 | 0.3390 | 0 |
2 | 1 | 0.3838 | 0.7420 | 38 | 1 | 0 | 0.3838 | 71.283 | 0.3838 | 0.5536 | 1 |
3 | 3 | 0.3838 | 0.7420 | 26 | 0 | 0 | 0.3838 | 7.925 | 0.3039 | 0.3390 | 1 |
4 | 1 | 0.3838 | 0.7420 | 35 | 1 | 0 | 0.4862 | 53.100 | 0.4862 | 0.3390 | 1 |
5 | 3 | 0.3838 | 0.1889 | 35 | 0 | 0 | 0.3838 | 8.050 | 0.3039 | 0.3390 | 0 |
Dies ist der Fall, wenn Wahrscheinlichkeit = Wahr. Eine Punktzahl für Klasse 1 wird vergeben.
PassengerId | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | Predicted_RandomForestClassifier |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | 3 | 0.3838 | 0.1889 | 22 | 1 | 0 | 0.3838 | 7.250 | 0.3039 | 0.3390 | 0.1497 |
2 | 1 | 0.3838 | 0.7420 | 38 | 1 | 0 | 0.3838 | 71.283 | 0.3838 | 0.5536 | 0.8477 |
3 | 3 | 0.3838 | 0.7420 | 26 | 0 | 0 | 0.3838 | 7.925 | 0.3039 | 0.3390 | 0.5401 |
4 | 1 | 0.3838 | 0.7420 | 35 | 1 | 0 | 0.4862 | 53.100 | 0.4862 | 0.3390 | 0.8391 |
5 | 3 | 0.3838 | 0.1889 | 35 | 0 | 0 | 0.3838 | 8.050 | 0.3039 | 0.3390 | 0.1514 |
AppendEncoder Die verschiedenen im DataLiner enthaltenen Encoder ersetzen die Kategoriespalten direkt durch codierte Nummern. In einigen Fällen möchten Sie es jedoch möglicherweise als neue Feature-Menge verwenden, ohne es zu ersetzen. (TargetMeanEncoder usw.) In diesem Fall wird Encoder durch Umschließen in diese Klasse als Feature-Menge hinzugefügt.
process = make_pipeline(
dl.ImputeNaN(),
dl.AppendEncoder(encoder=dl.TargetMeanEncoding())
)
process.fit_transform(X, y)
PassengerId | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | Name_TargetMeanEncoding | Sex_TargetMeanEncoding | Ticket_TargetMeanEncoding | Cabin_TargetMeanEncoding | Embarked_TargetMeanEncoding |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 3 | Braund, Mr. Owen Harris | male | 22 | 1 | 0 | A/5 21171 | 7.250 | B96 B98 | S | 0.3838 | 0.1889 | 0.3838 | 0.3039 | 0.3390 |
2 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Thayer) | female | 38 | 1 | 0 | PC 17599 | 71.283 | C85 | C | 0.3838 | 0.7420 | 0.3838 | 0.3838 | 0.5536 |
3 | 3 | Heikkinen, Miss. Laina | female | 26 | 0 | 0 | STON/O2. 3101282 | 7.925 | B96 B98 | S | 0.3838 | 0.7420 | 0.3838 | 0.3039 | 0.3390 |
4 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | female | 35 | 1 | 0 | 113803 | 53.100 | C123 | S | 0.3838 | 0.7420 | 0.4862 | 0.4862 | 0.3390 |
5 | 3 | Allen, Mr. William Henry | male | 35 | 0 | 0 | 373450 | 8.050 | B96 B98 | S | 0.3838 | 0.1889 | 0.3838 | 0.3039 | 0.3390 |
AppendClusterTargetMean Gruppieren Sie die Daten und weisen Sie eine Clusternummer zu. (Wie bisher Append Cluster) Ersetzen Sie dann jede Clusternummer durch den Durchschnitt der Zielvariablen im Cluster und fügen Sie sie als neue Funktion hinzu. Fehlende Wertvervollständigung und Verarbeitung kategorialer Variablen sind erforderlich.
process = make_pipeline(
dl.ImputeNaN(),
dl.TargetMeanEncoding(),
dl.AppendClusterTargetMean()
)
process.fit_transform(X, y)
PassengerId | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | cluster_mean |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | 3 | 0.3838 | 0.1889 | 22 | 1 | 0 | 0.3838 | 7.250 | 0.3039 | 0.3390 | 0.3586 |
2 | 1 | 0.3838 | 0.7420 | 38 | 1 | 0 | 0.3838 | 71.283 | 0.3838 | 0.5536 | 0.3586 |
3 | 3 | 0.3838 | 0.7420 | 26 | 0 | 0 | 0.3838 | 7.925 | 0.3039 | 0.3390 | 0.3586 |
4 | 1 | 0.3838 | 0.7420 | 35 | 1 | 0 | 0.4862 | 53.100 | 0.4862 | 0.3390 | 0.3586 |
5 | 3 | 0.3838 | 0.1889 | 35 | 0 | 0 | 0.3838 | 8.050 | 0.3039 | 0.3390 | 0.3586 |
PermutationImportanceTest Dies ist eine Art von Merkmalsauswahlmethode. Mit oder ohne zufälliges Mischen von Daten für eine bestimmte Funktion Die Merkmalsauswahl wird unter dem Gesichtspunkt durchgeführt, um wie viel sich der Bewertungsindex des Modellvorhersageergebnisses verschlechtert. Wenn das zufällige Mischen der Daten keine großen Auswirkungen auf die Metrik hat, löschen Sie die Funktion, da sie nicht funktioniert.
process = make_pipeline(
dl.ImputeNaN(),
dl.TargetMeanEncoding(),
dl.PermutationImportanceTest()
)
process.fit_transform(X, y)
Pclass | Sex | Age | SibSp | Ticket | Fare | Cabin | Embarked |
---|---|---|---|---|---|---|---|
3 | 0.1889 | 22 | 1 | 0.3838 | 7.250 | 0.3039 | 0.3390 |
1 | 0.7420 | 38 | 1 | 0.3838 | 71.283 | 0.3838 | 0.5536 |
3 | 0.7420 | 26 | 0 | 0.3838 | 7.925 | 0.3039 | 0.3390 |
1 | 0.7420 | 35 | 1 | 0.4862 | 53.100 | 0.4862 | 0.3390 |
3 | 0.1889 | 35 | 0 | 0.3838 | 8.050 | 0.3039 | 0.3390 |
Name, PassengerId und Parch wurden entfernt. Sie können die gelöschten Funktionen auch wie folgt überprüfen.
process['permutationimportancetest'].drop_columns_
['PassengerId', 'Name', 'Parch']
Sie können die Empfindlichkeit auch anpassen, indem Sie den Schwellenwert anpassen. Siehe Dokument für Details.
Das Obige ist die neu hinzugefügte Vorverarbeitung. RankedEvaluationMetricEncoding ist manchmal genauer als TargetMeanEncoding, daher versuche ich es oft. Außerdem kann der Permutation Importance Test schneller ausgeführt werden als die Boruta- und Step-weise Methoden, sodass es keinen unerwarteten Unterschied gibt. Ich denke, dass es verwendet werden kann, wenn Sie die (?) Feature-Menge ernsthafter als DropLowAUC auswählen möchten.
Artikel veröffentlichen: [Aktualisiert Ver1.1.9] Ich habe eine Datenvorverarbeitungsbibliothek DataLiner für maschinelles Lernen erstellt
Die Vorverarbeitung vor 1.2 wird unten vorgestellt. Versuchen Sie, Titanic-Daten mit der Vorverarbeitungsbibliothek DataLiner (Drop) zu verarbeiten Versuchen Sie, Titanic-Daten mit der Vorverarbeitungsbibliothek DataLiner (Encoding) zu verarbeiten Versuchen Sie, Titanic-Daten mit der Vorverarbeitungsbibliothek DataLiner (Konvertierung) zu verarbeiten Versuchen Sie, Titanic-Daten mit der Vorverarbeitungsbibliothek DataLiner (Anhängen) zu verarbeiten