imblearn流水线同步剔除X/y异常值触发连续标签报错排查
问题解答
imblearn兼容性说明
imblearn并非仅兼容标称型分类数据,你遇到的报错和库本身的兼容性无关,是默认参数的校验逻辑导致的。
原代码错误点
FunctionSampler默认开启参数validate=True,会在执行自定义采样函数前调用分类标签校验逻辑,仅认可离散型的分类标签,遇到连续型回归标签就会抛出ValueError: Unknown label type: 'continuous'。
另外原代码中random_state=rng的rng变量未提前定义,修复校验问题后也会触发命名错误。
基于imblearn的修复方案
给FunctionSampler传入validate=False关闭默认分类标签校验,补全随机数定义即可正常运行:
import numpy as np from imblearn import FunctionSampler from imblearn.pipeline import make_pipeline from sklearn.ensemble import IsolationForest from sklearn.linear_model import LinearRegression rng = np.random.RandomState(42) def outlier_rejection(X, y): model = IsolationForest(max_samples=100, contamination=0.4, random_state=rng) model.fit(X) y_pred = model.predict(X) return X[y_pred == 1], y[y_pred == 1] pipe = make_pipeline( FunctionSampler(func=outlier_rejection, validate=False), LinearRegression() ) pipe.fit(X_train, y_train)
基于原生sklearn流水线的替代方案
sklearn 1.2及以上版本原生支持自定义采样器接入流水线,只需继承基类实现对应接口即可,无需依赖imblearn。如果使用的sklearn版本低于1.2,原生Pipeline不支持中间步骤改变样本量,建议直接使用上述imblearn修复方案。
import numpy as np from sklearn.base import BaseEstimator, ResamplerMixin from sklearn.ensemble import IsolationForest from sklearn.linear_model import LinearRegression from sklearn.pipeline import make_pipeline class IsolationForestOutlierRemover(ResamplerMixin, BaseEstimator): def __init__(self, max_samples=100, contamination=0.4, random_state=42): self.max_samples = max_samples self.contamination = contamination self.random_state = random_state def _fit_resample(self, X, y): model = IsolationForest( max_samples=self.max_samples, contamination=self.contamination, random_state=self.random_state ) model.fit(X) inlier_mask = model.predict(X) == 1 return X[inlier_mask], y[inlier_mask] pipe = make_pipeline( IsolationForestOutlierRemover(), LinearRegression() ) pipe.fit(X_train, y_train)
注意:异常值剔除仅在流水线
fit阶段对训练集生效,不会影响预测阶段的测试集处理,避免数据泄露风险。示例中contamination=0.4会剔除40%的训练样本,实际使用请根据业务场景调整参数值。
内容的提问来源于stack exchange,提问作者Rob Zanelli
相关产品推荐
相关产品推荐

