TypeError: fit() принимает ровно 3 аргумента (задано 2) с помощью sklearn и sklearn_pandas

#python #pandas #machine-learning #scikit-learn #kaggle

#python #pandas #машинное обучение #scikit-learn #kaggle

Вопрос:

Я пытаюсь использовать модуль sklearn_pandas, чтобы расширить работу, которую я выполняю в pandas, и окунуться в машинное обучение, но я борюсь с ошибкой, которую я действительно не понимаю, как исправить.

Я работал со следующим набором данных на Kaggle.

По сути, это таблица без заголовков (1000 строк, 40 объектов) со значениями с плавающей запятой.

 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
  

Вывод:

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

Пока все хорошо. Но затем я пытаюсь подогнать

 mapper_train.fit_transform(train, labels)
  

Вывод:

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

Что я делаю не так? Хотя данные в этом случае все одинаковые, я планирую разработать рабочий процесс для смешивания категориальных, номинальных функций и функций с плавающей запятой, и sklearn_pandas, казалось, логично подходит.

Комментарии:

1. После изучения кода кажется, что автор забыл обработать y ( label ) значения. Посмотрите на код : y параметр никогда не используется. Я также не смог воспроизвести пример перекрестной проверки в документации, но это может быть из-за проблем с управлением версиями. Вам действительно это нужно? Я обнаружил, что pandas и sklearn довольно хорошо интегрируются.

2. Честно говоря, я не был уверен, нужно ли мне это, но выглядело так, как будто это была бы полезная оболочка, и хотел посмотреть, может ли это помочь. Ценю тот факт, что вы потратили время на проработку кода. Я бы не знал, с чего начать 🙂

3. sklearn-pandas автор здесь. Это сложная область, потому что в sklearn BaseEstimator классы могут иметь два разных интерфейса, один, где y передается, а другой, где это не так. sklearn-pandas первоначально пробовал сначала с помощью y in a try/except , и если он выдал a, TypeError он попробовал снова без y . Честно говоря, я не могу вспомнить, почему это изменилось, но, должно быть, я думал, что в этом не было необходимости. Я не уверен, нашли ли вы обходной путь, но я открыл проблему, чтобы исправить это, когда у меня будет возможность, если вы захотите отследить это, проблема здесь: github.com/paulgb/sklearn-pandas/issues/12

4. Пол, это здорово. Я ценю ваше время. Я только начинаю работать в sklearn и пытался использовать знания, которые я накопил в pandas, чтобы немного размяться. Хотя я знаю достаточно python, чтобы быть опасным, я обычно не в своей тарелке, когда что-то идет не так. Просто рад сообществу в Stackoverflow.

5. Перекрестная публикация с помощью datascience.stackexchange.com/q/677/1156

Ответ №1:

Поскольку sklearn_pandas в настоящее время не поддерживает оценщики, принимающие y вектор с метками, вам придется использовать его только для преобразования всех объектов в Numpy-матрицу, а затем использовать KNeighborsClassifier на отдельном шаге.

ОБНОВЛЕНИЕ 2015-08-10 sklearn_pandas DataFrameMapper не предназначено для использования в качестве конвейера для преобразования подгонки модели, а только для выборочного преобразования столбцов. Если вы хотите преобразовать, а затем оценить модель, используйте plain sklearn Pipeline с dataframe mapper в качестве первого шага.