线性回归(LinearRegression)是机器学习中最简单的回归算法,多元线性回归指的就是一个样本有多个特征的线性回归问题。对于一个有个特征的样本而言,它的回归方程:
其中,为模的参数,为截距(intercept);为回归系数(regressioncoefficient);是目标变量,即标签;是样本上的不同特征。
可以使用矩阵来表示这个方程,其中可以被看做是一个结构为的列矩阵,是一个结构为的特征矩阵,则有:
简写为:
在19世纪的英国,有一位著名的生物学家高尔顿,在研究父母和孩子身高的遗传关系时,发现了一个直线方程,通过这个方程,他几乎准确地拟合了被调查父母的平均身高和子女平均身高之前的关系:y=3.78+0.516x。它代表父母身高每增加1个单位,其成年子女的平均身高只增加0.516个单位,反映了一种"衰退"效应("回归"到正常人平均身高)。虽然之后的与变量之间并不总是具有"衰退"(回归)关系,但是为了纪念高尔顿这位伟大的统计学家,"线性回归"这一名称就保留了下来。
一般情况误差有正有负,如果直接对求和,则会出现正负抵消的情况,反映不出整体误差情况。如果使用平方和,不仅可以避免正负抵消的缺陷,而且整体的误差分布不变,所以一般使用平方和做损失函数。
其中是样本对应的真实标签,(即)是样本在一组参数下的预测标签。
由于每个样本的数据里存在较大差异,为了消除样本间差异的影响,使用最小化均方误差MSE拟合,并得到损失函数。
其中是为了求导计算的便利,而是将损失平均化,消除样本量m带来的影响。
误差中,误差是独立同分布的,并且服从的高斯分布。其表达式为
由于误差服从均值,方差为的高斯分布
从式中可以看出,误差越小,概率越大,说明预测值与真实值越接近。
因线性回归模型是一条直线(或超平面)拟合多个点,所以需要满足所有误差取得最小值,即所有概率的乘积最大化,符合似然函数
式中第一项为定值,因此需要第二项最小化,于是得到损失函数
同样乘以一个以消除样本量带来的影响,将损失平均化。
损失函数衡量了所构造的模型的预测结果和真实标签的差异,希望预测结果和真实值差异越小越好,即求解目标函数可以转化为
其中右下角的2表示向量的L2范式,称其为SSE(SumofSqauredError,误差平方和)或者RSS(ResidualSumofSquares残差平方和)。
通过最小化真实值和预测值之间的RSS来求解参数的方法叫做最小二乘法。
令(2)求导后一阶导数为0:
在这里可以看出,注意到是一个矩阵乘以它自身的转置,得到的是一个实对称的方阵。如果它是可逆的,则等式左右两边同乘,从而得到。因此,逆矩阵存在的充分必要条件是特征矩阵不存在多重共线性。下篇会详细介绍多重共线性问题及解决。
前面使用最小二乘法求出使得损失函数最小化的参数,而实际问题中常使用梯度下降法。首先,最小二乘法是通过平方损失函数建立模型优化目标函数的一种思路,求解最优模型过程便具体化为最优化目标函数的过程;而梯度下降法是最优化目标函数的一种优化算法,具体求解使得目标函数能达到最优或者近似最优的参数集。再者,实际问题中不是满秩矩阵,不可逆,最小二乘法无法解决,而梯度下降法可以。如果维度多、样本多,即便有逆矩阵,计算机求解的速度也会很慢。
损失函数为凸函数,其表达式
对参数求导
将上述梯度带入随机梯度下降公式
这个式子中,
矩阵和
向量都是已知的,步长是人为设定的一个值,只有参数
是未知的,而每一步的
是由
决定的,也就是每一步的点坐标。
算法过程1,初始化
向量的值,即
,将其带入
得到当前位置的梯度;2,当前梯度乘以步长
,得到从当前位置下降的距离;3,更新得到新表达式
4,重复以上步骤,直到更新到
,直至触发停止条件,即得到目标函数能达到最优或者近似最优的参数向量。
梯度下降不一定能够找到全局的最优解,有可能是一个局部最优解。当然,如果损失函数是凸函数,梯度下降法得到的解就一定是全局最优解。
fromsklearn.linear_modelimportLinearRegressionLinearRegression(fit_intercept=True,normalize=False,copy_X=True,n_jobs=1)普通最小二乘线性回归。线性回归拟合系数为w=(w1,…,wp)的线性模型,以最小化数据集中观察到的目标和通过线性逼近预测的目标之间的残差平方和。
fit_intercept:boolean,optional,defaultTrue是否计算此模型的截距。如果设置为False,则不会计算截距。normalize:boolean,optional,defaultFalse当fit_intercept设置为False时,将忽略此参数。如果为True,则特征矩阵X在进入回归之前将会被减去均值(中心化)并除以L2范式(缩放)。如果你希望进行标准化,请在fit数据之前使用preprocessing模块中的标准化专用类StandardScaler。copy_X:boolean,optional,defaultTrue如果为真,将在X.copy()上进行操作,否则的话原本的特征矩阵X可能被线性回归影响并覆盖。n_jobs:int,optional,default1用于计算的作业数。只在多标签的回归和数据量足够大的时候才生效。除非None在joblib.parallel_backend上下文中,否则None统一表示为1。如果输入-1,则表示使用全部的CPU来进行计算。
从参数可以看出,其参数较少,仅有四个参数就可以完成一个完整的算法。线性回归模型简单,其性能取决于数据本身,而非调参好坏。虽然线性回归对数据有着很高的要求,但大部分连续型变量之间,都存在着或多或少的联系。因此,在合适的数据集下,线性回归简单而强大。
coef_:arrayofshape(n_features,)or(n_targets,n_features)数组,形状为(n_features,)或者(n_targets,n_features)线性回归方程中估计出的系数。如果在fit中传递多个标签(当y为二维或以上的时候),则返回的系数是形状为(n_targets,n_features)的二维数组,而如果仅传递一个标签,则返回的系数是长度为n_features的一维数组。intercept_:floatorarrayofshape(n_targets,)数组,线性回归中的截距项。
>>>importnumpyasnp>>>fromsklearn.linear_modelimportLinearRegression>>>X=np.array([[1,1],[1,2],[2,2],[2,3]])>>>#y=1x_0+2x_1+3>>>y=np.dot(X,np.array([1,2]))+3>>>reg=LinearRegression().fit(X,y)>>>reg.score(X,y)1.0>>>reg.coef_array([1.,2.])>>>reg.intercept_3.0000...>>>reg.predict(np.array([[3,5]]))array([16.])评估指标回归类算法的模型评估与分类型算法的模型评估其实是相似的法则——找真实标签和预测值的差异。在分类型算法中,评判否预测到了正确的分类,而在我们的回归类算法中,评判是否预测到了正确的数值、以及是否拟合到了足够的信息。
----是否预测了正确的数值
sklearn中使用RSS的变体,均方误差MSE(meansquarederror)来衡量我们的预测值和真实值的差异:
在sklearn当中,我们有两种方式调用这个评估指标,一种是使用sklearn专用的模型评估模块metrics里的类mean_squared_error,另一种是调用交叉验证的类cross_val_score并使用里面的scoring参数来设置使用均方误差。
这里注意scoring="neg_mean_squared_error",均方误差为负是因为sklearn在计算模型评估指标的时,认为均方误差本身是一种误差,是模型的一种损失(loss)。在sklearn当中,所有的损失都使用负数表示,因此均方误差也被显示为负数了。
RMSE为MSE的算术平方根
缺点:因使用平均误差,平均误差对异常值比较敏感,异常值的出现,使得RMSE的误差较大。
----是否拟合了足够的信息
方差的本质是任意一个值和样本均值的差异,差异越大,这些值所带的信息越多。由此可以用来衡量数据上的信息量。如果方差越大,代表数据上的信息量越多,而这个信息量不仅包括了数值的大小,还包括了希望模型捕捉的那些规律。为衡量模型对数据上的信息量的捕捉而生。
总平方和(SST)=回归平方和(SSR)+残差平方和(SSE)
其中,为真实标签,为预测结果,为样本均值。比样本量即为样本方差。
数学理解:1,衡量的是1-模型没有拟合到的信息占真实标签中所带的信息量。2,分母理解为原始数据的离散程度,方差,即真实标签所带的信息量。3,分子为预测数据和原始数据的误差,残差平方和模型没有拟合到的信息。4,两者相除可以消除原始数据离散程度的影响。
理论上取值(∞,1],正常取值范围为[0,1]
缺点:
可以使用三种方式来调用,一是从metrics中导入r2_score,输入预测值和真实值后打分。第二是从线性回归LinearRegression的接口score来进行调用。第三是在交叉验证中,输入scoring="r2"来调用。
在这种技术中,因变量是连续的,自变量可以是连续的也可以是离散的,回归线的性质是线性的。
SSE(RSS)
——残差平方和,模型中没有拟合到的信息
——代表了模型中的全部信息
>>>#采用标准化之后的数据进行建模>>>lr2=LinearRegression()>>>lr2.fit(X_train_std,y_train)>>>lr2.score(X_train_std,y_train)>>>lr2.score(X_test_std,y_test)>>>y_train_std_pre=lr2.predict(X_train_std)>>>y_test_std_pre=lr2.predict(X_test_std)>>>y_train_predarray([2.17567626,2.13052503,1.17965784,...,1.00437331,1.57254239,1.47268172])>>>y_train_std_prearray([2.17567626,2.13052503,1.17965784,...,1.00437331,1.57254239,1.47268172])标准化前后模型系数对比,因为消除量纲对模型的影响,因此标准化后的系数更加可信。