我正在构建一个sklearn中的转换器,用于删除相关系数低于指定阈值的特征。
它在训练集上运行良好。然而,当我转换测试集时,测试集上的所有特征都消失了。我猜测转换器是在计算测试数据与训练标签之间的相关系数,由于这些相关系数都很低,所以它删除了所有特征。我该如何让它只在训练集上计算相关系数,并在转换时从测试集中删除这些特征呢?
class CorrelatedFeatures(BaseEstimator, TransformerMixin): #选择与响应标签相关系数高于阈值的特征 def __init__(self, response, threshold=0.1): self.threshold = threshold self.response = response def fit(self, X, y=None): return self def transform(self, X, y=None): df = pd.concat([X, self.response], axis=1) cols = df.columns[abs(df.corr()[df.columns[-1]]) > self.threshold].drop(self.response.columns) return X[cols]
回答:
您可以在fit()
方法中计算并存储该相关系数和要删除的列,然后在transform()
方法中仅转换这些列。
类似这样的代码:
........def fit(self, X, y=None): df = pd.concat([X, self.response], axis=1) self.cols = df.columns[abs(df.corr()[df.columns[-1]]) > self.threshold].drop(self.response.columns) return selfdef transform(self, X, y=None): return X[self.cols]