五种回归方法的比较

 引言

 线性和逻辑回归通常是人们为机器学习和数据科学学习的第一个建模算法。 两者都很棒,因为它们易于使用和解释。 然而,它们固有的简单性也有一些缺点,在许多情况下它们并不是回归模型的最佳选择。 实际上有几种不同类型的回归,每种都有自己的优点和缺点。

  在这篇文章中,我们将讨论5种最常见的回归算法及其属性,同时评估他们的性能。 最后,希望让您更全面地了解回归模型!

  目录

  • 线性回归
  • 多项式回归
  • 岭回归
  • 套索回归
  • 弹性网络回归

线性回归(Linear Regression)

  回归是一种用于建模和分析变量之间关系的技术,通常是它们如何结合并且与一起产生特定结果相关。 线性回归指的是完全由线性变量组成的回归模型。 从简单的情况开始,单变量线性回归是一种技术,用于使用线性模型对单个输入自变量和输出因变量之间的关系进行建模。

  更一般的情况是多变量线性回归,其中为多个独立输入变量(特征变量)和输出因变量之间的关系创建模型。 模型保持线性,输出是输入变量的线性组合。 我们可以建模多变量线性回归,如下所示:

  其中a_n是系数,X_n是变量,b是偏差。 我们可以看到,此函数不包含任何非线性,因此仅适用于对线性可分离数据进行建模,因为我们只是使用系数权重a_n来加权每个特征变量X_n的重要性。

关于线性回归的几个关键点:

  • 建模快速简便,当要建模的关系不是非常复杂且没有大量数据时尤其有用。
  • 非常直观地理解和解释。
  • 线性回归对异常值非常敏感。

python实例:

import numpy as np
import pandas as pd
from sklearn import datasets
from sklearn import metrics

data=datasets.load_boston()# load data

#定义评估函数
def evaluation(y_true,y_pred,index_name=[‘OLS‘]):
    df=pd.DataFrame(index=[index_name],columns=[‘平均绝对误差‘,‘均方误差‘,‘r2‘])
    df[‘平均绝对误差‘]=metrics.mean_absolute_error(y_true, y_pred).round(4)
    df[‘均方误差‘]=metrics.mean_squared_error(y_true,y_pred)
    df[‘r2‘]=metrics.r2_score(y_true,y_pred)
    return df

 

df=pd.DataFrame(data.data,columns=data.feature_names)

target=pd.DataFrame(data.target,columns=[‘MEDV‘])

  简单的可视化分析:

import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style="whitegrid", color_codes=True)

g=sns.pairplot(data[list(data.columns)[:5]], hue=‘ZN‘,palette="husl",diag_kind="hist",size=2.5)
for ax in g.axes.flat:
    plt.setp(ax.get_xticklabels(), rotation=45)
plt.tight_layout()

  

特征的相关系数图:

cm = np.corrcoef(data[list(data.columns)[:5]].values.T)   #corrcoef方法按行计算皮尔逊相关系数,cm是对称矩阵
#使用np.corrcoef(a)可计算行与行之间的相关系数,np.corrcoef(a,rowvar=0)用于计算各列之间的相关系数,输出为相关系数矩阵。
sns.set(font_scale=1.5)   #font_scale设置字体大小
cols=list(data.columns)[:5]
hm = sns.heatmap(cm,cbar=True,annot=True,square=True,fmt=‘.2f‘,annot_kws={‘size‘: 15},yticklabels=cols,xticklabels=cols)
# plt.tight_layout()
# plt.savefig(‘./figures/corr_mat.png‘, dpi=300)

  

用statsmodels模块的OLS

import statsmodels.api as sm

X=df[df.columns].values
y=target[‘MEDV‘].values

#add constant
X=sm.add_constant(X)

# build model
model=sm.OLS(y,X).fit()

prediction=model.predict(X)

print(model.summary())

  也可以用sklearn模块:

from sklearn import linear_model

lm = linear_model.LinearRegression()
model = lm.fit(X,y)

y_pred = lm.predict(X)

lm.score(X,y)

#系数
lm.coef_
#截距
lm.intercept_

evaluation(y,y_pred)

  

多项式回归(Polynomial Regression)

  当我们想要创建一个适合处理非线性可分数据的模型时,我们需要使用多项式回归。 在这种回归技术中,最佳拟合线不是直线。 它是一条适合数据点的曲线。 对于多项式回归,一些自变量的幂大于1.例如:

我们可以让一些变量具有指数,其他变量没有指数,并且还为每个变量选择我们想要的精确指数。 但是,选择每个变量的精确指数自然需要了解数据如何与输出相关。

note:

  • 能够建模非线性可分离数据; 线性回归不能做到这一点。 它通常更灵活,可以建立一些相当复杂的关系。
  • 完全控制特征变量的建模(指定要设置)。
  • 需要仔细设计。 需要一些数据知识才能选择最佳指数。
  • 如果指数选择不当,容易过度拟合。

python实例:

from sklearn.preprocessing import PolynomialFeatures

poly_reg = PolynomialFeatures(degree = 4)
X_Poly = poly_reg.fit_transform(X)

lin_reg_2 =linear_model.LinearRegression()
lin_reg_2.fit(X_Poly, y)

y_pred=lin_reg_2.predict(poly_reg.fit_transform(X))

evaluation(y,y_pred,index_name=[‘poly_reg‘])

  

可以看到,误差很小,r2很大,模型已经过拟合。

岭回归(ride regression)

  在特征变量之间存在高共线性的情况下,标准线性或多项式回归将失败。 共线性是独立变量之间存在近线性关系。 高共线性的存在可以通过几种不同的方式确定:

  • 即使理论上该变量应该与Y高度相关,回归系数也不显着。
  • 添加或删除X特征变量时,回归系数会发生显着变化。
  • X特征变量具有高成对相关性(检查相关矩阵)。

我们首先可以看一下标准线性回归的优化函数,以获得有关岭回归如何帮助的一些见解:

其中X代表特征变量,w代表权重,y代表实际值。 岭回归是一种补救措施,用于缓解回归模型中预测变量之间的共线性。 由于特征变量存在共线性,因此最终回归模型具有高方差。

为了缓解这个问题,Ridge Regression为变量添加了一个小的平方偏差因子:

在模型中引入少量偏差,但大大减小了方差。

note:

  • 该回归的假设与最小二乘回归类似,但没有正态性假设。
  • 它会缩小系数的值,但不会达到零,这表明没有特征选择功能

python实例:

from sklearn.linear_model import Ridge

ridge_reg = Ridge(alpha=1, solver="cholesky")
ridge_reg.fit(X, y)

y_pred=ridge_reg.predict(X

evaluation(y,y_pred,index_name=‘ridge_reg‘)

  

套索回归(lasso regression)

  套索回归与岭回归非常相似,因为两种技术都具有相同的前提。 我们再次为回归优化函数添加一个偏置项,以减少共线性的影响,从而减小模型方差。 然而,不是使用像岭回归那样的平方偏差,而套索回归使用绝对值偏差:

Ridge和Lasso回归之间存在一些差异,这些差异基本上可以回归到L2和L1正则化的属性差异:

  • 内置特征选择:经常被提及为L1范数的有用属性,而L2范数则不然。这实际上是L1范数的结果,它倾向于产生稀疏系数。例如,假设模型有100个系数,但只有10个系数具有非零系数,这实际上是说“其他90个预测变量在预测目标值方面毫无用处”。 L2范数产生非稀疏系数,因此不具有此属性。因此,可以说Lasso回归做了一种“参数选择”,因为未选择的特征变量的总权重为0。
  • 稀疏性:指矩阵(或向量)中只有极少数条目为非零。 L1范数具有产生许多具有零值的系数或具有很少大系数的非常小的值的特性。这与Lasso执行一种特征选择的前一点相关联。
  • 计算效率:L1范数没有解析解,但L2有。在计算上可以有效地计算L2范数解。然而,L1范数具有稀疏性属性,允许它与稀疏算法一起使用,这使得计算在计算上更有效。
from sklearn.linear_model import Lasso

lasso_reg = Lasso(alpha=0.1)
lasso_reg.fit(X, y)
y_pred=lasso_reg.predict(X)
evaluation(y,y_pred,index_name=‘lasso_reg‘)

  

弹性网络回归(ElasticNet Regression)

  ElasticNet是Lasso和Ridge Regression技术的混合体。 它使用L1和L2正则化来考虑两种技术的影响:

在Lasso和Ridge之间进行权衡的一个实际优势是:它允许Elastic-Net在旋转下继承Ridge的一些稳定性。

note:

  • 它在高度相关的变量的情况下鼓励群体效应,而不是像Lasso那样将其中的一些归零。
  • 所选变量的数量没有限制。

python实例:

enet_reg = linear_model.ElasticNet(l1_ratio=0.7)

enet_reg.fit(X,y)

y_pred=enet_reg.predict(X)
evaluation(y,y_pred,index_name=‘enet_reg ‘)

  

小结:

  这篇文章简单总结了5种常见类型的回归及其属性。 所有这些回归正则化方法(Lasso,Ridge和ElasticNet)在数据集中变量之间的高维度和多重共线性的情况下都能很好地工作。 希望对大家有帮助!

原文地址:https://www.cnblogs.com/jin-liang/p/9551759.html

时间: 2024-10-03 06:10:21

五种回归方法的比较的相关文章

iertutil.dll文件丢失找回的五种解决方法

今天小编在打开应用程序时弹出360se.exe窗口,提示没有找到iertutil.dll,因此这个应用程序未能启动.重新安装应用程序可能会修复此问题.瞬间就郁闷了,昨天用还好好的呢?难道真要重装程序.重新下载安装很浪费时间的.在请教大神后,小编找到了iertutil.dll丢失的原因,很有可能是电脑中毒了,卸载软件误删,比得到了四种常用解决办法和一种万能解决办法.现在分享给大家. 方法一 把C:\WINDOWS\system32\dllcache 下的iertutil.dll 复制到C:\WIN

7 种回归方法!请务必掌握!

https://mp.weixin.qq.com/s/k_UA4LIEji14fucj_NH7Cg 线性回归和逻辑回归通常是人们学习预测模型的第一个算法.由于这二者的知名度很大,许多分析人员以为它们就是回归的唯一形式了.而了解更多的学者会知道它们是所有回归模型的主要两种形式. 事实是有很多种回归形式,每种回归都有其特定的适用场合.在这篇文章中,我将以简单的形式介绍 7 中最常见的回归模型.通过这篇文章,我希望能够帮助大家对回归有更广泛和全面的认识,而不是仅仅知道使用线性回归和逻辑回归来解决实际问

Array 的五种迭代方法 -----every() /filter() /forEach() /map() /some()

ES5定义了五个迭代方法,每个方法都接收两个参数:要在每一项上运行的函数和运行该函数的作用域对象(可选的),作用域对象将影响this的值.传入这些方法中的函数会接收三个参数:数组的项的值.该项在数组中的位置和数组对象本身. 1.every() 和 some() every()是对数组中的每一项运行给定函数,如果该函数对每一项都返回true,则返回true. some()是对数组中的每一项运行给定函数,如果该函数对任一项返回true,则返回true. every()和some()很相似,他们都用于

JS 中对变量类型的五种判断方法

5种基本数据类型:undefined.null.boolean.unmber.string 复杂数据类型:object. object:array.function.date等 方法一:使用typeof检测 当需要变量是否是number,string,boolean ,function,undefined,json类型时,可以使用typeof进行判断:其他变量是判断不出类型的,包括null. typeof是区分不出array和json类型的,因为使用typeof这个变量时,array和json类

jQuery和Prototype的兼容性和冲突的五种解决方法

第一种情况:先加载Prototype,再加载jQuery方法一:jQuery 库和它的所有插件都是在jQuery名字空间内的,包括全局变量也是保存在jQuery 名字空间内的. 使用jQuery.noConflict();主要作用是在任何时候,只要在jQuery加载后就可以调用,将$符号的使用权返回给其它的js库,jQuery在创建它自己的名字空间时就将其它库的$保存在自己的一个变量当中. [html] view plain copy print? <html> <head> &l

Map的五种遍历方法

package com.jackey.topic; import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Set; //循环遍历map的方法public class CircleMap { public static void main(String[] args) {  Ma

HTML页面自动跳转的五种实现方法

下面列了五个例子来详细说明,这几个例子的主要功能是:在5秒后,自动跳转到同目录下的02view.html(根据自己需要自行修改)文件. 1)html的实现 <head> <meta http-equiv="refresh" content="5;url=02view.html"> </head> 优点:简单 缺点:Struts Tiles中无法使用 2)javascript的实现 <script language="

java 遍历map 方法 集合 五种的方法

以下是转载别人的日志,以方便自己以后使用,仅供自己学习之用. package com.jackey.topic; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; //循环遍历map的方法 public class CircleMap {  public

css颜色的五种表示方法

一.最简单.最古老的颜色类型在CSS颜色的关键词,如red blue等. 二.十六进制值,如#0000. 三.RGB: rgb(255,0,0),这是给定的三个参数表示的红色,绿色和蓝色通道的颜色值每个通道不是由两个十六进制数字表示的,而是由0到255之间的十进制数表示的. 四.HSL:该hsl( )函数接受色相.饱和度以及明度值 色调:颜色的底色调.这个值在0到360之间,表示色轮周围的角度. 饱和度:饱和度是多少?这需要一个价值从0-100%,其中0是没有颜色(它将显示为灰色),100%是全