普通最小二乘法回归 – OLS (ordinary least square)

普通最小二乘法回归 – OLS (ordinary least square)前言这篇博客用来记录初学普通最小二乘回归遇到的相关知识点和解决问题的过程。开发环境:Python2.7IDLE普通最小二乘法回归回归-已有数据数据集:Cal_housing.csv简介:从1990年至今,美国加州所有街区人口普查的信息,关于9组变量,共20640个观测值。VariablesBolstols…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

前言

这篇博客用来记录初学 普通最小二乘回归 遇到的相关知识点和解决问题的过程。

开发环境:Pycharm 2018.1.2
版本:Python 2.7.14 :: Anaconda, Inc.

普通最小二乘法回归


回归 – 已有数据

数据集:Cal_housing.csv
简 介:从 1990 年至今,美国加州所有街区人口普查的信息,关于 9 组变量,共 20640 个观测值。

Variables Bols tols
INTERCEPT (截距) 11.4939 275.7518
MEDIAN INCOME (收入中值) 0.4790 45.7768
MEDIAN INCOME2 (收入中值2) -0.0166 -9.4841
MEDIAN INCOME3 (收入中值3) -0.0002 -1.9157
ln(MEDIAN AGE) (年龄中位数) 0.1570 33.6123
ln(TOTAL ROOMS/ POPULATION) (总房屋数/人口) -0.8582 -56.1280
ln(BEDROOMS/ POPULATION) (卧室/人口) 0.8043 38.0685
ln(POPULATION/ HOUSEHOLDS) (人口/家庭) -0.4077 -20.8762
ln(HOUSEHOLDS) (家庭) 0.0477 13.0792

用下面代码读入数据, 并弄清楚哪些是自变量哪个是因变量:

import pandas as pd
import numpy as np

data = pd.read_csv("cal_housing.csv")
name = data.columns

X = data[name[:8]]  # 第1-8列
y = data[name[8:9]]  # 第9列

print("X name :", name[:8])
print("y name :", name[8:9])
print(data.shape, X.shape, y.shape)  # 返回行列数

---------------------------------------------
('X name :', Index([u'longitude', u'latitude', u'housingMedianAge', u'totalRooms',
       u'totalBedrooms', u'population', u'households', u'medianIncome'],
      dtype='object'))
('y name :', Index([u'medianHouseValue'], dtype='object'))
((20640, 9), (20640, 8), (20640, 1))

把数据随机分成训练集和测试集

可自己决定随机种子(多少位数都可以)和测试集百分比(小于0.5即小于50%)

seed = 8888  # 随机种子
proportion = 0.1  # 测试集百分比

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=proportion, random_state=seed)

print(X_train.shape,X_test.shape, y_train.shape, y_test.shape)
---------------------------------------------------
((18576, 8), (2064, 8), (18576, 1), (2064, 1))

做回归, 并求出 R^2 和 N M S E

reg = LinearRegression()  # 线性回归(Linear Regression)
res = reg.fit(X_train, y_train)  # 对训练集X_train, y_train进行训练
y_hat = res.predict(X_test)  # 使用训练得到的估计器对输入为X_test的集合进行预测,得到y_hat
e = y_test-y_hat  # 计算残差
SSE_cv = np.mean(e**2)  # 残差平方和
SSE_test = np.mean((y_test-np.mean(y_test))**2)  # 拍脑袋平方和
NMSE_cv = SSE_cv/SSE_test  # 标准化均方误差 NMSE_cv
R2_cv = 1 - NMSE_cv  # 可决系数R2_cv
print R2_cv
print NMSE_cv
-----------------------------------------------------------------
medianHouseValue    0.657186
dtype: float64
medianHouseValue    0.342814
dtype: float64

回归 – 模拟数据

自己决定样本量(n), 自变量个数(p)和系数值(B), 自己决定正态误差的均值m和标准差s

seed = 8888  # 随机种子
n = 100  # 样本量
p = 7  # 自变量个数
m = 0  # 误差项均值
s = 5  # 标准差
B = [2, 5, 16, 9, -3, -5, -2]  # beta值
C = [2, 2]

np.random.seed(seed)
X = np.random.normal(0, 1, (n, p))
y = X.dot(B)+np.random.normal(m, s, n)

print(X.shape, y.shape)
----------------------------------------------------------
((100L, 7L), (100L,))

实施回归

import statsmodels.api as sm
# 增加截距项
mod = sm.OLS(y, X)  # 普通最小二乘模型,ordinary least square model
res = mod.fit()
#输出R^2
print("R^2:",res2.rsquared,"\nNMSE:",1-res2.rsquared)
----------------------------------------------------------
R^2: 0.92564484308 
NMSE: 0.0743551569196
print (res2.summary())

---------------------------------
 OLS Regression Results                            
==============================================================================
Dep. Variable:                      y   R-squared:                       0.926
Model:                            OLS   Adj. R-squared:                  0.920
Method:                 Least Squares   F-statistic:                     165.4
Date:                Mon, 07 May 2018   Prob (F-statistic):           1.32e-49
Time:                        09:54:25   Log-Likelihood:                -304.71
No. Observations:                 100   AIC:                             623.4
Df Residuals:                      93   BIC:                             641.7
Df Model:                           7                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
x1             2.3477      0.532      4.415      0.000       1.292       3.404
x2             5.5829      0.511     10.929      0.000       4.568       6.597
x3            15.7619      0.596     26.444      0.000      14.578      16.946
x4             8.9595      0.521     17.181      0.000       7.924       9.995
x5            -3.3048      0.530     -6.233      0.000      -4.358      -2.252
x6            -4.9932      0.491    -10.175      0.000      -5.968      -4.019
x7            -2.0126      0.536     -3.754      0.000      -3.077      -0.948
==============================================================================
Omnibus:                        0.577   Durbin-Watson:                   1.970
Prob(Omnibus):                  0.749   Jarque-Bera (JB):                0.227
Skew:                          -0.078   Prob(JB):                        0.893
Kurtosis:                       3.174   Cond. No.                         1.51
==============================================================================

Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.

附录

源码以及数据下载

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/179496.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java executeupdate,为什么executeUpdate(sql)返回-1呢

    java executeupdate,为什么executeUpdate(sql)返回-1呢packagecom.user;importjava.sql.Connection;importjava.sql.Statement;importjava.sql.DriverManager;importjava.sql.*;publicclassuserBean{privateStringuserId;privateStringuserName;privateStrin…

    2022年10月20日
  • linux系统抓包工具_kali 抓包

    linux系统抓包工具_kali 抓包在使用ECS服务器时,发现网络流量异常,或者发现服务器有异常向外发包行为,可使用抓包工具抓取网络流量包,分析流量包的特征,看看这些流量包来自哪里,或者发向哪里了。根据这些信息,可进一步诊断异常。本文介绍Linux系统,使用tcpdump工具分析流量的方法。TcpDump可将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、not、or等逻…

    2022年8月21日
  • linux 虚拟网络_macvlan原理

    linux 虚拟网络_macvlan原理      macvlan是Linux操作系统内核提供的网络虚拟化方案之一,更准确的说法是网卡虚拟化方案。它可以为一张物理网卡设置多个mac地址,相当于物理网卡施展了影分身之术,由一个变多个,同时要求物理网卡打开混杂模式。针对每个mac地址,都可以设置IP地址,本来是一块物理网卡连接到交换机,现在是多块虚拟网卡连接到交换机。macvlan应该很简单。1.环境准备         假设有一块物理…

    2022年8月10日
  • ASp.NET MVC 路由「建议收藏」

    ASp.NET MVC 路由「建议收藏」路由ASP.NETMVCRoute—转发请求:1.客户端发起请求2.到达IIS3.转发到程序集4.经过一个路由匹配–转发到匹配的控制器中5.匹配的action去处理RouteConfig中如果有多个路由,从上到下进行匹配,按照路由url中的正则表达式进行匹配,在命中url后找不到Controller或View则使用defaults中的默认参数publicstaticvoidRegisterRoutes(RouteCollectionroutes){

    2022年7月21日
  • Win10总是开机黑屏?显卡驱动安装失败-驱动人生解决方案

    Win10总是开机黑屏?显卡驱动安装失败-驱动人生解决方案驱动人生了解到,自从win10系统发布以来,越来越多的用户都将系统给换成win10系统了。但是面对的用户基数大,系统难免会有不完善的地方。相信很多用户在使用过程中都会因为win10的各种毛病而被坑过,比如电脑开机就出现黑屏2分钟的问题。正常情况下,win10系统应该是开机后就可以显示的,不会出现需要黑屏2分钟左右的时间。这到底是哪里出现问题了呢?  经过驱动人生官方运维人员的检查发现,这个是因为Win10系统中潜在的一些bug导致的,如果大家的显卡有问题或者显卡驱动有问题,在开机后就会黑屏1-3分钟

    2022年5月5日
  • 对接【支付宝】支付接口「建议收藏」

    对接【支付宝】支付接口「建议收藏」场景最近在做支付宝的接口对接,之前做过一个版本,但是由于申请了新的账号以前旧的的接口对接就不能使用了所以就开始对接新的版本接口对接,在这里也记录一下让那些还没有对接的兄弟少走点弯路。准备先申请

    2022年8月6日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号