线性回归
【关键词】最小二乘法,线性
1、线性方程
标签数据y和一个特征x成线性关系,则x和y可以表示为如下表达式:
y = w*x + b 其中w和b都是常数,w叫做斜率,b叫做截距
标签数据 y和两个特征x1、x2都成线性关系,则y与x1、x2的关系表达式为:
y = w1x1 +w2x2 + b
令W = (w1,w2),令X=(x1,x2),此时W和X分别称为系数向量和特征向量,y和特征向量X的关系可以表示成
y = W*XT+ b ,在这个方程中W称为系数向量或者权重,X称为特征向量,b为截距
标签y和n个特征x1、x2…、xn都成线性关系,则y与x1、x2、…、xn的关系表达式为:y = w1x1 + w2x2+…+wn*xn + b
令W = (w1,w2,…,wn),X=(x1,x2,…,xn)
则标签y与特征向量X的关系可以表示为
y = W*XT+ b
2、样本带入
现在有一个样本,特征向量为X1 = (x1_1,x1_2,…,x1_n) ,标签为y1,如果y1和X1成线性关系,则有y1 = W*X1T+b
如果现在有m个样本每个样本n个特征,特征向量分别为X1、X1、…、Xm ,且这m个样本的标签分别为y1、y2、…、ym 而且每个标签都和特征向量乘线性关系,则有以下方程:
y1 =WX1 T+ b = w1x1_1 + w2x1_2+ … +wnx1_n + b
y2 =WX2T + b = w1x12_1 + w2x2_2+ … +wnx2_n + b
…
ym =WXmT + b = w1xm_1 + w2xm_2+ … +wnxm_n + b
以上m个方程构成一个方程组,这个方程组中常数为b,已知数y1-ym和X1-Xm,未知数是W,即w1-wm此时这个方程组就是n元一次方程组,现在线性回归目的就是要得到一个线性方程,如果我们得到W这个参数就得到这个方程,即得到了整个线性回归模型
讨论上面的m个方构成的n元一次方程组的解的情况:
当m==n的时候,即样本数量和特征数量相等的时候,方程组有且只有一个解,即线性回归模型有且只有一个W系数向量符合要求
当m<n的时候,即样本数量少于特征数量的时候,方程组有无数个解,即线性回归模型有无数个W系数向量符合要求
当m>n的时候,即样本数量多于特征数量的时候,方程组无解,即线性回归模型找不到合适的W系数向量符合要求
在实际情况中m>>n这种情况非常多的,方程组无解
但是现在要用m个样本训练处这n个回归系数(即回归系数向量W),带入以后肯定无解,即没有完全满足的W系数;如何来推导W的值?
没有完美的W,只能推导最合适的W,即找到一个系数向量W可以尽可能多的满足样本特征向量和标签的对应?
最小二乘法可以解决这个问题
3、算法的推导过程–最小二乘法
最小二乘法的步骤:
1)假设现有最合适的回归系数为W’,则有假设的回归方程为:y’ = W’*XT
2)把所有的m个已知样本的特征向量带入假设的回归方程中
y1’=W’X1T = w1x1_1+w2*x1_2 + …+wnx1_n
y2’=W’*X2T =…
…
Ym’ = W’*XmT = …
此时我们就有假设的方程得到了假设出来的标签y1’、y2、…、ym’这些标签都和W’有关,这些标签和真实的y1、y2、…、ym之间必然存在差别
3)计算y1’、y2’、…ym’和y1、y2、…、ym之间的差异
H = (y1-y1’)2
+ (y2-y2’)2 + … + (ym-ym’)2
把此时y1、y2…ym都是已知,y1’、y2’、…ym’可以通过W’来表示出来,则H就可以表示为:
H=(y1-W’*X1T)2 + (y2-W’*X2T)2+ … + (ym - W’*XmT)2
= (y12 - 2y1W’X1T+ (W’X1T)2) +… + (ym2 - 2ym*W’XmT+ (W’*XmT)2)
= [y12 + …+ym2]-2*[y1W’X1T + …+ymW’XmT] + [(W’*X1T)2+ … (W’*XmT)2]
H方程也称为损失函数
4)求损失函数H的最小值
H的最小值求法:
对H求导数
H’ = -2(y1X1T + … + ymXmT) + 2(W’X1TX1 + …+W’XmTXm)
令Y=(y1,y2,…,ym),X=(X1T,X2T,…,XmT)则
H’ = -2YXT + 2W’XTX
令H’ = 0的
W’XTX = YXT
当XTX这个矩阵可逆的时候可以得到
|XTX| != 0的时候可逆,即矩阵满秩的情况下(当m<n的时候矩阵不满秩,当m>n的时候矩阵满秩)
W’ = (XTX)-1YXT
4、欠拟合与过拟合的优化(模型的正则化)过拟合可引入λ进行惩罚,欠拟合不能使用λ来进行惩罚
在样本量非常小的情况下极易造成过拟合
在线性回归模型中引入正则化系数就可以减小过拟合
L1正则化:
线性回归的最小二乘法的损失函数:
J(W) = (y1-y1’)2+ (y2-y2’)2 +…+(ym-ym’)2
记为:MES(W)
L1正则化就是样在这个损失函数上面引入回归系数的一阶范数作为惩罚项
W =(w1,w2,…,wn)
一阶范数:(|w1|+|w2|+|w3|+…+|wn|)
引入以后损失函数会变成:
L(w) = J(W) + λ(|w1|+|w2|+|w3|+…+|wn|)
此时影响L(W)取值的除了已知那些样本以外,还有λ
引入一阶范数的作为惩罚项的回归优化算法我们称为Lasso回归
L2正则化:
J(W) = (y1-y1’)2+ (y2-y2’)2 + … + (ym-ym’)2
引入回归系数向量的二阶范数:(w12 + w22 + … + wn2)
L(W) = J(W) + λ(w12 + w22 + … + wn2)
L(W)’ = 0
==>
W = (XTX+ λI)-1YXT 其中I代表单位矩阵
此时引入了二阶范数的优化算法称为:岭回归,即Ridge回归
一、普通线性回归
1、原理
分类的目标变量是标称型数据,而回归将会对连续型的数据做出预测。
应当怎样从一大堆数据里求出回归方程呢?
假定输人数据存放在矩阵X中,而回归系数存放在向量W中。那么对于给定的数据X1, 预测结果将会通过
Y=X*W
给出。现在的问题是,手里有一些X和对应的Y,怎样才能找到W呢?
一个常用的方法就是找出使误差最小的W。这里的误差是指预测Y值和真实Y值之间的差值,使用该误差的简单累加将使得正差值和负差值相互抵消,所以我
们采用平方误差。
最小二乘法
平方误差可以写做:
对W求导,当导数为零时,平方误差最小,此时W等于:
例如有下面一张图片:
求回归曲线,得到:
2、实例
from sklearn.linear_model import LinearRegression
from sklearn import datasets
diabetes = datasets.load_diabetes()
diabetes
{'DESCR': '.. _diabetes_dataset:\n\nDiabetes dataset\n----------------\n\nTen baseline variables, age, sex, body mass index, average blood\npressure, and six blood serum measurements were obtained for each of n =\n442 diabetes patients, as well as the response of interest, a\nquantitative measure of disease progression one year after baseline.\n\n**Data Set Characteristics:**\n\n :Number of Instances: 442\n\n :Number of Attributes: First 10 columns are numeric predictive values\n\n :Target: Column 11 is a quantitative measure of disease progression one year after baseline\n\n :Attribute Information:\n - Age\n - Sex\n - Body mass index\n - Average blood pressure\n - S1\n - S2\n - S3\n - S4\n - S5\n - S6\n\nNote: Each of these 10 feature variables have been mean centered and scaled by the standard deviation times `n_samples` (i.e. the sum of squares of each column totals 1).\n\nSource URL:\nhttp://www4.stat.ncsu.edu/~boos/var.select/diabetes.html\n\nFor more information see:\nBradley Efron, Trevor Hastie, Iain Johnstone and Robert Tibshirani (2004) "Least Angle Regression," Annals of Statistics (with discussion), 407-499.\n(http://web.stanford.edu/~hastie/Papers/LARS/LeastAngle_2002.pdf)',
'data': array([[ 0.03807591, 0.05068012, 0.06169621, ..., -0.00259226,
0.01990842, -0.01764613],
[-0.00188202, -0.04464164, -0.05147406, ..., -0.03949338,
-0.06832974, -0.09220405],
[ 0.08529891, 0.05068012, 0.04445121, ..., -0.00259226,
0.00286377, -0.02593034],
...,
[ 0.04170844, 0.05068012, -0.01590626, ..., -0.01107952,
-0.04687948, 0.01549073],
[-0.04547248, -0.04464164, 0.03906215, ..., 0.02655962,
0.04452837, -0.02593034],
[-0.04547248, -0.04464164, -0.0730303 , ..., -0.03949338,
-0.00421986, 0.00306441]]),
'data_filename': 'C:\\Anaconda3\\lib\\site-packages\\sklearn\\datasets\\data\\diabetes_data.csv.gz',
'feature_names': ['age',
'sex',
'bmi',
'bp',
's1',
's2',
's3',
's4',
's5',
's6'],
'target': array([151., 75., 141., 206., 135., 97., 138., 63., 110., 310., 101.,
69., 179., 185., 118., 171., 166., 144., 97., 168., 68., 49.,
68., 245., 184., 202., 137., 85., 131., 283., 129., 59., 341.,
87., 65., 102., 265., 276., 252., 90., 100., 55., 61., 92.,
259., 53., 190., 142., 75., 142., 155., 225., 59., 104., 182.,
128., 52., 37., 170., 170., 61., 144., 52., 128., 71., 163.,
150., 97., 160., 178., 48., 270., 202., 111., 85., 42., 170.,
200., 252., 113., 143., 51., 52., 210., 65., 141., 55., 134.,
42., 111., 98., 164., 48., 96., 90., 162., 150., 279., 92.,
83., 128., 102., 302., 198., 95., 53., 134., 144., 232., 81.,
104., 59., 246., 297., 258., 229., 275., 281., 179., 200., 200.,
173., 180., 84., 121., 161., 99., 109., 115., 268., 274., 158.,
107., 83., 103., 272., 85., 280., 336., 281., 118., 317., 235.,
60., 174., 259., 178., 128., 96., 126., 288., 88., 292., 71.,
197., 186., 25., 84., 96., 195., 53., 217., 172., 131., 214.,
59., 70., 220., 268., 152., 47., 74., 295., 101., 151., 127.,
237., 225., 81., 151., 107., 64., 138., 185., 265., 101., 137.,
143., 141., 79., 292., 178., 91., 116., 86., 122., 72., 129.,
142., 90., 158., 39., 196., 222., 277., 99., 196., 202., 155.,
77., 191., 70., 73., 49., 65., 263., 248., 296., 214., 185.,
78., 93., 252., 150., 77., 208., 77., 108., 160., 53., 220.,
154., 259., 90., 246., 124., 67., 72., 257., 262., 275., 177.,
71., 47., 187., 125., 78., 51., 258., 215., 303., 243., 91.,
150., 310., 153., 346., 63., 89., 50., 39., 103., 308., 116.,
145., 74., 45., 115., 264., 87., 202., 127., 182., 241., 66.,
94., 283., 64., 102., 200., 265., 94., 230., 181., 156., 233.,
60., 219., 80., 68., 332., 248., 84., 200., 55., 85., 89.,
31., 129., 83., 275., 65., 198., 236., 253., 124., 44., 172.,
114., 142., 109., 180., 144., 163., 147., 97., 220., 190., 109.,
191., 122., 230., 242., 248., 249., 192., 131., 237., 78., 135.,
244., 199., 270., 164., 72., 96., 306., 91., 214., 95., 216.,
263., 178., 113., 200., 139., 139., 88., 148., 88., 243., 71.,
77., 109., 272., 60., 54., 221., 90., 311., 281., 182., 321.,
58., 262., 206., 233., 242., 123., 167., 63., 197., 71., 168.,
140., 217., 121., 235., 245., 40., 52., 104., 132., 88., 69.,
219., 72., 201., 110., 51., 277., 63., 118., 69., 273., 258.,
43., 198., 242., 232., 175., 93., 168., 275., 293., 281., 72.,
140., 189., 181., 209., 136., 261., 113., 131., 174., 257., 55.,
84., 42., 146., 212., 233., 91., 111., 152., 120., 67., 310.,
94., 183., 66., 173., 72., 49., 64., 48., 178., 104., 132.,
220., 57.]),
'target_filename': 'C:\\Anaconda3\\lib\\site-packages\\sklearn\\datasets\\data\\diabetes_target.csv.gz'}
data = diabetes.data
target = diabetes.target
data.shape
(442, 10)
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(data,target,test_size=0.2)
# 创建线性回归模型
lr = LinearRegression()
lr
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None,
normalize=False)
# 训练
lr.fit(x_train,y_train)
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None,
normalize=False)
x_train.shape
(353, 10)
x_train[0]
array([-0.08906294, -0.04464164, -0.01159501, -0.03665645, 0.01219057,
0.02499059, -0.03603757, 0.03430886, 0.02269202, -0.00936191])
训练过程:
1)假设一个回归系数W=(w1,w2,…,w10),得到回归方程y=W*X^T
2)将x_train的样本特征带入到回归方程中得到:
y1’ = w1x1_1 + w2x1_2 + … + w10x1_10
y2’ = w1x2_1 + w2x2_2 + … + w10x2_10
…
y352’ = w1x353_1 + w2x353_2 + … + w10*x353_10
3)求y1’、y2’…y353’和y1、y2…y353之间的差异
H = (y1’-y1)^2 + (y2’-y2)^2 + … + (y353’-y353)
=(y1-(w1x1_1 + w2x1_2 + … + w10x1_10))^2 + …+(y353-(w1x353_1 + w2x353_2 + … + w10x353_10))
4)对H求导数,得到最合适的W
# 经过上面的训练以后,得到了线性回归模型lr,lr实际上就是一个线性方程
y_ = lr.predict(x_test)
y_,y_test
(array([154.89352865, 117.66145264, 115.39462132, 263.02148887,
146.79323278, 205.27899278, 247.24868683, 76.58650704,
103.58635735, 169.200138 , 149.83791791, 88.43928491,
155.3842227 , 151.68579974, 214.49443703, 126.54484392,
61.81803479, 193.60691532, 170.24744126, 77.51329315,
134.56098579, 116.34830106, 84.36518853, 234.46506385,
137.48484809, 167.10021854, 165.62819288, 109.71417742,
266.77751244, 61.59933921, 165.79555251, 162.36833465,
169.75759087, 104.94767529, 160.20086893, 96.36430463,
136.63919961, 120.21130918, 185.75507159, 49.03023118,
117.14303835, 257.71458883, 82.94732875, 98.37461205,
52.68519927, 137.12229317, 162.51850782, 106.44530913,
119.06175181, 174.46433491, 179.28787779, 91.51218134,
259.66893177, 223.02673926, 165.98102707, 233.3523202 ,
159.51666131, 145.11491916, 155.7050318 , 170.46016154,
130.9758386 , 194.49753158, 167.88700093, 171.45787869,
118.96031811, 151.68601288, 75.22126957, 196.85985685,
290.20423187, 129.89394565, 140.30786115, 235.54147671,
162.24369658, 233.33357054, 124.80124842, 179.57583407,
196.42418401, 145.21897625, 77.74533059, 229.74545767,
186.99733822, 231.66435237, 76.34429234, 52.15053722,
256.88257267, 101.1362802 , 230.63949963, 188.43220532,
231.67447417]),
array([100., 71., 88., 310., 182., 288., 341., 65., 88., 121., 219.,
64., 131., 202., 259., 144., 43., 292., 277., 104., 214., 253.,
69., 236., 170., 151., 77., 111., 303., 99., 206., 120., 91.,
199., 127., 47., 59., 178., 129., 78., 68., 275., 60., 81.,
90., 50., 109., 89., 66., 258., 217., 84., 310., 225., 151.,
99., 94., 103., 141., 244., 148., 191., 122., 311., 145., 95.,
158., 137., 270., 42., 90., 152., 129., 280., 68., 126., 281.,
142., 55., 208., 90., 128., 134., 72., 132., 84., 275., 67.,
321.]))
检测性能
经验误差
y_t = lr.predict(x_train)
from sklearn.metrics import mean_absolute_error,mean_squared_error
print("经验数据的平均绝对误差:",mean_absolute_error(y_pred=y_t,y_true=y_train))
print("经验数据的均方误差:",mean_squared_error(y_pred=y_t,y_true=y_train))
经验数据的平均绝对误差: 41.49930369562525
经验数据的均方误差: 2670.0577236867643
泛化误差
print("泛化平均绝对误差:",mean_absolute_error(y_pred=y_,y_true=y_test))
print("泛化军方误差:",mean_squared_error(y_pred=y_,y_true=y_test))
泛化平均绝对误差: 50.5681075027226
泛化军方误差: 3690.850980625107
关于过拟合与欠拟合
拟合,所谓拟合指的就是机器学习过程中,更新参数,使得模性不断的契合训练集的过程
# 构造一些训练集
x_train = [[6],[8],[10],[14],[18]]
y_train = [[7],[9],[13],[17.5],[18]]
使用1次多项式进行模型训练拟合
# 创建线性回归模型
lgr = LinearRegression()
lgr.fit(x_train,y_train)
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None,
normalize=False)
import numpy as np
xx = np.linspace(0,26,100).reshape((100,1))
# 预测xx对应的标签
yy = lgr.predict(xx)
import matplotlib.pyplot as plt
%matplotlib inline
plt.axis([0,25,0,25])
plt.scatter(x_train,y_train)
plt.plot(xx,yy,c="r")
[<matplotlib.lines.Line2D at 0x21aa54c47f0>]
print("线性回归的准确率:",lgr.score(x_train,y_train))
线性回归的准确率: 0.9100015