300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 机器学习线性回归——概念梳理及非线性拟合

机器学习线性回归——概念梳理及非线性拟合

时间:2020-12-05 01:49:50

相关推荐

机器学习线性回归——概念梳理及非线性拟合

活动地址:CSDN21天学习挑战赛

在学术研究和工程实践中,线性回归的概念广为人知。虽然线性回归模型简单,但却涵盖了机器学习中相当多的内容,在某些场景,线性回归模型是十分有效的,即使在非线性的场合,借助核函数的思想,线性回归也能胜任。其充分体现了奥卡姆剃刀原理:如无必要,勿增实体。正所谓大道至简。

本文总结了学习线性回归时的一些记录,同时也对线性回归的概念做了一些梳理

从最大似然估计理解线性回归

在解决实际问题时,很多随机现象可以看做众多因素独立作用的综合反应,这类随机现象往往近似服从正态分布。

回到线性回归中,最初,我们使用预测结果与真实结果之间的距离来定义目标函数,通过使目标函数最小,来得到最优的回归系数。

另一方面,我们假设预测结果与真实结果之间的误差是独立同分布的,服从均值为0的高斯分布,通过最大似然估计的方法,同样也可以得到类似通过距离定义的目标函数,同样通过使目标函数最小,来得到最优的回归系数。

三种梯度下降的策略

在求解上面定义的目标函数最小值的过程中,我们可以使用直接法或梯度下降法,直接法要求损失函数有解析解,而梯度下降算法对目标函数的要求较低,在应用中则更为普遍。

而在梯度下降法中,根据实际情况,有三种策略:

1、 批量梯度下降

根据所有样本的平均梯度更新回归系数

2、 随机梯度下降

每拿到一个样本,就根据其梯度更新回归系数

3、 mini-batch

每次根据若干个而非全部样本的平均梯度更新回归系数

正则化策略

上面的求解过程是以测试数据为基础的,容易造成过拟合,影响模型的泛化能力,即在其他数据上的预测能力,所以引入了正则化策略,正则化策略有三种:

1、 岭回归:给目标函数添加L2正则化项,即在使目标函数最小化的同时,使回归系数的平方和最小

2、 Lasso回归:给目标函数添加L1正则化项

3、 ElasticNe回归:给目标函数添加L1正则化项和L2正则化项

模型的评价

在回归分析中,最常用的评价模型的指标就是均方差MSE以及均方根误差RMSE,除此之外,还有回归平方和ESS、残差平方和RSS、总体平方和TSS以及R2

案例:波士顿房价预测

数据格式如下图所示,最后一列为目标值,即房价,前面13列为属性:

代码如下:

import numpy as npimport matplotlib as mplimport matplotlib.pyplot as pltimport pandas as pdfrom sklearn.model_selection import train_test_splitfrom sklearn.preprocessing import PolynomialFeaturesfrom sklearn.linear_model import LinearRegression, RidgeCV, LassoCV, ElasticNetCVfrom sklearn.pipeline import Pipelinefrom sklearn.metrics import mean_squared_errordef not_empty(s):return s != ''if __name__ == "__main__":# 加载数据并作前置处理file_data = pd.read_csv('housing.data', header=None)data = np.empty((len(file_data), 14))for i, d in enumerate(file_data.values):d = list(map(float, list(filter(not_empty, d[0].split(' ')))))data[i] = dx, y = np.split(data, (13,), axis=1)y = y.ravel()# 拆分训练数据和测试数据x_train, x_test, y_train, y_test = train_test_split(x, y, train_size=0.7, random_state=0)# 定义模型,二次特征+线性回归,其中线性回归分别采用无正则化/Ridge正则化/LASSO正则化/ElasticNet正则化models = [Pipeline([('poly', PolynomialFeatures()), ('linear', LinearRegression(fit_intercept=False))]),Pipeline([('poly', PolynomialFeatures()), ('linear', RidgeCV(fit_intercept=False))]),Pipeline([('poly', PolynomialFeatures()), ('linear', LassoCV(fit_intercept=False))]),Pipeline([('poly', PolynomialFeatures()),('linear', ElasticNetCV(l1_ratio=[0.1, 0.3, 0.5, 0.7, 0.99, 1], fit_intercept=False))])]# 模型标题model_titles = ["二次特征+简单线性回归", "二次特征+岭回归", "二次特征+LASSO回归", "二次特征+ElasticNet回归"]mpl.rcParams['font.sans-serif'] = ['simHei']mpl.rcParams['axes.unicode_minus'] = False# 绘图准备plt.figure(figsize=(15, 10), facecolor='w')# 遍历所有模型,分别利用不同的模型进行拟合for i in range(len(models)):plt.subplot(2, 2, i + 1)# 当前模型model = models[i]print('开始建模: {}'.format(model_titles[i]))# 训练模型model.fit(x_train, y_train)# 对测试数据目标值(房价)进行排序,方便显示order = y_test.argsort(axis=0)y_test = y_test[order]x_test = x_test[order, :]# 对测试数据进行预测y_pred = model.predict(x_test)# R2r2 = model.score(x_test, y_test)# 均方误差mse = mean_squared_error(y_test, y_pred)print('R2:', r2)print('均方误差:', mse)# 绘制子图t = np.arange(len(y_pred))plt.plot(t, y_test, 'r-', lw=2, label='真实值')plt.plot(t, y_pred, 'g-', lw=2, label='估计值')plt.legend(loc='upper left')plt.grid(True)plt.title(model_titles[i], fontsize=18)plt.xlabel('样本编号', fontsize=15)plt.ylabel('房屋价格', fontsize=15)plt.tight_layout()plt.show()# plt.savefig('Boston.png', dpi=800)

代码运行结果如下:

作者这水平有限,有不足之处欢迎留言指正

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。