Catboost Categorical Features Handling-Optionen (CTR-Einstellungen)?

11

Ich arbeite mit einem Datensatz mit einer großen Anzahl von kategorialen Merkmalen (> 80%), die eine kontinuierliche Zielvariable (dh Regression) vorhersagen. Ich habe ziemlich viel darüber gelesen, wie man mit kategorialen Merkmalen umgeht. Und erfuhr , dass One-Hot - Codierung ich in Vergangenheit verwendet habe vor allem sehr schlechte Idee ist , wenn es darum geht, eine Menge kategorischer Funktionen mit vielen Ebenen (lesen Sie diese Post , und dies ).

Während ich auf Methoden wie die zielbasierte Codierung (Glättung) von kategorialen Features gestoßen bin, die häufig auf dem Mittelwert der Zielwerte für jedes Feature basieren, möglicherweise diesen Beitrag / Kernel in Kaggle. Trotzdem kämpfe ich darum, einen konkreteren Weg zu finden, bis ich CatBoost als Open-Source-Gradienten für Entscheidungsbäume fand, die letztes Jahr von der Yandex-Gruppe veröffentlicht wurden. Sie scheinen zusätzliche statistische Zähloptionen für kategoriale Funktionen zu bieten, die wahrscheinlich viel effizienter sind als die einfache One-Hot-Codierung oder Glättung.

Das Problem ist, dass die Dokumentation nicht hilfreich ist, um CTR-Einstellungen festzulegen . Ich habe verschiedene Wege ausprobiert, aber es funktioniert einfach nicht. Das Dokument sagt CTR-Einstellung als simple_ctr , angegeben als ( Abschnitt CTR-Einstellung ):

['CtrType[:TargetBorderCount=BorderCount][:TargetBorderType=BorderType][:CtrBorderCount=Count][:CtrBorderType=Type][:Prior=num_1/denum_1]..[:Prior=num_N/denum_N]',
 'CtrType[:TargetBorderCount=BorderCount][:TargetBorderType=BorderType][:CtrBorderCount=Count][:CtrBorderType=Type][:Prior=num_1/denum_1]..[:Prior=num_N/denum_N]',
  ...]

Hier ist ein super einfaches Beispiel, die Daten sehen so aus:

import pandas as pd
import catboost
data = [{'profit': '342','country': 'holland','account': 'Jones LLC', 'saving': 150, 'debt': -60, 'age': 28},
         {'profit': '875','country': 'germany','account': 'Alpha Co',  'saving': 200, 'debt': -10, 'age': 42},
         {'profit': '127','country': 'italy','account': 'Blue Inc',  'saving': 50,  'debt': -300,  'age': 38 }]
df = pd.DataFrame(data)

Hier ist ein einfacher Catboost-Regressor:

X_train = df.drop(['profit'],axis=1)
Y_train = df['profit']
categorical_features_indices = [0,2]

train_pool = catboost.Pool(X_train, Y_train, cat_features=categorical_features_indices)

model = catboost.CatBoostRegressor(
    depth=3,
    iterations=5,
    eval_metric='RMSE',
    simple_ctr=None)

model.fit(train_pool);

Das simple_ctr , eine der CTR-Einstellungen, ist das Problem !! Es ist schade, denn es sieht so aus, als ob das Paket verschiedene Methoden bietet, bisher keine Möglichkeit, darauf zuzugreifen.

UPDATE 9. August 2018: Vor ein paar Tagen habe ich dieses Problem beim Catboost-Entwickler angesprochen, siehe hier , und sie haben ein Ticket dafür geöffnet, um ein Tutorial bereitzustellen.

TwinPenguins
quelle
Hier ist die Beschreibung über Catboost auf kategorial vaiable: tech.yandex.com/catboost/doc/dg/concepts/…
DiveIntoML
Ja, ich kenne den Link. es gibt eine detaillierte theoretische Beschreibung. Es wird jedoch nicht genug beschrieben, wie man es benutzt. Ich meine praktische Gebrauchsanweisungen. Ich habe es vor ein paar Monaten versucht und es war nicht einfach.
TwinPenguins
1
Ich verwende derzeit nur den Parameter one_hot_max_size und verstehe, dass alles, was nicht heiß codiert ist, mit der mittleren Zielerweiterungscodierung codiert wird. Ich freue mich auf die zusätzliche offizielle Dokumentation, um die ctr-Einstellungen besser zu verstehen und wie ich damit spielen kann.
Garima Jain

Antworten:

2

Ich fand heraus, dass man zum Festlegen der ctrParameter und aller Komponenten eine Liste von Zeichenfolgen übergeben sollte, wobei jede Zeichenfolge die ctrTypeund eine ihrer Komponenten enthalten sollte:

  • Das erste Wort der Zeichenfolge sollte ctrTypebeispielsweise a sein Borders:(klicken Sie hier, um die Catboost-Parameter anzuzeigen).
  • Dann sollte eine Komponente der ctrTypefolgen. Zum Beispiel TargetBorderType=5.
  • Alles zusammen 'Borders:TargetBorderType=5'.
  • Wiederholen Sie den Vorgang, um eine andere Komponente festzulegen und die neue Zeichenfolge zur Liste hinzuzufügen.

Beispiel mit zwei Komponenten:

simple_ctr = ['Borders:TargetBorderType=Uniform', 'Borders:TargetBorderCount=50']
Giannis Krilis
quelle
Es funktioniert, danke für die Erklärung, und es tut mir leid, dass ich lange gebraucht habe, um es noch einmal zu überprüfen.
TwinPenguins
1

Haben Sie versucht, das unten angegebene Format zu verwenden:

['CtrType[:TargetBorderCount=BorderCount][:TargetBorderType=BorderType][:CtrBorderCount=Count][:CtrBorderType=Type][:Prior=num_1/denum_1]..[:Prior=num_N/denum_N]'

['BinarizedTargetMeanValue[:TargetBorderCount=1][:TargetBorderType=Uniform][:CtrBorderCount=5][:CtrBorderType=Uniform][:Prior=1]']
Interessierter Programmierer
quelle
Ist das eine Antwort? Es fühlt sich eher wie eine Frage / ein Kommentar an.
Stephen Rauch
@Interested_Programmer: Es funktioniert nicht, versuchen Sie es selbst in dem Beispiel, das ich gerade bereitgestellt habe. Haben Sie es getestet oder einfach in der Dokumentation gefunden?
TwinPenguins
Ich entschuldige mich bei StephenRauch. Ich konnte mein Notebook nicht ausführen, fand es jedoch in anderen Funktionen verwendbar, um dem Format zu folgen. Im Nachhinein hätte ich es als Kommentar hinzufügen sollen. Ich warte auch darauf, dass die Entwickler das neue Tutorial veröffentlichen.
Interested_Programmer
1
auch das funktioniert. simple_ctr = ['BinarizedTargetMeanValue'])
Interested_Programmer
1
Vielen Dank. Aber wie Sie gezeigt haben, funktioniert es nur als simple_ctr = ['BinarizedTargetMeanValue'])! Die anderen Optionen können nicht wie [: TargetBorderCount = BorderCount] usw. eingegeben werden. Wenn Sie wissen, wie Sie andere zusammen mit CtrType füttern können, lassen Sie es mich wissen.
TwinPenguins