Domanda

Sto cercando di utilizzare i sklearn_pandas modulo di estendere il lavoro che faccio in panda e immergere un dito del piede nel machine learning, ma sto lottando con un errore io non capisco come risolvere il problema.

stavo lavorando attraverso il seguente set di dati su Kaggle .

E 'essenzialmente una tabella unheadered (1000 righe, 40 caratteristiche) con valori in virgola mobile.

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

Output:

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'))])

Fin qui tutto bene. Ma poi cerco la misura

mapper_train.fit_transform(train, labels)

Output:

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

Che cosa sto facendo di sbagliato? Mentre i dati in questo caso è lo stesso, ho intenzione di lavorare un flusso di lavoro per le miscele categoriali, caratteristiche e sklearn_pandas punto nominale e variabile sembrava essere una misura logica.

È stato utile?

Soluzione

Ecco un esempio di come ottenere panda e sklearn di bel gioco

dire di avere 2 colonne che sono entrambe le stringhe e si desidera vettorizzare -. Ma non avete idea di quale params vettorializzazione si tradurrà in migliori prestazioni a valle

creare il vectorizer

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

creare l'obj DataFrameMapper.

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

Questa è la pipeline piena

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

definire i params si desidera che la scansione da considerare

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))]]}

Ecco fatto! - nota, tuttavia, che mapper_features sono un singolo elemento in questo dizionario - in modo da utilizzare un ciclo for o itertools.product per generare un elenco di tutte le opzioni FLAT to_vect che si desidera prendere in considerazione - ma questo è un compito separato al di fuori della portata della questione <. / p>

Vai a creare il classificatore ottimale o qualsiasi altra cosa la vostra estremità di tubazioni con

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

Altri suggerimenti

Non ho mai usato sklearn_pandas, ma dalla lettura loro codice sorgente, sembra che questo è un bug dalla loro parte. Se si guarda per la funzione che sta gettando l'eccezione , si può notare che essi sono scartando l'argomento y (non ha nemmeno sopravvivere fino alla docstring), e la funzione di fit interno si aspetta un argomento di più, che è probabilmente 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

mi sento di raccomandare che si apre un problema in loro bug tracker .

Aggiorna :

È possibile verificare questo se si esegue il codice da IPython. Per riassumere, se si utilizza il diritto magia %pdb on prima di eseguire la chiamata problematico, l'eccezione viene catturato dal debugger Python, in modo da poter giocare un po 'e vedere che chiamando la funzione fit con l'etichetta valori y[0] funziona - See l'ultima riga con il prompt pdb>. (I file CSV vengono scaricati da Kaggle, tranne che per il più grande, che è solo una parte del file vero e proprio).

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')
Autorizzato sotto: CC-BY-SA insieme a attribuzione
scroll top