赞
踩
回归分析(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数模笔记-模拟退火算法
以机器学习的角度来看,回归是广泛应用的预测建模方法,线性回归是机器学习中重要的基础算法。SKlearn 机器学习工具包提供了丰富的线性模型学习方法,最重要和应用最广泛的无疑是普通最小二乘法(Ordinary least squares,OLS),此外多项式回归(Polynomial regression)、逻辑回归(Logistic Regression)和岭回归(Ridge regression)也较为常用,将在本文及后续文中介绍。其它方法相对比较特殊,以下根据官网介绍给出简要说明,普通读者可以略过。
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_intercept=True, normalize=False, copy_X=True, n_jobs=None, positive=False)
LinearRegression() 类的参数不多,通常几乎不需要设置。
LinearRegression() 类的主要属性:
LinearRegression() 类的主要方法:
LinearRegression 使用例程:
# skl_LinearR_v1a.py # Demo of linear regression by scikit-learn # Copyright 2021 YouCans, XUPT # Crated:2021-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(size=len(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', label="data") # 原始数据 ax.plot(x, yFit, 'r-', label="OLS") # 拟合数据 ax.legend(loc='best') # 显示图例 plt.title('Linear regression by SKlearn (Youcans)') plt.show() # YouCans, XUPT # = 关注 Youcans,分享原创系列 https://blog.csdn.net/youcans =
程序说明:
x = x.reshape(-1, 1) # 输入转换为 n行 1列(多元回归则为多列)的二维数组
y = y.reshape(-1, 1) # 输出转换为 n行1列的二维数组
程序运行结果:
回归截距: w0=[2.45152704]
回归系数: w1=[[1.57077698]]
R2 确定系数:0.9562
均方误差:0.9620
平均绝对值误差:0.7905
中位绝对值误差:0.6732
用 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 # Crated:2021-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, header=0, sep=",") # 间隔符为逗号,首行为标题行 dfData = dfOpenFile.dropna() # 删除含有缺失值的数据 print(dfData.head()) # YouCans, XUPT # Model 1:Y = 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 3:Y = b0 + b1*X1 + b2*X2 + b3*X2**2 + e # 线性回归:分析因变量 Y(sales) 与 自变量 x1、x2 及 x2平方的关系 x1 = dfData['difference'] # 价格差,x4 = x1 - x2 x2 = 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) # 用回归模型来预测输出 # 输出回归结果, YouCans print("\nModel3: Y = b0 + b1*x1 + b2*x2 + b3*x2**2") print('回归截距: w0={}'.format(modelRegM.intercept_)) # w0: 截距, YouCans print('回归系数: w1={}'.format(modelRegM.coef_)) # w1,..wm: 回归系数, XUPT # 回归模型的评价指标 ,XUPT print('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, XUPT ax.plot(range(len(y)), y, 'b-.', label='Sample') # 样本数据 ax.plot(range(len(y)), yFit, 'r-', label='Fitting') # 拟合数据 ax.legend(loc='best') # 显示图例 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 回归截距: w0=4.4074933246887875 回归系数: w1=[1.58828573 0.56348229] R2 确定系数:0.8860 均方误差:0.0511 平均绝对值误差:0.1676 中位绝对值误差:0.1187 Model3: Y = b0 + b1*x1 + b2*x2 + b3*x2**2 回归截距: w0=17.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
程序说明:
版权说明:
本文内容及例程为作者原创,并非转载书籍或网络内容。
YouCans 原创作品
Copyright 2021 YouCans, XUPT
Crated:2021-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)旅行商问题
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。