美文网首页
机器学习——线性回归

机器学习——线性回归

作者: Bioinfor生信云 | 来源:发表于2023-12-07 09:55 被阅读0次

    什么是线性回归

    线性回归是一种统计学和机器学习中常用的方法,用于建立变量之间线性关系的模型。具体而言,线性回归用于预测一个因变量(或响应变量)与一个或多个自变量(或解释变量)之间的关系。这种关系可以表示为一条直线的方程,因此称为“线性”回归。

    线性回归模型的数学表达式如下:

    其中:

    • ( Y ) 是因变量(或响应变量);
    • ( X_1, X_2, \ldots, X_n ) 是自变量(或解释变量);
    • ( \beta_0 ) 是截距;
    • ( \beta_1, \beta_2, \ldots, \beta_n ) 是自变量的系数;
    • ( \varepsilon ) 是误差项,表示模型无法完全解释的部分。

    线性回归的目标是找到最佳的系数 ( \beta_0, \beta_1, \ldots, \beta_n ) 来使模型的预测值与实际观测值之间的差异最小化。这通常通过最小化平方误差(预测值与实际值之差的平方和)来实现。

    线性回归可用于分析变量之间的关系,进行预测,识别重要的自变量,以及理解数据中的趋势。虽然线性回归假设变量之间的关系是线性的,但它仍然是一个强大而广泛应用的工具。


    有多个预测因子

    多元线性回归是线性回归的一种扩展,适用于有多个自变量的情况。与简单线性回归只涉及一个自变量不同,多元线性回归考虑了多个自变量之间与因变量之间的线性关系。其数学表达式可以写为:


    其中:

    • ( Y ) 是因变量;
    • ( X_1, X_2, \ldots, X_p ) 是多个自变量;
    • ( \beta_0 ) 是截距;
    • ( \beta_1, \beta_2, \ldots, \beta_p ) 是各自变量的系数;
    • ( \varepsilon ) 是误差项。

    与简单线性回归类似,多元线性回归的目标是找到最佳的系数 ( \beta_0, \beta_1, \ldots, \beta_p ) 来最小化预测值与实际观测值之间的差异。这通常通过最小化平方误差的和来实现。

    多元线性回归的步骤包括:

    1. 收集数据: 收集包含因变量和多个自变量的数据集。

    2. 建立模型: 建立多元线性回归模型,并确定模型中的自变量。

    3. 拟合模型: 通过最小化平方误差来估计模型的系数,找到最佳的 ( \beta_0, \beta_1, \ldots, \beta_p )。

    4. 模型评估: 评估模型的性能,通常使用统计指标如均方误差(MSE)、决定系数(R²)等。

    5. 预测: 利用训练好的模型进行新数据的预测。

    多元线性回归在实际应用中非常常见,例如经济学中分析影响 GDP 的因素、生物学中预测生物体的生长等。在建立多元线性回归模型时,需要注意变量之间的共线性(collinearity)问题,以及对模型的适当性进行检验。

    简单线性模型

    要在 R 中执行简单线性回归模型,我们可以使用以下lm()函数:

    library(dplyr)    
    library(ggplot2) 
    library(caret) 
    library(vip)      
    library(gridExtra)
    library(tidyr)
    ames <- AmesHousing::make_ames()
    set.seed(123)  
    split  <- rsample::initial_split(ames, prop = 0.7, strata = "Sale_Price")
    ames_train  <- rsample::training(split)
    ames_test   <- rsample::testing(split)
    model1 <- lm(Sale_Price ~ Gr_Liv_Area, data = ames_train)
    
    p1 <- model1 %>%
      broom::augment() %>%
      ggplot(aes(Gr_Liv_Area, Sale_Price)) + 
      geom_point(size = 1, alpha = 0.3) +
      geom_smooth(se = FALSE, method = "lm") +
      scale_y_continuous(labels = scales::dollar) +
      ggtitle("Fitted regression line")
    
    p2 <- model1 %>%
      broom::augment() %>%
      ggplot(aes(Gr_Liv_Area, Sale_Price)) + 
      geom_segment(aes(x = Gr_Liv_Area, y = Sale_Price,
                       xend = Gr_Liv_Area, yend = .fitted), 
                   alpha = 0.3) +
      geom_point(size = 1, alpha = 0.3) +
      geom_smooth(se = FALSE, method = "lm") +
      scale_y_continuous(labels = scales::dollar) +
      ggtitle("Fitted regression line (with residuals)")
    
    grid.arrange(p1, p2, nrow = 1)
    
    #使用summary()来获得更详细的模型结果报告
    summary(model1)
    
    sigma(model1)    # RMSE
    
    sigma(model1)^2  # MSE
    
    confint(model1, level = 0.95)
    
    #########################another example####################
    
    data(Ozone, package = "mlbench")
    
    ozoneTib <- as_tibble(Ozone)
    
    names(ozoneTib) <- c("Month", "Date", "Day", "Ozone", "Press_height",
                         "Wind", "Humid", "Temp_Sand", "Temp_Monte",
                         "Inv_height", "Press_grad", "Inv_temp", "Visib")
    
    ozoneTib
    
    #目前,Month、Day和Date变量都是因子。可以说,这可能是有道理的,但在这个练习中,我们将把它们当作数字来对待。为此,我们使用方便的mutate_all()函数,该函数将数据作为第一个参数,将转换/函数作为第二个参数。在这里,我们用as。将所有变量转换为数值类。
    ozoneClean <- mutate_all(ozoneTib, as.numeric) %>%
      filter(is.na(Ozone) == FALSE)
    
    ozoneClean
    ozoneUntidy <- gather(ozoneClean, key = "Variable",
                          value = "Value", -Ozone)
    #在ggplot()调用中,我们将facet by Variable,并通过将scale参数设置为“free_x”来允许facet的x轴变化。然后,除了一个geom_point层,我们还添加了两个geom_smooth层。第一个geom_smooth没有参数,因此使用默认设置。默认情况下,如果数据少于1000例,geom_smooth将为数据绘制一条黄土曲线(一条曲线,局部回归线),如果数据超过1000例,则绘制一条GAM曲线。
    ggplot(ozoneUntidy, aes(Value, Ozone)) +
      facet_wrap(~ Variable, scale = "free_x") +
      geom_point() +
      geom_smooth() +
      geom_smooth(method = "lm", col = "red") +
      theme_bw()
    #结果图如图所示。嗯,一些预测因子与臭氧水平有线性关系,一些有非线性关系,还有一些似乎根本没有关系!将臭氧数据集中的每个预测变量与臭氧变量对照。直线表示线性回归线,曲线表示GAM线。
    

    根据埃姆斯住房数据的居住空间回归销售价格进行最小二乘法拟合右图中,垂直线表示与每个观察值相关的个体误差,称为残差。

    多元线性模型

    交互作用在预测建模中非常普遍。由于线性模型是参数化建模的一个示例,因此由我们决定是否以及何时包括交互效应。

    (model2 <- lm(Sale_Price ~ Gr_Liv_Area + Year_Built, data = ames_train))
    (model2 <- update(model1, . ~ . + Year_Built))
    # Fitted models
    fit1 <- lm(Sale_Price ~ Gr_Liv_Area + Year_Built, data = ames_train)
    fit2 <- lm(Sale_Price ~ Gr_Liv_Area * Year_Built, data = ames_train)
    
    # 回归数据
    plot_grid <- expand.grid(
      Gr_Liv_Area = seq(from = min(ames_train$Gr_Liv_Area), to = max(ames_train$Gr_Liv_Area), 
                        length = 100), 
      Year_Built = seq(from = min(ames_train$Year_Built), to = max(ames_train$Year_Built), 
                       length = 100)
    )
    plot_grid$y1 <- predict(fit1, newdata = plot_grid)
    plot_grid$y2 <- predict(fit2, newdata = plot_grid)
    
    # 水平图
    library(viridis)
    p1 <- ggplot(plot_grid, aes(x = Gr_Liv_Area, y = Year_Built, 
                                z = y1, fill = y1)) +
      geom_tile() +
      geom_contour(color = "white") +
      viridis::scale_fill_viridis(name = "Predicted\nvalue", option = "inferno") +
      theme_bw() +
      ggtitle("Main effects only")
    p2 <- ggplot(plot_grid, aes(x = Gr_Liv_Area, y = Year_Built, 
                                z = y2, fill = y1)) +
      geom_tile() +
      geom_contour(color = "white") +
      viridis::scale_fill_viridis(name = "Predicted\nvalue", option = "inferno") +
      theme_bw() +
      ggtitle("Main effects with two-way interaction")
    
    gridExtra::grid.arrange(p1, p2, nrow = 1)
    
    lm(Sale_Price ~ Gr_Liv_Area + Year_Built + Gr_Liv_Area:Year_Built, data = ames_train)
    
    # 使用数据集中的所有特征作为主要效果
    model3 <- lm(Sale_Price ~ ., data = ames_train) 
     #print estimated coefficients in a tidy data frame
    broom::tidy(model3)  
    

    评估模型精度

    将三个主效应模型拟合到 Ames 住房数据:单个预测变量、两个预测变量和所有可能的预测变量。但问题仍然存在,哪种模式是“最好的”?要回答这个问题,我们必须定义“最佳”的含义。

    set.seed(123)  
    (cv_model1 <- train(
      form = Sale_Price ~ Gr_Liv_Area, 
      data = ames_train, 
      method = "lm",
      trControl = trainControl(method = "cv", number = 10)
    ))
    

    模型二和模型三

    # model 2 CV
    set.seed(123)
    cv_model2 <- train(
      Sale_Price ~ Gr_Liv_Area + Year_Built, 
      data = ames_train, 
      method = "lm",
      trControl = trainControl(method = "cv", number = 10))
    
    # model 3 CV
    set.seed(123)
    cv_model3 <- train(
      Sale_Price ~ ., 
      data = ames_train, 
      method = "lm",
      trControl = trainControl(method = "cv", number = 10)
    )
    
    
    summary(resamples(list(
      model1 = cv_model1, 
      model2 = cv_model2, 
      model3 = cv_model3
    )))
    

    模型解释

    线性关系:线性回归假设预测变量和响应变量之间存在线性关系。通过对响应和/或预测变量应用变换,可以使非线性关系变为线性(或接近线性)关系。

    残差之间的恒定方差:线性回归假设误差项之间的方差(ε1,ε2,……,εp) 是常数(这个假设被称为同方差性)。如果误差方差不是常量,则系数的p值和置信区间将无效。


    线性回归假设残差之间的方差恒定。model1(左)显示出明确的异方差迹象,而model3(右)具有恒定方差。

    无自相关性:线性回归假设误差是独立且不相关的。如果实际上误差之间存在相关性,则系数的估计标准误差将有偏差,导致预测区间比应有的窄。

    观测值多于预测变量:虽然 Ames 住房数据不是问题,但当特征数量超过观测值时(p>n), 无法获得 OLS 估计。要解决此问题,我们可以一次删除一个变量,直到p<n。尽管可以使用预处理工具来指导这种手动方法,但它可能很麻烦且容易出错。

    没有或很少有多重共线性:共线性是指两个或多个预测变量彼此密切相关的情况。共线性的存在会给 OLS 带来问题,因为很难分离出共线性变量对响应的个别影响。

    两个变量产生了共线性问题

    主成分回归

    主成分回归(Principal Component Regression,PCR)是一种在多元统计分析和回归分析中使用的方法。它结合了主成分分析(PCA)和多元线性回归分析的思想。

    以下是主成分回归的基本步骤:

    1. 收集数据: 收集包含多个自变量和一个因变量的数据集。

    2. 标准化数据: 对所有自变量进行标准化处理,使其均值为0,标准差为1。这是为了确保所有变量在主成分分析中具有相同的权重。

    3. 主成分分析(PCA): 对标准化后的数据进行主成分分析,以找到原始变量的主成分。主成分是原始变量的线性组合,它们捕捉了原始变量中的大部分方差。通常,选择保留累积方差达到一定比例的主成分。

    4. 选择主成分数量: 根据累积方差的百分比或其他准则选择要保留的主成分数量。

    5. 建立回归模型: 使用选定的主成分作为新的自变量,建立多元线性回归模型。这个模型用于预测因变量。

    6. 模型解释: 解释主成分回归模型的结果,包括各主成分的系数和截距。

    主成分回归的优势在于可以处理高维数据,减少变量之间的共线性,并提高模型的泛化能力。然而,它也有一些局限性,例如对于解释模型中各主成分的实际意义可能不太直观,因为它们是原始变量的线性组合。此外,PCR对异常值比较敏感。

    主成分分析可用于表示具有较少数量不相关特征(称为主成分)的相关变量,并且所得成分可用作线性回归模型中的预测变量。

    偏最小二乘法

    偏最小二乘法(Partial Least Squares, PLS)是一种多变量统计方法,用于处理包含多个解释变量(自变量)和响应变量(因变量)的数据集。它的主要目标是通过建立新的综合变量(称为部分最小二乘变量),来最大化解释和预测响应变量的方差。PLS通常用于数据降维、模型建立和预测。

    以下是偏最小二乘法的主要步骤:

    1. 选择部分最小二乘变量的数量: PLS的第一步是确定要创建的新变量的数量。这通常是根据问题的特定要求和数据集的性质来确定的。

    2. 建立部分最小二乘变量: 对于每个解释变量和每个响应变量,PLS使用最小二乘回归建立新的综合变量。这些新变量是原始变量的线性组合。

    3. 计算加载因子: 加载因子是新综合变量中每个原始变量的权重。它们用于表示每个原始变量在新综合变量中的重要性。

    4. 计算得分: 得分是原始变量通过加载因子加权的结果,用于表示每个样本在新综合变量中的位置。

    5. 重复步骤2-4: 重复以上步骤,直到达到预定的部分最小二乘变量数量。

    PLS主要用于处理高维数据,特别是在样本数量较少的情况下,以及当解释变量之间存在多重共线性时。

    PCR(左)和 PLS(右)之间的差异。PCR 找到最大程度地总结独立于响应变量的特征的主成分 (PC),然后使用这些 PC 作为预测变量。PLS 找到同时总结预测变量变化同时与结果最佳相关的组件,然后使用这些PC 作为预测变量。

    特征解释

    一旦我们找到了最大化预测准确性的模型,下一个目标就是解释模型结构。变量重要性旨在确定那些在我们的模型中最有影响力的变量。对于线性回归模型,这通常通过使用的每个模型参数的 t 统计量的绝对值来衡量。

    欢迎关注Bioinfor 生信云!

    相关文章

      网友评论

          本文标题:机器学习——线性回归

          本文链接:https://www.haomeiwen.com/subject/wvscgdtx.html