Luttant pour intégrer sklearn et tâche simple dans Pandas Kaggle
-
16-10-2019 - |
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.
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')