问题未解决
问题描述:
使用sklearn中随机森林函数进行增量学习,
第一次训练:设置随机森林参数n_estimators = 10, warm_start = True
,训练小样本容量数据,可正常训练并预测分类;
第二次训练:设置参数n_estimators = 20
, 数据规模大幅增加,生成bug,无法生成预测结果,错误信息:ValueError: operands could not be broadcast together with shapes (50,3) (50,2) (50,3)
。
问题解决思路:
- 检查数据是否存在异常,测试数据是否正确 (数据ok)。
- 报错信息发生在二次训练阶段,检查特殊的数字
50, 3, 2
, 测试得出,50为第二次训练集数据规模,3 为第二次训练集类别种类数,2 为初次训练集类别种类数。 - 尝试更改第二次训练集类别个数,测试发现,即使第二次类别个数小于初次训练类别个数时仍然会出现类似错误
(50,1) (50,2) (50,1)
,但当两次训练样本种类个数相同时(即使各自种类完全不同)代码可以正常通过。 - 尝试更改初次训练集类别个数,测试发现,大多数情况下只要初次训练样本种类个数不同于第二次训练样本种类个数就会生成类似错误。但当初次训练样本种类数为 1 时,第二次训练样本种类个数无论多大,都可成功运行。
疑惑:
- 为什么初次训练样本类别数为1的时候为什么后续训练类别个数无论多少都可以执行,但一旦初次样本类别数超过1了,只要后续训练类别个数与初次样本类别数不同就无法执行。
- 为什么即使初次和第二次训练样本呢种类完全不同,但只要个数相同就可以正确执行。
- 为什么即使初次训练样本种类包含第二次训练样本种类,但只要种类数不同就无法执行。
解决方案
估计暂时只能选择保持增量学习每次迭代保证种类数的恒定。
有时间一定要去查查源码,看可不可以用更方便的方法解决这个问题
错误代码:
from sklearn.ensemble import RandomForestClassifier
import pandas as pd
import numpy as np
rows = 50
cols = 4
x_train_1 =