我试图得到一个线性模型,其中Y是因变量,X1,X2,X3是我的自变量。
使用R中的'scale'方法缩放我的输入并获得效率和截距。
Y = a1X1 + a2X2 + a3X3 + c
现在,要预测Y(X1,X2,X3)的给定值,可以使用上面的方程直接计算Y的值,还是应该在将它们放入等式之前对输入变量进行缩放? 如果是,我们如何扩展它们呢?
答案 0 :(得分:5)
如果您有训练集(原始数据)和测试集(新数据),并且您使用训练集缩放为[0,1] 来构建模型,那么当您使用测试集使用此模型进行预测时,您还必须首先进行缩放。但要小心:您必须使用与训练集相同的参数来缩放测试集。因此,如果您使用x-min(x)/(max(x)-min(x))
进行扩展,则必须使用 training 数据集中max(x)
和min(x)
的值。这是一个例子:
set.seed(1) # for reproducible example
train <- data.frame(X1=sample(1:100,100),
X2=1e6*sample(1:100,100),
X3=1e-6*sample(1:100,100))
train$y <- with(train,2*X1 + 3*1e-6*X2 - 5*1e6*X3 + 1 + rnorm(100,sd=10))
fit <- lm(y~X1+X2+X3,train)
summary(fit)
# ...
# Coefficients:
# Estimate Std. Error t value Pr(>|t|)
# (Intercept) 1.063e+00 3.221e+00 0.33 0.742
# X1 2.017e+00 3.698e-02 54.55 <2e-16 ***
# X2 2.974e-06 3.694e-08 80.51 <2e-16 ***
# X3 -4.988e+06 3.715e+04 -134.28 <2e-16 ***
# ---
# scale the predictor variables to [0,1]
mins <- sapply(train[,1:3],min)
ranges <- sapply(train[,1:3],function(x)diff(range(x)))
train.scaled <- as.data.frame(scale(train[,1:3],center=mins,scale=ranges))
train.scaled$y <- train$y
fit.scaled <- lm(y ~ X1 + X2 + X3, train.scaled)
summary(fit.scaled)
# ...
# Coefficients:
# Estimate Std. Error t value Pr(>|t|)
# (Intercept) 1.066 3.164 0.337 0.737
# X1 199.731 3.661 54.553 <2e-16 ***
# X2 294.421 3.657 80.508 <2e-16 ***
# X3 -493.828 3.678 -134.275 <2e-16 ***
# ---
请注意,正如预期的那样,缩放会影响系数的值(当然......),但不影响t值,或拟合,RSQ或F(我只复制了部分)这里的摘要。)
现在让我们比较缩放与测试数据集的效果。
# create test dataset
test <- data.frame(X1=sample(-5:5,10),
X2=1e6*sample(-5:5,10),
X3=1e-6*sample(-5:5,10))
# predict y based on test data with un-scaled fit
pred <- predict(fit,newdata=test)
# scale the test data using min and range from training dataset
test.scaled <- as.data.frame(scale(test[,1:3],center=mins,scale=ranges))
# predict y based on new data scaled, with fit from scaled dataset
pred.scaled <- predict(fit.scaled,newdata=test.scaled)
all.equal(pred,pred.scaled)
# [1] TRUE
因此,使用未缩放的拟合与未缩放数据进行预测会产生与使用缩放拟合和缩放数据的预测完全相同的结果。
答案 1 :(得分:2)
可以使用上面的方程式直接计算Y的值,还是应该在将输入变量放入等式之前对其进行缩放
输入变量的缩放方式与初始缩放的方式相同。
如果是,我们如何扩展它们?
阅读您使用的命令(?scale
)的文档,看看它做了什么!然后为您复制新的预测数据。如果使用默认值,则减去原始预测变量的均值,然后除以标准差。您应该返回原始数据,计算均值和标准差,并使用它们以相同的方式缩放数据以进行预测。
您的另一个选择是转换系数。这只需要一点代数。如果您的缩放转换为f(x) = mx + b
,而您的拟合模型为y = a * f(x)
,则很容易看到
y = a * f(x) + c
y = a * (mx + b) + c
y = a m x + a b + c
因此,对于未经转换的数据x
,您的斜率为a * m
,截距为a * b + c
。这很容易扩展到更多变量或不同的转换。如果你正在转换为[0,1],你的转换可能是f(x) = (x - min(x)) / (max(x) - min(x))
......代数应该不难,但我会留给你。