[PYTHON] Bevor ich es wusste, wurde Cat Boost überentwickelt, und selbst die Vorverarbeitung von Textelementen wurde unnötig.

unsplash-logoBen White

Einführung

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.

Umgebung

Referenz

Einzelheiten finden Sie weiter unten.

Wie benutzt man

Datenaufbereitung

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.

image.png

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()

image.png

Einstellmethode

Ü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)

Bewertungsindex

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.

Kommentar

Bei der Konvertierung von einem Textelement in ein numerisches Element für das durch "text_features" angegebene Element können drei Elemente festgelegt werden.

Streit

Verarbeitetes Bild (Tokenizer)

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

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.

abschließend

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.

Recommended Posts

Bevor ich es wusste, wurde Cat Boost überentwickelt, und selbst die Vorverarbeitung von Textelementen wurde unnötig.
Der Fall, dass die Installation von Pip einfacher wurde, bevor ich es wusste
P100-PCIE-16GB wurde der GPU von Google Colab hinzugefügt, bevor ich es wusste