建立完回归模型后,还需要验证咱们建立的模型是否合适,换句话说,就是咱们建立的模型是否真的能代表现有的因变量与自变量关系,这个验证标准一般就选用拟合优度。
拟合优度是指回归方程对观测值的拟合程度。度量拟合优度的统计量是判定系数R^2。R^2的取值范围是[0,1]。R^2的值越接近1,说明回归方程对观测值的拟合程度越好;反之,R^2的值越接近0,说明回归方程对观测值的拟合程度越差。
拟合优度问题目前还没有找到统一的标准说大于多少就代表模型准确,一般默认大于0.8即可
拟合优度的公式:R^2 = 1 - RSS/TSS
注: RSS 离差平方和 ; TSS 总体平方和
理解拟合优度的公式前,需要先了解清楚几个概念:总体平方和、离差平方和、回归平方和。
一、总体平方和、离差平方和、回归平方和
回归平方和 ESS,残差平方和 RSS,总体平方和 TSS
TSS(Total Sum of Squares)表示实际值与期望值的离差平方和,代表变量的总变动程度
ESS(Explained Sum of Squares)表示预测值与期望值的离差平方和,代表预测模型拥有的变量变动程度
RSS(Residual Sum of Squares)表示实际值与预测值的离差平方和,代表变量的未知变动程度
各个平方和的计算公式如下:
二、拟合优度
接上一节内容可知,我们拿实际值与期望值的离差平方和作为整体变量的总变动程度,这个变动程度就是我们建模型的目的,我们建立模型就是为了模拟这个变动程度。
建立模型后,整体变量的总变动程度(TSS)可以划分为两部分:模型模拟的变动程度(ESS)和未知的变动程度(RSS)
通常来说,预测模型拥有的变量变动程度在总变动程度中的占比越高,代表模型越准确,当RSS=0时,表示模型能完全模拟变量的总变动。
回到文章开头的拟合优度公式:R^2 = 1 - RSS/TSS 。是不是很好理解了!
假设R^2 = 0.8,意味着咱们建立的模型拥有的变动程度能模拟80%的总变动程度,剩下20%为未知变动。
三、例子
对于学生而言,现在要探索一下学生的学习成绩与单一的学习时间是否有关系,给出两组数据如下:
'学习时间':[0.50,0.75,1.00,1.25,1.50,1.75,1.75, 2.00,2.25,2.50,2.75,3.00,3.25,3.50,4.00,4.25,4.50,4.75,5.00,5.50],
'分数':[10,22,13,43,20,22,33,50,62,48,55,75,62,73,81,76,64,82,90,93]
常识理解,学习时间越长,分数一般都会越高,两者是正比关系,因为就一个自变量,直接用sklearn,算出截距和斜率即可
import pandas as pd import numpy as np import matplotlib.pyplot as plt from pandas import DataFrame,Series from sklearn.cross_validation import train_test_split from sklearn.linear_model import LinearRegression #创建数据集 examDict = {'学习时间':[0.50,0.75,1.00,1.25,1.50,1.75,1.75, 2.00,2.25,2.50,2.75,3.00,3.25,3.50,4.00,4.25,4.50,4.75,5.00,5.50], '分数':[10,22,13,43,20,22,33,50,62, 48,55,75,62,73,81,76,64,82,90,93]} #转换为DataFrame的数据格式 examDf = DataFrame(examDict) #examDf #绘制散点图 plt.scatter(examDf.分数,examDf.学习时间,color = 'b',label = "Exam Data") #添加图的标签(x轴,y轴) plt.xlabel("Hours") plt.ylabel("Score") #显示图像 plt.show() #将原数据集拆分训练集和测试集 exam_X = examDf.学习时间 exam_Y = examDf.分数 X_train,X_test,Y_train,Y_test = train_test_split(exam_X,exam_Y,train_size=0.8) #X_train为训练数据标签,X_test为测试数据标签,exam_X为样本特征,exam_y为样本标签,train_size 训练数据占比 print("原始数据特征:",exam_X.shape, ",训练数据特征:",X_train.shape, ",测试数据特征:",X_test.shape) print("原始数据标签:",exam_Y.shape, ",训练数据标签:",Y_train.shape, ",测试数据标签:",Y_test.shape) model = LinearRegression() #对于模型错误我们需要把我们的训练集进行reshape操作来达到函数所需要的要求 # model.fit(X_train,Y_train) #reshape如果行数=-1的话可以使我们的数组所改的列数自动按照数组的大小形成新的数组 #因为model需要二维的数组来进行拟合但是这里只有一个特征所以需要reshape来转换为二维数组 X_train = X_train.values.reshape(-1,1) X_test = X_test.values.reshape(-1,1) model.fit(X_train,Y_train) a = model.intercept_#截距 b = model.coef_#回归系数 print("最佳拟合线:截距",a,",回归系数:",b)
接下来算出拟合优度看看 ,拟合优度0.83,符合要求
# 用训练集进行拟合优度,验证回归方程是否合理 def get_lr_stats(x, y, model): message0 = '一元线性回归方程为: '+'\ty' + '=' + str(model.intercept_)+' + ' +str(model.coef_[0]) + '*x' from scipy import stats n = len(x) y_prd = model.predict(x) Regression = sum((y_prd - np.mean(y))**2) # 回归平方和 Residual = sum((y - y_prd)**2) # 残差平方和 total = sum((y-np.mean(y))**2) #总体平方和 R_square = 1-Residual / total # 相关性系数R^2 message1 = ('相关系数(R^2): ' + str(R_square) + ';' + '\n'+ '总体平方和(TSS): ' + str(total) + ';' + '\n') message2 = ('回归平方和(RSS): ' + str(Regression) + ';' + '\n残差平方和(ESS): ' + str(Residual) + ';' + '\n') return print(message0 +'\n' +message1 + message2 ) get_lr_stats(X_train,Y_train,model)
如果需要,可以把所有点和回归直线画出来,直观感受一下
#训练数据的预测值 y_train_pred = model.predict(X_train) #绘制最佳拟合线:标签用的是训练数据集中的极值预测值 X_train_pred = [min(X_train),max(X_train)] y_train_pred = [a+b*min(X_train),a+b*max(X_train)] plt.plot(X_train_pred, y_train_pred, color='green', linewidth=3, label="best line") #测试数据散点图 plt.scatter(X_test, Y_test, color='red', label="test data") plt.scatter(X_train, Y_train, color="blue", label="train data") #添加图标标签 plt.legend(loc=2) plt.xlabel("Hours") plt.ylabel("Score") #显示图像 plt.savefig("lines.jpg") plt.show() #计算拟合优度 score = model.score(X_test,Y_test) print(score)
以上这篇python 线性回归分析模型检验标准--拟合优度详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。
本文向大家介绍Python 线性回归分析以及评价指标详解,包括了Python 线性回归分析以及评价指标详解的使用技巧和注意事项,需要的朋友参考一下 废话不多说,直接上代码吧! 对于回归模型效果的判断指标经过了几个过程,从SSE到R-square再到Ajusted R-square, 是一个完善的过程: SSE(误差平方和):The sum of squares due to error R-squ
回归问题的条件或者说前提是 1) 收集的数据 2) 假设的模型,即一个函数,这个函数里含有未知的参数,通过学习,可以估计出参数。然后利用这个模型去预测/分类新的数据。 1 线性回归的概念 线性回归假设特征和结果都满足线性。即不大于一次方。收集的数据中,每一个分量,就可以看做一个特征数据。每个特征至少对应一个未知的参数。这样就形成了一个线性模型函数,向量表示形式: 这个就是一个组合问题,
本文向大家介绍Python线性回归实战分析,包括了Python线性回归实战分析的使用技巧和注意事项,需要的朋友参考一下 一、线性回归的理论 1)线性回归的基本概念 线性回归是一种有监督的学习算法,它介绍的自变量的和因变量的之间的线性的相关关系,分为一元线性回归和多元的线性回归。一元线性回归是一个自变量和一个因变量间的回归,可以看成是多远线性回归的特例。线性回归可以用来预测和分类,从回归方程可以看出
线性回归模型(linear regression) 1.模型定义 给定数据集,$$T={(x{(1)},y{(1)}),(x{(2)},y{(2)}),...,(x{(m)},y{(m)})}$$,其中$$x{(i)}=(1, x_1, x_2, ..., x_n)T\in X= R{n+1}$$,$$y{(i)}\in Y=R$$,线性回归模型试图学到一个通过属性的线性组合来进行预测的函数,即
许多标准的机器学习算法可以归结为凸优化问题。例如,找到凸函数f的一个极小值的任务,这个凸函数依赖于可变向量w(在spark源码中,一般表示为weights)。 形式上,我们可以将其当作一个凸优化问题${min}_{w}f(w)$。它的目标函数可以表示为如下公式 (1): 在上式中,向量x表示训练数据集,y表示它相应的标签,也是我们想预测的值。如果L(w;x,y)可以表示为${w}^{T}x
1 普通线性模型 普通线性模型(ordinary linear model)可以用下式表示: Y = \beta0 + \beta_1 x_1 + \beta_2 x_2 + … + \beta{p-1} x_{p-1} + \epsilon 这里$\beta$是未知参数,$\epsilon$是误差项。普通线性模型主要有以下几点假设: 响应变量$Y$和误差项$\epsilon$均服从正太分