Schwierigkeiten, Sklearn und Pandas in einfache Kaggle-Aufgaben zu integrieren


7

Ich versuche, das Modul sklearn_pandas zu verwenden, um meine Arbeit in Pandas zu erweitern und einen Zeh in maschinelles Lernen zu tauchen, aber ich habe Probleme mit einem Fehler, den ich nicht wirklich zu beheben verstehe.

Ich habe den folgenden Datensatz für Kaggle durchgearbeitet .

Es handelt sich im Wesentlichen um eine Tabelle ohne Header (1000 Zeilen, 40 Features) mit Gleitkommawerten.

import pandas as pdfrom sklearn import neighbors
from sklearn_pandas import DataFrameMapper, cross_val_score
path_train ="../kaggle/scikitlearn/train.csv"
path_labels ="../kaggle/scikitlearn/trainLabels.csv"
path_test = "../kaggle/scikitlearn/test.csv"

train = pd.read_csv(path_train, header=None)
labels = pd.read_csv(path_labels, header=None)
test = pd.read_csv(path_test, header=None)
mapper_train = DataFrameMapper([(list(train.columns),neighbors.KNeighborsClassifier(n_neighbors=3))])
mapper_train

Ausgabe:

DataFrameMapper(features=[([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39], KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
       n_neighbors=3, p=2, weights='uniform'))])

So weit, ist es gut. Aber dann versuche ich die Passform

mapper_train.fit_transform(train, labels)

Ausgabe:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-6-e3897d6db1b5> in <module>()
----> 1 mapper_train.fit_transform(train, labels)

//anaconda/lib/python2.7/site-packages/sklearn/base.pyc in fit_transform(self, X, y,     **fit_params)
    409         else:
    410             # fit method of arity 2 (supervised transformation)
--> 411             return self.fit(X, y, **fit_params).transform(X)
    412 
    413 

//anaconda/lib/python2.7/site-packages/sklearn_pandas/__init__.pyc in fit(self, X, y)
    116         for columns, transformer in self.features:
    117             if transformer is not None:
--> 118                 transformer.fit(self._get_col_subset(X, columns))
    119         return self
    120 

TypeError: fit() takes exactly 3 arguments (2 given)`

Was mache ich falsch? Obwohl die Daten in diesem Fall alle gleich sind, plane ich, einen Workflow für Gemische mit kategorialen, nominalen und Gleitkommafeatures zu erstellen, und sklearn_pandas schien logisch zu passen.


1
Ihr zweiter Import wird nicht korrekt eingerückt. Ich würde den Code selbst korrigieren, wenn die Bearbeitung lang genug wäre.
Logc

Antworten:


6

Hier ist ein Beispiel, wie man Pandas und Sklearn dazu bringt, nett zu spielen

Angenommen, Sie haben zwei Spalten, die beide Zeichenfolgen sind, und Sie möchten vektorisieren. Sie wissen jedoch nicht, welche Vektorisierungsparameter zu der besten Downstream-Leistung führen.

Erstellen Sie den Vektorisierer

to_vect = Pipeline([('vect',CountVectorizer(min_df =1,max_df=.9,ngram_range=(1,2),max_features=1000)),
                    ('tfidf', TfidfTransformer())])

Erstellen Sie das DataFrameMapper-Objekt.

full_mapper = DataFrameMapper([
        ('col_name1', to_vect),
        ('col_name2',to_vect)
    ])

Dies ist die vollständige Pipeline

full_pipeline  = Pipeline([('mapper',full_mapper),('clf', SGDClassifier(n_iter=15, warm_start=True))])

Definieren Sie die Parameter, die der Scan berücksichtigen soll

full_params = {'clf__alpha': [1e-2,1e-3,1e-4],
                   'clf__loss':['modified_huber','hinge'],
                   'clf__penalty':['l2','l1'],
                   'mapper__features':[[('col_name1',deepcopy(to_vect)),
                                        ('col_name2',deepcopy(to_vect))],
                                       [('col_name1',deepcopy(to_vect).set_params(vect__analyzer= 'char_wb')),
                                        ('col_name2',deepcopy(to_vect))]]}

Das ist es! - Beachten Sie jedoch, dass mapper_features ein einzelnes Element in diesem Wörterbuch sind. Verwenden Sie daher eine for-Schleife oder itertools.product, um eine FLAT-Liste aller to_vect-Optionen zu erstellen, die Sie berücksichtigen möchten. Dies ist jedoch eine separate Aufgabe außerhalb des Bereichs der Frage.

Erstellen Sie anschließend den optimalen Klassifikator oder was auch immer Ihre Pipeline endet

gs_clf = GridSearchCV(full_pipe, full_params, n_jobs=-1)

7

Ich habe es noch nie benutzt sklearn_pandas, aber nach dem Lesen des Quellcodes sieht es so aus, als wäre dies ein Fehler auf ihrer Seite. Wenn Sie nach der Funktion suchen, die die Ausnahmey auslöst , können Sie feststellen, dass das Argument verworfen wird (es überlebt nicht einmal bis zur Dokumentzeichenfolge), und die innere fitFunktion erwartet ein weiteres Argument, wahrscheinlich y:

def fit(self, X, y=None):
    '''
    Fit a transformation from the pipeline

    X       the data to fit
    '''
    for columns, transformer in self.features:
        if transformer is not None:
            transformer.fit(self._get_col_subset(X, columns))
    return self

Ich würde empfehlen, dass Sie ein Problem in ihrem Bug-Tracker öffnen .

UPDATE :

Sie können dies testen, wenn Sie Ihren Code über IPython ausführen. Zusammenfassend lässt sich %pdb onsagen, dass die Ausnahme vom Python-Debugger erfasst wird , wenn Sie die Magie direkt vor dem Ausführen des problematischen Aufrufs verwenden. Sie können also ein wenig herumspielen und sehen, dass das Aufrufen der fitFunktion mit den Beschriftungswerten y[0]funktioniert - siehe letzte Zeile mit der pdb>Eingabeaufforderung. (Die CSV-Dateien werden von Kaggle heruntergeladen, mit Ausnahme der größten, die nur ein Teil der realen Datei ist.)

In [1]: import pandas as pd

In [2]: from sklearn import neighbors

In [3]: from sklearn_pandas import DataFrameMapper, cross_val_score

In [4]: path_train ="train.csv"

In [5]: path_labels ="trainLabels.csv"

In [6]: path_test = "test.csv"

In [7]: train = pd.read_csv(path_train, header=None)

In [8]: labels = pd.read_csv(path_labels, header=None)

In [9]: test = pd.read_csv(path_test, header=None)

In [10]: mapper_train = DataFrameMapper([(list(train.columns),neighbors.KNeighborsClassifier(n_neighbors=3))])

In [13]: %pdb on

In [14]: mapper_train.fit_transform(train, labels)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-14-e3897d6db1b5> in <module>()
----> 1 mapper_train.fit_transform(train, labels)

/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sklearn/base.pyc in fit_transform(self, X, y, **fit_params)
    409         else:
    410             # fit method of arity 2 (supervised transformation)
--> 411             return self.fit(X, y, **fit_params).transform(X)
    412
    413

/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sklearn_pandas/__init__.pyc in fit(self, X, y)
    116         for columns, transformer in self.features:
    117             if transformer is not None:
--> 118                 transformer.fit(self._get_col_subset(X, columns))
    119         return self
    120

TypeError: fit() takes exactly 3 arguments (2 given)
> /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sklearn_pandas/__init__.py(118)fit()
    117             if transformer is not None:
--> 118                 transformer.fit(self._get_col_subset(X, columns))
    119         return self

ipdb> l
    113
    114         X       the data to fit
    115         '''
    116         for columns, transformer in self.features:
    117             if transformer is not None:
--> 118                 transformer.fit(self._get_col_subset(X, columns))
    119         return self
    120
    121
    122     def transform(self, X):
    123         '''
ipdb> transformer.fit(self._get_col_subset(X, columns), y[0])
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
           n_neighbors=3, p=2, weights='uniform')

Vielen Dank. Ich hätte nicht gewusst, was es verursacht hatte. Ich weiß nur die meiste Zeit, dass meine Arbeit schuld ist :)
elksie5000

@ elksie5000: Ich habe hinzugefügt, wie man den Anruf debuggt. Ich hoffe, der letzte Aufruf ist das, was Sie von einem erfolgreichen Aufruf der Funktion (?) Erwarten würden. Ansonsten ist es immer gut zu wissen, wie man mit pdb:) in den Code tritt :)
logc

Ich muss zugeben, dass pdb etwas war, das ich mir noch einmal angesehen habe, nachdem ich das Python for Data Analysis-Buch von Wes McKinney durchgearbeitet hatte. Ich arbeite bereits in IPython, war aber mit den Druckanweisungen einigermaßen zufrieden. Danke nochmal.
Elksie5000

Nebenbei bemerkt, die Debugger-Eingabeaufforderung sagt "ipdb", da es sich um den ipython-Debugger handelt - dies ist eine zusätzliche Installation in meinem Setup. Unter normalen Umständen wird die reguläre PDF-Datei aufgerufen. Habe gerade diesen Unterschied bemerkt.
Logc
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.