我有一个要建模的变量,它具有偏态分布。对 var 进行对数转换是一个类似正态的分布。在未转换的 var 上训练随机森林回归器时,我得到的性能比对 var 进行对数转换时更差。我有点困惑是否应该这样做,因为我知道随机森林回归器正在预测叶子的平均值。如果在对数转换的 var 上进行训练,这意味着预测是叶子中值的对数的平均值。其中(转换回来时)不等于实际值的平均值。
有什么意见吗?
我有一个要建模的变量,它具有偏态分布。对 var 进行对数转换是一个类似正态的分布。在未转换的 var 上训练随机森林回归器时,我得到的性能比对 var 进行对数转换时更差。我有点困惑是否应该这样做,因为我知道随机森林回归器正在预测叶子的平均值。如果在对数转换的 var 上进行训练,这意味着预测是叶子中值的对数的平均值。其中(转换回来时)不等于实际值的平均值。
有什么意见吗?
我将假设“更好的性能”是指更好的 CV/验证性能,而不是训练一个。
我想请你想想对数转换目标变量对单个回归树的影响是什么
回归树以最小化 MSE 的方式进行拆分,这(考虑到我们预测均值)意味着它们最小化子节点中目标的方差之和。
如果你的目标有偏差会发生什么?
如果您的变量是倾斜的,高值将影响方差并将您的分割点推向更高的值 - 迫使您的决策树进行不太平衡的分割并尝试将尾部与其余点“隔离”。
非转换和转换数据的单个拆分示例:
因此,总体而言,如果您的数据没有被转换,您的树(等等 RF)将更多地受到高端值的影响——这意味着它们在预测高值时应该更准确,而对低值的预测要少一些.
如果您进行对数转换,您会降低这些高值的相对重要性,并接受对这些高值有更多错误,同时对大量数据更准确。这可能会更好地概括,并且 - 一般来说 - 也是有道理的。确实在同一个回归中,预测什么时候比预测好什么时候,因为相对误差通常比绝对误差更重要。
希望这很有用!
切向地,结果的边际分布(即绘制直方图时获得的分布)与回归无关,因为大多数回归方法都对条件分布做出假设(即绘制结果直方图时获得的分布是 I只观察具有相同特征的结果)。现在,关于你的问题。
如果您正在评估转换结果的性能,则结果可能会产生误导。因为对数本质上压缩了结果,所以方差也缩小了,这意味着预测将更接近观察结果。这减少了损失,并且似乎使您的模型更好。尝试这样做
from sklearn.dummy import DummyRegressor
from sklearn.model_selection import cross_val_score
cross_val_score(DummyRegressor(), X, y, scoring = 'neg_mean_squared_error')
cross_val_score(DummyRegressor(), X, np.log(y), scoring = 'neg_mean_squared_error')
相同的数据,但得分差异很大。为什么?因为对数缩小了结果的方差,使模型看起来更好,即使它没有什么不同。
如果你想改变你的结果,你可以:
Sklearn 使用他们的TransformedTargetRegressor
.
from sklearn.ensemble import RandomForestRegressor
from sklearn.compose import TransformedTargetRegressor
from sklearn.model_selection import GridSearchCV, train_test_split
from sklearn.pipeline import Pipeline
from sklearn.datasets import make_regression
import numpy as np
rf = RandomForestRegressor()
log_rf = TransformedTargetRegressor(rf, func = np.log, inverse_func=np.exp)
params = {'regressor__n_estimators': [10,100,1000]}
gscv = GridSearchCV(log_rf, param_grid=params,refit = True)
X,y = make_regression(n_samples = 10_000, n_features=50, n_informative=5)
y -= y.min()-1 #Make the outcome positive.
Xtrain, Xtest, ytrain, ytest = train_test_split(X,y, test_size = 0.25)
gscv.fit(Xtrain, ytrain)
这将确保模型在对数转换结果上进行训练,反向转换到原始空间,并评估原始空间中的损失。