一、线性回归的概念
(小时候的我很喜欢“回”这个字,直到我上中学后学了线性回归=_=)
在统计学中,线性回归(Linear Regression)是利用称为线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。这种函数是一个或多个称为回归系数的模型参数的线性组合。只有一个自变量的情况称为简单回归,大于一个自变量情况的叫做多元回归。(这反过来又应当由多个相关的因变量预测的多元线性回归区别,而不是一个单一的标量变量。)——摘自百度百科“线性回归”词条
上过中学的同学应该还记得线性回归、最小二乘法等东西,所以就不具体谈线性回归的基础原理了。ヾ(≧▽≦*)o
基础原理相关名词
- 最小二乘法
- 线性代数
- 逆矩阵
- 矩阵内积
- 转置矩阵
线性回归的作用
- 趋势线:一条趋势线代表着时间序列数据的长期走势。它告诉我们一组特定数据(如GDP、石油价格和股票价格)是否在一段时期内增长或下降。虽然我们可以用肉眼观察数据点在坐标系的位置大体画出趋势线,更恰当的方法是利用线性回归计算出趋势线的位置和斜率。
- 流行病学:有关吸烟对死亡率和发病率影响的早期证据来自采用了回归分析的观察性研究。为了在分析观测数据时减少伪相关,除最感兴趣的变量之外,通常研究人员还会在他们的回归模型里包括一些额外变量。例如,假设我们有一个回归模型,在这个回归模型中吸烟行为是我们最感兴趣的独立变量,其相关变量是经数年观察得到的吸烟者寿命。研究人员可能将社会经济地位当成一个额外的独立变量,已确保任何经观察所得的吸烟对寿命的影响不是由于教育或收入差异引起的。然而,我们不可能把所有可能混淆结果的变量都加入到实证分析中。例如,某种不存在的基因可能会增加人死亡的几率,还会让人的吸烟量增加。因此,比起采用观察数据的回归分析得出的结论,随机对照试验常能产生更令人信服的因果关系证据。当可控实验不可行时,回归分析的衍生,如工具变量回归,可尝试用来估计观测数据的因果关系。
- 金融与经济学:利用回归分析预测投资风险、回报,或者预测消费支出、存货投资等。
二、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
四、其他
由于本文只打算介绍简单的线性回归,所以其他一些线性回归的方法不会在本文中介绍,比如:岭回归,套索回归等。感兴趣的朋友可以自行探索一下。