回归分析


回归分析的核心在于确定变量之间存在着的函数关系

各个变量之间可以分为确定关系和非确定关系(相对关系),我们要做的就是对这种关系进行建模和解释

其主要流程可以解释如下:

  • 收集一组包含因变量和自变量的数据
  • 根据因变量和自变量之间的关系,初步设定回归模型
  • 求解合理的回归系数
  • 进行相关性检验,确定相关系数
  • 利用模型对因变量做出预测或解释,并计算预测值的置信区间。

一、一元线性回归分析

表达式如下:
y = f ( x , θ ) + ε = β 0 + β 1 x + ε y=f(x,\theta)+\varepsilon=\beta_0+\beta_1x+\varepsilon y=f(x,θ)+ε=β0​+β1​x+ε
其中, ε \varepsilon ε表示误差项,其期望 E ( ε ) = 0 E(\varepsilon)=0 E(ε)=0,方差等于 D ( ε ) = σ 2 D(\varepsilon)=\sigma^2 D(ε)=σ2, β 0 \beta_0 β0​为常数项,也称为截距, β 1 \beta_1 β1​为斜率

求解参数的主流方法有最小二乘法最大似然法矩方法。下面介绍最小二乘法。

最小二乘法(Least Squares Estimation,LSE)通过最小化误差的平方和来寻找数据的最佳匹配。

我们定义残差平方和(Residual Sum of Squares,RSS), △ y = ( y − y ^ ) \triangle y=(y-\hat y) △y=(y−y^​)表示残差:
Q ( β 0 , β 1 ) = ∑ i = 1 n ( y i − y ^ i ) 2 = ∑ i = 1 n ( y i − β ^ 0 − β ^ 1 x i ) 2 Q(\beta_0,\beta_1)=\sum_{i=1}^n(y_i-\hat y_i)^2 =\sum_{i=1}^n(y_i-\hat\beta_0-\hat\beta_1x_i)^2 Q(β0​,β1​)=i=1∑n​(yi​−y^​i​)2=i=1∑n​(yi​−β^​0​−β^​1​xi​)2
根据微积分知识,这玩意的极值点应该在导数为0的时候取得,我们对 Q Q Q求偏导,得到:
{ σ Q σ β ^ 0 = − 2 ∑ i = 1 n ( y i − β ^ 0 − β ^ 1 x i ) σ Q σ β ^ 1 = − 2 ∑ i = 1 n ( y i − β ^ 0 − β ^ 1 x i ) x i \begin{cases} \frac{\sigma Q}{\sigma \hat\beta_0}=-2\sum_{i=1}^n(y_i-\hat\beta_0-\hat\beta_1x_i)\\ \frac{\sigma Q}{\sigma \hat\beta_1}=-2\sum_{i=1}^n(y_i-\hat\beta_0-\hat\beta_1x_i)x_i\\ \end{cases} {σβ^​0​σQ​=−2∑i=1n​(yi​−β^​0​−β^​1​xi​)σβ^​1​σQ​=−2∑i=1n​(yi​−β^​0​−β^​1​xi​)xi​​
求解方程组得到:
{ β ^ 0 = y ˉ − β ^ 1 x ˉ β ^ 1 = ∑ i = 1 n ( x i − x ˉ ) ( y i − y ˉ ) ∑ i = 1 n ( x i − x ˉ ) 2 \begin{cases} \hat\beta_0=\bar y-\hat\beta_1\bar x\\ \hat\beta_1=\frac{\sum_{i=1}^n(x_i-\bar x)(y_i-\bar y)}{\sum_{i=1}^n(x_i-\bar x)^2} \end{cases} {β^​0​=yˉ​−β^​1​xˉβ^​1​=∑i=1n​(xi​−xˉ)2∑i=1n​(xi​−xˉ)(yi​−yˉ​)​​
将其带入方程,即可得到最佳拟合曲线。

误差估计

SSE:
∑ i = 1 n e i 2 = ∑ i = 1 n ( y i − y ^ i ) 2 \sum_{i=1}^ne_i^2=\sum_{i=1}^n(y_i-\hat y_i)^2 i=1∑n​ei2​=i=1∑n​(yi​−y^​i​)2
MSE是对SSE的无偏估计量
σ 2 = S S E n − 2 = M S E \sigma^2=\frac{SSE}{n-2}=MSE σ2=n−2SSE​=MSE

Python实现一元线性回归

Step 1️⃣ 数据准备

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.linear_model import LinearRegression# 导入数据集
iris=load_iris()
data=pd.DataFrame(iris.data)
data.columns=['sepal-length','sepal-width','petal-length','petal-width']
print(data.head())
   sepal-length  sepal-width  petal-length  petal-width
0           5.1          3.5           1.4          0.2
1           4.9          3.0           1.4          0.2
2           4.7          3.2           1.3          0.2
3           4.6          3.1           1.5          0.2
4           5.0          3.6           1.4          0.2
# 使用scikit-learn完成回归
x=data['petal-length'].values
y=data['petal-width'].values
x=x.reshape(len(x),1)
y=y.reshape(len(y),1)
clf=LinearRegression()
clf.fit(x,y)
pre=clf.predict(x)# 绘制图形
plt.scatter(x,y,s=50)
plt.plot(x,pre,'r-',linewidth=2)
plt.xlabel("petal-length")
plt.ylabel("petal-wdith")
for idx,m in enumerate(x):# 绘制长条# 从(m,y[idx])到(m,pre[idx])plt.plot([m,m],[y[idx],pre[idx]],'g-')
plt.show()

step 2️⃣ 显示回归参数

print("斜率",clf.coef_)
print("截距",clf.intercept_)
print("MSE",np.mean((y-pre)**2))
斜率 [[0.41575542]]
截距 [-0.36307552]
MSE 0.04206730919499318

step 3️⃣ 进行预测

print(clf.predict([[3.9]]))
[[1.2583706]]

二、多元线性回归

也就是有多个参数啦。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression# 导入数据集
d=load_boston()
data=pd.DataFrame(d.data)
data['price']=d.target
print(data.sample(5))
            0    1      2    3      4  ...      9    10      11     12  price
373  11.10810  0.0  18.10  0.0  0.668  ...  666.0  20.2  396.90  34.77   13.8
491   0.10574  0.0  27.74  0.0  0.609  ...  711.0  20.1  390.11  18.07   13.6
91    0.03932  0.0   3.41  0.0  0.489  ...  270.0  17.8  393.55   8.20   22.0
363   4.22239  0.0  18.10  1.0  0.770  ...  666.0  20.2  353.04  14.64   16.8
322   0.35114  0.0   7.38  0.0  0.493  ...  287.0  19.6  396.90   7.70   20.4[5 rows x 14 columns]

多元线性回归

y=d.target
x=d.data
clf=LinearRegression()
from sklearn.model_selection import train_test_split
# 分割训练集
x_train,x_test,y_train,y_test=train_test_split(x,y)
clf.fit(x_train,y_train)
print("多元线性回归模型参数",clf.coef_)
print("多元线性回归模型常数项",clf.intercept_)
print("预测",clf.predict([x_test[0]]))
多元线性回归模型参数 [-1.11747256e-01  4.05201935e-02 -6.69439553e-04  3.34919157e+00-1.83818082e+01  3.95199967e+00 -9.12733246e-03 -1.31523502e+002.44628300e-01 -1.08309725e-02 -1.00522555e+00  7.56771086e-03-4.23492114e-01]
多元线性回归模型常数项 36.524193135861886
预测 [15.9054318]

模型分析

y_predict=clf.predict(x_test)
from sklearn.metrics import mean_absolute_error
from sklearn.metrics import mean_squared_error
from sklearn.metrics import r2_scoreprint("预测值均方误差",mean_squared_error(y_test,y_predict))
print("R2得分",r2_score(y_test,y_predict))
print("回归得分",clf.score(x_test,y_test))print("各个特征间的系数矩阵",clf.coef_)
print("影响房价的特征排序",np.argsort(clf.coef_))
print("影响房价的特征排序",d.feature_names[np.argsort(clf.coef_)])
预测值均方误差 26.66065801123315
R2得分 0.7170059315243467
回归得分 0.7170059315243467
各个特征间的系数矩阵 [-1.24752898e-01  4.23381228e-02  7.89030069e-03  2.76191464e+00-1.86055326e+01  3.76015663e+00 -3.25002550e-03 -1.49233753e+003.12843628e-01 -1.40160600e-02 -8.47213267e-01  7.64996205e-03-5.32883469e-01]
影响房价的特征排序 [ 4  7 10 12  0  9  6 11  2  1  8  3  5]
影响房价的特征排序 ['NOX' 'DIS' 'PTRATIO' 'LSTAT' 'CRIM' 'TAX' 'AGE' 'B' 'INDUS' 'ZN' 'RAD''CHAS' 'RM']

三、逻辑回归

如果说线性回归偏向数学,那么逻辑回归就是机器学习从统计领域借鉴来的技术

逻辑回归用来分析二分类或有序的因变量与解释变量之间的关系,算是广义上的线性回归分析方法。他在线性回归的基础上利用Sigmoid函数对事件发生的概率进行预测。

线性回归可以得到一个预测值,然后通过S函数封装后,就能得到一个概率值,再通过概率值进行分类。(上清下浊)

Sigmoid的函数能够将任意值转化为[0,1]范围内,其定义如下:
g ( z ) = 1 1 + e − z g(z)=\frac{1}{1+e^{-z}} g(z)=1+e−z1​
我们来看下函数曲线

宏观尺度

微观尺度

def sigmoid(x):return 1./(1.+np.exp(-x))

Python 实现


x=load_iris().data
y=load_iris().target# 归一化
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.25,random_state=0)
from sklearn.preprocessing import StandardScalersc=StandardScaler()
x_train=sc.fit_transform(x_train)
x_test=sc.transform(x_test)# 进行逻辑回归
from sklearn.linear_model import LogisticRegression
classifier=LogisticRegression(random_state=0)
classifier.fit(x_train,y_train)
y_pred=classifier.predict(x_test)
# 测试准确性
print("Accuracy of LR %.3f"%classifier.score(x_test,y_test))
Accuracy of LR 0.974

我们可以看一下经过逻辑回归后的数据:

[2 1 0 2 0 2 0 1 1 1 2 1 1 1 1 0 1 1 0 0 2 1 0 0 2 0 0 1 1 0 2 1 0 2 2 1 0 2]

这是个多分类的回归。


四、多项式回归

适用于非线性关系。

# 线性回归
lin_reg=LinearRegression()
lin_reg.fit(X,y)
y_pre=lin_reg.predict(X)
plt.rcParams['font.family']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
ax[1].scatter(x,y)
ax[1].plot(x,y_pre,color="r")# 多项式回归
from sklearn.preprocessing import PolynomialFeatures
POLY=PolynomialFeatures(degree=2) # 设置最多几次幂
POLY.fit(X)
x2=POLY.transform(X)
# 这个多项式回归是对x进行处理后,让其成为非线性关系
# 譬如:
print(x.shape)
print(x2.shape)
# (100,)
# (100, 3)
# 之后的操作与LR完全相同,所以Polynomial并没有作为独立的API
# 而是放在preprocessing
lin_reg2=LinearRegression()
lin_reg2.fit(x2,y)
y_pre2=lin_reg2.predict(x2)ax[2].scatter(x,y)
# 此时的关系并不再是原先的对应了
ax[2].plot(np.sort(x),y_pre2[np.argsort(x)],color="b")# degree调成10 后
POLY=PolynomialFeatures(degree=10) # 设置最多几次幂
POLY.fit(X)
x2=POLY.transform(X)
# 这个多项式回归是对x进行处理后,让其成为非线性关系
# 譬如:
print(x.shape)
print(x2.shape)
# (100,)
# (100, 11)
# 之后的操作与LR完全相同,所以Polynomial并没有作为独立的API
# 而是放在preprocessing
lin_reg2=LinearRegression()
lin_reg2.fit(x2,y)
y_pre2=lin_reg2.predict(x2)
ax[3].scatter(x,y)
ax[3].plot(np.sort(x),y_pre2[np.argsort(x)],color="g")
plt.show()


五、岭回归

岭回归(Ridge Regression)是一种专用于共线性数据分析的有偏估计回归方法,实质上是改良的最小二乘法。通过放弃无偏性,降低部分信息为代价,使回归系数更加可靠,对病态数据的耐受性远高于最小二乘法。

通常的岭回归是在顺势函数中加入L2正则项:
L ( θ ) = 1 N ∑ i = 1 N ( f ( x i ; θ ) − y i ) 2 + λ 2 ∣ ∣ θ ∣ ∣ 2 L(\theta)=\frac{1}{N}\sum_{i=1}^N(f(x_i;\theta)-y_i)^2+\frac{\lambda}{2}||\theta||^2 L(θ)=N1​i=1∑N​(f(xi​;θ)−yi​)2+2λ​∣∣θ∣∣2
其中, ∣ ∣ θ ∣ ∣ ||\theta|| ∣∣θ∣∣表示向量 θ \theta θ的 L 2 L2 L2范数。岭回归的 R 2 R^2 R2往往会小于线性回归,但其具有更强的泛化能力,也能解决线性回归汇总的不可逆问题。


from sklearn.linear_model import Ridge,RidgeCV
# Ridge CV是广义交叉验证的岭回归
X,y=load_iris(return_X_y=True)
x=X[:,1].reshape(len(X),-1)
y=X[:,0].reshape(len(X),-1)model=Ridge(alpha=0.5)
model1=RidgeCV(alphas=[0.1,1.0,10.0]) # cross validationmodel.fit(x,y)
model1.fit(x,y)print("系数矩阵",model.coef_)
print("线性回归模型",model)
print("CV最优alpha值",model1.alpha_)# 模型预测
pre=model.predict(x)
plt.scatter(x,y)
plt.plot(x,pre)
plt.show()
系数矩阵 [[-0.2194842]]
线性回归模型 Ridge(alpha=0.5)
CV最优alpha值 10.0


六、Lasso回归

L 2 L2 L2正则只能削弱影响,而不能剔除变量。Lasso(Least Absolute Shrinkage and Selection Operator)模型将惩罚项换为了 L 1 L1 L1正则,从而达到剔除变量的作用。

from sklearn.metrics import r2_score
# 产生一些稀疏数据
np.random.seed(42)
n_samples,n_features=50,100X=np.random.randn(n_samples,n_features)
coef=3*np.random.randn(n_features) # 每个特征对应一个系数inds=np.arange(n_features)
np.random.shuffle(inds)
coef[inds[10:]]=0 # 随机将向量中的10个变为0 稀疏化
y=np.dot(X,coef)# 添加高斯噪声
y+=0.01*np.random.normal(size=n_samples)# 划分数据集
n_samples=X.shape[0]
X_train,y_train=X[:n_samples//2],y[:n_samples//2]
X_test,y_test=X[n_samples//2:],y[n_samples//2:]# 训练Lasson模型
from sklearn.linear_model import Lasso
alpha=0.1
lass=Lasso(alpha=alpha)
y_pre=lass.fit(X_train,y_train).predict(X_test)
r2_score_lasso=r2_score(y_test,y_pre)print("R^2 socre",r2_score_lasso)
plt.plot(lass.coef_,color='gold')
plt.title("Lasso R^2 %s"%r2_score_lasso)
plt.show()


回归案例–波士顿数据处理

import numpy as np
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression,SGDRegressor,Ridge,Lasso
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error,accuracy_score
from sklearn.model_selection import train_test_splitdef linearModel():# 1. load datasetX,y=load_boston(return_X_y=True)X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.25)# 2. Standardstd=StandardScaler()X_train=std.fit_transform(X_train)X_test=std.transform(X_test)# 添加维度# y=y[:,np.newaxis]y_test=y_test[:,np.newaxis]y_train=y_train[:,np.newaxis]std_y=StandardScaler()y_train=std_y.fit_transform(y_train)y_test=std_y.transform(y_test)# 3. traininglr=LinearRegression()sgd=SGDRegressor()rid=Ridge(alpha=0.5)las=Lasso(alpha=0.5)lr.fit(X_train,y_train)y_lr_pre=lr.predict(X_test)# 还原真实值# 这是因为我们做处理用的都是标准化# 所以最后跟原始数据比较需要反标准化y_lr_pre=std_y.inverse_transform(y_lr_pre)sgd.fit(X_train,y_train)y_sgd_pre=sgd.predict(X_test)y_sgd_pre=std_y.inverse_transform(y_sgd_pre)rid.fit(X_train, y_train)y_rid_pre = rid.predict(X_test)y_rid_pre = std_y.inverse_transform(y_rid_pre)las.fit(X_train, y_train)y_las_pre = las.predict(X_test)y_las_pre = std_y.inverse_transform(y_las_pre)# 4. evaluationy_test=std_y.inverse_transform(y_test)print("线性回归的均方误差为: ",mean_squared_error(y_test,y_lr_pre))print("梯度下降的均方误差为: ",mean_squared_error(y_test,y_sgd_pre))print("岭回归的均方误差为: ",mean_squared_error(y_test,y_rid_pre))print("Lasson均方误差为: ",mean_squared_error(y_test,y_las_pre))linearModel()
线性回归的均方误差为:  24.474589501317524
梯度下降的均方误差为:  23.82902862765662
岭回归的均方误差为:  24.433234356526174
Lasson均方误差为:  61.95307932912878

【数据分析】Python数据分析之回归分析相关推荐

  1. python时间序列数据分析,Python数据分析之时间序列

    Python数据分析之时间序列 发布时间:2020-07-10 06:56:27 来源:51CTO 阅读:808 作者:up4ever 1. 时间序列类型 时间戳(timestramp) 即特定的时刻 ...

  2. python数据分析-Python数据分析从小白到高手的几个步骤

    原标题:Python数据分析从小白到高手的几个步骤 曾经看过一篇老外写的文章,把Numpy/Pandas甚至各种机器学习和神经网络算法组织成了不同的结构图,看起来非常清晰,一目了然. 有点遗憾当时没有 ...

  3. python可视化数据分析-Python数据分析与可视化从入门到精通

    (1)没有高深理论,每章都以实例为主,读者参考书中源码运行,就能得到与书中一样的结果.(2)专注于Python数据分析与可视化操作中实际用到的技术.相比大而全的书籍资料,本书能让读者尽快上手,开始项目 ...

  4. python数据分析是什么意思_利用python进行数据分析,python数据分析是什么

    Q2:有没有人在学python做量化交易的 推荐一些书籍 1 像计算机科学家一样思考Python 2 [Python标准库].Doug.Hellmann.扫描版 3<Python科学计算> ...

  5. python数据分析-Python数据分析:可视化

    本文是<数据蛙三个月强化课>的第二篇总结教程,如果想要了解数据蛙社群,可以阅读 对于我们数据分析师来说,不仅要自己明白数据背后的含义,而且还要给老板更直观的展示数据的意义.所以,对于这项不 ...

  6. python爬取拉钩python数据分析职位招聘信息

    python数据分析 python数据分析是目前python最火的方向之一,为了解目前市场对该职位的需求,我们爬取了拉钩上对pythons数据分析的招聘信息. 环境 系统:windows7 pytho ...

  7. python编程大数据分析_大数据分析Python学习技巧

    大数据分析Python是任何开发人员都应该知道的重要编程语言.许多程序员使用这种语言来构建网站,创建学习算法以及执行其他重要任务.但是尝试学习大数据分析Python可能会令人感到恐惧,沮丧和困难,尤其 ...

  8. python朋友圈数据分析_第7天|16天搞定Python数据分析,盗墓笔记重现

    词云,又称文字云,是由词汇组成类似云的彩色图形.网络上好多漂亮的词云图,好多人以为是用PS软件P出来的,其实不是的,它们是用Python生成的.而且生成的方法还挺简单的,用Python开源的词云库就可 ...

  9. python波士顿房价是什么数据,Python数据分析 | 波士顿房价回归分析

    分析目标: 将波士顿房价的数据集进行描述性数据分析.预测性数据分析(主要用了回归分析),可用于预测房价. 数据集介绍: 卡内基梅隆大学收集,StatLib库,1978年,涵盖了麻省波士顿的506个不同 ...

  10. 【Python数据分析】数据挖掘建模——分类与预测——回归分析

    根据挖掘目标和数据形式可以建立分类与预测.聚类分析.关联规则.时序模型.离群点检测等模型.首先介绍一下分类与预测模型. 一.分类预测模型实现过程 分类模型主要是预测分类编号,预测模型主要是建立连续值函 ...

最新文章

  1. 《转》Python学习(14)-对文件的操作(一)
  2. jmx使用应该注意的基本规范
  3. Onchain Capital创始人看涨BCH
  4. python源程序执行的方式是什么执行-python调用可执行文件的方法
  5. asp2.0缓存概述
  6. File类的使用(java)
  7. 前端笔记之NodeJS(四)MongoDB数据库Mongoose自制接口MVC架构思想|实战
  8. 在windows下使用putty登陆linux
  9. keras 的使用例子
  10. 《矩阵分析》代码Ⅲ——Doolittle分解、Crout分解、Cholesky分解求解线性方程组matlab实现
  11. (六十五)for循环
  12. 时间序列pandas的创建date_range+时间戳的序列化to_datetime+重采样resample+将字符串时间转化为时间序列PeriodIndex(传入年月日)
  13. virtualbox win10 共享文件夹
  14. trans系列是sci几区_sci怎么看几区
  15. 三维坐标要建一个4*4的矩阵?平移 旋转 缩放
  16. 这样充满青春活力的微信公众号图文排版,你见过吗?
  17. 外设键盘的win键和alt键功能互换
  18. 【入门】【递推】走楼梯
  19. CSS - 禁止手机移动端网页缩放(meta)
  20. Nginx之原理,限流,日志切割,正反代理,HTTPS配置

热门文章

  1. 神武4手游等待服务器响应,《神武4》手游:转服功能终上线,认准长安袁守诚...
  2. FBI和DHS在响应网络攻击时为何存在分歧
  3. java的actionlistener_「actionlistener」Java——事件处理机制监听者基础(一)动作监听ActionListener - seo实验室...
  4. CAS实现单点登入(三):登入提示消息修改
  5. openGauss杭州用户组正式成立啦
  6. 多媒体一体机计算机打不开,多媒体一体机常见故障(电脑)
  7. Unix编程艺术和代码大全比较阅读
  8. Torrance–Sparrow BRDF Model公式推导
  9. 洛谷P3131 [USACO16JAN]Subsequences Summing to Sevens S 题解
  10. 修改LinuxIP地址