Пользовательский трансформатор для sklearn Pipeline, который изменяет как X, так и y

Я хочу создать собственный трансформатор для использования с конвейером sklearn. Поэтому я создаю класс, который реализует методы fit и transform. Целью трансформатора будет удаление строк из матрицы с более чем определенным количеством NaN. Поэтому проблема, с которой я сталкиваюсь, – это как изменить как матрицы X, так и y, которые передаются трансформатору? Я считаю, что это нужно делать в методе подгонки, поскольку он имеет доступ как к X, так и к. Поскольку python передает аргументы по присваиванию, как только я переназначу X на новую матрицу с меньшим количеством строк, ссылка на исходный X будет потеряна (и, конечно же, это верно для y). Можно ли сохранить эту ссылку?

Я использую pandas DataFrame, чтобы легко отбрасывать строки с слишком большим количеством NaN, это может быть неправильный способ сделать это для моего использования. Текущий код выглядит следующим образом:

class Dropna(): # thresh is max number of NaNs allowed in a row def __init__(self, thresh=0): self.thresh = thresh def fit(self, X, y): total = X.shape[1] # +1 to account for 'y' being added to the dframe new_thresh = total + 1 - self.thresh df = pd.DataFrame(X) df['y'] = y df.dropna(thresh=new_thresh, inplace=True) X = df.drop('y', axis=1).values y = df['y'].values return self def transform(self, X): return X 

  • Предсказание: прогнозирование будущих событий с использованием модуля SVR
  • Набор данных цифр Sklearn
  • ImportError: невозможно импортировать имя '_safe_split'
  • Как рассчитать AUC для одного класса SVM в python?
  • Как свернуть собственный оценщик в PySpark mllib
  • Как добавить предсказанные кластеры k-значений в столбце к фрейму данных в Python
  • Как использовать фиктивную переменную для представления категориальных данных в python scikit-learn random forest
  • как вычислить матрицу term-document?
  • 3 Solutions collect form web for “Пользовательский трансформатор для sklearn Pipeline, который изменяет как X, так и y”

    Изменение оси выборки, например удаление образцов, не (пока?) Соответствует API-интерфейсу трансформатора scikit-learn. Поэтому, если вам нужно это сделать, вы должны сделать это за пределами любых вызовов scikit learn, в качестве предварительной обработки.

    Как и сейчас, API-интерфейс трансформатора используется для преобразования функций данного образца во что-то новое. Это может неявно содержать информацию из других образцов, но образцы никогда не удаляются.

    Другой вариант – попытаться ввести недостающие значения. Но опять же, если вам нужно удалить образцы, обработайте их как предварительную обработку перед использованием scikit learn.

    Это можно легко решить, используя метод sklearn.preprocessing.FunctionTransformer ( http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.FunctionTransformer.html )

    Вам просто нужно поместить ваши чередования в X в функции

     def drop_nans(X, y=None): total = X.shape[1] new_thresh = total - thresh df = pd.DataFrame(X) df.dropna(thresh=new_thresh, inplace=True) return df.values 

    тогда вы получаете свой трансформатор, позвонив

     transformer = FunctionTransformer(drop_nans, validate=False) 

    которые вы можете использовать в конвейере. Порог можно установить вне функции drop_nans.

    Используйте « глубокие копии » дальше, вниз по трубопроводу, а X , y остаются защищенными

    .fit() может сначала назначить для каждого вызова глубокую копию новые переменные класса

     self.X_without_NaNs = X.copy() self.y_without_NaNs = y.copy() 

    а затем уменьшить / преобразовать их, чтобы не иметь больше NaN -s, чем упорядочено по self.treshold

    Python - лучший язык программирования в мире.