Der Fortschritt der Tools rund um das maschinelle Lernen ist so schnell, dass es viele Erfahrungen gibt, dass neue Funktionen seit mehreren Monaten ohne Bestätigung implementiert wurden. Es scheint, dass CatBoost Textelemente innerhalb des Modells verarbeiten konnte, bevor ich es wusste. Probieren Sie die Textspaltenspezifikationsfunktion von CatBoost aus
Als ich es nachgeschlagen habe, scheint es, dass es aus v0.22
hinzugefügt wurde, das am 03.03.2020 veröffentlicht wurde.
Ich weiß nicht ... lol
Ich habe mich gefragt, welche Art von Verarbeitung durchgeführt werden soll, also habe ich sie sofort untersucht.
Einzelheiten finden Sie weiter unten.
Verwenden Sie wie im Tutorial "rotten_tomatoes" als Daten. Ein Datensatz mit einer Mischung aus numerischen Elementen, Kategorieelementen und Textelementen mit der Bewertung_10 als Zielvariable von 0 bis 10.
from catboost import Pool, CatBoostClassifier
from catboost.datasets import rotten_tomatoes
from sklearn.metrics import accuracy_score
#Liste der Kategorieelemente
list_cat_features = ['rating_MPAA', 'studio', 'fresh', 'critic', 'top_critic', 'publisher']
#Liste der Textelemente
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):
#Da es sich um eine Funktionsprüfung handelt, wird das Element, das zum Erstellen von Features Zeit benötigt, gelöscht
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
#Aufgeteilt in Zug und Test
X_train, X_test, y_train, y_test = get_processed_rotten_tomatoes()
#Nur Textelemente anzeigen
X_train[list_text_features].head()
Übergeben Sie einfach die Liste der Elementnamen an text_features
wie bei category_features
.
Die folgenden Klassen und Methoden können "text_features" als Argumente verwenden.
Setzen Sie es hier auf "Pool ()".
#Zugdatensatz
train_pool = Pool(
X_train,
y_train,
cat_features=list_cat_features,
text_features=list_text_features,
feature_names=list(X_train)
)
#Testdatensatz
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'Wird nicht unterstützt, tritt CatBoostError auf
'random_seed': 0,
'verbose': 100
}
#Klassifizierung mehrerer Klassen
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
Da "random_seed" im Tutorial nicht festgelegt ist, stimmt es nicht genau mit der "Genauigkeit" im Tutorial überein, aber das Ergebnis ist fast das gleiche. Gemäß dem Überprüfungsergebnis des Lernprogramms beträgt der Wert für das Textmerkmal 0,4562, wenn es entfernt wird, sodass die Genauigkeit um mehrere Punkte verbessert wird.
Bei der Konvertierung von einem Textelement in ein numerisches Element für das durch "text_features" angegebene Element können drei Elemente festgelegt werden.
tokenizers
[doc]dictionaries
[doc]feature_calcers
[doc]Vor Tokenizern
['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 :)']
Nach Tokenizern (geteilt durch ein Leerzeichen halber Breite als Trennzeichen)
[['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', ':)']]
Es ist möglich, die obige Kombination mit feature_processing
anzugeben.
Diese Einstellungen werden als Argument als Diktat an catboost_params
übergeben.
Grundeinstellung
{
"tokenizers" : [{
"tokenizer_id" : "Space", # "Space"Definieren Sie Tokenizer mit dem Namen
"separator_type" : "ByDelimiter", #Durch Trennzeichen aufgeteilt
"delimiter" : " " #Separator ist ein Raum mit halber Breite
}],
"dictionaries" : [{
"dictionary_id" : "BiGram", # "BiGram"Definieren Sie Wörterbücher mit dem Namen
"max_dictionary_size" : "50000",
"occurrence_lower_bound" : "3",
"gram_order" : "2" # n-Gramm n=2
}, {
"dictionary_id" : "Word", # "Word"Definieren Sie Wörterbücher mit dem Namen
"max_dictionary_size" : "50000",
"occurrence_lower_bound" : "3",
"gram_order" : "1" # n-Gramm n=1
}],
"feature_processing" : {
"default" : [{ # tokenizers, dictionaries, feature_Definieren Sie eine Kombination von Kalzinatoren
"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
Da verschiedene Kombinationen definiert werden können, ist es stark erweiterbar, es gibt jedoch viele Möglichkeiten, Werte einzustellen. Lesen Sie daher die Referenz.
OneHotEncoding ist aufgrund der internen Verarbeitung von Kategorieelementen seit einiger Zeit nicht mehr erforderlich. Jetzt, da wir Textelemente verarbeiten können, haben wir Textelemente hinzugefügt. Es ist jetzt möglich, ein Basismodell zu erstellen, ohne Feature-Mengen auch mit Tabellendaten zu erstellen. LightGBM ist heutzutage das am häufigsten verwendete Basismodell in Kaggle. Cat Boost wird wahrscheinlich in Zukunft zunehmen. Ich werde es in mich aufnehmen.
Übrigens wurden große Pakete in den letzten Monaten umfassend aktualisiert. Die Inhalte, an denen ich persönlich interessiert war, sind wie folgt.
Neben dem Hinzufügen von Funktionen mit hoher Wirkung wird auch die Beutelbefestigung durchgeführt. Es ist schwer zu jagen, aber es ist nur ein fröhlicher Schrei.