||
线性回归-Linear Regression
一、线性回归
原理:采用最小平方误差估计自变量和因变量之间的关系,通过建模求解回归因子(自变量系数),这种方法叫做回归分析。如果自变量个数的有多个,称为多元回归分析。
下面以统计模型库statsmodels中的解释进行说明:
http://www.statsmodels.org/stable/regression.html
统计数据满足,其中X可以是多个自变量,而且全是一次项,这里面没有二次项等高阶项哈。Beta是X的系数,称为回归系数或回归因子,关键就是求Beta,求解过程其实就是将数据进行拟合,当拟合的值与实际值误差的平方和最小时就是所求结果。有些网上给的很多分析都是没有必要的扯淡,请以本文为主。
上述表达式和sklearn官方的是统一的:都是采用OLS求解的
http://scikit-learn.org/stable/modules/linear_model.html#ordinary-least-squares
二、statsmodels实现
程序如下:
先来个官方文档:有点应用性不强,毕竟因变量在很多时候是直接给出的,这里造了一个
#多元线性回归 import numpy as np import statsmodels.api as sm nobs = 100 X = np.random.random((nobs, 2)) X = sm.add_constant(X) #这一步是将截距加进去,初始值为1 beta = [1, .1, .5] e = np.random.random(nobs) y = np.dot(X, beta) + e #解释下这行,等价于下面的 #y4=np.dot(X, np.array(beta).reshape(-1,1)).reshape(nobs) + e #>>> np.all(y==y4) #True results = sm.OLS(y, X).fit() print(results.summary())
完全和公式对应吧,一般model是sm.OLS(y, X),在sklearn中都是X在前的,注意。
#来个双色球的线性回归,虽说没有理论依据,这里强行进行回归,数据来源中国福彩网http://www.cwl.gov.cn/kjxx/ssq/kjgg/而且是100期的数据。【顺便说下,谁能给我爬下来这100期数据,我跟你学爬虫,菜鸟一般都爬不下来哈,别费劲了】
x1=data.values[-80:,:6] y1=data['蓝球'].values[-80:] import statsmodels.api as sma X=sma.add_constant(x1) model=sma.OLS(y1,X) results=model.fit() print('\nOLS线性回归结果:\n',results.summary()) xx=np.tile(range(1,8),(100,1)).reshape(-1,1)#换成一列 yy=data.values.reshape(-1,1) plt.figure(1) plt.scatter(xx,yy,s=1) plt.plot(xx,results.fittedvalues) plt.show()
结果如下:
OLS线性回归结果:
OLS Regression Results
==============================================================================
Dep. Variable: y R-squared: 0.049
Model: OLS Adj. R-squared: -0.030
Method: Least Squares F-statistic: 0.6220
Date: Fri, 15 Jun 2018 Prob (F-statistic): 0.712
Time: 21:00:23 Log-Likelihood: -233.80
No. Observations: 80 AIC: 481.6
Df Residuals: 73 BIC: 498.3
Df Model: 6 Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 15.4805 4.067 3.806 0.000 7.375 23.586
x1 0.1197 0.149 0.803 0.425 -0.178 0.417
x2 0.0301 0.199 0.151 0.880 -0.367 0.427
x3 -0.1403 0.239 -0.586 0.560 -0.617 0.337
x4 -0.0353 0.214 -0.165 0.869 -0.461 0.390
x5 0.0422 0.206 0.205 0.838 -0.368 0.452
x6 -0.1744 0.192 -0.910 0.366 -0.556 0.207
==============================================================================
Omnibus: 33.175 Durbin-Watson: 2.218
Prob(Omnibus): 0.000 Jarque-Bera (JB): 5.414
Skew: -0.043 Prob(JB): 0.0667
Kurtosis: 1.728 Cond. No. 368.
=================================================
打印的这是什么鬼??是个人都会完全懵逼的好吧。其实Python的这个结果和其他统计分析的软件是类似的,比如SPSS,说到统计,肯定有假设检验啊,t检验、F检验,不懂不要紧,这里简单介绍下:
按照度娘百科的解释,t检验可理解为样本平均数与总体平均数的差异是否显著,如果P值小于5%,那么可以拒绝H0假设,H0假设是两者的平均值是相等的。t检验的结果在这里我却找不到对应的数据,,,懵逼。不过这里默认的是双侧检验。
F检验是方差齐性检验,当t检验数据的方差不同时,应先进行F检验。类似于t检验,F检验是看方差是否相等,这个相等不一定是绝对相等。F检验的P值这里是0.712,不能拒绝假设H0。
R2是离差,这么小已经很ok了。、
Skew:
表征概率分布密度曲线相对于平均值不对称程度的特征数,也称偏态、偏态系数
正态分布的偏度为0,两侧尾部长度对称。Skew<0称分布具有负偏离,也称左偏态,此时数据位于均值左边的比右边的少,直观表现为左边的尾部相对于右边的尾部要长,因为有少数变量值很小,使得曲线左侧尾部拖得很长,skew>0称分布具有正偏离,也称右偏态。
用偏度检验分布的正态性。
Kurtosis:
分布形态陡缓程度的统计值。峰度为0表示该总体数据分布与正态分布的陡缓程度相同;峰度大于0表示该分布与正态分布相比较为陡峭,为尖顶峰;峰度小于0表示分布与正态分布相比较为平坦,为平顶峰。
峰度的绝对值越大,表示其分布形态的陡缓程度与正态分布的差异程度越大。
图在这里
重点来啦,图中的‘直线’的表达式到底是什么?
看到上面打印的蓝色部分了吗?Coef就是beta,左边就是对应的自变量。
三、sklearn实现
咱们看一下sklearn是怎么玩的?
http://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html
#一元线性回归 import matplotlib.pyplot as plt import numpy as np from sklearn import datasets, linear_model from sklearn.metrics import mean_squared_error, r2_score # Load the diabetes dataset diabetes = datasets.load_diabetes() # Use only one feature diabetes_X = diabetes.data[:, np.newaxis, 2] #前面导入数据不重要,关键看怎么用。 # Split the data into training/testing sets diabetes_X_train = diabetes_X[:-20] diabetes_X_test = diabetes_X[-20:] # Split the targets into training/testing sets diabetes_y_train = diabetes.target[:-20] diabetes_y_test = diabetes.target[-20:] #分割数据也不重要,如果是分类的话,交叉验证里分割数据数随机的,这里是有顺序的 # Create linear regression object regr = linear_model.LinearRegression() #创建模型 # Train the model using the training sets regr.fit(diabetes_X_train, diabetes_y_train) #给模型喂数据,相当于训练数据 # Make predictions using the testing set diabetes_y_pred = regr.predict(diabetes_X_test) #预测数据 # The coefficients print('Coefficients: \n', regr.coef_) # The mean squared error print("Mean squared error: %.2f" % mean_squared_error(diabetes_y_test, diabetes_y_pred)) # Explained variance score: 1 is perfect prediction print('Variance score: %.2f' % r2_score(diabetes_y_test, diabetes_y_pred)) # Plot outputs plt.scatter(diabetes_X_test, diabetes_y_test, color='black') plt.plot(diabetes_X_test, diabetes_y_pred, color='blue', linewidth=3) ##plt.xticks(()) ##plt.yticks(())#去掉坐标轴 #训练数据集中有测试数据,这种做法不符合一般机器学习的规则,不可取 diabetes_y=diabetes.target model=linear_model.LinearRegression() result=model.fit(diabetes_X,diabetes_y) y_pred=result.predict(diabetes_X) plt.figure() plt.scatter(diabetes_X,diabetes_y, color='black') plt.plot(diabetes_X, y_pred, color='blue', linewidth=3) plt.show()
两个图在这
相对statsmodels中的结果,sklearn还是人性化的,没有那么多难解释的数据。哈哈
四、总结
其实数据拟合在scipy.opimize中的curve_fit可以拟合你想要的任何表达式的数据,它都能够给你得到你的表达式的系数,这个表达式就是数据符合的模型,找对模型很重要。
很多东西其实scipy库也都可以做,但大家总是非要用sklearn,TensorFlow,及keras,caffe,pytorch,显得自己很牛逼的样子,甚至有的连sklearn都鄙视,这种情况不可取。掌握原理很重要,至于哪个工具实现,那也仅仅是工具罢了,你牛逼咋不自己造轮子啊,你要自己造轮子,我就服你,绝对膜拜!!!
五、下期预告
关联分析,很多公司都需要推荐算法,一直没有涉及Apriori、频繁树,这方面需要学习一下。
欢迎持续关注!
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-10-19 23:03
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社