sklearn RandomForestClassifier fit训练报TypeError参数不能为SAMPLES
报错原因
- scikit-learn内置的
RandomForestClassifier要求输入特征矩阵必须是纯数值类型的二维结构,形状为(样本数, 特征数),所有元素必须可被转换为浮点型数值,不支持自定义类实例作为矩阵元素。 - 你的实现中自定义了
SAMPLES类封装第三维的采样数组,最终生成的特征矩阵X是存储SAMPLES实例的对象数组,sklearn在调用np.asarray做输入校验、尝试将数组转换为float类型时,无法将自定义类实例转为浮点值,因此抛出该类型错误。 - 额外逻辑误区:通过自定义类封装数组“强行降维”的思路无效,模型无法自动读取自定义类内部存储的数值数据,这种封装本质没有改变输入内容不可解析的问题。
修复方案
你的原始数据维度为(8次试验, 5个特征维度, 450个采样点),每个试验样本的实际特征总数为5*450=2250个,直接将三维数组展平为二维数值数组即可满足模型输入要求,无需自定义类封装,具体修改步骤:
- 删除所有
SAMPLES类定义、构造temp对象数组的冗余代码 - 将原始三维数据列表直接转为numpy数组,通过
reshape方法把形状调整为(样本数, 特征总数)的二维数值数组 - 修正模型匹配问题:你当前生成的标签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
相关产品推荐
相关产品推荐

