自定义RandomForestClassifier的fit方法报错:样本数不一致[514,514,4]
自定义RandomForestClassifier拟合时样本数不匹配问题解决
问题代码
X = data.iloc[:,1:-1].values y = data.iloc[:, -1].values xTrain, xTest, yTrain, yTest = train_test_split(X, y, test_size = 0.2) print(f"Train Data: {xTrain.shape}, {yTrain.shape}") print(f"Test Data: {xTest.shape}, {yTest.shape}") forest = RandomForestClassifier() forest.fit(xTrain, yTrain) accuracy = forest.score(xTest, yTest) print('The accuracy was', 100*accuracy, '% on the test data.')
问题描述
上述代码使用scikit-learn官方的RandomForestClassifier时运行完全正常,训练集形状输出也验证了样本数一致,但替换为自定义实现的RandomForestClassifier后,调用forest.fit(xTrain, yTrain)抛出以下错误:
报错信息
ValueError Traceback (most recent call last) <ipython-input-65-3353626df052> in <module> 1 forest = RandomForestClassifier() ----> 2 forest.fit(xTrain, yTrain) 3 4 accuracy = forest.score(xTest, yTest) 5 print('The accuracy was', 100*accuracy, '% on the test data.') ---------------------------------------------------------------------- 330 uniques = np.unique(lengths) 331 if len(uniques) > 1: ---> 332 raise ValueError( 333 "Found input variables with inconsistent numbers of samples: %r" 334 % [int(l) for l in lengths] ValueError: Found input variables with inconsistent numbers of samples: [514, 514, 4]
问题分析与解决
报错里的[514, 514, 4]说明自定义代码的fit方法中存在参数处理错误,导致样本数统计逻辑混乱,核心排查点如下:
- 检查
fit方法的参数接收逻辑:确保fit(X, y)中X是二维数组(样本数×特征数),y是一维数组(样本数×1)。如果自定义代码误将y当作二维数组处理,或者混淆了X与y的维度,可在fit方法开头添加y = y.ravel()强制将y转为一维。 - 检查内部决策树的拟合调用:遍历创建决策树时,确认传递给单棵决策树的训练数据与标签样本数一致,避免出现某棵树接收的
X切片和y切片样本数不匹配的情况。 - 排查样本数统计的代码:报错中的
lengths大概率来自自定义代码中对输入数组的样本数统计,比如误将多个无关数组纳入统计(如额外传入了特征列数),需修正统计逻辑,只统计X和y的样本数。 - 验证输入数据形状:再次确认
yTrain的形状是(514,)而非(514,4),如果yTrain是二维数组,自定义代码需兼容这种格式,或者提前将其转为一维。
内容的提问来源于stack exchange,提问作者Dimas Ari Lumintang
相关产品推荐
相关产品推荐

