python+Scikit-Learn线性回归及损失函数
环境:(ubuntu18.04LTS)Anaconda3+python3.7.4+Scikit-Learn
一、线性回归
- 监督学习
机器学习主要分为监督学习、非监督学习和强化学习。其中,监督学习主要包括:分类(Classification)、回归(Regression)和排序(Ranking)。
监督学习是通过已知的训练数据集,训练得到数据集中特征x→标签 y 的映射关系 f ,然后通过训练得到的映射关系 f ,对测试数据集中的测试输入 x 进行预测,得到对应的预测值: y ^ = f ( x ) \hat{y}=f (x) y^=f(x)通过测试数据中的真实结果,可以得到模型的预测误差 r = y − y ^ r = y-\hat{y} r=y−y^ - 回归与分类
在监督学习任务中,如果数据集的标签 y 为连续值,则该任务为回归任务;反之,如果标签 y 为离散值,则该任务为分类任务。 - 线性回归
假设数据集中的输入(特征)和输出(标签)之间符合线性关系 y = f ( x ) = W T x y = f(x)=W^Tx y=f(x)=WTx = [ w 0 , w 1 , . . . , w N ] [ 1 x 1 . . . x n ] = w 0 + ∑ r = 1 n w i x i =[w_0,w_1,...,w_N]\begin{bmatrix} 1\\x_1\\...\\x_n \\ \end{bmatrix}=w_0+\sum_{r=1}^nw_ix_i =[w0,w1,...,wN]⎣⎢⎢⎡1x1...xn⎦⎥⎥⎤=w0+r=1∑nwixi则称之为线性回归。其中 w 0 w_0 w0称为偏置, w i w_i wi称为回归系数,如下图所示。
- 预测残差: r = y − y ^ r= y-\hat{y} r=y−y^
- 残差平方: r 2 = ( y − y ^ ) 2 r^2 = (y-\hat{y})^2 r2=(y−y^)2
- 数据集训练的模型预测残差值平方和RSS最小,则说明线型回归效果最好。 R S S = ∑ i = 1 n r i 2 = ∑ i = 1 n ( y − y ^ ) 2 RSS=\sum_{i=1}^nr_i^2=\sum_{i=1}^n(y-\hat{y})^2 RSS=i=1∑nri2=i=1∑n(y−y^)2
二、损失函数
在机器学习中,损失函数用于度量数据集中样本的真实值与训练模型的预测值之间的差异。
- L2损失
L ( y − y ^ ) = ( y − y ^ ) 2 = r 2 ⇒ m i n ∑ i = 1 n L ( y − y ^ ) = m i n ∑ i − 1 n r i 2 L(y-\hat{y})=(y-\hat{y})^2=r^2\Rightarrow min\sum_{i=1}^nL(y-\hat{y})=min\sum_{i-1}^nr_i^2 L(y−y^)=(y−y^)2=r2⇒mini=1∑nL(y−y^)=mini−1∑nri2- 优点:处处可导,优化计算方便
- 缺点:对噪声敏感(异常值会被平方放大,影响模型准确性)
- L1损失
L ( y − y ^ ) = ∣ y − y ^ ∣ = ∣ r ∣ L(y-\hat{y})=|y-\hat{y}|=|r| L(y−y^)=∣y−y^∣=∣r∣- 优点:对噪声不敏感(异常值对模型的影响就是绝对值本身,不会被平方放大)
- 缺点:在0处不可导,优化计算不方便
- Huber损失
L δ ( r ) = { 1 2 r 2 , i f ∣ r ∣ ≤ δ δ ∣ r ∣ − 1 2 δ 2 , o t h e r w i s e L_\delta(r)=\begin{cases} \frac 1 2r^2 , &if |r|\le \delta \\ \delta|r|-\frac1 2 \delta^2 , &otherwise\end{cases} Lδ(r)={21r2,δ∣r∣−21δ2,if∣r∣≤δotherwise- 优点:在0处可导,优化计算方便,且对噪声不敏感。
三、python+Scikit-Learn实现
"""
Created on Tue Nov.26 2019
Test-Linear regression by Scikie-Learn
@author:Lihoon
"""
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import HuberRegressor
# 训练数据集:X_train表示学生学习时长,Y_train表示学生的分数
X_train = np.array([6, 7, 7.5, 8, 6.6, 8.1, 6.8, 6.9, 7.3, 6.9])
Y_train = np.array([53, 60, 56, 79, 58, 85, 70, 56, 69, 76])
# 建立特征和标签变量
x_train = X_train.reshape(-1, 1)
y_train = Y_train.reshape(-1, 1)
# 定义测试数据
x_test = np.array([7.2]).reshape(-1, 1)
# linear regression method初始化及训练模型
lr_model = LinearRegression()
lr_model.fit(x_train, y_train)
# Huber regression method初始化及训练模型
hb_model = HuberRegressor()
hb_model.fit(x_train, y_train)
# 输出预测结果
y_pred = lr_model.predict(x_test)
y_pred_huber = hb_model.predict(x_test)
print("result of linear method is: {} ".format(y_pred))
print("result of Huber method is: {} ".format(y_pred_huber))
# plot
plt.plot(x_train, y_train, 'b*')
plt.plot(x_test, y_pred, 'ro')
plt.plot(x_test, y_pred_huber, 'ko')
plt.plot(x_train, lr_model.predict(x_train), color='g')
plt.plot(x_train, hb_model.predict(x_train), color='b')
plt.show()
- 通过线性回归训练,得到的线性回归模型如下图所示,对测试数据7.2,两种方法计算得到的预测值为:
result of linear method is: [[67.30939984]]
result of Huber method is: [67.79339269]