You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用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

火山引擎 最新活动