如东做网站公司,全屋整装十大排名全国前十强,个人博客响应式模板,优设导航1、什么是线性回归#xff1f;
回归分析#xff08;Regression analysis)是一种统计分析方法#xff0c;研究自变量和因变量之间的定量关系。回归分析不仅包括建立数学模型并估计模型参数#xff0c;检验数学模型的可信度#xff0c;也包括利用建立的模型和估计的模型参数…
1、什么是线性回归
回归分析Regression analysis)是一种统计分析方法研究自变量和因变量之间的定量关系。回归分析不仅包括建立数学模型并估计模型参数检验数学模型的可信度也包括利用建立的模型和估计的模型参数进行预测或控制。按照输入输出变量关系的类型回归分析可以分为线性回归和非线性回归。
线性回归Linear regression 假设样本数据集中的输出变量y与输入变量X存在线性关系即输出变量是输入变量的线性组合。线性模型是最简单的模型也是非常重要和应用广泛的模型。
如果模型只有一个输入变量和一个输出变量称为一元线性模型可以用一条直线来描述输出与输入的关系其表达式是一元一次方程
y w0 w1*x1 e
如果模型包括两个或多个输入变量则称为多元线性模型可以用一个平面或超平面来描述输出与输入的关系其表达式是多元一次方程
Y w0 w1*x1 w2*x2… wm*xm e
采用最小二乘法Least square method可以通过样本数据来估计回归模型的参数使模型的输出与样本数据之间的误差平方和最小。
回归分析还要进一步分析究竟能不能采用线性回归模型或者说线性关系的假设是否合理、线性模型是否具有良好的稳定性这就需要使用统计分析进行显著性检验检验输入与输出变量之间的线性关系是否显著用线性模型来描述它们之间的关系是否恰当。 欢迎关注 Youcans 原创系列每周更新数模笔记
Python数模笔记-PuLP库 Python数模笔记-StatsModels统计回归 Python数模笔记-Sklearn Python数模笔记-NetworkX Python数模笔记-模拟退火算法 2、SKlearn 中的线性回归方法sklearn.linear_model
以机器学习的角度来看回归是广泛应用的预测建模方法线性回归是机器学习中重要的基础算法。SKlearn 机器学习工具包提供了丰富的线性模型学习方法最重要和应用最广泛的无疑是普通最小二乘法Ordinary least squaresOLS此外多项式回归Polynomial regression、逻辑回归Logistic Regression和岭回归Ridge regression也较为常用将在本文及后续文中介绍。其它方法相对比较特殊以下根据官网介绍给出简要说明普通读者可以略过。
普通最小二乘法Ordinary least squares 以模型预测值与样本观测值的残差平方和最小作为优化目标。岭回归Ridge regression 在普通最小二乘法的基础上增加惩罚因子以减少共线性的影响以带惩罚项L2正则化的残差平方和最小作为优化目标。在指标中同时考虑了较好的学习能力以及较小的惯性能量以避免过拟合而导致模型泛化能力差。Lasso 回归Least absolute shrinkage and selection operator 在普通最小二乘法的基础上增加绝对值偏差作为惩罚项L1正则化以减少共线性的影响在拟合广义线性模型的同时进行变量筛选和复杂度调整适用于稀疏系数模型。多元 Lasso 回归Multi-task Lasso 用于估计多元回归稀疏系数的线性模型。注意不是指多线程或多任务而是指对多个输出变量筛选出相同的特征变量也即回归系数整列为 0因此该列对应的输入变量可以被删除。弹性网络回归Elastic-Net 引入L1和L2范数正则化而构成带有两种惩罚项的模型相当于岭回归和 Lasso 回归的组合。Multi-task Elastic-Net 用于估计多元回归稀疏系数线性模型的弹性网络回归方法。最小角回归算法Least Angle Regression 结合前向梯度算法和前向选择算法在保留前向梯度算法的精确性的同时简化迭代过程。每次选择都加入一个与相关度最高的自变量最多 m步就可以完成求解。特别适合于特征维度远高于样本数的情况。LARS Lasso 使用最小角回归算法求解 Lasso模型。正交匹配追踪法Orthogonal Matching Pursuit 用于具有非零系数变量数约束的近似线性模型。在分解的每一步进行正交化处理选择删除与当前残差最大相关的列反复迭代达到所需的稀疏程度。贝叶斯回归Bayesian Regression 用贝叶斯推断方法求解的线性回归模型具有贝叶斯统计模型的基本性质可以求解权重系数的概率密度函数。可以被用于观测数据较少但要求提供后验分布的问题例如对物理常数的精确估计也可以用于变量筛选和降维。逻辑回归Logistic Regression 逻辑回归是一种广义线性模型研究顺序变量或属性变量作为输出的问题实际是一种分类方法。通过线性模型加Sigmoid映射函数将线性模型连续型输出变换为离散值。常用于估计某种事物的可能性如寻找危险因素、预测发病概率、判断患病概率是流行病学和医学中最常用的分析方法。广义线性回归Generalized Linear Regression 广义线性回归是线性回归模型的推广实际上是非线性模型。通过单调可微的联结函数建立输出变量与输入变量的线性关系将问题简洁直接地转化为线性模型来处理。随机梯度下降Stochastic Gradient Descent 梯度下降是一种基于搜索的最优化方法用梯度下降法来求损失函数最小时的参数估计值适用样本数和特征数非常非常大的情况。随机梯度下降法在计算下降方向时随机选一个数据进行计算而不是扫描全部训练数据集加快了迭代速度。感知机Perceptron 感知机是一种适合大规模学习的简单分类算法。训练速度比SGD稍快并且产生的模型更稀疏。被动攻击算法Passive Aggressive Algorithms 被动攻击算法是一类用于大规模学习的算法。鲁棒性回归Robustness regression 鲁棒性回归的目的是在存在损坏数据的情况下拟合回归模型如存在异常值或错误的情况。多项式回归Polynomial regression 多项式回归通过构造特征变量的多项式来扩展简单的线性回归模型。例如将特征变量组合成二阶多项式可以将抛物面拟合到数据中从而具有更广泛的灵活性和适应性。 3、SKlearn 中的最小二乘线性回归方法
3.1 最小二乘线性回归类LinearRegression
SKlearn 包中的 LinearRegression() 方法不宜从字面理解为线性回归方法 LinearRegression() 仅指基于普通最小二乘法OLS的线性回归方法。
sklearn.linear_model.LinearRegression 类是 OLS 线性回归算法的具体实现官网介绍详见https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html#sklearn.linear_model.LinearRegression
sklearn.linear_model.LinearRegression() class sklearn.linear_model.LinearRegression(*, fit_interceptTrue, normalizeFalse, copy_XTrue, n_jobsNone, positiveFalse) LinearRegression() 类的参数不多通常几乎不需要设置。
fit_interceptbool, defaultTrue 是否计算截距。默认值 True计算截距。normalizebool, defaultFalse 是否进行数据标准化该参数仅在 fit_intercept True 时有效。n_jobsint, defaultNone 计算时设置的任务数为 n1和大规模问题提供加速。默认值 任务数为 1。
LinearRegression() 类的主要属性
coef_ 线性系数即模型参数 w1… 的估计值intercept_ 截距即模型参数 w0 的估计值
LinearRegression() 类的主要方法
fit(X,y[,sample_weight]) 用样本集X, y训练模型。sample_weight 为每个样本设权重默认None。get_params([deep]) 获取模型参数。注意不是指模型回归系数而是指fit_intercept,normalize等参数。predict(X) 用训练的模型预测数据集 X 的输出。即可以对训练样本给出模型输出结果也可以对测试样本给出预测结果。score(X,y[,sample_weight]) R2 判定系数是常用的模型评价指标。
3.2 一元线性回归
LinearRegression 使用例程
# skl_LinearR_v1a.py
# Demo of linear regression by scikit-learn
# Copyright 2021 YouCans, XUPT
# Crated2021-05-12
# -*- coding: utf-8 -*-import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score, mean_squared_error, mean_absolute_error, median_absolute_error# 生成测试数据:
nSample 100
x np.linspace(0, 10, nSample) # 起点为 0终点为 10均分为 nSample个点
e np.random.normal(sizelen(x)) # 正态分布随机数
y 2.36 1.58 * x e # y b0 b1*x1# 按照模型要求进行数据转换输入是 array类型的 n*m 矩阵输出是 array类型的 n*1 数组
x x.reshape(-1, 1) # 输入转换为 n行 1列多元回归则为多列的二维数组
y y.reshape(-1, 1) # 输出转换为 n行1列的二维数组
# print(x.shape,y.shape)# 一元线性回归最小二乘法(OLS)
modelRegL LinearRegression() # 创建线性回归模型
modelRegL.fit(x, y) # 模型训练数据拟合
yFit modelRegL.predict(x) # 用回归模型来预测输出# 输出回归结果
print(回归截距: w0{}.format(modelRegL.intercept_)) # w0: 截距
print(回归系数: w1{}.format(modelRegL.coef_)) # w1,..wm: 回归系数# 回归模型的评价指标
print(R2 确定系数{:.4f}.format(modelRegL.score(x, y))) # R2 判定系数
print(均方误差{:.4f}.format(mean_squared_error(y, yFit))) # MSE 均方误差
print(平均绝对值误差{:.4f}.format(mean_absolute_error(y, yFit))) # MAE 平均绝对误差
print(中位绝对值误差{:.4f}.format(median_absolute_error(y, yFit))) # 中值绝对误差# 绘图原始数据点拟合曲线
fig, ax plt.subplots(figsize(8, 6))
ax.plot(x, y, o, labeldata) # 原始数据
ax.plot(x, yFit, r-, labelOLS) # 拟合数据ax.legend(locbest) # 显示图例
plt.title(Linear regression by SKlearn (Youcans))
plt.show() # YouCans, XUPT
# 关注 Youcans分享原创系列 https://blog.csdn.net/youcans 程序说明
线性回归模型 LinearRegression() 类在模型训练 modelRegL.fit(x, y) 时要求输入 x 和输出 y 数据格式为 array类型的 n*m 矩阵。一元回归模型 m1也要转换为 n*1 的 array类型
x x.reshape(-1, 1) # 输入转换为 n行 1列多元回归则为多列的二维数组
y y.reshape(-1, 1) # 输出转换为 n行1列的二维数组LinearRegression() 类提供的模型评价指标只有 R2指标但在 sklearn.metrics 包中提供了均方误差、平均绝对值误差和中位绝对值误差例程中给出了其使用方法。
程序运行结果
回归截距: w0[2.45152704]
回归系数: w1[[1.57077698]]
R2 确定系数0.9562
均方误差0.9620
平均绝对值误差0.7905
中位绝对值误差0.67323.2 多元线性回归
用 LinearRegression() 解决多元线性回归问题与一元线性回归的步骤、参数和属性都是相同的只是要注意样本数据的格式要求输入数据 X 是 array 类型的 n*m 二维数组输出数据 y 是 array类型的 n*1 数组也可以用 n*k 表示多变量输出。 问题描述 数据文件 toothpaste.csv 中收集了 30个月牙膏销售量、价格、广告费用及同期的市场均价。 1分析牙膏销售量与价格、广告投入之间的关系建立数学模型 2估计所建立数学模型的参数进行统计分析 3利用拟合模型预测在不同价格和广告费用下的牙膏销售量。 需要说明的是本文例程并不是问题最佳的求解方法和结果只是使用该问题及数据示范读取数据文件和数据处理的方法。
LinearRegression 使用例程
# skl_LinearR_v1b.py
# Demo of linear regression by scikit-learn
# v1.0d: 线性回归模型SKlearn求解
# Copyright 2021 YouCans, XUPT
# Crated2021-05-12# -*- coding: utf-8 -*-
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy import stats
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, mean_absolute_error, median_absolute_error# 关注 Youcans分享原创系列 https://blog.csdn.net/youcans
# 主程序
def main(): # 主程序# 读取数据文件readPath ../data/toothpaste.csv # 数据文件的地址和文件名dfOpenFile pd.read_csv(readPath, header0, sep,) # 间隔符为逗号首行为标题行dfData dfOpenFile.dropna() # 删除含有缺失值的数据print(dfData.head()) # YouCans, XUPT# Model 1Y b0 b1*X1 b2*X2 e# 线性回归分析因变量 Y(sales) 与 自变量 x1(diffrence)、x2(advertise) 的关系# 按照模型要求进行数据转换输入是 array类型的 n*m 矩阵输出是 array类型的 n*1 数组feature_cols [difference, advertise] # 创建特征列表X dfData[feature_cols] # 使用列表选择样本数据的特征子集y dfData[sales] # 选择样本数据的输出变量# print(type(X),type(y))# print(X.shape, y.shape)# 一元线性回归最小二乘法(OLS)modelRegL LinearRegression() # 创建线性回归模型modelRegL.fit(X, y) # 模型训练数据拟合yFit modelRegL.predict(X) # 用回归模型来预测输出# 输出回归结果print(\nModel1: Y b0 b1*x1 b2*x2)print(回归截距: w0{}.format(modelRegL.intercept_)) # w0: 截距print(回归系数: w1{}.format(modelRegL.coef_)) # w1,..wm: 回归系数# 回归模型的评价指标print(R2 确定系数{:.4f}.format(modelRegL.score(X, y))) # R2 判定系数print(均方误差{:.4f}.format(mean_squared_error(y, yFit))) # MSE 均方误差print(平均绝对值误差{:.4f}.format(mean_absolute_error(y, yFit))) # MAE 平均绝对误差print(中位绝对值误差{:.4f}.format(median_absolute_error(y, yFit))) # 中值绝对误差# Model 3Y b0 b1*X1 b2*X2 b3*X2**2 e# 线性回归分析因变量 Y(sales) 与 自变量 x1、x2 及 x2平方的关系x1 dfData[difference] # 价格差x4 x1 - x2x2 dfData[advertise] # 广告费x5 x2**2 # 广告费的二次元X np.column_stack((x1,x2,x5)) # [x1,x2,x2**2]# 多元线性回归最小二乘法(OLS)modelRegM LinearRegression() # 创建线性回归模型modelRegM.fit(X, y) # 模型训练数据拟合yFit modelRegM.predict(X) # 用回归模型来预测输出# 输出回归结果, YouCansprint(\nModel3: Y b0 b1*x1 b2*x2 b3*x2**2)print(回归截距: w0{}.format(modelRegM.intercept_)) # w0: 截距, YouCansprint(回归系数: w1{}.format(modelRegM.coef_)) # w1,..wm: 回归系数, XUPT# 回归模型的评价指标 ,XUPTprint(R2 确定系数{:.4f}.format(modelRegM.score(X, y))) # R2 判定系数print(均方误差{:.4f}.format(mean_squared_error(y, yFit))) # MSE 均方误差print(平均绝对值误差{:.4f}.format(mean_absolute_error(y, yFit))) # MAE 平均绝对误差print(中位绝对值误差{:.4f}.format(median_absolute_error(y, yFit))) # 中值绝对误差# 计算 F统计量 和 F检验的 P值m X.shape[1]n X.shape[0]yMean np.mean(y)SST sum((y-yMean)**2) # SST: 总平方和SSR sum((yFit-yMean)**2) # SSR: 回归平方和SSE sum((y-yFit)**2) # SSE: 残差平方和Fstats (SSR/m) / (SSE/(n-m-1)) # F 统计量probFstats stats.f.sf(Fstats, m, n-m-1) # F检验的 P值print(F统计量{:.4f}.format(Fstats))print(FF检验的P值{:.4e}.format(probFstats))# 绘图原始数据点拟合曲线fig, ax plt.subplots(figsize(8, 6)) # YouCans, XUPTax.plot(range(len(y)), y, b-., labelSample) # 样本数据ax.plot(range(len(y)), yFit, r-, labelFitting) # 拟合数据ax.legend(locbest) # 显示图例plt.title(Regression analysis with sales of toothpaste by SKlearn)plt.xlabel(period)plt.ylabel(sales)plt.show()return
# 关注 Youcans分享原创系列 https://blog.csdn.net/youcans
if __name__ __main__:main()程序运行结果
Model1: Y b0 b1*x1 b2*x2
回归截距: w04.4074933246887875
回归系数: w1[1.58828573 0.56348229]
R2 确定系数0.8860
均方误差0.0511
平均绝对值误差0.1676
中位绝对值误差0.1187Model3: Y b0 b1*x1 b2*x2 b3*x2**2
回归截距: w017.324368548878198
回归系数: w1[ 1.30698873 -3.69558671 0.34861167]
R2 确定系数0.9054
均方误差0.0424
平均绝对值误差0.1733
中位绝对值误差0.1570
F统计量82.9409
F检验的P值1.9438e-13程序说明
用 LinearRegression() 类处理多元线性回归问题模型对训练样本数据的格式要求为输入数据 X 是 array 类型的 n*m 二维数组输出数据 y 是 array类型的 n*1 数组也可以用 n*k 表示多变量输出。例程中给出了两种数据转换的方式Model 1 从 Pandas 的 dataframe 数据转换得到模型要求的 array 类型二维数组这在 Pandas 读取数据文件时非常方便Model3 则用 Numpy 的 np.column_stack 数组拼接获得 array 类型二维数组。本例程的问题和数据《Python学习笔记-StatsModels 统计回归3模型数据的准备》中相同来自姜启源、谢金星《数学模型第 3版》高等教育出版社。为了便于与 StatsModels 统计回归结果进行比较例程所采用的模型也与该文一致Model1 中使用特征变量 ‘difference’, ‘advertise’ 建立线性回归模型Model3 中使用特征变量 ‘difference’, ‘advertise’ 及 ‘advertise’ 的二次项 x2**2建立线性回归模型。SKlearn 与 StatsModels 对这两个模型的参数估计结果、预测结果和 R2确定系数都完全相同表明用 SKlearn 与 StatsModels 工具包都可以实现线性回归。StatsModels 工具包提供的模型检验的指标非常全面、详细对模型检验和统计分析非常重要。而 SKlearn 包所提供的统计检验指标很少F检验、T 检验、相关系数的显著性检验指标都没有根本原因在于 SKlearn 是机器学习库而非统计工具箱关注点是模型精度和预测性能而不在于模型的显著性。为了解决缺少模型显著性检验指标的问题例程中增加了一段 计算 F统计量 和 F检验P值 的程序可供参考。 版权说明 本文内容及例程为作者原创并非转载书籍或网络内容。 YouCans 原创作品 Copyright 2021 YouCans, XUPT Crated2021-05-12
欢迎关注 Youcans 原创系列每周更新数模笔记
Python数模笔记-PuLP库1线性规划入门 Python数模笔记-PuLP库2线性规划进阶 Python数模笔记-PuLP库3线性规划实例 Python数模笔记-StatsModels 统计回归1简介 Python数模笔记-StatsModels 统计回归2线性回归 Python数模笔记-StatsModels 统计回归3模型数据的准备 Python数模笔记-StatsModels 统计回归4可视化 Python数模笔记-Sklearn 1介绍 Python数模笔记-Sklearn 2聚类分析 Python数模笔记-Sklearn 3主成分分析 Python数模笔记-Sklearn 4线性回归 Python数模笔记-Sklearn 5支持向量机 Python数模笔记-模拟退火算法1多变量函数优化 Python数模笔记-模拟退火算法2约束条件的处理 Python数模笔记-模拟退火算法3整数规划问题 Python数模笔记-模拟退火算法4旅行商问题