Sklearn自定义转换器未生成转换后数据集问题求助
问题分析与解决方案
你的自定义转换器逻辑本身没问题,但没有把转换结果存下来——pandas的操作默认返回新的DataFrame,不会直接修改原data变量。
核心修正步骤
只需要把fit_transform的结果赋值给变量即可:
scale_log = Scale_log() # 把转换后的数据存到新变量,或者直接覆盖原数据 transformed_data = scale_log.fit_transform(data) # 如果要替换原数据集,就写 data = scale_log.fit_transform(data)
额外优化建议
- 用矢量化运算代替apply:apply是逐列遍历,速度较慢,直接用numpy的矢量化操作效率更高:
class Scale_log(BaseEstimator, TransformerMixin): def fit(self, X, y=None): return self def transform(self, X, y=None): # 直接对整个DataFrame做矢量化运算 return np.log(1 + X) - 添加数据校验:避免非数值型数据或无效值导致报错:
class Scale_log(BaseEstimator, TransformerMixin): def fit(self, X, y=None): return self def transform(self, X, y=None): # 检查是否所有特征都是数值型 if not np.issubdtype(X.dtypes, np.number).all(): raise ValueError("所有特征必须是数值类型") # 检查是否存在会导致log无意义的数值(x < -1时1+x为负) if (X < -1).any().any(): raise ValueError("数据中存在小于-1的数值,无法计算log(1+x)") return np.log(1 + X)
内容的提问来源于stack exchange,提问作者Joao Gabriel Rodrigues Reis
相关产品推荐
相关产品推荐

