在使用线性回归模型进行预测时缩放自变量

Moh*_*rma 1 r

我试图得到一个线性模型,其中Y是因变量,X1,X2,X3是我的自变量.

在R中使用'scale'方法缩放我的输入并获得eo-efficients和intercept.

Y = a1X1 + a2X2 + a3X3 + c
Run Code Online (Sandbox Code Playgroud)

现在,为了预测给定值(X1,X2,X3)的Y,可以使用上面的方程直接计算Y的值,还是应该在将它们放入等式之前对输入变量进行缩放?如果是,我们如何扩展它们?

jlh*_*ard 5

如果您有训练集(原始数据)和测试集(新数据),并使用缩放到[0,1]的训练集构建模型,那么当您使用此模型使用此模型进行预测时设置,你必须首先扩展.但要小心:您必须使用与训练集相同的参数来缩放测试集.因此,如果您使用x-min(x)/(max(x)-min(x))缩放,则必须使用训练数据集中的值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 ***
# ---
Run Code Online (Sandbox Code Playgroud)

请注意,正如预期的那样,缩放会影响系数的值(当然......),但不会影响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
Run Code Online (Sandbox Code Playgroud)

因此,使用未缩放拟合与未缩放数据的预测产生与使用缩放拟合与缩放数据的预测完全相同的结果.