Frage

Ich versuche, das Modul sklearn_pandas zu verwenden, um die Arbeit, die ich in Pandas mache, zu erweitern und einen Zeh in maschinelles Lernen zu tauchen, aber ich kämpfe mit einem Fehler, den ich nicht wirklich verstehe.

Ich habe den folgenden Datensatz durchgearbeitet Kaggle.

Es handelt sich im Wesentlichen um eine ungehörte Tabelle (1000 Zeilen, 40 Merkmale) mit schwimmenden Punktwerten.

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? Während die Daten in diesem Fall gleich sind, plane ich, einen Workflow für kategorische, nominelle und schwimmende Punkte für Mischungen zu erarbeiten, und sklearn_pandas schien eine logische Passform zu sein.

War es hilfreich?

Lösung

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

Angenommen, Sie haben 2 Spalten, die beide Saiten sind, und Sie möchten vektorisieren - aber Sie haben keine Ahnung, welche Vektorisierungsparamente zur besten nachgelagerten Leistung führen werden.

Erstellen Sie den Vectorizer

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

Erstellen Sie den DataFramemapper OBJ.

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

Dies ist die volle 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 also eine für Schleifen oder itertools.product, um eine flache Liste aller To_Vect -Optionen zu generieren, die Sie berücksichtigen möchten - aber das ist eine separate Aufgabe außerhalb des Geltungsbereichs der Frage.

Erstellen Sie den optimalen Klassifizierer oder was auch immer Ihre Pipeline endet

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

Andere Tipps

Ich habe nie benutzt sklearn_pandas, Aber aus dem Lesen ihres Quellcodes sieht es so aus, als wäre dies ein Fehler auf ihrer Seite. Wenn Sie suchen Die Funktion, die die Ausnahme auswirft, Sie können feststellen, dass sie die verworfen haben y Argument (es überlebt nicht einmal bis zum Docstring) und das Innere fit Funktion erwartet ein Argument mehr, was wahrscheinlich ist 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 eröffnen ihr Bug -Tracker.

AKTUALISIEREN:

Sie können dies testen, wenn Sie Ihren Code von Ipython ausführen. Zusammenfassend, wenn Sie die verwenden %pdb on Magie, bevor Sie den problematischen Anruf ausführen, wird die Ausnahme vom Python -Debugger erfasst, sodass Sie ein bisschen herumspielen und sehen können fit Funktion mit den Etikettenwerten y[0] Funktioniert - sehen Sie die letzte Linie mit dem pdb> prompt. (Die CSV -Dateien werden von Kaggle heruntergeladen, mit Ausnahme des größten, der 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')
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit datascience.stackexchange
scroll top