基于广义线性模型的机器学习算法——线性回归
本文作者:王 歌
文字编辑:孙晓玲
导读
前面我们讲到的KNN算法、朴素贝叶斯算法都是用于分类的算法,决策树则既可用于回归也可用于分类,我们今天开始要介绍的线性回归则是只用于回归的算法。
1 算法原理
线性回归作为机器学习的一种算法,与我们在计量里面的多元回归是类似的。其理论模型为:
为使模型达到更好的拟合效果,通常使用最小二乘法对
由此对w求导后令其为0就可以得到w的估计值,进而求出b的估计值。
当然,在样本量较大时,对于此类凸优化问题,我们也可以使用随机梯度下降法(SGD)来求解。该方法是由批量梯度下降法(BGD)发展而来的。在微积分里面,对多元函数的参数求∂偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度。对于损失函数:
其中,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_boston
boston_sample = load_boston()
print(boston_sample.DESCR) #对数据集的介绍
结果中关于变量的部分介绍如下:
从上面我们可以看到每个变量的含义,并且所有变量均没有缺失值。然后我们对数据集进行切分并LogisticRegression()对模型进行拟合,程序如下:
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
x_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_score
y = 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是一样的,两者得到的都是模型的拟合优度。这里我们没有对变量进行标准化,大家也可以对其进行标准化以后再拟合模型;同时我们也并没有对变量进行筛选就直接拟合了模型,当然也可以先判断变量间的相关性以后再进行拟合。大家可以在此例的基础上多做尝试,熟练应用。
关于我们
微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。