【发布时间】:2021-12-07 09:07:24
【问题描述】:
我正在建立一个机器学习管道来对一些数据进行分类。一个数据源非常适合 PCA,构成了数据集的最后一个 n 维度。我想对这些变量使用 PCA,而不是前面的变量。从通过 stackexchange 搜索来看,这似乎也是一个常见的问题——人们只想将 PCA 应用于数据的一部分。
显然,我可以先进行 PCA,然后连接数据集,然后将其传递到管道,但是 PCA 应该是管道的一部分,否则来自测试样本的信息会渗入训练数据。
我想使用 sklearn 的 PCA 函数(但我也愿意接受建议),但它不需要任何参数来定义要对哪些变量进行 PCA,因此很难将其合并到管道中。
我目前的工作是通过定义一个新的 PCA 来选择所需的功能,如下所示:
class new_PCA(PCA):
@staticmethod
def reduce(X):
return X.iloc[:,NUMBER_NONPCA_FEATURES:]
# Define PCA for limited number of columns
def _fit(self, X):
part_X = self.reduce(X)
PCA._fit(self,part_X)
def transform(self, X):
part_X = self.reduce(X)
pca_part = PCA.transform(self, part_X)
X_new = np.concatenate([X.iloc[:,:NUMBER_NONPCA_FEATURES],pca_part],axis=1)
return X_new
def score_samples(self, X):
part_X = self.reduce(X)
PCA.score_samples(self,part_X)
def inverse_transform(self, X):
part_X = self.reduce(X)
PCA.inverse_transform(self,part_X)
所以基本的_fit() 方法和transform() 都被限制在当前变量中。这似乎可行,通过检查源代码,我认为这涵盖了将训练数据 (X) 作为输入的所有方法。
我只是有点担心我可能忽略了一些东西,这可能会在某处产生一些意想不到的后果。这看起来好吗?
【问题讨论】:
标签: machine-learning pca dimensionality-reduction feature-engineering data-preprocessing