Пользовательский трансформатор для 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?
  • Является ли countvectorizer таким же, как tfidfvectorizer с use_idf = false?
  • Как получить наиболее информативные функции для классификаторов scikit-learn?
  • sklearn LogisticRegression без регуляризации
  • Использовать метрику после классификатора в конвейере
  • scikit узнать коэффициенты полиномиальные функции
  • почему перекрестная проверка для RandomForestRegressor терпит неудачу в scikit-learn
  • В scikit узнать, как обрабатывать данные, смешанные с численным и номинальным значением?
  •  
    Interesting Posts for Van-Lav

    Используя Python, как мне получить двоичную сериализацию моего сообщения protobuf в Google?

    Почему работает `mylist = reverse (mylist)`?

    Как читать / понимать сериализованную строку данных PHP в python

    Аргументы метакласса для Python 3.x

    как удалить избыточное время даты, когда ось x является недержанием pandas DatetimeIndex

    Поиск необычного значения в массиве, список

    Python и ftplib, не удалось войти в систему?

    Переупорядочить список точек для достижения кратчайшего расстояния между ними

    Получить размеры изображения из Url в Python

    Лучший способ масштабирования матричных переменных в схеме линейного программирования SCIPY

    Python 3 ТипError: ожидаемый байт или целочисленный адрес вместо экземпляра str

    Разделите строку на все возможные упорядоченные фразы

    Преобразование 1D-массива в матрицу numpy

    python jedi: как получить методы экземпляров?

    python tkinter отображает анимированный GIF с использованием PIL

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