AI遮天传 ML-广义线性模型(一)

简介: AI遮天传 ML-广义线性模型(一)

前文回顾:

还记得很久很久以前,我们学习了简单的回归分析,这其实与我们在学校所学的求解回归方程并没无太大的区别,或许仅是维度不同。

我们当时通过定义损失函数,让损失函数结果最小,来达到更好的回归效果。

多种损失函数都是可行的,考虑到优化等问题,最常用的是基于误差平方和的损失函数:

用误差平方和作为损失函数有很多优点


       • 损失函数是严格的凸函数,有唯一解


       • 求解过程简单且容易计算


• 同时也伴随着一些缺点


       • 结果对数据中的“离群点”(outlier)非常敏感


               • 解决方法:提前检测离群点并去除


       • 损失函数对于超过和低于真实值的预测是等价的


               • 但有些真实情况下二者带来的影响是不同的  

为了找到最优的斜率和截距,我们使用最小二乘法求解出了相应系数:

当然,对于多维:

当因变量有多个时,我们可以用矩阵方式表达

基于以上矩阵表示,可以写为

此时:

注:

  • 矩阵X的第一列都是1,其与β相乘表示截距。
  • 损失函数结果还是数字
  • 通过最小二乘法得到求解β的公式

例如:

记录了 25 个家庭每年在快销品和日常服务

  • 总开销(𝑌)
  • 每年固定收入( 𝑋2)、持有的流动资产( 𝑋3)

可以构建如下线性回归模型:

链接 该文章的末尾还有对应的实例实验可供加深理解。

一、普通最小二乘法

上方回顾的内容便是所谓普通最小二乘法回归,我们提到参数的求解公式:

但在sklearn中,已经有封装好的类供我们使用:

from sklearn import linear_model
# 初始化 内部参数选择默认
reg = linear_model.LinearRegression()
X = [[0, 0], [1, 1], [2, 2]]
y = [0, 1, 2]
# 通过fit训练出回归模型
reg.fit (X,y) 
# 这是我们这个模型训练后得到的参数 array([0.5, 0.5])
reg.coef_
# 假设预测的了两个点是[[3,3],[2.5,2.8]]  则结果为array([3.  , 2.65])
reg.predict([[3,3],[2.5,2.8]])
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets, linear_model
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score #均方误差 决定系数 当然 都可以自己算
diabetes_X, diabetes_y = datasets.load_diabetes(return_X_y=True)
# 只取一个特征 np.newaxis 是为了让其变成二维
diabetes_X = diabetes_X[:,np.newaxis,2] 
# 我们接下来计算 该 特征是否有线性回归关系
# 当然也可以计算总的 但该组数据效果不好,并不全有回归关系。
# 划分数据集
x_train, x_test, y_train, y_test = train_test_split(diabetes_X,diabetes_y,test_size=0.045, random_state=2020)
# diabetes_X.shape, diabetes_y.shape, x_train.shape, x_test.shape, y_train.shape, y_test.shape # 输出数据行列信息
# 大小:((442, 1), (442,), (422, 1), (20, 1), (422,), (20,))
regr = linear_model.LinearRegression()
regr.fit(x_train, y_train)
# 得到预测结果
p_test = regr.predict(x_test)
# 参数 斜率和截距
print("Coefficients: \n", regr.coef_)
# 均方误差 也可以自己算
print("Mean squared error: %.2f" % mean_squared_error(p_test, y_test))
# 决定系数 越接近1越好
print("Coefficient of determination: %.2f" % r2_score(p_test, y_test))
# 实际数据 用点表示
plt.scatter(x_test, y_test, color="black")
# 根据预测数据 画出回归线
plt.plot(x_test, p_test, color="blue", linewidth=3)
plt.xticks(())
plt.yticks(())
plt.show()

参数及属性部分建议阅读官方文档,下同:官方文档


然而,对于普通最小二乘的系数估计问题,其依赖于模型各项的相互独立性。当各项是相关的,且设计矩阵的各列近似线性相关,那么,设计矩阵会趋向于奇异矩阵,这种特性导致最小二乘估计对于随机误差非常敏感,可能产生很大的方差。例如,在没有实验设计的情况下收集到的数据,这种多重共线性(multicollinearity)的情况可能真的会出现。

二、岭回归

如果上方最小二乘法使得误差函数最小,用公式表示为:

岭回归

岭回归,通过对系数的大小施加惩罚来解决 普通最小二乘法 的一些问题。 岭系数最小化的是带罚项的残差平方和。

其中, α>=0 是控制系数收缩量的复杂性参数: α的值越大,收缩量越大,模型对共线性的鲁棒性也更强。

from sklearn import linear_model
reg = linear_model.Ridge (alpha = .5)
reg.fit ([[0, 0], [0, 0], [1, 1]], [0, .1, 1])
reg.coef_ # array([0.34545455, 0.34545455])
reg.intercept_ # 0.13636363636363638

岭回归系数的影响:

import numpy as np
import matplotlib.pyplot as plt
from sklearn import linear_model
# X 为 10*10矩阵
X = 1.0 / (np.arange(1, 11) + np.arange(0, 10)[:, np.newaxis])
y = np.ones(10)
n_alphas = 200
# 传入开始值 结束值 个数 生成200个α
alphas = np.logspace(-10, -2, n_alphas)
coefs = []
for a in alphas:
    # fit_intercept 不计算截距
    ridge = linear_model.Ridge(alpha=a, fit_intercept=False)
    ridge.fit(X, y)
    # 记录参数
    coefs.append(ridge.coef_)
ax = plt.gca()
ax.plot(alphas, coefs)
ax.set_xscale("log")
ax.set_xlim(ax.get_xlim()[::-1])  # reverse axis 从大到小
plt.xlabel("alpha")
plt.ylabel("weights")
plt.title("Ridge coefficients as a function of the regularization")
plt.axis("tight")
plt.show()

从上图我们可以看出:α的值越大,收缩量越大,模型对共线性的鲁棒性也更强。

设置正则化参数:广义交叉验证

RidgeCV 通过内置的关于的 alpha 参数的交叉验证来实现岭回归。 该对象与 GridSearchCV 的使用方法相同,只是它默认为 Generalized Cross-Validation(广义交叉验证 GCV),这是一种有效的留一验证方法(LOO-CV):

from sklearn import linear_model
reg = linear_model.RidgeCV(alphas=[0.1, 1.0, 10.0])
reg.fit([[0, 0], [0, 0], [1, 1]], [0, .1, 1])       
reg.alpha_  

案例:使用稀疏特征对文本文档进行分类 — scikit-learn 1.1.2 文档


相关文章
|
5月前
|
机器学习/深度学习 存储 人工智能
2023 年 AI/ML 值得关注的 15 个 Github 开源库
2023 年 AI/ML 值得关注的 15 个 Github 开源库
244 0
|
机器学习/深度学习 人工智能 搜索推荐
ML 模型不等于“黑盒”:explainable AI 可解释的人工智能
ML 模型不等于“黑盒”:explainable AI 可解释的人工智能
182 0
ML 模型不等于“黑盒”:explainable AI 可解释的人工智能
|
12月前
|
机器学习/深度学习 人工智能 自然语言处理
用Transformer定义所有ML模型,特斯拉AI总监Karpathy发推感叹AI融合趋势
用Transformer定义所有ML模型,特斯拉AI总监Karpathy发推感叹AI融合趋势
118 0
|
机器学习/深度学习 人工智能 算法
【沙龙分享】记录一下AI/ML/元宇宙在游戏领域中的落地场景
元宇宙、AI、机器学习、元宇宙游戏、Mate、人工智能,这些名词一方面让人觉得憧憬,一方面又因为几乎在全球范围都在讨论而觉得烂大街,在天空上飞翔的空中楼阁,只听说是未来,但却没亲眼看过一眼未来~
157 1
【沙龙分享】记录一下AI/ML/元宇宙在游戏领域中的落地场景
|
机器学习/深度学习 人工智能 算法
AI遮天传 ML/DL-感知机
AI遮天传 ML/DL-感知机
AI遮天传 ML/DL-感知机
|
机器学习/深度学习 数据采集 人工智能
|
机器学习/深度学习 人工智能 文字识别
AI遮天传 ML-集成学习
AI遮天传 ML-集成学习
AI遮天传 ML-集成学习
|
机器学习/深度学习 人工智能 监控
AI遮天传 ML-无监督学习
AI遮天传 ML-无监督学习
AI遮天传 ML-无监督学习
|
人工智能 数据挖掘
AI遮天传 ML-回归分析入门
AI遮天传 ML-回归分析入门