百变大魔王探花小明哥GBM分享 http://blog.sciencenet.cn/u/iggcas010 https://blog.csdn.net/SPESEG

博文

机器学习之线性回归附Python代码

已有 8846 次阅读 2018-6-15 23:18 |系统分类:科研笔记| 机器学习, 回归分析, Regression, Python

 线性回归-Linear Regression


一、线性回归

原理:采用最小平方误差估计自变量和因变量之间的关系,通过建模求解回归因子(自变量系数),这种方法叫做回归分析。如果自变量个数的有多个,称为多元回归分析。


下面以统计模型库statsmodels中的解释进行说明:

http://www.statsmodels.org/stable/regression.html

统计数据满足image.png其中X可以是多个自变量,而且全是一次项,这里面没有二次项等高阶项哈。BetaX的系数,称为回归系数或回归因子,关键就是求Beta,求解过程其实就是将数据进行拟合,当拟合的值与实际值误差的平方和最小时就是所求结果。有些网上给的很多分析都是没有必要的扯淡,请以本文为主。

上述表达式和sklearn官方的是统一的:都是采用OLS求解的

http://scikit-learn.org/stable/modules/linear_model.html#ordinary-least-squares

image.png

二、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表示分布与正态分布相比较为平坦,为平顶峰。

峰度的绝对值越大,表示其分布形态的陡缓程度与正态分布的差异程度越大。

 

图在这里

image.png

重点来啦,图中的‘直线’的表达式到底是什么?

看到上面打印的蓝色部分了吗?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()


两个图在这

image.png

image.png

相对statsmodels中的结果,sklearn还是人性化的,没有那么多难解释的数据。哈哈

四、总结


其实数据拟合在scipy.opimize中的curve_fit可以拟合你想要的任何表达式的数据,它都能够给你得到你的表达式的系数,这个表达式就是数据符合的模型,找对模型很重要。

很多东西其实scipy库也都可以做,但大家总是非要用sklearnTensorFlow,及kerascaffepytorch,显得自己很牛逼的样子,甚至有的连sklearn都鄙视,这种情况不可取。掌握原理很重要,至于哪个工具实现,那也仅仅是工具罢了,你牛逼咋不自己造轮子啊,你要自己造轮子,我就服你,绝对膜拜!!!



五、下期预告

关联分析,很多公司都需要推荐算法,一直没有涉及Apriori、频繁树,这方面需要学习一下。


欢迎持续关注!



https://blog.sciencenet.cn/blog-1966190-1119186.html

上一篇:数据结构之栈和队列——附Python代码
下一篇:数据结构之链表
收藏 IP: 159.226.117.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-20 05:15

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部