机器学习sklearn-线性回归

目录

基本原理

linear_model.LinearRegression

多重共线性

岭回归

linear_model.Ridge

选择最佳正则化系数

Lasso

Lasso的核心作用:特征选择

选择最佳正则参数


基本原理

 

表达式

机器学习sklearn-线性回归_第1张图片

损失函数 

机器学习sklearn-线性回归_第2张图片

这个损失函数实在计算我们的真实标签和预测值之间的距离。因此,我们认为这个损失函数衡量了我们构造的模型的预测结果和真实标签的差异,因此我们固然希望我们的预测结果和真实值差异越小越好。所以我们的求解目标就可以转化成

我们往往称呼这个式子为SSE Sum of Sqaured Error ,误差平方和)或者 RSS Residual Sum of Squares 残差平方和)。 sklearn 所有官方文档和网页上,我们都称之为 RSS 残差平方。
最小二乘法
现在问题转换成了求解让 RSS 最小化的参数向量 , 这种通过最小化真实值和预测值之间的 RSS 来求解参数的方法叫 做最小二乘法 。求解极值的第一步往往是求解一阶导数并让一阶导数等于 0 ,最小二乘法也不能免俗。因此,我们现在残差平方和RSS 上对参数向量求导。

linear_model.LinearRegression

机器学习sklearn-线性回归_第3张图片

使用sklearn建立简单的逻辑回归模型

from sklearn.linear_model import LinearRegression as LR
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
from sklearn.datasets import fetch_california_housing as fch #加利福尼亚房屋价值数据集
import pandas as pd

house_value=fch()
"""
MedInc:该街区住户的收入中位数
HouseAge:该街区房屋使用年代的中位数
AveRooms:该街区平均的房间数目
AveBedrms:该街区平均的卧室数目
Population:街区人口
AveOccup:平均入住率
Latitude:街区的纬度
Longitude:街区的经度
"""
X=pd.DataFrame(house_value.data)
y=house_value.target
X.columns=house_value.feature_names

Xtrain, Xtest, Ytrain, Ytest = train_test_split(X,y,test_size=0.3,random_state=420)
#恢复索引
for i in [Xtrain, Xtest]:
    i.index = range(i.shape[0])

#建模
reg=LR().fit(Xtrain,Ytrain)
#查看回归系数向量
# print(reg.coef_)
#就回归系数和特征组合起来查看
print([*zip(Xtrain.columns,reg.coef_)])

 绘图查看预测数据和真实数据

机器学习sklearn-线性回归_第4张图片

#回归模型的衡量指标

#均方误差
print(MSE(yhat,Ytest))
#0.5309012639324571

#R^2
print(r2_score(Ytest, yhat))
#0.6043668160178817

plt.plot(range(len(Ytest)),sorted(Ytest),c="black",label= "Data")
plt.plot(range(len(yhat)),sorted(yhat),c="red",label = "Predict")
plt.legend()
plt.show()

多重共线性

多重共线性是一种统计现象,是指线性模型中的特征(解释变量)之间由于存在 精确相关关系或高度相关关系 ,多重共线性的存在会使模型无法建立,或者估计失真。多重共线性使用指标方差膨胀因子(variance inflflation factor, VIF )来进行衡量( from statsmodels.stats.outliers_inflfluence import variance_inflflation_factor ),通常当我们提到“ 共线性 ,都特指多重共线性。
相关性是衡量两个或多个变量一起波动的程度的指标,它可以是正的,负的或者 0 。当我们说变量之间具有相关性,通常是指线性相关性,线性相关一般由皮尔逊相关系数进行衡量,非线性相关可以使用斯皮尔曼相关系数或者互信息法进行衡量。
在现实中特征之间完全独立的情况其实非常少,因为大部分数据统计手段或者收集者并不考虑统计学或者机器学习建模时的需求,现实数据多多少少都会存在一些相关性,极端情况下,甚至还可能出现收集的特征数量比样本数量多的情况。通常来说,这些相关性在机器学习中通常无伤大雅(在统计学中他们可能是比较严重的问题),即便有一些偏差,只要最小二乘法能够求解,我们都有可能会无视掉它。毕竟,想要消除特征的相关性,无论使用怎样的手段,都无法避免进行特征选择,这意味着可用的信息变得更加少,对于机器学习来说,很有可能尽量排除相关性后,模型的整体效果会受到巨大的打击。这种情况下,我们选择不处理相关性,只要结果好,一切万事大吉。
然而多重共线性就不是这样一回事了,它的存在会造成模型极大地偏移,无法模拟数据的全貌,因此这是必须解决的问题。为了保留线性模型计算快速,理解容易的优点,我们并不希望更换成非线性模型,这促使统计学家和机器学习 研究者们钻研出了多种能够处理多重共线性的方法,其中有三种比较常见的:
机器学习sklearn-线性回归_第5张图片

 

这三种手段中,第一种相对耗时耗力,需要较多的人工操作,并且会需要混合各种统计学中的知识和检验来进行使用。在机器学习中,能够使用一种模型解决的问题,我们尽量不用多个模型来解决,如果能够追求结果,我们会尽量避免进行一系列检验。况且,统计学中的检验往往以“ 让特征独立 为目标,与机器学习中的 稍微有点相关性也无妨“ 不太一致。
第二种手段在现实中应用较多,不过由于理论复杂,效果也不是非常高效,因此向前逐步回归不是机器学习的首选。
第三种手段改进线性回归来处理多重共线性是较为常用的方法。为此,一系列算法,岭回归, Lasso,弹性网就被研究出来了。

岭回归

在线性模型之中,除了线性回归之外,最知名的就是岭回归与 Lasso 了。这两个算法非常神秘,他们的原理和应用都不像其他算法那样高调,学习资料也很少。这可能是因为这两个算法不是为了提升模型表现,而是为了修复漏洞 而设计的(实际上,我们使用岭回归或者Lasso ,模型的效果往往会下降一些,因为我们删除了一小部分信息),因此在结果为上的机器学习领域颇有些被冷落的意味。
岭回归,又称为吉洪诺夫正则化( Tikhonov regularization )。通常来说,大部分的机器学习教材会使用代数的形式来展现岭回归的原理,这个原理和逻辑回归及支持向量机非常相似,都是将求解 的过程转化为一个带条件的最优化问题,然后用最小二乘法求解。

linear_model.Ridge

机器学习sklearn-线性回归_第6张图片

 

可以看出,加利佛尼亚数据集上,岭回归的结果轻微上升,随后骤降。可以说,加利佛尼亚房屋价值数据集带有很轻微的一部分共线性,这种共线性被正则化参数α消除后,模型的效果提升了一点点,但是对于整个模型而言是杯水车薪。在过了控制多重共线性的点后,模型的效果飞速下降,显然是正则化的程度太重,挤占了参数w本来的估计空间。从这个结果可以看出,加利佛尼亚数据集的核心问题不在于多重共线性,岭回归不能够提升模型表现。
from sklearn.linear_model import Ridge,LinearRegression,Lasso
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
from sklearn.metrics import r2_score
from sklearn.metrics import mean_squared_error as MSE
from sklearn.datasets import fetch_california_housing as fch #加利福尼亚房屋价值数据集
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

house_value=fch()
X=pd.DataFrame(house_value.data)
y=house_value.target
X.columns=house_value.feature_names

Xtrain, Xtest, Ytrain, Ytest = train_test_split(X,y,test_size=0.3,random_state=420)
#恢复索引
for i in [Xtrain, Xtest]:
    i.index = range(i.shape[0])

#使用岭回归来建模
reg=Ridge(alpha=1).fit(X, y)
print(reg.score(Xtest,Ytest))
#0.6054283217593106
#结果和线性回归差不多
#说明该数据不存在明显多重共线性

#绘制曲线观察α对岭回归的影响,并和线性回归对比
#交叉验证下,与线性回归相比,岭回归的结果如何变化?
alpharange = np.arange(1,1001,100)
ridge, lr = [], []
for alpha in alpharange:
     reg = Ridge(alpha=alpha)
     linear = LinearRegression()
     regs = cross_val_score(reg,X,y,cv=5,scoring = "r2").mean()
     linears = cross_val_score(linear,X,y,cv=5,scoring = "r2").mean()
     ridge.append(regs)
     lr.append(linears)
plt.plot(alpharange,ridge,color="red",label="Ridge")
plt.plot(alpharange,lr,color="orange",label="LR")
plt.title("Mean")
plt.legend()
plt.show()

选择最佳正则化系数

我们一般使用交叉验证来选择最佳的正则化系数, sklearn 中,我们有带交叉验证的岭回归可以使用,我们来 看一看:

 

机器学习sklearn-线性回归_第7张图片

Lasso

除了岭回归之外,最常被人们提到还有模型 Lasso Lasso 全称最小绝对收缩和选择算子( least absolute shrinkage and selection operator),由于这个名字过于复杂所以简称为 Lasso 。和岭回归一样, Lasso 是被创造来作用于多重共线性问题的算法,不过Lasso 使用的是系数 的 L1 范式( L1 范式则是系数 的绝对值)乘以正则化系数 ,所以Lasso的损失函数表达式为:

 岭回归可以解决特征间的精确相关关系导致的最小二乘法无法使用的问题,而Lasso不行。

Lasso不是从根本上解决多重共线性问题,而是限制多重共线性带来的影响。

Lasso的核心作用:特征选择

sklearn 中我们使用类 Lasso 来调用 lasso 回归,众多参数中我们需要比较在意的就是参数 ,正则化系数。另外需要注 意的就是参数positive 。当这个参数为 "True" 的时候,是我们要求 Lasso 回归出的系数必须为正数,以此来保证我们的 α一定以增大来控制正则化的程度。

选择最佳正则参数

机器学习sklearn-线性回归_第8张图片 

机器学习sklearn-线性回归_第9张图片 

 

你可能感兴趣的:(机器学习,sklearn,线性回归)