Kaggle 3: die harte Gangart

Nachdem ich einiges ausprobiert hab im Titanic Wettbewerb, versuch ich jetzt, in einem anderen Wettbewerb nach vorne zu kommen. Dabei stolpere ich jetzt knallhart über die Realität.

In diesem Wettbewerb gibt es sowohl numerische Daten als auch Text. Sklearn hat ein wunderbares Konzept um Daten auseinander zu ziehen und nachher wieder zusammenzufügen, sehr wiederverwendbar und clean, aber die Details sind dann doch schlecht vorhersehbar für ein Grünschnabel wie mir.
Das Konzept ist der Pipeline. Du definierst einmal, welche Schritte nacheinander durchgeführt werden und dann kann das Training und die tatsächliche Vorhersage nacheinander durchgeführt werden. Das geht auch, weil die verschiedene Werkzeuge im sklearn Werkzeugkasten alle die Methoden Methoden wie fit, transform und predict
haben.
Heute ging das aber schief – die Eingangsparameter und Ergebnisse sind doch nicht so verschaltbar wie ich es erwartet hatte.

So sieht es aus:

pl = Pipeline([
        ('union', FeatureUnion(
            transformer_list = [
                ('numeric_features', Pipeline([
                    ('selector', get_numeric_data),
                    ('imp', Imputer()),
                    ('scale', StandardScaler())
                ])),
                ('text_features', Pipeline([
                    ('selector', get_text_data),
                    ('vectorizer', CountVectorizer()),
                    ('dim_red', SelectKBest(chi2, 300))
                ]))
             ])
        ),
        ('clf', SVC(gamma=my_gamma, C=my_C, kernel=my_kernel, probability=True))
    ])

pl.fit(X_train, y_train)
y_val_pred = pl.predict_proba(X_val)

Die Probleme:

  • Der Unterpipeline 'numeric_features' arbeitet mit einem Pandas DataFrame, .während 'text_features' mit einem Pandas Series Struktur arbeitet.
  • 'text_features' liefert dann einen ’sparse matrix‘ Struktur zurück, wo nicht alle ('clf') Classifier mit umgehen können. Deswegen gerade den Resourcenfressenden Support Vector Machine, obwohl das Ergebnis wahrscheinlich suboptimal sein wird. Ich warte mal ab, was weiter passiert, das ganze läuft jetzt seit 2 Stunden, die Trainingsphase ist durch, jetzt ist das pl.fit für die aktuelle Vorhersage dran.

[Edit 1, 8. März:] Wenn man das problem richtig aussprechen kann, kann Google unterstützen bei der Lösungsfindung. Es gibt eine Bibliothek, mlxtend, die eine Funktion bereitstellt, um einen sparse matrix in einen dense matrix zu verwandeln. Das funktioniert, bringt aber meinen Rechner an den Grenzen seiner Speicherkapazitäten. Hier muss ich an der eine Seite vielleicht einige Dienste abschalten, an der andere Seite im Skript was machen.

Es hat sich aber (sei es minimal, aber ich bin noch nicht am Ende!) gelohnt:

climbing_the_ranks.3

[Edit 2, 8. März] Inzwischen bin ich sogar bei 0,60419 und habe ich einen ersten Durchlauf gestartet, wo ich auch die Beschreibung mitnehme, ein langes Freitextfeld. Ich hoffe, dass ich dann mit folgender Pipeline unter 0.6 komme:

 
pl = Pipeline([
        ('union', FeatureUnion(
            transformer_list = [
                ('numeric_features', Pipeline([
                    ('selector', get_numeric_data),
                    ('imp', Imputer()),
                    ('scale', StandardScaler())
                ])),
                ('text_feature1', Pipeline([
                    ('selector', get_text_data),
                    ('vectorizer', CountVectorizer()),
                    ('dim_red', SelectKBest(chi2, 100))
                ])),
                ('text_feature2', Pipeline([
                    ('selector', get_description),
                    ('vectorizer', vectorizer),
                    ('dim_red', SelectKBest(chi2, 100))
                ]))
             ])
        ),
        ('to_dense', DenseTransformer()),
        ('clf', GradientBoostingClassifier(n_estimators = 1000))
    ])
pl.fit(X_train, y_train)
Advertisements

Einen Kommentar schreiben

Required fields are marked *

*
*

%d Bloggern gefällt das: