【机器学习03--线性模型】

文章目录

线性模型

线性模型可以说是机器学习模型中最为基础的模型,在本节中,我们将会重点介绍线性回归和对数几率回归以及线性判别分析。

在机器学习任务中,常见的两种任务是回归和分类,回归任务的输出一般是一个或多个连续实数值,你需要根据给你的特征准确预测这个实数值,常见的例子包括房价的预测、股票的预测等。而分类任务主要是根据给你的特征将这个样本分为两类或者多类,它的输出是一个离散的标签。接下来,我们介绍线性回归模型,也就是我们假设这里的模型满足线性性,比如 y = w 1 ∗ x 1 + w 2 ∗ x 2 y=w_1*x_1+w_2*x_2 y=w1∗x1+w2∗x2类似这种。


线性回归

我们刚才也说了,我们需要根据特征值预测一个实数值,我们假设他们满足线性关系,即 f ( x i ) = w T ∗ x + b f(x_i)=w^T*x+b f(xi)=wT∗x+b,这里我们假设x表示一个向量,这个向量有n个元素,相当于这个样本有n个特征,我们需要根据这个n个特征取去预测这里的y值,举个例子,假设我们需要根据西瓜的重量和西瓜的品质(假设西瓜品质可以分为几个离散值)来预测该西瓜的价格,那么这里一个样本中包含的特征值就是两个。

现在假设我们根据实际情况,得到了很多样本,现在需要训练一个模型,使其可以根据其特征来预测这里的实数值(比如得到了很多个西瓜的特征以及对应的西瓜组成的数据集,需要训练一个模型去预测新的西瓜的价格),那么这里有一个问题就是,假设我确实预测出了西瓜的价格,但是我怎么知道它预测的准不准呢,那就要跟实际的价格进行对比才能知道,在回归任务中,实际的价格和预测的价格之间的差异我们可以根据均方误差来进行衡量,可以将其表示为:
w ∗ = a r g m i n w ( y − X w ) T ( y − X w ) w*=argmin_w(y-Xw)^T(y-Xw) w∗=argminw(y−Xw)T(y−Xw)

==通过最小化这里的均方误差,我们可以得到线性回归任务中,模型参数的值,==具体的求法我们可以根据最小二乘法或梯度下降来得到。一般来说这可以得到一个解析解,这里只阐述思想,并不细讲,在求解析解时,首先需要证明你的优化问题是凸的,然后通过求偏导,然后将其置为0,就可以求得全局最优解。当然你也可以通过随机梯度下降来求,每次都让参数移动一段距离,不断迭代,就可以得到一个较优的解,这也是目前常用的方法。
这里我们还要考虑的一个问题时,在很多时候,我们会遇到我们的样本数很少,但是每一个样本的特征数量却很多的情况,这种情况下,如果你列一个线性方程组去求解这里的参数的时候,你会发现方程的数量少于参数的数量,这就会导致从在很多个解,那么我们应该选择哪一个解?需要根据实际情况进行选择。一般来说,我们会在原始优化目标后面再加一个正则化项,一般有L1正则化和L2正则化。
**L1正则化项: λ ∑ ∣ w i ∣ \lambda \sum{|w_i|} λ∑∣wi∣
L2正则化项: λ ∑ w i 2 \lambda\sum{w_i^2} λ∑wi2**

通过将其中一个加入到原始的优化目标中,可以有效的缓解过拟合的问题,那么这两种正则化方式有什么区别呢?

一般来说L1正则化,它可能会使某些特征的权重为0,这样就会起到一个特征选择的作用,但是L2正则化不会将权重置为0,L1正则化优化难度更高。

除此之外,我们还可以再线性回归的基础上进行拓展,我们可以实现一种广义线性模型,考虑单调可微函数: y = g − 1 ( w T x + b ) y=g^{-1}(w^Tx+b) y=g−1(wTx+b),我们通过拟合一个线性模型,从而可以得到预测y值的非线性模型,但是我们在训练的时候,其训练集的标签为 g ( y ) g(y) g(y),比如,如果 g = l n ( ) g=ln() g=ln(),那么就是对数线性回归了。

额外补充:我们在量化特征的时候,如果特征之间具有序关系,并且该特征使离散的,那么可以将其表示为数字(比如0.2,0.5,1,就分别表示低中高),如果没有,那么就不能这样表示,,可以表示为独热编码或其他形式。

对数几率回归

**对数几率回归,也叫logistic回归,虽然名为回归,但是解决的是分类任务,**他也是从上面广义线性模型中扩展来的,我们现在假设一个二分类任务,我们需要根据其特征将其分为0或1,但是线性模型的输出是一个实数值,怎么将其转换为0或1呢,这里我们就要看看 y = g − 1 ( w T x + b ) y=g^{-1}(w^Tx+b) y=g−1(wTx+b)

如果,我将这里线性模型的输出经过一个阶跃函数,也就是大于0.5为1,小于0.5为0,那就可以进行分类,但是,阶跃函数并不连续,我们需要找一个其他的函数,尽可能的接近阶跃函数,并且连续可微,我们常用的这样一个函数叫sigmoid,可以将其表示为 y = 1 1 + e − ( w T x + b ) y=\frac{1}{1+e^{-(w^Tx+b)}} y=1+e−(wTx+b)1
这里的几率表示了x作为正例与反例之间的相对可能 性,并且再加一个对数,即对数几率。
l n ( y 1 − y ) = w T x + b ln(\frac{y}{1-y})=w^Tx+b ln(1−yy)=wTx+b

那么我们怎么训练这样一个模型呢?我们这里的优化目标是想染给预测的概率值尽可能准确,这里我们最小化交叉熵损失(相当于最大化似然函数):
− [ y ( l o g ( y i ) + ( 1 − y ) l o g ( 1 − y i ) ] -[y(log(y_i)+(1-y)log(1-y_i)] −[y(log(yi)+(1−y)log(1−yi)]

可以通过梯度下降来进行迭代求解。

线性判别分析

线性判别分析,即LDA,这里只阐述其思路:给定训练样本集,设法将该样本投影到一条直线上,使得同类样本的投影点尽可能近,不同类样本的投影点尽可能远,在对新样本进行分类的时候,先将其投影到这条直线上,然后再根据投影点的位置进行判别分析。

这里做一下简单的补充:这里我们说是将其投影到一条直线,并不准确,二分类任务中为一条直线,多分类任务中应该为超平面,通过最大化类间散度矩阵与类内散度矩阵的比值,可以实现特征降维的效果。

面试题

自测,答案下节给

  • 给定一个简单的数据集,要求实现线性回归模型。
  • 描述梯度下降法的步骤,如何优化参数。
  • 讨论岭回归和Lasso回归的区别,在哪些情况下使用它们。
  • 解释逻辑回归和线性回归的区别。
  • 给定数据,如何诊断过拟合或欠拟合的情况,并调整模型。

扩展内容

使用python库实现L1、L2正则化(例子展示)

L1正则化

==L1正则化通过在损失函数中加入权重参数的绝对值的和,来惩罚模型的复杂度。==它的目标是使得模型参数尽可能稀疏,也就是说,L1正则化倾向于使得一些特征的权重为零,从而实现特征选择
L1正则化的特点

  • 通过加入绝对值项,L1正则化会使得一些特征的权重变为零,从而实现特征选择。
  • 在处理稀疏数据时,L1正则化非常有效。

L2正则化

L2正则化通过在损失函数中加入权重参数的平方和,来惩罚模型的复杂度。它的目标是减小模型参数的绝对值,而不是将其变为零。
L2正则化的特点

  • L2正则化能有效防止过拟合,尤其在特征之间存在多重共线性时。
  • L2正则化不会使特征完全不重要,而是通过降低权重来限制模型的复杂度。

Python实现

在Python中,我们可以使用sklearn 库来实现L1和L2正则化。sklearn.linear_model模块中的Lasso和Ridge分别对应L1和L2正则化。ElasticNet类则用于实现L1和L2正则化的组合。
示例:L1正则化(Lasso)

python 复制代码
from sklearn.linear_model import Lasso
from sklearn.datasets import make_regression
import numpy as np

# 生成一个简单的回归数据集
X, y = make_regression(n_samples=100, n_features=2, noise=0.1, random_state=42)

# 创建Lasso模型并拟合数据
lasso_model = Lasso(alpha=0.1)  # alpha是L1正则化的强度参数
lasso_model.fit(X, y)

# 输出模型的系数
print("Lasso回归的系数:", lasso_model.coef_)

# 预测
y_pred = lasso_model.predict(X)

示例:L2正则化(Ridge)

python 复制代码
from sklearn.linear_model import Ridge

# 创建Ridge模型并拟合数据
ridge_model = Ridge(alpha=0.1)  # alpha是L2正则化的强度参数
ridge_model.fit(X, y)

# 输出模型的系数
print("Ridge回归的系数:", ridge_model.coef_)

# 预测
y_pred = ridge_model.predict(X)

示例:Elastic Net(L1和L2正则化的组合)

python 复制代码
from sklearn.linear_model import ElasticNet

# 创建ElasticNet模型并拟合数据
elastic_net_model = ElasticNet(alpha=0.1, l1_ratio=0.5)  # alpha控制正则化强度,l1_ratio决定L1和L2的比例
elastic_net_model.fit(X, y)

# 输出模型的系数
print("ElasticNet回归的系数:", elastic_net_model.coef_)

# 预测
y_pred = elastic_net_model.predict(X)
相关推荐
NAGNIP8 小时前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
冬奇Lab9 小时前
一天一个开源项目(第36篇):EverMemOS - 跨 LLM 与平台的长时记忆 OS,让 Agent 会记忆更会推理
人工智能·开源·资讯
冬奇Lab9 小时前
OpenClaw 源码深度解析(一):Gateway——为什么需要一个"中枢"
人工智能·开源·源码阅读
AngelPP13 小时前
OpenClaw 架构深度解析:如何把 AI 助手搬到你的个人设备上
人工智能
宅小年13 小时前
Claude Code 换成了Kimi K2.5后,我再也回不去了
人工智能·ai编程·claude
九狼14 小时前
Flutter URL Scheme 跨平台跳转
人工智能·flutter·github
ZFSS14 小时前
Kimi Chat Completion API 申请及使用
前端·人工智能
天翼云开发者社区15 小时前
春节复工福利就位!天翼云息壤2500万Tokens免费送,全品类大模型一键畅玩!
人工智能·算力服务·息壤
知识浅谈15 小时前
教你如何用 Gemini 将课本图片一键转为精美 PPT
人工智能
Ray Liang15 小时前
被低估的量化版模型,小身材也能干大事
人工智能·ai·ai助手·mindx