Python调用ADASYN过采样时报str与float实例不支持操作错误咨询
ADASYN过采样报错排查与修复方案
核心错误原因
- 特征与标签拆分逻辑完全错误:你错误地将
target为keep的整行数据作为特征集X,target为changing的整行数据作为标签y,X中包含了字符串类型的target列,ADASYN基于KNN计算样本距离时需要全数值输入,字符串与浮点数运算时触发该报错。 - 变量初始化顺序错误:在实例化
ADASYN对象之前就调用了ada.fit_resample(),同时未初始化PCA就直接调用pca.transform(),会触发未定义变量报错。 - 变量名不匹配:最后打印统计结果时调用的
y_res未定义,实际生成的重采样标签是y_resampled。 - 缺失依赖导入:代码中未导入pandas库就直接使用
pd.read_csv(),会触发命名错误。 - 额外潜在问题:如果特征列中本身存在字符串类型的非数值字段,未做编码转换也会触发同类运算错误。
修复后可运行代码
import pandas as pd from collections import Counter from sklearn.decomposition import PCA from imblearn.over_sampling import ADASYN from sklearn.preprocessing import OneHotEncoder from sklearn.compose import ColumnTransformer # 读取数据集 df_train = pd.read_csv('F:/Master_study/Research_data/data/lankershim_label_data.csv') # 正确拆分特征与标签 X = df_train.drop('target', axis=1) # 特征集:去掉target列的所有字段 y = df_train['target'] # 标签集:仅target列 # 处理非数值特征(如果特征全为数值可跳过这部分) # 识别数值列和非数值列 num_cols = X.select_dtypes(include=['int64', 'float64']).columns cat_cols = X.select_dtypes(include=['object']).columns # 定义编码处理器,非数值列做独热编码,数值列保持原样 preprocessor = ColumnTransformer( transformers=[ ('num', 'passthrough', num_cols), ('cat', OneHotEncoder(sparse_output=False, drop='first'), cat_cols) ]) # 初始化ADASYN和PCA ada = ADASYN(random_state=42) pca = PCA(n_components=2, random_state=42) # 按需求调整降维维度 # 先处理特征编码,再过采样 X_processed = preprocessor.fit_transform(X) X_resampled, y_resampled = ada.fit_resample(X_processed, y) # PCA降维可视化用 X_res_vis = pca.fit_transform(X_resampled) # 打印重采样后类别分布 print('Resampled dataset shape {}'.format(Counter(y_resampled)))
修正说明
- 调整了特征和标签的拆分逻辑,确保特征集不包含字符串类型的标签字段
- 补充了非数值特征的编码逻辑,保证输入ADASYN的特征全为数值类型
- 修正了变量初始化顺序,所有工具类先实例化再调用方法
- 修正了变量名不匹配的问题,打印时使用实际生成的重采样标签变量
- 补充了pandas的依赖导入
内容的提问来源于stack exchange,提问作者owais lateef
相关产品推荐
相关产品推荐

