Nous avons publié DataLiner 1.2.0, une bibliothèque de prétraitement pour l'apprentissage automatique. Cette fois, j'ai ajouté environ 6 nouveaux prétraitements, je voudrais donc le présenter.
GitHub: https://github.com/shallowdf20/dataliner PyPI: https://pypi.org/project/dataliner/ Document: https://shallowdf20.github.io/dataliner/preprocessing.html
Installez à l'aide de pip.
! pip install -U dataliner
Utilisez les données Titanic comme d'habitude.
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 |
Jetons un coup d'oeil maintenant.
AppendArithmeticFeatures Quatre règles sont appliquées entre les quantités d'entités incluses dans les données, et une nouvelle quantité d'entités avec un indice d'évaluation plus élevé que la quantité d'entités utilisée dans le calcul est ajoutée. L'évaluation se fait par régression logistique. Par défaut, l'indice de multiplication et d'évaluation est AUC, mais l'addition, la soustraction et la division, la précision, etc. sont également disponibles. Il est nécessaire de renseigner les valeurs manquantes avant de l'utiliser.
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 |
De cette manière, de nouvelles fonctionnalités sont ajoutées.
RankedEvaluationMetricEncoding Après avoir fait de chaque catégorie une variable fictive, une régression logistique est effectuée avec chaque colonne de catégorie et variable objective. Créez un classement à l'aide de la métrique résultante (AUC par défaut) et encodez la catégorie d'origine avec ce classement. Étant donné que la régression logistique de 5 fois est adaptée à chaque catégorie, la quantité de calcul sera énorme pour les fonctionnalités à cardinalité élevée, donc à l'avance Il est recommandé de réduire la cardinalité en utilisant Drop High Cardinality ou Group Rare Category.
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 |
Vous pouvez également vérifier l'importance de chaque catégorie dans la variable catégorielle en générant le classement.
process['rankedevaluationmetricencoding'].dic_corr_['Embarked']
Category | Rank | Evaluation_Metric |
---|---|---|
S | 1 | 0.5688 |
C | 2 | 0.5678 |
Q | 3 | 0.4729 |
AppendClassificationModel Le classificateur est formé en fonction des données d'entrée et le résultat de la prédiction est ajouté en tant que nouvelle quantité de caractéristiques. Le modèle peut être n'importe quel modèle compatible sklearn. De plus, si la méthode predict_proba est implémentée Vous pouvez ajouter un score au lieu d'une étiquette en donnant l'argument probabilité = Vrai. Puisque le modèle est entraîné, la complétion des valeurs manquantes et le traitement des variables catégorielles sont fondamentalement nécessaires.
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 |
C'est le cas lorsque probabilité = Vrai. Une note pour la classe 1 sera attribuée.
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 Les différents encodeurs inclus dans le DataLiner remplacent directement les colonnes de catégorie par des nombres encodés. Cependant, dans certains cas, vous souhaiterez peut-être l'utiliser comme nouvelle quantité de fonctionnalités sans la remplacer. (TargetMeanEncoder, etc.) Dans ce cas, enveloppez Encoder dans cette classe et il sera ajouté en tant que quantité de fonctionnalités.
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 Regroupez les données et attribuez un numéro de cluster. (Identique à Ajouter un cluster jusqu'à présent) Remplacez ensuite chaque numéro de cluster par la moyenne des variables objectives du cluster et ajoutez-le en tant que nouvelle fonctionnalité. La saisie des valeurs manquantes et le traitement des variables catégorielles sont nécessaires.
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 Il s'agit d'un type de méthode de sélection de caractéristiques. Avec ou sans mélange aléatoire des données pour une certaine fonctionnalité La sélection des caractéristiques est effectuée du point de vue de la détérioration de l'indice d'évaluation du résultat de la prédiction du modèle. Si la lecture aléatoire des données n'a pas beaucoup d'effet sur la métrique, supprimez la fonctionnalité car elle ne fonctionne pas.
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 |
Nom, PassengerId et Parch ont été supprimés. Vous pouvez également vérifier les fonctionnalités supprimées comme suit.
process['permutationimportancetest'].drop_columns_
['PassengerId', 'Name', 'Parch']
Vous pouvez également régler la sensibilité en ajustant le seuil de seuil. Voir le document pour plus de détails.
Ce qui précède est le prétraitement nouvellement ajouté. ClasséEvaluationMetricEncoding est parfois plus précis que TargetMeanEncoding, donc je l'essaie souvent. De plus, le test d'importance de la permutation peut être exécuté plus rapidement que les méthodes Boruta et Step-wise, il n'y a donc aucune différence inattendue. Je pense qu'il peut être utilisé lorsque vous souhaitez sélectionner le montant de la fonctionnalité (?) Plus sérieusement que DropLowAUC.
Article de sortie: [mise à jour Ver1.1.9] J'ai créé une bibliothèque de prétraitement de données DataLiner pour l'apprentissage automatique
Le prétraitement avant la version 1.2 est présenté ci-dessous. Essayez de traiter les données Titanic avec la bibliothèque de prétraitement DataLiner (Drop) Essayez de traiter les données Titanic avec la bibliothèque de prétraitement DataLiner (encodage) Essayez de traiter les données Titanic avec la bibliothèque de prétraitement DataLiner (conversion) Essayez de traiter les données Titanic avec la bibliothèque de prétraitement DataLiner (Append)