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

sklearn RandomForestClassifier fit训练报TypeError参数不能为SAMPLES

报错原因
  • scikit-learn内置的RandomForestClassifier要求输入特征矩阵必须是纯数值类型的二维结构,形状为(样本数, 特征数),所有元素必须可被转换为浮点型数值,不支持自定义类实例作为矩阵元素。
  • 你的实现中自定义了SAMPLES类封装第三维的采样数组,最终生成的特征矩阵X是存储SAMPLES实例的对象数组,sklearn在调用np.asarray做输入校验、尝试将数组转换为float类型时,无法将自定义类实例转为浮点值,因此抛出该类型错误。
  • 额外逻辑误区:通过自定义类封装数组“强行降维”的思路无效,模型无法自动读取自定义类内部存储的数值数据,这种封装本质没有改变输入内容不可解析的问题。
修复方案

你的原始数据维度为(8次试验, 5个特征维度, 450个采样点),每个试验样本的实际特征总数为5*450=2250个,直接将三维数组展平为二维数值数组即可满足模型输入要求,无需自定义类封装,具体修改步骤:

  1. 删除所有SAMPLES类定义、构造temp对象数组的冗余代码
  2. 将原始三维数据列表直接转为numpy数组,通过reshape方法把形状调整为(样本数, 特征总数)的二维数值数组
  3. 修正模型匹配问题:你当前生成的标签Y是0-1区间的连续浮点值,属于回归任务场景,需要将分类器RandomForestClassifier替换为回归器RandomForestRegressor;如果确实要做分类任务,需要将Y修改为离散分类标签(如0/1二值标签)

修正后可运行代码

from random import random
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import LeaveOneOut
# 连续标签场景改用随机森林回归器
from sklearn.ensemble import RandomForestRegressor
import numpy as np

numberOfTest = 8
numberOfFeature = 5
numberOfSamplePerEachFeature = 450

# 创建三维列表存储实验数据
dataForLearning = [[[0.0 for i in range(numberOfSamplePerEachFeature)] for j in range(numberOfFeature)] for k in range(numberOfTest)]
targetValue = [0.0 for i in range(numberOfTest)]

# 初始化数据集
for i in range(numberOfTest):
    for j in range(numberOfFeature):
        for k in range(numberOfSamplePerEachFeature):
            dataForLearning[i][j][k] = random()

for i in range(numberOfTest):
    targetValue[i] = random()

# 直接将三维数据展平为二维数值数组,形状为(8, 5*450)=(8,2250)
X = np.array(dataForLearning).reshape(numberOfTest, numberOfFeature * numberOfSamplePerEachFeature)
Y = np.array(targetValue)
Y_pred = np.zeros(len(targetValue))

oneOfAll = LeaveOneOut()
oneOfAll.get_n_splits(X)
for train_index, test_index in oneOfAll.split(X):
    X_train, X_test = X[train_index], X[test_index]
    Y_train, Y_test = Y[train_index], Y[test_index]
    # 初始化回归模型
    model = RandomForestRegressor()
    model.fit(X_train, Y_train)
    Y_pred[test_index] = model.predict(X_test)

print(mean_squared_error(Y, Y_pred))

注:如果你的任务需要保留时序/序列特征结构,不能直接展平数据,就不能用原生随机森林,需要换用支持序列输入的模型,或者先对序列做特征提取(比如统计值、频域特征)后再输入随机森林。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 08:27:23