You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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类型混用的问题,同时严格保证输入维度正确:

  1. 初始化阶段就把初始训练特征、初始标签、未标注池全部转成numpy数组:特征保持2维结构(形状为样本数×特征数),标签保持1维整数数组结构。
  2. 查询到样本索引后,直接用numpy数组的索引方式取数,不需要额外reshape,单条查询样本的形状会自动保持为(1,100),符合模型输入要求。
  3. 人工输入的标签强制转成int类型,整理成和新增样本数匹配的1维数组再传入teach方法。
  4. 每次标注完的样本记得从未标注池里删掉,避免重复查询。

可直接运行的修正代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 20:33:19