[PYTHON] Avant que je ne le sache, Cat Boost est devenu super évolué et même le prétraitement des éléments de texte est devenu inutile.

unsplash-logoBen White

introduction

La progression des outils autour du machine learning est si rapide qu'il existe de nombreuses expériences que de nouvelles fonctions ont été implémentées sans confirmation depuis plusieurs mois. Il semble que CatBoost ait pu traiter les éléments de texte dans le modèle avant que je ne le sache. Essayez la fonction de spécification de colonne de texte de CatBoost

Quand je l'ai recherché, il semble qu'il ait été ajouté à partir de v0.22 sorti le 03/03/2020. Je ne sais pas ... lol Je me demandais quel genre de traitement allait être fait, alors j'ai immédiatement enquêté.

environnement

référence

Voir ci-dessous pour plus de détails, extraits ici le cas échéant.

Comment utiliser

Préparation des données

Comme pour le didacticiel, utilisez rotten_tomatoes comme données. Un ensemble de données avec un mélange d'éléments numériques, d'éléments de catégorie et d'éléments de texte avec rating_10 comme variable objectif de 0 à 10.

image.png

from catboost import Pool, CatBoostClassifier
from catboost.datasets import rotten_tomatoes
from sklearn.metrics import accuracy_score

#Liste des éléments de catégorie
list_cat_features = ['rating_MPAA', 'studio', 'fresh', 'critic', 'top_critic', 'publisher']

#Liste des éléments de texte
list_text_features = ['synopsis', 'genre', 'director', 'writer', 'review']

def get_processed_rotten_tomatoes():
    train, test = rotten_tomatoes()
    
    def fill_na(df, features):
        for feature in features:
            df[feature].fillna('', inplace=True)

    def preprocess_data_part(data_part):
        #Puisqu'il s'agit d'un contrôle d'opération, l'élément qui prend du temps pour créer des fonctionnalités est le drop
        data_part = data_part.drop(['id', 'theater_date', 'dvd_date', 'rating', 'date'], axis=1)
        
        fill_na(data_part, list_cat_features)
        fill_na(data_part, list_text_features)

        X = data_part.drop(['rating_10'], axis=1)
        y = data_part['rating_10']
        
        return X, y
    
    X_train, y_train = preprocess_data_part(train)
    X_test, y_test = preprocess_data_part(test)

    return X_train, X_test, y_train, y_test


#Divisé en train et test
X_train, X_test, y_train, y_test = get_processed_rotten_tomatoes()

#Afficher uniquement les éléments de texte
X_train[list_text_features].head()

image.png

Méthode de réglage

Passez simplement la liste des noms d'éléments à text_features comme avec category_features.

Les classes et méthodes suivantes peuvent prendre text_features comme arguments.

Ici, réglez-le sur Pool ().


#ensemble de données de train
train_pool = Pool(
    X_train, 
    y_train, 
    cat_features=list_cat_features,
    text_features=list_text_features,
    feature_names=list(X_train)
)

#jeu de données de test
test_pool = Pool(
    X_test, 
    y_test, 
    cat_features=list_cat_features,
    text_features=list_text_features,
    feature_names=list(X_test)
)

catboost_default_params = {
    'iterations': 1000,
    'learning_rate': 0.03,
    'eval_metric': 'Accuracy',
    'task_type': 'GPU',  # 'CPU'N'est pas pris en charge, CatBoostError se produira
    'random_seed': 0, 
    'verbose': 100

}

#Classification multi-classes
clf = CatBoostClassifier(**catboost_default_params)
clf.fit(train_pool)

Index d'évaluation

y_pred = clf.predict(X_test)
print(f"accuracy = {accuracy_score(y_test, y_pred):.4f}")
accuracy = 0.4699

Puisque random_seed n'est pas défini dans le didacticiel, il ne correspond pas exactement à ʻaccuracy` dans le didacticiel, mais le résultat est presque le même. Selon le résultat de la vérification du didacticiel, lorsque la quantité de fonction de texte est supprimée, elle est de 0,4562, de sorte que la précision est améliorée de plusieurs points.

Commentaire

Lors de la conversion d'un élément de texte en un élément numérique pour l'élément spécifié par text_features, trois éléments peuvent être définis.

argument

Image traitée (tokenizer)

Avant les jetons


['cats so cute :)',
 'mouse skare ...',
 'cat defeated mouse',
 'cute : mice gather army !',
 'army mice defeated cat :(',
 'cat offers peace',
 'cat skared :(',
 'cat mouse live peace :)']

Après les jetons (séparés avec un espace demi-largeur comme délimiteur)


[['cat', 'so', 'cute', ':)'],
 ['mouse', 'skare', '...'],
 ['cat', 'defeat', 'mouse'],
 ['cute', ':', 'mice', 'gather', 'army', '!'],
 ['army', 'mice', 'defeat', 'cat', ':('],
 ['cat', 'offer', 'peace'],
 ['cat', 'skare', ':('],
 ['cat', 'mouse', 'live', 'peace', ':)']]

Il est possible de spécifier la combinaison ci-dessus avec feature_processing. Ces paramètres sont passés à catboost_params comme argument en tant que dict.

Réglage initial

Réglage initial


{
    "tokenizers" : [{
        "tokenizer_id" : "Space",  # "Space"Définissez les jetons par le nom de
        "separator_type" : "ByDelimiter",  #Fractionner par délimiteur
        "delimiter" : " "  #Le séparateur est un espace demi-largeur
    }],

    "dictionaries" : [{
        "dictionary_id" : "BiGram",  # "BiGram"Définissez les dictionnaires par le nom de
        "max_dictionary_size" : "50000", 
        "occurrence_lower_bound" : "3",
        "gram_order" : "2"  # n-gramme n=2
    }, {
        "dictionary_id" : "Word",  # "Word"Définissez les dictionnaires par le nom de
        "max_dictionary_size" : "50000",
        "occurrence_lower_bound" : "3",
        "gram_order" : "1"  # n-gramme n=1
    }],

    "feature_processing" : {
        "default" : [{  # tokenizers, dictionaries, feature_Définir une combinaison de calculateurs
            "dictionaries_names" : ["BiGram", "Word"],
            "feature_calcers" : ["BoW"],
            "tokenizers_names" : ["Space"]
        }, {
            "dictionaries_names" : ["Word"],
            "feature_calcers" : ["NaiveBayes"],
            "tokenizers_names" : ["Space"]
        }],
    }
}

https://catboost.ai/docs/references/text-processing__test-processing__default-value.html

Étant donné que diverses combinaisons peuvent être définies, il est hautement extensible, mais il existe de nombreux choix de valeurs de réglage, alors reportez-vous à la référence.

en conclusion

OneHotEncoding est inutile depuis un certain temps en raison du traitement interne des éléments de catégorie. Maintenant que nous pouvons gérer les éléments de texte, nous avons inclus des éléments de texte. Il est désormais possible de créer un modèle de ligne de base sans créer de quantités d'entités, même avec des données de table. LightGBM est le modèle de base le plus utilisé à Kaggle ces jours-ci, Cat Boost est susceptible d'augmenter à l'avenir. Je vais le prendre en moi.

À propos, les principaux packages ont subi des mises à jour majeures au cours des derniers mois. Les contenus qui m'intéressaient personnellement sont les suivants.

En plus d'ajouter des fonctionnalités à fort impact, la correction des sacs est également en cours. C'est difficile à chasser, mais c'est juste un cri joyeux.

Recommended Posts

Avant que je ne le sache, Cat Boost est devenu super évolué et même le prétraitement des éléments de texte est devenu inutile.
Le cas où l'installation de pip est devenue plus facile avant que je ne le sache
P100-PCIE-16GB a été ajouté au GPU de Google Colab avant que je le sache