所以我已经为一个小数据集建立了一个模型,因为它是一个小数据集,我做了一个Leave-One-out交叉验证(LOOCV)检查其准确性。所以简而言之,我会手动删除一个样本,训练模型,预测遗漏的样本并保存预测,然后对所有样本重复这个过程。然后我会使用预测列表和实际值来获得RMSE和R2。今天我发现有一个Scikit-Learn实现sklearn.model_selection。然而,当我尝试它时,它给了我不同的RMSE结果,并拒绝在LOOCV方法中使用r平方作为精度(它似乎计算每个样本的精度,这与R2不起作用)。
下面是一个简短的代码示例:from numpy import mean
from numpy import std
from sklearn.datasets import make_blobs
from sklearn.model_selection import LeaveOneOut
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestClassifier
cv = LeaveOneOut()
model = RandomForestRegressor(n_estimators=200, max_depth=6,n_jobs=40, random_state=0)
scores = cross_val_score(model, data2SN, labelCL, scoring='neg_root_mean_squared_error', cv=cv, n_jobs=-1)
# report performance
print('Accuracy: %.3f (%.3f)' % (mean(scores), std(scores)))
我的猜测是,我正在计算整个数据集的RMSE,而LOOCV正在每个样本做它,最终我会取平均值,这就是导致两个代码输出之间差异的原因,然而,当我试图计算每个样本的RMSE时,它失败了(引用这个TypeError: Singleton数组3021.0不能被认为是一个有效的集合)。所以我不确定如何在LOOCV内计算RMSE。我不确定是否应该相信我的代码,或者只是盲目地使用scikit-learn实现。
我不知道该怎么做,chatGPT只是混乱的地狱,所以我的人类兄弟请帮助
cross_val_score
平均分数,所以对于cv=LeaveOneOut()
,是的,它是计算每行分数(通过在所有其他行上训练的模型)。RMSE等于MAE;R2就会失败。
您可以使用cross_val_predict
来获得单个预测,然后立即对该集合进行评分,以重现您的手动工作。