使用Scikit-learn执行欠采样时出现错误,寻求技术解决方案
排查RandomForest二分类任务中RandomUnderSampler错误(编号446)的解决方案
让咱们一步步梳理你遇到的问题,这类错误通常和几个常见因素相关,下面是具体的排查方向和解决方法:
1. 最常见原因:缺失正确的库导入
RandomUnderSampler并不属于sklearn原生模块,它是imbalanced-learn库的组件。你的代码里只导入了sklearn.metrics,大概率是没安装或没正确导入这个库:
- 首先安装依赖库:
pip install imbalanced-learn - 替换导入语句为:
from imblearn.under_sampling import RandomUnderSampler
2. 训练集存在非数值型特征
RandomUnderSampler要求输入的特征必须是数值类型,如果你的train数据集中还残留字符串、分类类型的列,就会触发错误:
- 先检查训练集的所有列类型:
print(train.dtypes) - 对非数值列做处理:要么用
LabelEncoder/OneHotEncoder做编码,要么直接删除无关的分类列。
3. 目标变量格式或缺失值问题
如果目标变量Y存在缺失值,或者格式不符合要求(比如不是一维Series/数组),也会导致采样失败:
- 检查目标变量的缺失情况:
print(Y.isnull().sum()) - 确保
Y是一维结构:
如果有缺失值,先通过填充或删除对应行处理;如果是多维结构,用print(Y.shape) # 正常输出应为(n_samples,)Y = Y.values.ravel()转为一维。
4. 方法版本兼容问题
新版imbalanced-learn已经弃用了fit_sample方法,替换为fit_resample,如果你的库版本较新,旧方法会报错:
- 替换采样代码为:
X_train_res, y_train_res = rus.fit_resample(train, Y)
修正后的完整代码示例
# 安装依赖(首次运行时执行) !pip install imbalanced-learn import pandas as pd from sklearn import metrics from imblearn.under_sampling import RandomUnderSampler # 处理数据集 train = data.drop(['Co_Name','Cust_ID','Phone','Shpr_ID','Resi_Cnt','Buz_Cnt','Nearby_Cnt','parseNumber','removeString','Qty','bins','Adj_Addr','Resi','Weight','Resi_Area','Lat','Lng'], axis=1) Y = data['Resi'] # 前置检查 print("训练集数据类型:\n", train.dtypes) print("目标变量缺失值数量:", Y.isnull().sum()) # 执行欠采样 rus = RandomUnderSampler(random_state=42) X_train_res, y_train_res = rus.fit_resample(train, Y)
内容的提问来源于stack exchange,提问作者pankaj




