Как я могу повторно использовать Transformer с inverse_transform в конвейере scikit-learnPython

Программы на Python
Ответить
Anonymous
 Как я могу повторно использовать Transformer с inverse_transform в конвейере scikit-learn

Сообщение Anonymous »

Я пытаюсь создать scikit-learn Pipeline с конечной целью сжатия моих данных. Я использую в основном специальные трансформаторы. Чтобы объяснить мою проблему, я буду использовать sklearn.decomposition.PCA, так как он очень близок к тому, как работает мой собственный преобразователь.
Для следующих шагов в моем конвейере мне нужны не фактические значения pca.transform(), а скорее pca.inverse_transform(pca.transform()). Однако мне нужен доступ к результату метода преобразования на другом этапе, поэтому я не могу использовать преобразование() для преобразования() и мгновенного обратного_трансформирования().
Минимальный рабочий пример:

Код: Выделить всё

from sklearn.pipeline import Pipeline
from sklearn.decomposition import PCA
import numpy as np
import matplotlib.pyplot as plt

class CustomPCA(PCA):
def __init__(self, inverse=False, n_components=None):
super().__init__(n_components=n_components)
self.inverse = inverse

def fit(self, X, y=None):
if self.inverse:
super().fit(X[1], y)  # use original data
else:
super().fit(X, y)
return self

def transform(self, X):
if self.inverse:
return super().inverse_transform(X[0])  # use transformed data
transformed = super().transform(X)
return (transformed, X)  # return transformed and untransformed data

def fit_transform(self, X, y=None):
return self.fit(X).transform(X)

pipe = Pipeline([("pca", CustomPCA(n_components=3)),
("inv", CustomPCA(inverse=True, n_components=3))])
X = np.random.uniform(0,5,(100,10))+np.arange(10)
plt.plot(X.T)
plt.show()
plt.plot(pipe.fit_transform(X).T)
plt.show()
Исходные данные:
Изображение

Преобразованные и повторно преобразованные данные:
Изображение

Хотя это работает, я считаю, что это довольно неуклюже. Есть ли способ повторно использовать преобразователь, используя метод inverse_transform() вместо метода Transform()?

Подробнее здесь: https://stackoverflow.com/questions/680 ... n-pipeline
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»