线性回归模型
1、回归(regression)与 分类(Classification)区别,前者处理的是连续型数值变量。后者处理的是类别变量。
2、回归分析:建立方程模拟2个或多个变量之间关联关系。
3、简单线性回归:y=b1*x+b0
1) 参数b1,b0可以由如上公式计算出来,xi,yi为样本中各点。numpy实现简单线性回归方程。
# y = b1*x+b0 import numpy as np def fitSLR(x,y): n = len(x) fenzi = 0 fenmu = 0 for i in range(0,n): fenzi = fenzi + (x[i]- np.mean(x))*(y[i]- np.mean(y)) fenmu = fenmu + (x[i]- np.mean(x))**2 print(fenzi) print(fenmu) b1 = fenzi/float(fenmu) b0 = np.mean(y)- b1*np.mean(x) print(“b0:”,b0,"b1:",b1) return b0,b1 def predict(x,b0,b1): return b0+b1*x x = [1,3,2,1,3] y = [14,24,18,17,27] b0,b1 = fitSLR(x,y) x_test = 6 y_test = predict(x_test,b0,b1) print("y_test", y_test)
得出:b0: 10.0 b1: 5.0
2)调用statsmodels统计建模模块中的ols函数
import statsmodels.api as sm
import statsmodels.api as sm import pandas as pd import numpy as np x = [1,3,2,1,3] y = [14,24,18,17,27] data = np.vstack((x,y)) dat = pd.DataFrame(data.T,columns = ['x','y']) fit = sm.formula.ols('y ~ x',data = dat).fit() print(fit.params)
结果为:
3) sklearn子模块linear_model中的LinearRegression方法
import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegression x = np.array([1,3,2,1,3]) y = np.array([14,24,18,17,27]) model = LinearRegression(fit_intercept = True) model.fit(x[:,np.newaxis], y) xfit = np.linspace(0,10,1000) yfit = model.predict(xfit[:,np.newaxis]) plt.scatter(x,y) plt.plot(xfit,yfit) plt.show() print("Model slope: " , model.coef_[0]) print("Model intercept: " , model.intercept_)
此方法注意引入的x、y须为array形式
Model slope: 4.999999999999998
Model intercept: 10.000000000000004
4、多元线性回归
python模块中有2种方式均可构建多元线性回归模型,一种是简单线性回归中sklearn子模块linear_model,还可以利用statsmodels统计建模模块中的ols函数进行构建。
1)statsmodels模块(ols函数)
from sklearn import model_selection # 便于交叉验证,可将模块分解成一定数量训练集和测试集 import statsmodels.api as sm import pandas as pd import numpy as np import matplotlib.pyplot as plt Profit = pd.read_excel(r'Predict to Profit.xlsx') Profit.head()
数据集中State变量为非连续性变量,需要进行转化成哑变量。
# 对离散型变量State,需进行量化处理,(哑变量) train, test = model_selection.train_test_split(Profit, test_size =0.2, random_state = 1234) model = sm.formula.ols('Profit~RD_Spend+Administration+Administration+C(State)',data = train).fit() # 回归系数params model.params # 查看模型总的情况 model.summary()
结果中State值的回归系数只出现2个,原因是建模时State的3个值,另外一个值State.California被用作了对照组。
模型预测后结果:
2)sklearn子模块linear_model。
引入模块,生成哑变量
from sklearn import preprocessing from sklearn import model_selection from sklearn.linear_model import LinearRegression import pandas as pd import numpy as np Profit = pd.read_excel(r'Predict to Profit.xlsx') dummy_Profit = pd.get_dummies(Profit['State'],prefix = 'State') # 转化哑变量 Profit_d = Profit.join(dummy_Profit).drop('State',axis =1) columns = ['RD_Spend','Administration','Marketing_Spend','State_California','State_Florida','State_New York','Profit'] Profit_d = Profit_d[columns]
转化后数据集前5行:
模型训练及预测:
train,test = model_selection.train_test_split(Profit_d,test_size=0.2,random_state=1234) model = LinearRegression(fit_intercept = True) model.fit(train.iloc[:,:-1],train.iloc[:,-1]) print(model.intercept_) print(model.coef_) test_X = test.drop(labels = 'Profit',axis =1) pred = model.predict(test_X) print(pd.DataFrame({'prediction':pred , 'real':test.Profit}))
预测结果:
以上2种方式比较,使用statsmodels中ols函数构建线性回归模型时,若数据集中存在离散变量,需构建哑变量,构建方式将其变成分类变量:C(变量)的形式处理。而linear_model构建线性模型时,数据集中离散变量通过引入preprocessing模块,通过get_dummies()函数处理。
3)对于第一种ols函数方法哑变量中对照组值是系统自动确定的,如需要指定对照组。可以先采用pandas中get_dummies()函数生成哑变量,在删除掉对照组对应的哑变量值。
# 选定State中New York作为对照组 dummies = pd.get_dummies(Profit.State,prefix = 'State') Profit_New = pd.concat([Profit,dummies],axis=1) Profit_New.drop(labels = ['State','State_New York'],axis =1,inplace = True) train , test = model_selection.train_test_split(Profit_New,test_size = 0.2,random_state=1234) model = sm.formula.ols('Profit~RD_Spend+Administration+Marketing_Spend+State_California+State_Florida',data = train).fit() model.params
以New York作为对照组的各偏回归系数情况如下:
得到回归方程:Profit = 58068.048193 + 0.803487RD_Spend - 0.057792Administration + 0.013779Marketing_Spend + 513.468310State_California + 1440.862734State_Florida , 其他变量不变的情况下,RD_Spend每增加1美元,Profit 增加0.803487美元,以new york 为基准,如果在State_Florida销售产品,利润会增加1440.862734。
生成预测值:
test_X = test.drop('Profit',axis=1) pred = model.predict(test_X) print(pd.DataFrame({"prediction":pred,"real":test.Profit}))
对比test值:
原文地址:https://www.cnblogs.com/hqczsh/p/11792978.html
- Dubbo 源码解析 —— 集群容错架构设计
- PhalGo-ADM思想
- 数据库中间件 Sharding-JDBC 源码分析 —— JDBC实现与读写分离
- Pytorch 0.3.0 发布:新增张量函数,支持模型移植
- 数据库分库分表中间件 Sharding-JDBC 源码分析 —— SQL 执行
- PhalGo-初识PhalGO
- 【学术】如何在神经网络中选择正确的激活函数
- PhalGo-Echo路由
- PhalGo-介绍
- 数据库分库分表中间件 Sharding-JDBC 源码分析 —— 分布式主键
- [喵咪Golang(2)]安装和Helloworld
- LSTM的简单介绍,附情感分析应用
- 使用实体嵌入的结构化数据进行深度学习
- Otter-入门篇3(Node搭建)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- SAP CRM One Order函数CRM_Object_FILL_OW的设计原理
- SAP CRM One Order header extension的缓存机制设计原理
- SAP CRM数据库表CRMD_CUMULAT_H的设计原理
- Python从入门到大师一百篇教程 | 前言:Python的前世和发展
- Java和ABAP的垃圾回收机制(Garbage Collection)比较
- Java和SAP ABAP的异常处理
- Java的字节码和ABAP load的比较
- matplotlib | Python强大的作图工具,让你从此驾驭图表(一)
- 使用ES6的fetch API读取数据时要注意的一个和cookie相关的坑
- 跟牛老师一起学WEBGIS——WEBGIS基础(地图切片)
- Go语言 | 并发设计中的同步锁与waitgroup用法
- LeetCode 99 | 如何不用递归遍历二叉搜索树?MT方法给你答案
- 以攻击者角度学习某风控设备指纹产品
- 高并发系统三大利器之缓存
- 前端测试题:(解析)js中关于类(class)的继承的说法,下面错误的是?