回归模型效果评估系列1-QQ图

(erbqi)导语 QQ图全称 Quantile-Quantile图,也就是分位数-分位数图,简单理解就是把两个分布相同分位数的值,构成点(x,y)绘图;如果两个分布很接近,那个点(x,y)会分布在y=x直线附近;反之则不;可以通过QQ图从整体评估回归模型的预测效果

QQ图一般有两种,正态QQ图和普通QQ图,区别在于正态QQ图中其中有一个分布是正态分布,下面来看下这两种分布

正态QQ图

下图来自这里                                                  使用Filliben‘s estimate来确定n分点

下面我们尝试绘制正态QQ图

使用开源库自带函数,很简单,但是可能一些细节看不到

import numpy as np
from matplotlib import pyplot as plt
import matplotlib
matplotlib.style.use(‘ggplot‘)
# 用正态分布随机生死100个数据
x = np.round(np.random.normal(loc=0.0, scale=1.0, size=100),2)
from scipy.stats import probplot
f = plt.figure(figsize=(8, 6))
ax = f.add_subplot(111)
probplot(x, plot=ax)
plt.show()

下面展开一些细节,为下面我们的普通QQ做点铺垫

import sys,os
import pandas as pd
import numpy as np
from scipy.stats import norm,linregress
from matplotlib import pyplot as plt
# 返回长度为len(x)的order_statistic_medians
def calc_uniform_order_statistic_medians(x):
    N = len(x)
    osm_uniform = np.zeros(N, dtype=np.float64)
    osm_uniform[-1] = 0.5**(1.0 / N)
    osm_uniform[0] = 1 - osm_uniform[-1]
    i = np.arange(2, N)
    osm_uniform[1:-1] = (i - 0.3175) / (N + 0.365)
    return osm_uniform
# 用正态分布随机生死100个数据
x = np.round(np.random.normal(loc=0.0, scale=1.0, size=100),2)
osm_uniform = calc_uniform_order_statistic_medians(x)
# ppf(Percent point function) 是 cdf(Cumulative distribution function) 的逆函数,就是取对应分位数对应的值
osm = norm.ppf(osm_uniform)
osr = np.sort(x)
# 计算osm和osr组合的样本的线性回归的 斜率 截距 等信息
slope, intercept, rvalue, pvalue, stderr = linregress(osm, osr)

plt.figure(figsize=(10,8))
plt.plot(osm, osr, ‘bo‘, osm, slope*osm + intercept, ‘r-‘)
plt.legend()
plt.show()

左图是100个采样点,右图是1000个采样点,对比可以发现 ,1000个采样点的分布更接近直线y=x,也就是更拟合正态分布

普通QQ图和正态不同的地方在于参考系不是正态分布而可能是任意分布的数据集,这正是我们要用的

下图来自这里

下图是一个场景,虚线是真实的网络变化,实线是简单的平滑预测的结果,我希望通过普通QQ图看下简单的平滑预测的拟合效果

先看下两个曲线的cdf图( Fx(x)=P(X≤x) ),

这个图的累计分布点是np.linspace(min(X), max(X), len(X))计算来的,看起来有点怪

我们重新计算以原始数据为累计分布点的cdf图,发现有趣的地方了吗?

在两个曲线的数量一致的情况下,我们把两组数据从小到大排序之后,相同位置对应的cdf的值是一样的,

所以两个曲线的数量一致的情况下,QQ图只需要从小到大排序即可

可以看到,正式的网络曲线和平滑预测曲线的QQ图的斜率只有0.79,说明平滑预测的分布和源数据的分布差别还是挺大的。

最后是代码

httpspeedavg = np.array([1821000, 2264000, 2209000, 2203000, 2306000, 2005000, 2428000,
       2246000, 1642000,  721000, 1125000, 1335000, 1367000, 1760000,
       1807000, 1761000, 1767000, 1723000, 1883000, 1645000, 1548000,
       1608000, 1372000, 1532000, 1485000, 1527000, 1618000, 1640000,
       1199000, 1627000, 1620000, 1770000, 1741000, 1744000, 1986000,
       1931000, 2410000, 2293000, 2199000, 1982000, 2036000, 2462000,
       2246000, 2071000, 2220000, 2062000, 1741000, 1624000, 1872000,
       1621000, 1426000, 1723000, 1735000, 1443000, 1735000, 2053000,
       1811000, 1958000, 1828000, 1763000, 2185000, 2267000, 2134000,
       2253000, 1719000, 1669000, 1973000, 1615000, 1839000, 1957000,
       1809000, 1799000, 1706000, 1549000, 1546000, 1692000, 2335000,
       2611000, 1855000, 2092000, 2029000, 1695000, 1379000, 2400000,
       2522000, 2140000, 2614000, 2399000, 2376000])

def smooth_(squences,period=5):
    res = []
    gap = period/2
    right = len(squences)
    for i in range(right):
        res.append(np.mean(squences[i-gap if i-gap > 0 else 0:i+gap if i+gap < right else right]))
    return res 

httpavg = np.round((1.0*httpspeedavg/1024/1024).tolist(),2)
smooth = np.round(smooth_((1.0*httpspeedavg/1024/1024).tolist(),5),2)

f = plt.figure(figsize=(8, 6))
ax = f.add_subplot(111)
probplot(smooth, plot=ax)
# plt.show()

f = plt.figure(figsize=(8, 6))
ax = f.add_subplot(111)
probplot(httpavg, plot=ax)
# plt.show()

import statsmodels.api as sm
plt.figure(figsize=(15,8))
ecdf = sm.distributions.ECDF(httpavg)
x = np.linspace(min(httpavg), max(httpavg), len(httpavg))
y = ecdf(x)
plt.plot(x, y, label=‘httpavg‘,color=‘blue‘,marker=‘.‘)
ecdf1 = sm.distributions.ECDF(smooth)
x1 = np.linspace(min(smooth), max(smooth), len(smooth))
y1 = ecdf1(x1)
plt.plot(x1, y1, label=‘smooth‘,color=‘red‘,marker=‘.‘)
plt.legend(loc=‘best‘)
# plt.show()
def cdf(l):
    res = []
    length = len(l)
    for i in range(length):
        res.append(1.0*(i+1)/length)
    return res
plt.figure(figsize=(15,8))
x = np.sort(httpavg)
y = cdf(x)
plt.plot(x, y, label=‘httpavg‘,color=‘blue‘,marker=‘.‘)
x1 = np.sort(smooth)
y1 = cdf(x1)
plt.plot(x1, y1, label=‘smooth‘,color=‘red‘,marker=‘.‘)
plt.legend(loc=‘best‘)
# plt.show()
from scipy.stats import norm,linregress
plt.figure(figsize=(10,8))
httpavg = np.sort(httpavg)
smooth  = np.sort(smooth)
slope, intercept, rvalue, pvalue, stderr = linregress(httpavg, smooth)
plt.plot(httpavg, smooth, ‘bo‘, httpavg, slope*httpavg + intercept, ‘r-‘)
xmin = np.amin(httpavg)
xmax = np.amax(httpavg)
ymin = np.amin(smooth)
ymax = np.amax(smooth)
posx = xmin + 0.50 * (xmax - xmin)
posy = ymin + 0.01 * (ymax - ymin)
plt.text(posx, posy, "$R^2=%1.4f$ y = %.2f *x + %.2f"  % (rvalue,slope,intercept))
plt.plot(httpavg,httpavg,color=‘green‘,label=‘y=x‘)
plt.legend(loc=‘best‘)
# plt.show()

原文地址:https://www.cnblogs.com/qwj-sysu/p/8484924.html

时间: 2024-11-06 12:30:30

回归模型效果评估系列1-QQ图的相关文章

回归模型效果评估系列2-MAE、MSE、RMSE、MAPE(MAPD)

MAE.MSE.RMSE.MAPE(MAPD)这些都是常见的回归预测评估指标,重温下它们的定义和区别以及优缺点吧 MAE(Mean Absolute Error) 平均绝对误差                                                  是基础的评估方法,后面的方法一般以此为参考对比优劣. MSE(Mean Square Error) 平均平方差                                                   对比MAE,

【NLP】蓦然回首:谈谈学习模型的评估系列文章(三)

基于NLP角度的模型评价方法 作者:白宁超 2016年7月19日19:04:51 摘要:写本文的初衷源于基于HMM模型序列标注的一个实验,实验完成之后,迫切想知道采用的序列标注模型的好坏,有哪些指标可以度量.于是,就产生了对这一专题进度学习总结,这样也便于其他人参考,节约大家的时间.本文依旧旨在简明扼要梳理出模型评估核心指标,重点达到实用.本文布局如下:第一章采用统计学习角度介绍什么是学习模型以及如何选择,因为现今的自然语言处理方面大都采用概率统计完成的,事实证明这也比规则的方法好.第二章采用基

PP图和QQ图

 一. QQ图 分位数图示法(Quantile Quantile Plot,简称 Q-Q 图) 统计学里Q-Q图(Q代表分位数)是一个概率图,用图形的方式比较两个概率分布,把他们的两个分位数放在一起比较.首先选好分位数间隔.图上的点(x,y)反映出其中一个第二个分布(y坐标)的分位数和与之对应的第一分布(x坐标)的相同分位数.因此,这条线是一条以分位数间隔为参数的曲线.如果两个分布相似,则该Q-Q图趋近于落在y=x线上.如果两分布线性相关,则点在Q-Q图上趋近于落在一条直线上,但不一定在y=x线

逻辑斯蒂回归模型

http://blog.csdn.net/hechenghai/article/details/46817031 主要参照统计学习方法.机器学习实战来学习.下文作为参考. 第一节中说了,logistic 回归和线性回归的区别是:线性回归是根据样本X各个维度的Xi的线性叠加(线性叠加的权重系数wi就是模型的参数)来得到预测值的Y,然后最小化所有的样本预测值Y与真实值y‘的误差来求得模型参数.我们看到这里的模型的值Y是样本X各个维度的Xi的线性叠加,是线性的. Y=WX (假设W>0),Y的大小是随

[转]如何正确的选择回归模型?

转自CSDN_杨志友  http://blog.csdn.net/yangzhiyouvl/article/details/53955073原文标题:7 Types of Regression Techniques you should know! 链接:https://www.analyticsvidhya.com/blog/2015/08/comprehensive-guide-regression/ Introduction 线性回归(Linear regressions)和对率回归(Lo

吴裕雄 数据挖掘与分析案例实战(7)——岭回归与LASSO回归模型

# 导入第三方模块import pandas as pdimport numpy as npimport matplotlib.pyplot as pltfrom sklearn import model_selectionfrom sklearn.linear_model import Ridge,RidgeCV # 读取糖尿病数据集diabetes = pd.read_excel(r'F:\\python_Data_analysis_and_mining\\08\\diabetes.xlsx

回归模型

# 机器学习中的五种回归模型及其优缺点·监督学习参考链接:https://blog.csdn.net/Katherine_hsr/article/details/79942260 ## 1.线性回归(Linear Regression)参考:<机器学习实战>第八章算法链接:https://github.com/sharryling/machine-learning/blob/Machine-Learning/%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92_%E5%9B

统计工具之QQ图

正态 QQ 图和普通 QQ 图 分位数-分位数 (QQ) 图是两种分布的分位数相对彼此进行绘制的图.评估数据集是否正态分布,并分别研究两个数据集是否具有相似的分布. 如何构建正态 QQ 图 首先,数据值经过排序,且累积分布值按照公式 (i– 0.5)/n 进行计算,其中字母表示总数为 n 的值中的第 i 个值(累积分布值给出了某个特定值以下的值所占的数据比例).累积分布图通过以比较方式绘制有序数据和累积分布值得到(如下图中左上角的图表所示).标准正态分布(平均值为 0 标准方差为 1 的高斯分布

SPSS数据分析—多分类Logistic回归模型

前面我们说过二分类Logistic回归模型,但分类变量并不只是二分类一种,还有多分类,本次我们介绍当因变量为多分类时的Logistic回归模型. 多分类Logistic回归模型又分为有序多分类Logistic回归模型和无序多分类Logistic回归模型 一.有序多分类Logistic回归模型 有序多分类Logistic回归模型拟合的基本方法是拟合因变量水平数-1个Logistic回归模型,也称为累积多分类Logit模型,实际上就是将因变量依次分割成两个等级,对这两个等级建立二分类Logistic