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

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

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

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

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

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

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

另一方面,我们假设预测结果与真实结果之间的误差是独立同分布的,服从均值为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 np
import matplotlib as mpl
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression, RidgeCV, LassoCV, ElasticNetCV
from sklearn.pipeline import Pipeline
from sklearn.metrics import mean_squared_error
 
 
def 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] = d
    x, 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)
        # R2
        r2 = 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)

代码运行结果如下:

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

相关文章
|
6天前
|
机器学习/深度学习 人工智能 算法
探索机器学习:从线性回归到深度学习
本文将带领读者从基础的线性回归模型开始,逐步深入到复杂的深度学习网络。我们将通过代码示例,展示如何实现这些算法,并解释其背后的数学原理。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和知识。让我们一起踏上这段激动人心的旅程吧!
|
19天前
|
机器学习/深度学习 人工智能 算法
探索机器学习中的线性回归模型
本文深入探讨了机器学习中广泛使用的线性回归模型,从其基本概念和数学原理出发,逐步引导读者理解模型的构建、训练及评估过程。通过实例分析与代码演示,本文旨在为初学者提供一个清晰的学习路径,帮助他们在实践中更好地应用线性回归模型解决实际问题。
|
19天前
|
机器学习/深度学习 人工智能 算法
探索机器学习中的过拟合现象及其解决方案
在机器学习领域,过拟合是一个常见且棘手的问题,它发生在模型过于复杂以至于捕捉到训练数据中的噪声而非信号时。本文将深入探讨过拟合的原因、影响以及如何通过技术手段有效缓解这一问题,旨在为读者提供一个全面而实用的指南。
|
21天前
|
机器学习/深度学习 自然语言处理 算法
深入理解机器学习算法:从线性回归到神经网络
深入理解机器学习算法:从线性回归到神经网络
|
2月前
|
机器学习/深度学习 自然语言处理 JavaScript
信息论、机器学习的核心概念:熵、KL散度、JS散度和Renyi散度的深度解析及应用
在信息论、机器学习和统计学领域中,KL散度(Kullback-Leibler散度)是量化概率分布差异的关键概念。本文深入探讨了KL散度及其相关概念,包括Jensen-Shannon散度和Renyi散度。KL散度用于衡量两个概率分布之间的差异,而Jensen-Shannon散度则提供了一种对称的度量方式。Renyi散度通过可调参数α,提供了更灵活的散度度量。这些概念不仅在理论研究中至关重要,在实际应用中也广泛用于数据压缩、变分自编码器、强化学习等领域。通过分析电子商务中的数据漂移实例,展示了这些散度指标在捕捉数据分布变化方面的独特优势,为企业提供了数据驱动的决策支持。
103 2
信息论、机器学习的核心概念:熵、KL散度、JS散度和Renyi散度的深度解析及应用
|
28天前
|
机器学习/深度学习
深入理解机器学习中的过拟合与正则化
深入理解机器学习中的过拟合与正则化
|
2月前
|
机器学习/深度学习 算法 Python
深度解析机器学习中过拟合与欠拟合现象:理解模型偏差背后的原因及其解决方案,附带Python示例代码助你轻松掌握平衡技巧
【10月更文挑战第10天】机器学习模型旨在从数据中学习规律并预测新数据。训练过程中常遇过拟合和欠拟合问题。过拟合指模型在训练集上表现优异但泛化能力差,欠拟合则指模型未能充分学习数据规律,两者均影响模型效果。解决方法包括正则化、增加训练数据和特征选择等。示例代码展示了如何使用Python和Scikit-learn进行线性回归建模,并观察不同情况下的表现。
400 3
|
1月前
|
机器学习/深度学习 数据采集 算法
探索机器学习中的线性回归
【10月更文挑战第25天】本文将深入浅出地介绍线性回归模型,一个在机器学习领域中广泛使用的预测工具。我们将从理论出发,逐步引入代码示例,展示如何利用Python和scikit-learn库实现一个简单的线性回归模型。文章不仅适合初学者理解线性回归的基础概念,同时也为有一定基础的读者提供实践指导。
|
2月前
|
机器学习/深度学习 算法 数据挖掘
机器学习入门(二):如何构建机器学习模型,机器学习的三要素,欠拟合,过拟合
机器学习入门(二):如何构建机器学习模型,机器学习的三要素,欠拟合,过拟合
|
2月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
探索机器学习:从线性回归到深度学习
在这篇文章中,我们将一起踏上一场激动人心的旅程,穿越机器学习的广阔天地。我们将从最基本的线性回归开始,逐步深入到复杂的深度学习模型。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和深入的理解。让我们一起探索这个充满无限可能的世界吧!