R语言 岭回归

R语言 岭回归

岭回归 是一种分类算法,它的部分工作原理是不需要无偏估计器。岭回归使给定模型中预测因子的残差平方和最小。山脊回归包括将系数的估计值向零缩减。

岭回归在R中的应用

岭回归是一种正则化的回归算法,它执行L2正则化,增加了一个L2惩罚,该惩罚等于系数大小的平方。所有的系数都以相同的系数缩减,即没有一个系数被消除。二级正则化不会导致稀疏的模型。岭回归增加了偏见,使估计值可靠地接近真实的人口值。山脊回归通过在相关矩阵的对角线元素上增加一个小数值 k 来进行,即山脊回归的名字来自于相关矩阵的对角线上的1被认为是一个山脊。

R编程中的岭回归

这里, k 是一个小于1的正量(通常小于0.3)。估计器中的偏差量由以下公式给出。

R编程中的岭回归

协方差矩阵由以下公式给出。

R编程中的岭回归

存在一个 k 值,在这个值上,山脊估计器的平均平方误差(MSE即方差加偏差平方)小于最小二乘估计器。适当的k值取决于真实的回归系数(被估计的)和山脊方案的最优性。

  • lambda =0时,岭回归等于最小二乘回归。
  • lambda =无穷大时,所有的系数都缩减为零。

另外,理想的惩罚是在0和无限之间。让我们在R编程中实现岭回归。

岭回归在R中的实现

数据集

Big Mart 数据集由不同城市的10家商店的1559种产品组成。每个产品和商店的某些属性已经被定义。它包括12个特征,即Item_Identifier(分配给每个不同商品的唯一产品ID),Item_Weight(包括产品的重量),Item_Fat_Content(描述产品是否为低脂肪),Item_Visibility(提到商店中所有产品的总展示面积中分配给特定产品的百分比),Item_Type(描述产品所属的食品类别),Item_MRP(产品的最高零售价(清单价格)),Outlet_Identifier(分配的唯一商店ID。它由一个长度为6的字母数字字符串组成),Outlet_Establishment_Year(提到了商店成立的年份),Outlet_Size(告诉了商店占地面积的大小),Outlet_Location_Type(告诉了商店所在城市的大小),Outlet_Type(告诉了该商店是否只是一个杂货店或某种超市)和Item_Outlet_Sales(该产品在特定商店的销售额)。

# Loading data
train = fread("Train_UWu5bXk.csv")
test = fread("Test_u94Q5KV.csv")
 
# Structure
str(train)

输出

R编程中的岭回归

对数据集进行山脊回归

在数据集上使用岭回归算法,该数据集包括12个特征,有1559个产品,分布在不同城市的10家商店。

# Installing Packages
install.packages("data.table")
install.packages("dplyr")
install.packages("glmnet")
install.packages("ggplot2")
install.packages("caret")
install.packages("xgboost")
install.packages("e1071")
install.packages("cowplot")
 
# load packages
library(data.table) # used for reading and manipulation of data
library(dplyr)     # used for data manipulation and joining
library(glmnet)     # used for regression
library(ggplot2) # used for ploting
library(caret)     # used for modeling
library(xgboost) # used for building XGBoost model
library(e1071)     # used for skewness
library(cowplot) # used for combining multiple plots
 
# Loading datasets
train = fread("Train_UWu5bXk.csv")
test = fread("Test_u94Q5KV.csv")
 
# Setting test dataset
# Combining datasets
# add Item_Outlet_Sales to test data
test[, Item_Outlet_Sales := NA]
 
combi = rbind(train, test)
 
# Missing Value Treatment
missing_index = which(is.na(combiItem_Weight))
for(i in missing_index)
{
item = combiItem_Identifier[i]
combiItem_Weight[i] =
        mean(combiItem_Weight[combiItem_Identifier == item],
        na.rm = T)
}
 
# Replacing 0 in Item_Visibility with mean
zero_index = which(combiItem_Visibility == 0)
for(i in zero_index)
{
item = combiItem_Identifier[i]
combiItem_Visibility[i] =
        mean(combiItem_Visibility[combiItem_Identifier == item],
                                                    na.rm = T)
}
 
# Label Encoding
# To convert categorical in numerical
combi[, Outlet_Size_num := ifelse(Outlet_Size == "Small", 0,
                            ifelse(Outlet_Size == "Medium", 1, 2))]
 
combi[, Outlet_Location_Type_num :=
                ifelse(Outlet_Location_Type == "Tier 3", 0,
                    ifelse(Outlet_Location_Type == "Tier 2", 1, 2))]
 
combi[, c("Outlet_Size", "Outlet_Location_Type") := NULL]
 
# One Hot Encoding
# To convert categorical in numerical
ohe_1 = dummyVars("~.", data = combi[, -c("Item_Identifier",
                                        "Outlet_Establishment_Year",
                                        "Item_Type")], fullRank = T)
ohe_df = data.table(predict(ohe_1, combi[, -c("Item_Identifier",
                                        "Outlet_Establishment_Year",
                                        "Item_Type")]))
 
combi = cbind(combi[, "Item_Identifier"], ohe_df)
 
# Remove skewness
skewness(combiItem_Visibility)
skewness(combiprice_per_unit_wt)
 
# log + 1 to avoid division by zero
combi[, Item_Visibility := log(Item_Visibility + 1)]
 
# Scaling and Centering data
num_vars = which(sapply(combi, is.numeric)) # index of numeric features
num_vars_names = names(num_vars)
 
combi_numeric = combi[, setdiff(num_vars_names, "Item_Outlet_Sales"),
                                                        with = F]
 
prep_num = preProcess(combi_numeric, method=c("center", "scale"))
combi_numeric_norm = predict(prep_num, combi_numeric)
 
# removing numeric independent variables
combi[, setdiff(num_vars_names, "Item_Outlet_Sales") := NULL]
combi = cbind(combi, combi_numeric_norm)
 
# splitting data back to train and test
train = combi[1:nrow(train)]
test = combi[(nrow(train) + 1):nrow(combi)]
 
# Removing Item_Outlet_Sales
test[, Item_Outlet_Sales := NULL]
 
# Model Building :Lasso Regression
set.seed(123)
control = trainControl(method ="cv", number = 5)
Grid_la_reg = expand.grid(alpha = 1, lambda = seq(0.001,
                                    0.1, by = 0.0002))
 
# Model Building : Ridge Regression
set.seed(123)
control = trainControl(method ="cv", number = 5)
Grid_ri_reg = expand.grid(alpha = 0, lambda = seq(0.001, 0.1,
                                                by = 0.0002))
 
# Training Ridge Regression model
Ridge_model = train(x = train[, -c("Item_Identifier",
                                "Item_Outlet_Sales")],
                    y = trainItem_Outlet_Sales,
                    method = "glmnet",
                    trControl = control,
                    tuneGrid = Grid_reg
                    )
Ridge_model
 
# mean validation score
mean(Ridge_modelresample$RMSE)
 
# Plot
plot(Ridge_model, main="Ridge Regression")

输出

  • 模型 Ridge_model:

R编程中的岭回归

Ridge回归模型使用alpha值为0,lambda值为0.1。RMSE被用来选择使用最小值的最佳模型。

  • 平均验证得分

R编程中的岭回归

平均验证得分

该模型的平均验证分数为1133.668分。

  • 平面图

R编程中的岭回归

正则化参数增加,RMSE保持不变。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程