Для следующих шагов в моем конвейере мне нужны не фактические значения 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
Мобильная версия