RandomForestRegressor 评价方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RandomForestRegressor 评价方法相关的知识,希望对你有一定的参考价值。

参考技术A 最近在参加一个比赛,用到了随机森林作回归,遇到了一个小问题:

我使用的是 RadomForestRegressor() 类进行回归预测,评价指标使用了 metrics.roc_auc_score() ,之后就报错了:

意思是该方法不支持连续值,之后查了一下,可能是因为将分类的评价方法用到了回归上导致了错误。

之后改为了 metrics.mean_absolute_error() ,问题解决。

RandomForestRegressor 只吐出 1 个预测

【中文标题】RandomForestRegressor 只吐出 1 个预测【英文标题】:RandomForestRegressor spitting out 1 prediction only 【发布时间】:2020-07-11 05:58:21 【问题描述】:

我正在尝试使用 RandomForestRegressor。使用 RandomForestClassifier 我似乎能够收到 +/-1 的可变结果。但是,使用 RandomForestRegressor 时,我只能在尝试预测时得到一个常数值。

import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestRegressor
from pandas_datareader import data
import csv
import statsmodels.api as sm
data = pd.read_csv('C:\H\XPA.csv')
data['pct move']=data['XP MOVE']
# Features construction
data.dropna(inplace=True)
# X is the input variable
X = data[[ 'XPSpread', 'stdev300min']]
# Y is the target or output variable
y = data['pct move']
# Total dataset length
dataset_length = data.shape[0]
# Training dataset length
split = int(dataset_length * 0.75)
# Splitiing the X and y into train and test datasets
X_train, X_test = X[:split], X[split:]
y_train, y_test = y[:split], y[split:]
clf = RandomForestRegressor(n_estimators=1000)
# Create the model on train dataset
model = clf.fit(X_train, y_train)
from sklearn.metrics import accuracy_score
data['strategy_returns'] = data['pct move'].shift(-1) * -model.predict(X)
print(model.predict(X_test))

输出:

[4.05371547e-07 4.05371547e-07 4.05371547e-07 ... 4.05371547e-07
 4.05371547e-07 4.05371547e-07]

输出是静止的,而 y 数据是这样的:

0       -0.0002
1        0.0000
2       -0.0002
3        0.0002
4        0.0003
          ...  
29583    0.0014
29584    0.0010
29585    0.0046
29586    0.0018
29587    0.0002

x 数据:

       XPSpread  stdev300min
0           1.0       0.0002
1           1.0       0.0002
2           1.0       0.0002
3           1.0       0.0002
4           1.0       0.0002
...         ...          ...
29583       6.0       0.0021
29584       6.0       0.0021
29585      19.0       0.0022
29586       9.0       0.0022
29587      30.0       0.0022

现在,当我将此问题更改为分类问题时,我确实得到了相对较好的符号预测。但是,当我将其更改为回归时,我会得到一个固定的结果。 有什么建议可以改进吗?

【问题讨论】:

好吧,要么你有一个分类问题并且你使用一个分类器,或者一个回归问题并且你使用一个回归器。为什么这两种方法都应该起作用?你的问题是什么——回归还是分类? 我有一个回归问题,可以改成分类问题。因此我使用了 RandomForestRegressor,但目前的结果根本不是最优的。 Y_train 数据集是:0 -0.0002 1 0.0000 2 -0.0002 3 0.0002 4 0.0003 ... 22186 -0.0003 22187 0.0007 22188 0.0001 22189 -0.0003 22190 -0.0003 所以有一个固定的结果不是我期望和寻找的。​​span> 当然不是说平稳的结果是可以接受的;您确定所有这些索引 (0, 1,..., 22189, 22190) 都没有作为数据传递(就像它们在这里一样)? 不,不是,我注意到我可能做错的一件事是:data.dropna() --> data = data.dropna() 无论如何,我想对你的情况进行独立的观察和评估可以说不是没有帮助。 【参考方案1】:

很可能只有两个特征,没有足够的信息来进行数字预测(即回归);在“较温和”的分类设置中(如您所说,仅预测符号)您取得了一些成功。

特征数量少并不是唯一可能的问题;从您发布的几个示例来看,可以很容易地看到,例如,您的前 5 个示例具有相同的特征([1.0, 0.0002]),而它们对应的y 值可以在[-0.0002, 0.0003] 中的任何位置 - 情况是您的样本 #29583 和 29584 相似。另一方面,您的样本 #3 ([1.0, 0.0002]) 和 #29587 ([30.0, 0.0022]) 看起来非常不同,但它们最终具有相同的 y0.0002 .

如果您的数据集的其余部分具有相似的特征,则可能无法进行像样的回归建模。

最后但并非最不重要的一点是,如果您的数据以任何方式沿某些特征“排序”(它们看起来像,但当然我不能确定这么小的样本),情况会变得更糟。我的建议是使用train_test_split 拆分您的数据,而不是手动进行:

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
     X, y, test_size=0.25, shuffle=True)

希望,由于洗牌,将导致更有利的分裂。您可能希望在洗牌和拆分之前从数据框中删除重复的行(它们从来都不是一个好主意) - 请参阅 pandas.DataFrame.drop_duplicates

【讨论】:

以上是关于RandomForestRegressor 评价方法的主要内容,如果未能解决你的问题,请参考以下文章

将 GridSearchCV 用于 RandomForestRegressor

回归任务中的评价指标之MSE,RMSE,MAE,R-Squared,MAPE

sklearn 中的 RandomForestRegressor 给出负分

RandomForestRegressor,特征重要性

回归评价指标MSERMSEMAER-Squared

RandomForestRegressor 和 feature_importances_ 错误