机器学习之简单的线性回归

图片源自互联网

一、线性回归的概念

(小时候的我很喜欢“回”这个字,直到我上中学后学了线性回归=_=)

在统计学中,线性回归(Linear Regression)是利用称为线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。这种函数是一个或多个称为回归系数的模型参数的线性组合。只有一个自变量的情况称为简单回归,大于一个自变量情况的叫做多元回归。(这反过来又应当由多个相关的因变量预测的多元线性回归区别,而不是一个单一的标量变量。)——摘自百度百科“线性回归”词条

线性回归的标准方程

上过中学的同学应该还记得线性回归、最小二乘法等东西,所以就不具体谈线性回归的基础原理了。ヾ(≧▽≦*)o

基础原理相关名词

  • 最小二乘法
  • 线性代数
  • 逆矩阵
  • 矩阵内积
  • 转置矩阵

线性回归的作用

  1. 趋势线:一条趋势线代表着时间序列数据的长期走势。它告诉我们一组特定数据(如GDP、石油价格和股票价格)是否在一段时期内增长或下降。虽然我们可以用肉眼观察数据点在坐标系的位置大体画出趋势线,更恰当的方法是利用线性回归计算出趋势线的位置和斜率。
  2. 流行病学:有关吸烟对死亡率和发病率影响的早期证据来自采用了回归分析的观察性研究。为了在分析观测数据时减少伪相关,除最感兴趣的变量之外,通常研究人员还会在他们的回归模型里包括一些额外变量。例如,假设我们有一个回归模型,在这个回归模型中吸烟行为是我们最感兴趣的独立变量,其相关变量是经数年观察得到的吸烟者寿命。研究人员可能将社会经济地位当成一个额外的独立变量,已确保任何经观察所得的吸烟对寿命的影响不是由于教育或收入差异引起的。然而,我们不可能把所有可能混淆结果的变量都加入到实证分析中。例如,某种不存在的基因可能会增加人死亡的几率,还会让人的吸烟量增加。因此,比起采用观察数据的回归分析得出的结论,随机对照试验常能产生更令人信服的因果关系证据。当可控实验不可行时,回归分析的衍生,如工具变量回归,可尝试用来估计观测数据的因果关系。
  3. 金融与经济学:利用回归分析预测投资风险、回报,或者预测消费支出、存货投资等。

二、Talk is cheap, show me code

2.1 简单线性回归

简单线性回归就是一元线性回归。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 准备训练数据
X = 2 * np.random.rand(100,1)
y = 4 + 3 * X + np.random.randn(100,1)

# 创建模型
from sklearn.linear_model import LinearRegression
lin_reg_model = LinearRegression()
lin_reg_model.fit(X,y)

# 测试数据
X_new = np.array([[0],[2]])
ypredict = lin_reg_model.predict(X_new)

# 绘图
plt.scatter(X,y,s=10,c='black')
plt.plot(X_new,ypredict,c='r')
简单线性回归

2.2 随机梯度下降

在使用简单线性回归的时候,当特征数很大的时候,比如100000个,训练速度就会很慢。这时候借助一些优化算法,比如梯度下降算法,将有效提高训练速度。

使用梯度下降的线性回归有:

  • 批量梯度下降:计算梯度下降的每一步都使用整批训练数据,但当训练集非常非常庞大时,算法还是会变慢。
  • 随机梯度下降:每一步在训练集中随机选择一个实例,并且仅基于该单个实例来计算梯度。当面对庞大的数据集时,随机梯度下降会比批量梯度下降快得多。但由于随机性质,算法停下来的参数值永远不是最小值,只是一个足够好的值。
  • 小批量梯度下降:相比于随机梯度下降,小力量梯度下降的主要优势在于可以从矩阵运算的硬件优化中获得显著的性能提升,特别是需要用到GPU的时候。

由于没找到scikit-learn中关于批量梯度下降和小批量梯度下降的类,所以这里只实现了随机梯度下降。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 准备训练数据
X = 2 * np.random.rand(100,1)
y = 4 + 3 * X + np.random.randn(100,1)

# 创建模型
from sklearn.linear_model import SGDRegressor
sgd_reg = SGDRegressor(n_iter=50,penalty=None,eta0=0.1)
sgd_reg.fit(X,y)

# 测试数据
X_new = np.array([[0],[2]])
ypredict2 = sgd_reg.predict(X_new)

# 绘图
plt.scatter(X,y,s=10,c='black')
plt.plot(X_new,ypredict2,c='r')
随机梯度下降

2.3 多项式回归

看了那么多博客,都提到线性回归无法拟合非线性数据,,,但其实,将每个特征的幂次方添加为一个新特征,然后在这个拓展过的特征集上训练线性模型就可以实现拟合非线性特征。这种方法称为多项式回归。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 准备训练数据
m = 100
X = 6 * np.random.rand(m,1) - 3
y = 0.5 * X ** 2+ X + 2 + np.random.randn(m,1)

# 使用PolynomialFeatures类来对训练数据进行转换
from sklearn.preprocessing import PolynomialFeatures
poly_features = PolynomialFeatures(degree=2,include_bias=False)
X_poly = poly_features.fit_transform(X)

# X_poly现在包含原本的特征X和该特征的平方
# 使用X_poly创建线性模型
from sklearn.linear_model import LinearRegression
lin_reg_model = LinearRegression()
lin_reg_model.fit(X_poly,y)

# 绘图
a = lin_reg_model.coef_[0][0]
b = lin_reg_model.coef_[0][1]
c = lin_reg_model.intercept_

xtest1 = np.linspace(-3,3,100)
funcy = a * xtest1 ** 2 + b * xtest1 + c

plt.scatter(X,y,s=10,c='black')
plt.plot(xtest1,funcy,c='red')
多项式回归

注意:PolynomialFeatures会在给定的多项式系数下,添加所有特征组合。例如,有两个特征a和b,degree=3时,会有a^3, b^3, a^2, b^2, ab, ba^2, ab^2。

三、模型评估

  • SSE:和方差。拟合数据与实际数据之间的差的平方。
  • MSE:SSE的均值,即SSE/n。
  • RMSE:MSE的平方根。
  • R-Square:SSR / SST
    • SSR:预测数据与实际数据均值之差的平方和
    • SST:实际数据与实际数据均值之差的平方和
mse = sklearn.metrics.mean_absolute_error(ytrain,ytest)
rmse = np.sqrt(mse)
ssr = ((ytest - ytrain.mean()) ** 2).sum()
sst = ((ytrain - ytrain.mean()) ** 2).sum()
rs = ssr / sst

四、其他

由于本文只打算介绍简单的线性回归,所以其他一些线性回归的方法不会在本文中介绍,比如:岭回归,套索回归等。感兴趣的朋友可以自行探索一下。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容