按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
相关产品推荐
相关产品推荐

