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]
) 看起来非常不同,但它们最终具有相同的 y
值 0.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