Question

Je suis en train d'utiliser le module sklearn_pandas pour étendre le travail que je fais en pandas géants et tremper un orteil dans l'apprentissage de la machine mais je suis aux prises avec une erreur que je ne comprends pas vraiment comment résoudre.

Je travaillais dans l'ensemble de données suivant sur Kaggle .

Il est essentiellement une table unheadered (1000 lignes, 40 caractéristiques) avec des valeurs en virgule flottante.

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

Sortie:

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

Jusqu'à présent, si bon. Mais alors je tente l'ajustement

mapper_train.fit_transform(train, labels)

Sortie:

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

Qu'est-ce que je fais mal? Bien que les données dans ce cas est tout de même, je prévois de travailler un flux de travail pour les mélanges catégoriques, les caractéristiques des points nominaux et flottants et sklearn_pandas semblaient être un ajustement logique.

Était-ce utile?

La solution

Voici un exemple de la façon d'obtenir et sklearn pandas géants à Nice play

dites que vous avez 2 colonnes qui sont à la fois des chaînes et que vous souhaitez vectoriser -. Mais vous ne savez pas qui vectorisation params entraînera la meilleure performance en aval

créer la vectorisation

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

créer le obj DataFrameMapper.

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

est la pleine pipeline

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

définir les params que vous voulez que l'analyse à considérer

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

Thats it! - A noter toutefois que mapper_features sont un seul élément dans ce dictionnaire - donc utiliser une boucle ou itertools.product pour générer une liste de plats de toutes les options de to_vect que vous voulez prendre en compte - mais qui est une tâche distincte en dehors de la portée de la question <. / p>

Aller à créer le classificateur optimal ou tout ce que la fin de votre pipeline avec

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

Autres conseils

Je n'ai jamais utilisé sklearn_pandas, mais à la lecture de leur code source, il semble que c'est un bug de leur côté. Si vous recherchez la fonction qui est de lancer d'exception, vous pouvez remarquer que ils sont défausser l'argument y (il ne survit même pas jusqu'à la docstring), et la fonction fit intérieure attend un argument plus, ce qui est probablement 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

Je recommande que vous ouvrez un problème dans leur bug tracker .

UPDATE :

Vous pouvez tester si vous exécutez votre code de IPython. En résumé, si vous utilisez la magie de %pdb on droit avant d'exécuter l'appel problématique, l'exception est capturée par le débogueur Python, de sorte que vous pouvez jouer un peu et voir que l'appel de la fonction fit avec les valeurs de l'étiquette y[0] fonctionne - voir la dernière ligne à l'invite de pdb>. (Les fichiers CSV sont téléchargés à partir Kaggle, sauf pour le plus grand qui est juste une partie du fichier réel).

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')
Licencié sous: CC-BY-SA avec attribution
scroll top