使用modAL实现主动学习时出现形状不匹配、类型报错如何解决
modAL主动学习多特征输入报错修复方案
报错核心原因
多个问题叠加导致运行失败:
- 初始代码里
reshape(-1,1)写法完全错误:单条100维的样本被转成了100行1列的结构,模型把100个特征维度当成了100个独立样本,直接触发[100,1]样本数不匹配的错误。 - 初始化学习器时传入pandas的DataFrame/Series作为训练集,modAL内部会默认用pandas的concat逻辑做增量训练,后面传numpy数组进去就会报“仅支持Series/DataFrame拼接”的错;如果直接用
iloc[query_idx]取数,拿到的是单条样本的Series结构,modAL本身不支持Series作为输入,又会触发Series类型不支持的报错。 input()拿到的用户输入默认是字符串类型,没有转成和初始标签一致的0/1整数,就算形状对了随机森林训练也会报类型错。- 原代码里
learner.teach()的括号未闭合,属于基础语法错误。
修复方案
全程统一用numpy数组和modAL交互,彻底规避pandas类型混用的问题,同时严格保证输入维度正确:
- 初始化阶段就把初始训练特征、初始标签、未标注池全部转成numpy数组:特征保持2维结构(形状为
样本数×特征数),标签保持1维整数数组结构。 - 查询到样本索引后,直接用numpy数组的索引方式取数,不需要额外reshape,单条查询样本的形状会自动保持为
(1,100),符合模型输入要求。 - 人工输入的标签强制转成int类型,整理成和新增样本数匹配的1维数组再传入teach方法。
- 每次标注完的样本记得从未标注池里删掉,避免重复查询。
可直接运行的修正代码
import numpy as np from sklearn.ensemble import RandomForestClassifier from modAL.models import ActiveLearner from modAL.uncertainty import uncertainty_sampling # 统一转换所有输入为numpy数组,提前对齐维度和类型 # 初始训练特征:转为(初始样本数, 100)的2维数组 X_train_init = X_train0.to_numpy() if hasattr(X_train0, "to_numpy") else np.array(X_train0) # 初始训练标签:转为(初始样本数,)的1维整数数组 y_train_init = y_train.to_numpy().flatten().astype(int) if hasattr(y_train, "to_numpy") else np.array(y_train).flatten().astype(int) # 未标注样本池:转为(1056, 100)的2维数组 X_unlabeled = X_test0.to_numpy() if hasattr(X_test0, "to_numpy") else np.array(X_test0) # 初始化主动学习器 learner = ActiveLearner( estimator=RandomForestClassifier(), query_strategy=uncertainty_sampling, X_training=X_train_init, y_training=y_train_init ) # 20轮主动学习迭代 for round_idx in range(20): # 从未标注池查询最具标注价值的样本 query_idx, query_instance = learner.query(X_unlabeled) # 获取人工标注结果,强制转成整数 manual_label = int(input(f"第{round_idx+1}轮,待标注样本索引{query_idx[0]},请输入标签(0/1):")) # 取出待新增的训练样本,自动保持(1,100)的2维结构 X_new = X_unlabeled[query_idx] y_new = np.array([manual_label], dtype=int) # 增量更新模型 learner.teach(X=X_new, y=y_new) # 从未标注池移除已标注样本 X_unlabeled = np.delete(X_unlabeled, query_idx, axis=0)
补充说明:如果需要每次批量查询N个样本标注,只需要在初始化ActiveLearner时传入参数
query_strategy_kwargs={"n_instances": N}即可,此时返回的query_idx是长度为N的索引数组,X_new形状自动为(N,100),标签数组长度对应为N即可正常运行。
内容的提问来源于stack exchange,提问作者Luis
相关产品推荐
相关产品推荐

