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é.
Voir ci-dessous pour plus de détails, extraits ici le cas échéant.
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.
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()
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)
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.
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.
tokenizers
[doc]dictionaries
[doc]feature_calcers
[doc]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
{
"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.
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.