机器学习之线性回归(手推公式版)

前言

  回归 ( R e g r e s s i o n ) (Regression) (Regression),用于预测输入变量(自变量)与输出变量(因变量)之间的关系,即当输入的值发生变化时,输出的值也随之变化。它属于监督学习,即需要给定一个训练数据集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x m , y m ) } D=\{(x_1,y_1),(x_2,y_2),\dots,(x_m,y_m)\} D={ (x1,y1),(x2,y2),,(xm,ym)},就拿股票预测来说吧,将股票以往的历史数据作为训练集来学习一个模型,根据当前的股票信息来预测下一个时间的股票价格。学习得到的模型我们称之为回归函数 f ( x ) f(x) f(x)

1. 线性回归 ( L i n e a r (Linear (Linear M o d e l ) Model) Model)

  线性回归的基本形式:给定有 d d d个属性描述的示例 x = [ x 1 x 2 ⋮ x d ] \bm {x}=\begin{bmatrix} x_1 \\ x_2 \\ \vdots\\ x_d\\ \end{bmatrix} x=x1x2xd,其中 x i x_i xi x \bm {x} x在第 i i i个属性上的取值,线性模型试图学得一个由属性 x i x_i xi线性组合的预测函数,即 f ( x ) = w 1 x 1 + w 2 x 2 + ⋯ + w d x d + b f(\bm {x})=w_1x_1+w_2x_2+\dots+w_dx_d+b f(x)=w1x1+w2x2++wdxd+b
一般用向量形式表示为 f ( x ) = w T x + b f(\bm {x})=\bm {w^Tx}+b f(x)=wTx+b
  其中 w = [ w 1 w 2 ⋮ w d ] \bm {w}=\begin{bmatrix} w_1 \\ w_2 \\ \vdots\\ w_d\\ \end{bmatrix} w=w1w2wd,参数 w \bm {w} w b b b是通过学习得到的,这两个参数确定即代表模型就确定了。

1.1 一元线性回归

  这应该是最基本的线性回归了,即输入的变量只有一个。对于给定的数据集 D = { ( x i , y i ) } D=\{(x_i,y_i)\} D={ (xi,yi)},其中 1 ≤ i ≤ m 1 \leq i \leq m 1im,一元线性回归试图学得
f ( x i ) = w x i + b , 使 得 f ( x i ) 无 限 接 近 于 y i f(x_i)=wx_i+b,使得f(x_i)无限接近于y_i f(xi)=wxi+b,使f(xi)yi
  确定参数 w w w b b b,关键在于如何衡量 f ( x ) f(x) f(x) y y y之间的差别,均方误差 ( M e a n (Mean (Mean S q u a r e Square Square E r r o r , M S E ) Error,MSE) ErrorMSE)是回归任务中最常用的性能度量,试图让均方误差最小化来求得最优的 w w w b b b,即 ( w ∗ , b ∗ ) = a r g m i n ∑ i = 1 m ( f ( x i ) − y i ) 2 = a r g m i n ∑ i = 1 m ( y i − w x i − b ) 2 (w^*,b^*)=argmin\sum_{i=1}^m(f(x_i)-y_i)^2 \\ =argmin\sum_{i=1}^m(y_i-wx_i-b)^2 (w,b)=argmini=1m(f(xi)yi)2=argmini=1m(yiwxib)2

  知识小提示:均方误差也称为平均损失 ( S q u a r e (Square (Square L o s s ) Loss) Loss)

  如何求解呢?对于上述公式来数,我们可以再次简化成 y = x 2 y=x^2 y=x2,求解使 y y y取最小值时的 x x x,很好办,上来就是求导,令倒数等于0,没错,就是这样。我们这里求解的是两个未知数,所以求的是偏导数,求解如下:

在这里插入图片描述

  知识小提示:凸函数,即二阶导数在区间上非负,若恒大于0,称为严格凸函数,这和高数里面的定义正好相反。西瓜书上具体定义如下:
    假设函数 f ( x ) f(x) f(x)的定义域为 [ a , b ] [a,b] [a,b],在其区间上任取两点,若 f ( x 1 ) + f ( x 2 ) 2 \frac {f(x_1)+f(x_2)} {2} 2f(x1)+f(x2) ≥ \geq f ( x 1 + x 2 2 ) {f(\frac {x_1+x_2} {2})} f(2x1+x2),则称 f ( x ) f(x) f(x)为凸函数。

1.2 多元线性回归 ( M u l t i v a r i a t e (Multivariate (Multivariate L i n e a r Linear Linear M o d e l ) Model) Model)

  即输入的变量有多个,正如最上面的基本形式。多元线性回归试图学得
f ( x i ) = w T x i + b , 使 得 f ( x i ) 无 限 接 近 于 y i f(\bm {x_i})=\bm {w^Tx_i}+b,使得f(\bm {x_i})无限接近于y_i f(xi)=wTxi+b,使f(xi)yi

  同样,可以利用最小二乘法进行上述求解,为了方便,这里把 w \bm {w} w b b b吸收入向量形式 w ^ = [ w b ] \bm {\hat {w}}=\begin{bmatrix} \bm {w} \\ b \\ \end{bmatrix} w^=[wb],则 w ^ ∗ = a r g m i n ∑ i = 1 m ( f ( x i ) − y i ) 2 = a r g m i n ∑ i = 1 m ∣ ∣ y − X w ^ ∣ ∣ 2 2 = a r g m i n ∑ i = 1 m ( y − X w ^ ) T ( y − X w ^ ) \bm {\hat {w}^*}=argmin\sum_{i=1}^m(f(\bm {x_i})-\bm {y_i})^2 \\ =argmin\sum_{i=1}^m||\bm {y}-\bm {X\hat {w}}||_2^2 \\ =argmin\sum_{i=1}^m(\bm {y}-\bm {X\hat {w}})^T(\bm {y}-\bm {X\hat {w}}) w^=argmini=1m(f(xi)yi)2=argmini=1myXw^22=argmini=1m(yXw^)T(yXw^)  具体求解如下:

在这里插入图片描述

  知识小提示:基于均方误差最小化进行求解的方法称为最小二乘法。在统计学中,使用最小二乘法来求解线性回归的方法是一种无偏估计的方法,这种无偏估计要求因变量(即标签 y y y)必须服从正态分布,所以当线性回归模型效果不好时,考虑正态化处理来改变一下因变量的分布。

2. 模型实现

  这里使用sklearn.linear_model里的LinearRegression进行线性回归建模,数据集为sklearn自带的糖尿病数据集diabetes,数据集详情大致如下:
在这里插入图片描述

age sex bmi bp s1 s2 s3 s4 s5 s6
年龄 性别 体重指数 平均血压 T细胞数 ( t c ) (tc) (tc) 低密度脂蛋白 ( l d l ) (ldl) (ldl) 高密度脂蛋白 ( h d l ) (hdl) (hdl) 促甲状腺激素 ( t c h ) (tch) (tch) l a m o t r i g i n e ( l t g ) lamotrigine(ltg) lamotrigine(ltg) 血糖含量 ( g l u ) (glu) (glu)

  详情可打印diabetes.DESCR

	from sklearn import linear_model
	from sklearn import model_selection
	from sklearn import datasets
	from sklearn.metrics import mean_squared_error
	from sklearn.metrics import r2_score
	import pandas as pd
	import matplotlib.pyplot as plt
	
	
	# 加载糖尿病数据集
	diabetes = datasets.load_diabetes()
	# print(diabetes.DESCR)
	
	# data = pd.DataFrame(diabetes.data)
	# data.columns = diabetes.feature_names
	# data['target'] = diabetes.target
	
	data = diabetes.data
	target = diabetes.target
	
	# 划分训练集和测试集
	x_train, x_test, y_train, y_test = model_selection.train_test_split(data, target, test_size=0.3, random_state=512)
	
	# 创建线性回归模型
	model= linear_model.LinearRegression()
	# 训练这个模型
	model.fit(x_train, y_train)
	# score = model.score(x_test, y_test)
	# 使用模型做预测
	y_pred = model.predict(x_test)
	
	# 查看各个特征的系数
	w = model.coef_
	b = model.intercept_
	
	print('w: {0}\nb: {1}'.format(w, b))

  各个特征对应的系数如下:
在这里插入图片描述
  由上可以看出,s5与糖尿病有很大的关联,其次是s2,而s1和性别与糖尿病的关联很小(额(⊙o⊙)…这样分析总感觉有点…)。

  有关LinearRegression的详细参数说明可参考官方手册

3. 模型评估

  在线性回归的模型评估中常用两种方法,一种就是上面所述的均方误差 M S E MSE MSE,另一种就是 R R R方值 R 2 _ s c o r e R2\_score R2_score M S E = 1 m ∑ i = 1 m ( y i − y ^ i ) 2 MSE=\frac {1} {m} \sum_{i=1}^m(y_i-\hat {y}_i)^2 MSE=m1i=1m(yiy^i)2  可见, M S E MSE MSE衡量的是模型对样本数值的拟合能力, M S E MSE MSE越小,表示模型对数据拟合的越好,但它有可能对部分数值拟合的很好,而对数据的分布可能拟合的不好,尤其是在数据上下界限附近。 R 2 _ s c o r e = 1 − ∑ i = 1 m ( y i − y ^ i ) 2 ∑ i = 1 m ( y i − y ‾ ) 2 R2\_score=1-\frac {\sum_{i=1}^m(y_i-\hat {y}_i)^2} {\sum_{i=1}^m(y_i-\overline {y})^2} R2_score=1i=1m(yiy)2i=1m(yiy^i)2  分式上的分子表示真实值和预测值之间的差值,也就是模型没有捕捉到的,分母是真实标签所带的信息量,可见, R 2 _ s c o r e R2\_score R2_score衡量的是模型对捕获到的信息量占真实标签中所带的信息量的比例。 R 2 _ s c o r e R2\_score R2_score越接近于1,表示模型对数据拟合的越好。

  方差可以用来衡量数据上的信息量,如果方差越大,代表数据上的信息量越多,这些信息量不仅包括数值的大小,还包括数据中隐藏的规律,比如,数据的分布规律。

	# 绘制输出
	plt.plot(range(len(y_test)), sorted(y_test), color='black', label='data')
	plt.plot(range(len(y_pred)), sorted(y_pred), color='red', label='pred')
	plt.legend()
	plt.show()

在这里插入图片描述
  结果如下:

在这里插入图片描述

结束语

  持续充电中,博客内容也在不断更新补充中,如有错误,欢迎来私戳小编哦!共同进步,感谢Thanks♪(・ω・)ノ

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42730750/article/details/112853848
今日推荐