Bootstrap

如何使用python来进行回归分析

文章主要介绍两种常见的回归分析方法,以及其对应的Python实现操作。
目录:
什么是回归分析
为什么使用回归分析
回归分析技术有哪些
使用Python实现回归分析

什么是回归分析

在统计学中,回归分析(regression analysis)指的是确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。
在大数据分析中,回归分析是一种预测性的建模技术,它研究的是因变量(目标)和自变量(预测器)之间的关系。

回归分析是通过规定的因变量和自变量来确定变量间的关系,建立回归模型,并根据实测数据来求解模型的各参数,然后评价回归模型是否能够很好的拟合实测数据;如果能够很好的拟合,则可以根据自变量作进一步预测。

举例来说,我们可以通过回归分析来研究和预测员工的流失情况与员工的各种特征之间的关系;预测股票波动与各种股票特征之间的关系等等。回归分析还可以用于比较那些通过不同变量之间的相互影响,如商品价格变动与促销活动数量之间的关系。

回归分析与相关分析不同,相关分析表明的是变量间的相关关系的性质和程度,一般不区分因变量和自变量;而回归分析研究是的影响关系如何,需要确定具体的因变量和自变量间的相关的数学形式。所以一般都会先进行相关分析后,确认存在相关再进行回归分析。

为什么使用回归分析
如上所说,我们可以看出:

回归分析可以表明因变量和自变量之间的显著关系;也可以表明自变量对因变量的影响程度。

利用回归分析,我们可以更好的了解哪些变量对因变量的影响程度更大,从而决定采取什么样的方式去解决问题或者达到目标。

回归分析技术有哪些
比较常见的回归分析有线性回归、逻辑回归,除了这两种,还有多项式回归、逐步回归、岭回归、套索回归和弹性网络回归也都比较常见。

接下来我们对这些比较常见的两种回归方法进行分析:

1.Linear Regression线性回归

线性回归是最为人熟知的建模技术之一。线性回归通常是人们在学习预测模型时首选的技术之一。在这种技术中,因变量是连续的,自变量可以是连续的也可以是离散的,回归线的性质是线性的。

线性回归使用最佳的拟合直线(也就是回归线)在因变量(Y)和一个或多个自变量(X)之间建立一种关系。

线性回归可以表示为 [公式] ;通常,a是截距,b表示斜率。

接下来,我们需要去衡量自变量x与因变量y的相关程度。

举例来看:这里有20名学生,以及他们为考试花费时间和最后的考试成绩,我们需要研究自变量花费时间和因变量成绩的相关关系:
在这里插入图片描述先画一个散点图看下:

在这里插入图片描述
可以看出来,随着学习时间越大,考试成绩也是越高的,我们也可以看下相关系数,相关系数为0.93,我们可以说,学习时间和考试成绩是强相关。
在这里插入图片描述
或许你会对相关系数比较陌生,不要着急,补充一下什么是相关系数。

再说相关系数之前,先介绍一下协方差

在概率论和统计学中,协方差用于衡量两个变量的总体误差。

期望值分别为E[x]与E[y]的两个实随机变量x与y之间的协方差Cov(x,y)定义为:
在这里插入图片描述
直观来看,协方差表示的是两个变量总体误差的期望。协方差可以表示两个变量相关性方向,也可以表示相关性大小衡量两个变量相关程度,但是协方差会因为变量的变化幅度不同,导致差异较大。为了消除变量的变化幅度带来的影响,我们可以使用相关系数。

相关系数是用以反映变量之间相关关系密切程度的统计指标。

相关系数r表达式:
在这里插入图片描述
相关系数在-1到1之间, [公式],可以说,相关系数是标准化后的协方差,单纯反映两个变量每单位的变化的相似程度。相关系数同样可以表示两个变量相关性方向,也可以表示相关性大小衡量两个变量相关程度。

回到案例中,如果我们想要通过学习时间来预测考试成绩,怎么办呢?我们可以在这些散点中穿过一条直线,使得这条直线尽量的接近每个数据点。这条直线就是“最佳拟合线”。我们无法保证这条线穿过每一个点,但是如果存在线性相关性,应该可以保证,每一个点合理的接近这条“最佳拟合线”,这样我们就可以通过学习时间来预测考试的成绩了。

我们一开始有提到,简单线性回归的表达式为y = bx+a,那我们怎么求最佳拟合线的a和b的值?我们可以通过最小二乘法来完成。

最小二乘法通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。

一个点的误差 = 实际值 - 预测值

误差平方和SSE = ∑(实际值 - 预测值)²

而最小二乘法可以使得误差平方和SSE最小

通过上述,我们已经可以建立模型。那接下来就是需要对模型的精度进行评估。

决定系数R平方来评估模型的性能。

决定系数R²反应了y的波动有多少百分比能被x的波动所描述,即表征依变数Y的变异中有多少百分比,可由控制的自变数X来解释。

决定系数R²与训练点的数量无关,不受数据集中的数据多少影响;比误差平方和SSE更可靠。
在这里插入图片描述
决定系数R²越大,表示回归模型精度越高。
2.Logistic Regression逻辑回归
还是上述的案例,如果我们去根据学生的学习成绩预测学生考试是否及格(及格&不及格),我们采用逻辑回归

逻辑回归是用来计算“事件=Success”和“事件=Failure”的概率。当因变量的类型属于二元(1 / 0,真/假,是/否)变量时,应该使用逻辑回归。
逻辑回归于线性回归的区别,就是线性回归预测输出的是(-∞,∞),而逻辑回归输出的是{0,1},是离散值。

简单来说, 逻辑回归是一种用于解决二分类(0 or 1)问题的机器学习方法,用于估计某种事物的可能性。好比投硬币预测正面还是反面,结果只有两种。

我们继续回到刚才的案例中,我们增加1个column叫“是否及格”:
在这里插入图片描述
案例中,我们根据学生花费时间作为特征变量,预测是否及格,及格、不及格就是标签。

我们用散点图观察一下:
在这里插入图片描述

如果我们依旧使用线性回归的“最佳拟合线”在这里就是不合适的。

所以我们需要使用逻辑回归。逻辑回归核心就是逻辑回归函数:
在这里插入图片描述
逻辑函数是一个S型曲线,y值是从0-1的函数,曲线函数与Y轴相交于(0,0.5)。
在这里插入图片描述
逻辑函数值表示什么呢?逻辑函数中y表示当分类结果的标签为1时,x对应的概率值;比如说,当学生为考试努力时间x=2时候,函数上y就表示,分类标签为1时的概率为0.25就是通过考试的概率为0.25;

那问题来了,有了这个概率值Y如何应用到我们结果标签0或者1上呢,因为我们是想要知道学生是否通过考试:我们利用决策面,如果逻辑函数得到的结果大于等于0.5,那特征=1,如果y<0.5,那特征-y=0;

这里需要解释一下什么是决策面

决策面,是用于在N维空间,将不同类别样本分开的平面或曲面。

机器学习可以对分类问题定义决策面,决策面通常位于两个不同类中间的地方,机器学习中有许多现成模型供我们生成决策面。

通过上述,我们已经可以建立模型。那接下来就是同样需要对模型的精度进行评估

我们用正确率评估模型的准确率。正确率等于给模型输入数据中,正确数据占所有测试数据比例。

使用Python实现回归分析
1.线性回归的Python实现
① 提取特征x和标签y

# 特征features
exam_x = df.loc[:,'学习时间']
# 标签labels
exam_y = df.loc[:,'成绩']

② 建立训练数据和测试数据

我们需要导入train_test_split,train_test_split是交叉验证中常用的函数,功能是从样本中随机的按比例选取训练数据(train)和测试数据(test)。

# 建立训练数据和测试数据
x_train , x_test , y_train , y_test = train_test_split(exam_x,exam_y,train_size = .8)

train_size:训练数据占比,如果是整数的话就是样本的数量。
③ 输出数据大小

print('原始数据特征',exam_x.shape,
      ',训练数据特征',x_train.shape,
      ',测试数据特征',x_test.shape)
print('原始数据标签',exam_y.shape,
     ',训练数据标签',y_train.shape,
     ',测试数据标签',y_test.shape)

在这里插入图片描述

④ 训练模型

先导入线性回归包:

# 1.导入线性回归
from sklearn.linear_model import LinearRegression

创建模型:

# 2.创建模型:线性回归
model1 = LinearRegression()

训练模型:

# 3.训练模型
x_train = x_train.values.reshape(-1,1)
x_test = x_test.values.reshape(-1,1)
model1.fit(x_train,y_train)

在这里插入图片描述
截距和回归系数:

# 截距
a = model1.intercept_
# 回归系数
b = model1.coef_
print('最佳拟合线:截距a = ',a,'回归系数b = ',b)

在这里插入图片描述
可以看一下图:
在这里插入图片描述
⑤ 模型准确性评估

# 模型评估
model1.score(x_test , y_test)

2.逻辑回归的Python实现

① 提取特征x和标签y

# 特征features
exam_x1 = df.loc[:,'学习时间']
# 标签labels
exam_y1 = df.loc[:,'是否及格']

② 建立训练数据和测试数据

我们同样需要导入train_test_split:

from sklearn.model_selection import train_test_split
# 建立训练数据和测试数据
x1_train , x1_test , y1_train , y1_test = train_test_split(exam_x1,exam_y1,train_size = .8)

③ 输出数据大小:

# 输出数据大小
print('原始数据特征',exam_x1.shape,
      ',训练数据特征',x1_train.shape,
      ',测试数据特征',x1_test.shape)
print('原始数据标签',exam_y1.shape,
     ',训练数据标签',y1_train.shape,
     ',测试数据标签',y1_test.shape)

④ 训练模型

先导入逻辑回归:

# 训练模型
# 1.导入逻辑回归
from sklearn.linear_model import LogisticRegression
# 2.创建模型:逻辑回归
model2 = LogisticRegression()
# 3.模型训练
x1_train = x1_train.values.reshape(-1,1)
x1_test = x1_test.values.reshape(-1,1)
model2.fit(x1_train,y1_train)

在这里插入图片描述
⑤ 评估模型的准确率

# 评估模型的准确率
model2.score(x1_test,y1_test)

在这里插入图片描述
总结一下分类和回归的区别:

输出类型不同:分类输出的是离散数据(预测是否通过),回归输出的是连续数据(预测分数)
分类得到的是决策面,用于对数据集中的数据进行分类;回归得到的是最优拟合线,这个线条可以最好的接近数据的每个点;
对模型评估指标不一样:如何评估监督分类,通常使用正确率作为指标;回归中通常使用决定系数R平方表示模型评估的好坏,R平方可以表示有多少百分比的y波动被回归线所描述。

;