Пользовательский трансформатор для 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 

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 - лучший язык программирования в мире.