首先阐述什么是回归问题(数学上就是用曲线拟合一系列点):

回归分析是一种预测性的建模技术,它研究的是因变量(目标)和自变量(预测器)之间的关系。这种技术通常用于预测分析,时间序列模型以及发现变量之间的因果关系。通常使用曲线来拟合数据点,目标是使曲线到数据点的距离差异最小 。

线性回归公式推导及其原理解析:

 1:实质就是构建多元线性方程,然后写成矩阵形式

 2:构建出的方程和真实数据之间肯定存在误差,经过数学家证明:误差满足高斯分布(高斯分布为接下来铺路)

 注:至于为什么误差满足高斯分布这是数学家的问题,作为技术人员,只要知道会用即可。

标准高斯分布如图:

 3:通过误差的分布公式和构建出的线性方程推出预测值y满足的分布(结果表明与参数有关)

 注:右边是概率密度函数,左边服从右边的分布。

4:怎样获得较好的参数来让预测值y尽可能与真实值接近呢?

答案:通过极大似然法构建出目标函数(凹函数)通过求解出参数,让该目标函数最小(最小二乘法求解:让均方误差最小),当该目标函数最小时的参数即为预测值y尽可能与真实值最接近。

注:就是把参数求解问题转化为函数求极值问题(数学家都喜欢这么干)

 

注:通过极大似然法构建出目标函数

5:目标函数求最小值:采用梯度下降法求解

注:1:梯度概念:对各个自变量的偏导数构建出的在某点单位向量

         2:沿着该向量下降方向,函数可以慢慢迭代寻求到极小值。(需要乘上一个步长:也就是学习率)

        3:为什么不直接解方程求极小值:因为不是每个方程都有公式解

 

 6:评价模型拟合好不好的方法:R平方:其实就是相关系数的平方:取值在0到1之间

 一元线性回归以及一元多项式(一元多次)回归Python实例分析(关于这个的理论部分详见本人博客应用统计学——一元线性回归部分):

1:首先生成实例数据集并查看:

import numpy as np
import matplotlib.pyplot as plt

# 生成示例数据集
np.random.seed(666)
x = np.random.uniform(-3.0, 3.0, size=100)
X = x.reshape(-1, 1)
y = 0.5 * x**2 + x + 2 + np.random.normal(0, 1, size=100)

plt.scatter(x, y)
plt.show()

 

2:尝试直接采用线性回归拟合并查看     R2    分数

# 直接采用线性回归拟合
from sklearn.linear_model import LinearRegression
lin_reg = LinearRegression()
lin_reg.fit(X, y)
y_predict = lin_reg.predict(X)
# 比较真值和预测值的r2
from sklearn.metrics import r2_score
r2 = r2_score(y, y_predict) # 评价指标r2分数
print(r2)

 

 2.1:可视化拟合效果:结论:效果很差

# 绘制拟合结果
plt.scatter(x, y)
plt.plot(np.sort(x), y_predict[np.argsort(x)], color='r')
plt.show()

 

3:采用二次多项式拟合(原理见本人博客应用统计学) (pipeline封装注释里有说明解释)并查看R2分数


# 封装 Pipeline 管道
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.preprocessing import StandardScaler


def PolynomialRegression(degree):
    '''Pipeline 管道:字符串里是人为写的函数名字,后面是函数
    原理就是先将数据进行多项式处理转化成线性模型
    其次进行标准化处理  最后送入线性评估器
    当.fit就是一次性处理以上三个步骤
    '''
    return Pipeline([('poly', PolynomialFeatures(degree=degree)),
                     ('std_scaler', StandardScaler()),
                     ('lin_reg', LinearRegression())])

# 使用degree=2拟合:采用二次多项式模型拟合数据
poly2_reg = PolynomialRegression(degree=2)
poly2_reg.fit(X, y)
y2_predict = poly2_reg.predict(X)
# 比较真值和预测值的R2分数
from sklearn.metrics import r2_score
r2 = r2_score(y, y2_predict)
print(r2)

3.1:可视化拟合效果:结论:拟合效果好

# 绘制degree=2拟合拟合结果
plt.scatter(x, y)
plt.plot(np.sort(x), y2_predict[np.argsort(x)], color='r')
plt.show()

 

 

 

 注:以上案例只是测试了一元回归在训练集上的线性回归效果以及多项式回归效果,其中用到了管道封装原理。如果有测试集,那么根据R2分数,肯定采用第二个模型进行测试。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐