查看原文
其他

基于广义线性模型的机器学习算法——线性回归

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:王   歌

文字编辑:孙晓玲

技术总编:张   邯

导读

前面我们讲到的KNN算法、朴素贝叶斯算法都是用于分类的算法,决策树则既可用于回归也可用于分类,我们今天开始要介绍的线性回归则是只用于回归的算法。

1  算法原理

线性回归作为机器学习的一种算法,与我们在计量里面的多元回归是类似的。其理论模型为:

为使模型达到更好的拟合效果,通常使用最小二乘法对和b进行估计,也就是要使估计值f(x)与真实值y的均方误差最小,即:

由此对w求导后令其为0就可以得到w的估计值,进而求出b的估计值。

当然,在样本量较大时,对于此类凸优化问题,我们也可以使用随机梯度下降法(SGD)来求解。该方法是由批量梯度下降法(BGD)发展而来的。在微积分里面,对多元函数的参数求∂偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度。对于损失函数:

其中,m代表每次取多少样本进行训练,,通过迭代收敛到符合条件的最优值。批量梯度下降法是指在每一次迭代时使用所有样本来更新梯度,即在对θ求偏导并进行更新时m取值与样本量相等。但由于样本数目m很大时,每迭代一步都需要对所有样本计算,训练过程会很慢,因此提出随机梯度下降法,它是在每次迭代中使用一个样本来对参数进行更新,使得训练速度加快,即m=1。但有时由于随机梯度下降法一次迭代一个样本,使得并不是每次迭代都向着整体最优化方向,因此提出了一个折中的小批量梯度下降法(MBGD),它是每次从样本中随机抽取一小批进行训练,而不是一组。这种方法下m的选择就对结果有很大影响了。

总的来说,线性回归的算法具有容易实现、快速建模的优点,对于数据量不大的情况很有效,但由于它假设变量之间不相关,因此当变量间具有相关性时会对结果有较大影响,并且传统的最小二乘法虽然计算速度很快,但是如果样本量很大时求解难度会增大,速度也会变慢,这时使用迭代的梯度下降法就比较有优势。

2  算法实例

本文我们还是以最小二乘法为主要的求解方式,对梯度下降法的使用方法我们会在后面具体介绍。在此之前,我们先来看看我们要使用到的类——LogisticRegression(),它对模型的估计时使用最小二乘的方法,其中主要有以下几个参数:

(1)fit_intercept表示是否计算该模型的截距,默认为True;

(2)normalize表示是否对数据进行标准化处理,默认为False,当fit_intercept设置为False的时候,这个参数会被自动忽略;

(3)n_jobs:表示使用CPU的个数,默认为1,当取-1时,代表使用全部CPU;

(4)copy_X:默认True,当取False时表示用标准化后的数据覆盖原数据。

这次我们使用的数据是sklearn中自带的波士顿房价的数据,该数据共506个样本,有13个输入变量和一个输出变量,可以用来拟合多元回归模型。我们首先导入数据来看一下这个数据中的变量特征,程序如下:

from sklearn.datasets import load_bostonboston_sample = load_boston()print(boston_sample.DESCR)  #对数据集的介绍

结果中关于变量的部分介绍如下:

从上面我们可以看到每个变量的含义,并且所有变量均没有缺失值。然后我们对数据集进行切分并LogisticRegression()对模型进行拟合,程序如下:

from sklearn.model_selection import train_test_splitfrom sklearn.linear_model import LinearRegressionx_train, x_test, y_train, y_test = train_test_split( boston_sample.data, boston_sample.target, test_size=0.25, random_state=123)lrclf = LinearRegression()lrclf.fit(x_train, y_train)print(lrclf.coef_, lrclf.intercept_)  # 打印回归系数、截距项

运行结果如下:

通过调用LinearRegression的属性coef_和intercept_,就可以得到回归模型的系数和截距项。最后我们用该模型进行预测,同时计算测试集的准确度、r2值以及均方误差,程序如下:

from sklearn.metrics import mean_squared_error,r2_scorey = lrclf.predict(x_test)print('准确度为:', lrclf.score(x_test, y_test))print('r2为:', r2_score(y_test, y))print('均方误差为:', mean_squared_error(y_test, y))

结果如下:

LinearRegression并没有计算均方误差的方法,只有score方法,因此这里我们使用了sklearn中的metrics来计算模型的拟合优度和均方误差,可以看到LinearRegression自带的score方法和直接计算的r2_score是一样的,两者得到的都是模型的拟合优度。这里我们没有对变量进行标准化,大家也可以对其进行标准化以后再拟合模型;同时我们也并没有对变量进行筛选就直接拟合了模型,当然也可以先判断变量间的相关性以后再进行拟合。大家可以在此例的基础上多做尝试,熟练应用。







对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐
听说你会魔法?
dummieslab——从分类变量到虚拟变量的“一步之遥”
线上Python课程都面向哪些方向?
子类与父类
用requests库爬取淘宝数据
WordStat—Stata的文本分析小助手
数据筛选理还乱,datacheck能诊断

如何用简单的手法绘制出不一样的海外疫情趋势图

matplotlib绘制数学函数
gen的再进化
Stata版大家来找茬—cfout就够了
另辟蹊径js逆向爬取百度翻译
可迭代对象、迭代器、生成器傻傻分不清楚
Ftools命令组之fegen命令介绍
提升效率的利器——如何用labvarch批量修改变量标签
二进制序列类型——bytes()、bytearray()
今日头条海外疫情数据爬取

关于我们



微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata和python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存