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.
python
pandas
scikit-learn
elksie5000
quelle
quelle
Antworten:
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
Erstellen Sie das DataFrameMapper-Objekt.
Dies ist die vollständige Pipeline
Definieren Sie die Parameter, die der Scan berücksichtigen soll
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
quelle
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 innerefit
Funktion erwartet ein weiteres Argument, wahrscheinlichy
: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 on
sagen, 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 derfit
Funktion mit den Beschriftungswerteny[0]
funktioniert - siehe letzte Zeile mit derpdb>
Eingabeaufforderung. (Die CSV-Dateien werden von Kaggle heruntergeladen, mit Ausnahme der größten, die nur ein Teil der realen Datei ist.)quelle
pdb
:) in den Code tritt :)