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

按veg_type训练随机森林预测fmc_mean 保存结果到DataFrame报错求解

错误原因
  • 核心矛盾是不同veg_type对应的测试集样本数量不一致:你初始化的是空DataFrame,第一次循环给Combined列赋值时,会自动把DataFrame的索引长度设为当前veg_type=0的测试集长度,后续其他veg_type的测试集长度和这个初始长度不匹配,就会抛出长度不匹配的错误。
  • 额外逻辑问题:你每次循环都对test_lfmc列赋值,会导致该列的值被当前循环的测试集真实值覆盖,最终只会保留最后一个veg_type的真实值,不符合你存储所有测试集真实值的需求。
解决方案

方案1:分类型存储结果(最推荐)

不同植被类型的测试样本本身不存在行对应关系,分开存储更合理,示例代码如下:

# 用字典存储每个veg_type的结果
result_dict = {}
col_map = {0:"Combined", 1:"Grassland", 2:"Shrubland", 3:"Forest"}
feats = ['ndvi', 'ndii', 'nbart_blue','nbart_green','nbart_red','nbart_nir_1','nbart_nir_2','nbart_swir_2','nbart_swir_3']

for veg_type in [0,1,2,3]:
    rf = RandomForestRegressor(n_estimators=25, max_depth=10, n_jobs=8)
    train, test = generate_train_datasets(veg_type)
    rf.fit(train[feats], train['fmc_mean'])
    y_hat = rf.predict(test[feats])
    # 单独生成每个类型的结果DataFrame
    veg_result = pd.DataFrame({
        col_map[veg_type]: y_hat,
        "test_lfmc": test['fmc_mean'].values
    })
    result_dict[col_map[veg_type]] = veg_result

后续需要用哪个植被类型的结果直接从result_dict里取即可。

方案2:合并到同一个DataFrame(如果需要统一存储)

如果必须合并到同一个表,先收集所有测试集,用唯一样本标识对齐,无预测值的位置填NaN:

all_test = []
result_list = []
col_map = {0:"Combined", 1:"Grassland", 2:"Shrubland", 3:"Forest"}
feats = ['ndvi', 'ndii', 'nbart_blue','nbart_green','nbart_red','nbart_nir_1','nbart_nir_2','nbart_swir_2','nbart_swir_3']

for veg_type in [0,1,2,3]:
    rf = RandomForestRegressor(n_estimators=25, max_depth=10, n_jobs=8)
    train, test = generate_train_datasets(veg_type)
    # 给测试集加唯一标识,无原始样本ID的话可以用索引+植被类型生成
    test['sample_id'] = test.index.astype(str) + f"_{veg_type}"
    all_test.append(test)
    rf.fit(train[feats], train['fmc_mean'])
    y_hat = rf.predict(test[feats])
    # 存储当前类型的预测结果
    result_list.append(pd.DataFrame({
        "sample_id": test['sample_id'],
        col_map[veg_type]: y_hat
    }))

# 合并所有测试集真实值和各类型预测值
all_test_df = pd.concat(all_test, ignore_index=True)[['sample_id', 'fmc_mean']].rename(columns={'fmc_mean':'test_lfmc'})
for res in result_list:
    all_test_df = all_test_df.merge(res, on='sample_id', how='left')

最终all_test_df就是包含所有样本真实值、各植被类型模型预测值的统一表。

内容的提问来源于stack exchange,提问作者Sher

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 01:45:03