我已经像这样在训练和测试之间分离了一个数据集。通过选择第 80% 的行索引并将其拆分。
# Eliminamos variables no útiles
df <- df[,!(colnames(df) %in% c("sqm_lot", "sqm_lot15"))]
df_train <- df[1:as.integer(nrow(df)*0.8),]
df_test <- df[as.integer(nrow(df)*0.8):nrow(df),]
nrow(df_test)
## [1] 4324
nrow(df_train)
## [1] 17290
顺便说一下,这个数据集有以下信息
## 'data.frame': 21613 obs. of 16 variables:
## $ price_eur : num 206367 500340 167400 561720 474300 ...
## $ bedrooms : int 3 3 2 4 3 4 3 3 3 3 ...
## $ bathrooms : int 1 2 1 3 2 4 2 1 1 2 ...
## $ sqm_living : num 109.6 238.8 71.5 182.1 156.1 ...
## $ sqm_lot : num 525 673 929 464 751 ...
## $ floors : int 1 2 1 1 1 1 2 1 1 2 ...
## $ waterfront : int 0 0 0 0 0 0 0 0 0 0 ...
## $ view : int 0 0 0 0 0 0 0 0 0 0 ...
## $ condition : int 3 3 3 5 3 3 3 3 3 3 ...
## $ sqm_basement: num 0 37.2 0 84.5 0 ...
## $ yr_built : int 1955 1951 1933 1965 1987 2001 1995 1963 1960 2003 ...
## $ yr_renovated: int 0 1991 0 0 0 0 0 0 0 0 ...
## $ sqm_living15: num 124 157 253 126 167 ...
## $ sqm_lot15 : num 525 710 749 464 697 ...
然后我训练了一个这样的线性模型。
x_train <- df_train[,!(colnames(df_train) %in% "price_eur")]
y_train <- df_train$price_eur
# Entrenamos el modelo
modelo.mlineal <- lm(formula = price_eur ~ ., data = df_train)
modelo.mlineal
##
## Call:
## lm(formula = price_eur ~ ., data = df_train)
##
## Coefficients:
## (Intercept) bedrooms bathrooms sqm_living sqm_lot
## 5.696e+06 -4.366e+04 5.886e+04 2.371e+03 3.063e-01
## floors waterfront view condition sqm_basement
## 2.524e+04 5.327e+05 4.727e+04 2.125e+04 -3.477e+02
## yr_built yr_renovated sqm_living15 sqm_lot15
## -3.000e+03 1.571e+01 1.039e+03 -8.048e+00
然后我使用我的 df_test 数据集进行预测并与我的进行比较
# Tomamos los valores de y_test y x_test
y_test <- df_test$price_eur
x_test <- df_test[,!(colnames(df_test) %in% "price_eur")]
# Restamos sqm_living al modelo y lo metemos con tubería a predict.lm
prediccion_prueba <- modelo.mlineal %>% predict.lm( data = df_test )
print(length(prediccion_prueba))
## [1] 17290
print(length(y_test))
## [1] 4324
errores <- prediccion_prueba - y_test
## Warning in prediccion_prueba - y_test: length of larger object is not a multiple of the length of a smaller one
正如你所看到的,尽管我在
predict.lm
函数中解析 df_test,但我的 y_test 和 y_pred 的长度不同。相反,它给了我用来训练它的原始 df_train 的长度。为什么会出现这种情况?
我期望,嗯......显然我的变量 y_test 和 prediccion_prueba 有相同的长度。
我想要的输出看起来像这样。
print(length(prediccion_prueba))
## [1] 4324
print(length(y_test))
## [1] 4324
解决了。
唯一给我带来问题的是,我将所有内容解析为 Predict.lm 中名为“data”的标志。它应该是“newdata”,请参阅 RDocumentation 中有关该函数的文档。基本上,只需更改这行代码即可:
prediccion_prueba <- modelo.mlineal %>% predict.lm( newdata = df_test )
我不知道为什么它没有给我解析一个不应该存在的变量的错误。