第四章 广义线性模型 - "耿直"的算法模型
这章主要介绍了线性模型, 怎么模拟直线, 线性回归, 岭回归, Lasso(套索)回归.不过这本书都不怎么讲数学, 原理基本不讲. 没有讲出线性回归, 岭回归, Lasso回归的本质差异, 需要额外补充资料学习.
这章主要用到sklearn.linear_model 模块:
linear_model模块
4.1 线性模型的基本模型
线性模型一般预测公式:
ŷ = w0 + ∑i=1~n (xi*wi)
其中w0也写作b, 截距. 而wi则是系数(斜率), 变量的权重值. |w|和b组成了线性模型的参数. ŷ 读作y-hat, 代表y的估计值. 则ŷ-y就是误差.
线性回归模型的损失函数
根据损失函数的不同, 线性模型有不同, 根据正则项λ∑w^2还是λ∑|w|, 可以分为岭回归还是Lasso回归, 前者又称L2正则化, 后者叫L1正则化.
线性模型的表示
显示线性函数其实就是先用np.linspace 构造一个自变量范围内的等差数列数组, 再用自变量数组代入线性方程, 将相应点plot出来:
import numpy as np
import matplotlib.pyplot as plt
# 构造一个等差数列, 覆盖自变量显示范围
x = np.linspace(-5,5,100)
# 输入线性方程
y = 0.5*x+3
# 画图显示
plt.plot(x,y,c='orange')
plt.title('Straight Line')
plt.show()
线性方程
其实np.linspace(-5,5,2) 都能把线显示出来, 1则不行. 其实这个是个线段, x范围[-5,5]. 因此要覆盖好你的范围.
如果利用两个点来构造直线呢? 构造线段可以直接plot出来:
plt.scatter([1,4],[3,5],s=80)
plt.plot([1,4],[3,5],c='orange')
plt.xlim(0, 6)
plt.ylim(0, 10)
plt.show()
过两点的线段
如果想在一定范围内显示好效果, 可以利用线性回归器构造:
from sklearn.linear_model import LinearRegression
# 输入两个点的坐标
X = [[1], [4]]
y = [3,5]
# 构造线性模型
lr = LinearRegression().fit(X,y)
# 构造一定范围的等差数列
xr = np.linspace(0,6,10)
# 画图
plt.scatter(X,y,s=80)
plt.plot(xr,lr.predict(xr.reshape(-1,1)),c='k')
plt.title('Straight Line by Linear Regression')
plt.show()
线性模型
显示线性模型的系数和系数可以用lr.coef_和lf.intercept_ 来进行, 前者实际是个数组, 储存了wi的值, 可以显示指定的系数
print('y = %.3f * x + %.3f' % (lr.coef_[0],lr.intercept_))
# y = 0.667 * x + 2.333
类似地, 可以对多个点进行回归和显示, 这里用上章的make_regression来构造. lr.score 所计算的就是决定系数(R2).
决定系数R2也可以使用metrics.r2_score(真值,估计值)来计算.
from sklearn.datasets import make_regression
# 构造数据集
X, y = make_regression(n_samples=50, n_features=1,n_informative=1,noise=30,random_state=1)
# 线性模型
reg = LinearRegression().fit(X,y)
# 用于画线性函数
xr = np.linspace(-3,3,200).reshape(-1,1)
plt.scatter(X,y,c='b',s=60)
plt.plot(xr, reg.predict(xr),c='k')
plt.title('Linear Regression Model')
plt.show()
# 显示方程
print('y = %.3f*x + %.3f' % (reg.coef_[0],reg.intercept_))
#> y = 83.851*x + 6.553
# 显示相关系数(R)和决定系数(R平方)
print('相关系数: %.3f ; 决定系数 %.3f' % (reg.score(X,y)**0.5,reg.score(X,y)))
#> 相关系数: 0.958 ; 决定系数 0.917
线性方程模型
如果是多元线性方程, 二维图不太便于显示, 仅显示其方程:
# 构造数据集
X, y = make_regression(n_samples=50, n_features=3,n_informative=1,noise=30,random_state=1)
# 线性模型
reg = LinearRegression().fit(X,y)
# 显示出方程
print('y = %.3f*x1 + %.3f*x2 + %.3f*x3 + %.3f' % tuple(list(reg.coef_)+[reg.intercept_]))
#> y = -9.596*x1 + 34.865*x2 + -7.491*x3 + 8.912
print('相关系数: %.3f ; 决定系数 %.3f' % (reg.score(X,y)**0.5,reg.score(X,y)))
#> 相关系数: 0.815*x ; 决定系数 0.664