机器学习之回归(线性回归+逻辑回归)

开学第七周,开启机器学习新篇章。

一.关于机器学习

        机器学习是人工智能的核心分支,本质是通过让计算机通过数据学习规律实现自主决策、预测或模式识别。核心逻辑就是给它一串数据,通过特定的模型训练让它找到数据的内在规律对我们想要解决的问题进行一个预测。在寻找适合的模型中,我们要采取各种算法提高其准确度。

下面是关于我在搜集资料后拟写的一个思维导图

二.回归

        回归的本质是拟合一条“ 曲线 / 平面 ”,并尽可能让所有的数据都在这条线上,也就是误差最小,以此提高预测的精确度和可靠性。

回归流程如下

主包刚开始有点没能理解训练集和测试集的一些概念,这里做一个小小的介绍。

1)训练集与测试集

        训练集和测试集作为存放数据的集合都有特征标签,这里和平时理解的字面意义上的特征和标签不一样,我们可以分别把其简单理解为“输入”和“输出”。

        特征是模型的输入信息,通常描绘了数据的各属性和维度。比如在预估房价时,房屋的面积、楼层还有地段等都是特征;在识别垃圾邮件时,发件人、邮件内容等也是特征。

        标签是模型的输出目标,也就是想要得到数据的结果。可大致分为分类和回归两种类型,前者的标签指离散类别,比如是垃圾邮件/正常邮件;后者的标签则指连续的数值,比如预测的房价、销量等。

        训练集作用是让模型不断学习并挖掘数据的内在规律,而测试集的作用则是用训练过的模型来对数据的结果进行一个预估,与真实值进行对比看这个模型准不准。他们俩的区别在于是否参与过模型训练。

     (除此之外在实践中还有验证集,用于调节各项参数,防止过度拟合,帮助最佳模型的选择)

2)线性回归

        线性回归是一种用于预测连续数值的统计方法,通过找到自变量(特征)与因变量(目标)之间的线性关系进行预测。基本公式为

                                        y = w₁x₁ + w₂x₂ + ... + wₙxₙ + b

        其中,y为预测目标;x为特征变量;w为系数(权重);b为截距

        关于线性回归,重要的核心概念有三个分别是损失函数、梯度下降、评估指标。

a.损失函数

        损失函数是核心的 “误差衡量工具”,它量化了模型预测结果与真实值之间的差异,指导模型参数的优化方向。为什么它是核心呢,要看一个线性回归模型误差大不大其实是有很多指标的,除了直观的可视化图像之外也需要有量化的数据来计算到底“损失”了多少。

b.梯度下降算法(GD)

        通过逐步降低损失函数,找到最优解。是线性回归中用来最小化损失函数的核心优化算法。批量梯度下降(BGD)是最基础的形式,每次迭代都使用全部训练样本计算梯度。

(1)BGD
  • 计算损失函数每个参数的梯度/偏导,更新参数
  • 每次更新步长由学习率决定(过大会导致震荡不收敛,过小会导致收敛过慢)

更新公式:

                

其中 θ 是模型参数,η 是学习率,∇θ​J(θ) 是损失函数 J(θ) 在全部样本上的梯度。

优点是梯度估计准确,收敛稳定,能保证朝全局最优方向前进;但如果训练集数据过于庞大,会导致计算量大,速度也慢——针对这个进行优化就有了随机梯度下降算法(SGD)。

(2)SGD

与BGD不同的是,SGD在每次迭代时只随机选择部分训练样本计算梯度并更新参数。

更新公式:

                

优点是计算速度快,大数据集适用,并且随机性也有助于跳出局部最优解;但会引入噪声,更新方向也不稳定,收敛过程会产生较大震荡,难以精确收敛——针对此问题又优化引进动量法(Momentum)。

(3)Momentum

在更新参数时,不仅考虑当前梯度,还积累之前的梯度方向。

更新公式:

                

它可以提高速度并有效抑制震荡,但仍需要手动调整学习率——针对这个问题优化为自适应学习算法。

(4)AdaGrad和RMSProp

为每个参数位数一个独立的学习率,对出现频率低的参数使用较大的学习率,频率高的则使用较小的学习率。RMSProp则是对前者学习率过早衰减的问题进行优化。

        

(5)Adam

动量+自适应学习(Momentum+RMSProp)是目前最流行的优化算法之一。

利用动量平滑路径,自适应调整每个参数的学习率。

收敛速度快,对超参数不敏感,在大多数深度学习任务中表现出色,是默认首选优化器。

c.评估指标

决定系数

R^{^{2}}

(最核心指标),取值为[0,1],越接近1表示拟合效果越好

(适用无明显异常值时)

均方误差(Mean Squared Error, MSE):

                        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​

(对大误差更敏感)

均方根误差(Root Mean Squared Error, RMSE):

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        

(同样适用于无明显异常值时)

平均绝对误差(Mean Absolute Error, MAE):

        ​​​​​​​         ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        

(对异常值更鲁棒,不进行平方操作,故当存在异常值时使用更为恰当)

除此之外,还有

平均绝对百分比误差(MAPE):

(衡量预测值相对真实值的平均百分比误差,适合评估相对偏差的场景)

均方对数误差(MSLE):

目标值范围大,用对数变换可以缓解大值对误差的影响)

3)逻辑回归

逻辑回归是一种用于分类的统计方法,虽然名字里有 “回归”,但它本质上是通过线性模型结合Sigmoid 函数,将预测结果映射到 [0,1] 区间,从而实现对二分类问题的概率预测。其基本公式为:

\hat{y}

是预测为正类的概率,z是线性组合的输出,

\sigma

() Sigmoid 激活函数,将线性输出压缩到概率区间

a.损失函数

二元交叉熵损失(Binary Cross-Entropy):

                                

多分类交叉熵损失(Categorical Cross-Entropy):

                                        

b.梯度下降算法(GD)

计算通线性回归,这里不做详细说明。

c.评估指标

逻辑回归作为分类模型,常用一下指标来评估性能:

混淆矩阵

预测为正类预测为负类
真实为正类真阳性(TP)假阴性(FN)
真实为负类假阳性(FP)真阴性(TN)

准确率Accuracy

(在数据不平衡的情况下极具误导性,仅适用于数据集分布相对平衡时)

精确率Precision

(所有预测为正类中,真正是正的比例,适用于数据不平衡/避免时)

召回率Recall

(所有真实为正类中,预测为正的比例,适用于数据不平衡/避免时)

F1分数

(精确率和召回率的调和平均数,为二者的平衡指标,使用范围广不管数据平不平衡)

AUC

        ROC曲线下的面积,取值范围为[0,1]。roc横轴为假阳性率:FP/(FP+TN),纵轴为真阳性率/召回率:TP/(TP+FN)。auc代表模型区分正负样本的能力,越接近1分类能力越强,对数据不平衡不敏感,是评估分类模型的重要指标之一。

        

Read more

C++ 拷贝构造函数与赋值运算符:深拷贝与浅拷贝的核心辨析

C++ 拷贝构造函数与赋值运算符:深拷贝与浅拷贝的核心辨析

C++ 拷贝构造函数与赋值运算符:深拷贝与浅拷贝的核心辨析 💡 学习目标:掌握拷贝构造函数与赋值运算符的定义及调用场景,理解深拷贝与浅拷贝的本质区别,能够在实际开发中避免内存泄漏与野指针问题。 💡 学习重点:拷贝构造函数的触发条件、浅拷贝的缺陷、深拷贝的实现方法、赋值运算符的重载原则。 一、拷贝构造函数的概念与触发场景 ✅ 结论:拷贝构造函数是一种特殊的构造函数,用于通过一个已存在的对象创建一个新对象,其参数必须是本类对象的常量引用(const 类名&)。 1.1 拷贝构造函数的语法格式 class 类名 {public:// 普通构造函数 类名(参数列表);// 拷贝构造函数 类名(const 类名& other);}; ⚠️ 注意事项: 1. 拷贝构造函数的参数必须是常量引用,使用 const 防止实参被修改,使用引用避免无限递归调用拷贝构造函数。 2. 如果没有手动定义拷贝构造函数,编译器会自动生成一个默认拷贝构造函数,实现简单的成员变量值拷贝。 1.2 拷贝构造函数的触发条件

By Ne0inhk
【 C/C++ 算法】入门动态规划-----一维动态规划基础(以练代学式)

【 C/C++ 算法】入门动态规划-----一维动态规划基础(以练代学式)

每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry” 绪论 : 本章是动态规划算法的基础入门篇,我将通过三道简单题 + 一道中等难度的一维动态规划题来带你对动态规划有个初认识,并基本了解动态规划的最基本常见的写法,只有将基本写法了解了,对后续的难的题目自然也不会毫无头绪,后续还将持续更新更多相关的动规算法,敬请期待~🙃 ———————— 早关注不迷路,话不多说安全带系好,发车啦(建议电脑观看)。 👻动态规划🌥️ 这里通过大量练习得出下面动态规划做题步骤 简单的说动态规划理解成:某种状态的公式 + 提前求出来值的容器 求出当前位置的值然后放到容器中后后续使用 因为最开始的值一般是会看见的所以就能有初始值,从而启动动态规划 从上中可以主要提炼出: * 状态 * 容器的重要性 * 公式,可以换种说法:状态转移方程 这样严格😈的说:动态规划 = 状态定义 + 状态转移方程 + 初始条件 + 状态存储(容器) 下述步骤是通过写完下述四道题后的总结,所以同样需要道友🗡️大量的练习沉淀最终就能对动态规划的题目

By Ne0inhk
【探寻C++之旅】C++11 深度解析:重塑现代 C++ 的关键特性

【探寻C++之旅】C++11 深度解析:重塑现代 C++ 的关键特性

请君浏览 * 前言 * 1. C++的发展历史 * 2. 列表初始化:统一对象初始化的优雅方案 * 2.1 从 C++98 到 C++11 的突破 * 2.2 std::initializer_list:容器初始化的 “神器” * 3. 右值引用和移动语义:彻底解决拷贝性能痛点 * 3.1 左值 vs 右值 * 3.2 左值引用 vs 右值引用 * 3.3右值引用的使用场景 * 3.3.1参数匹配 * 3.3.2 类型分类 * 3.3.3 移动构造和移动赋值

By Ne0inhk
C++ 继承:面向对象的代码复用核心机制

C++ 继承:面向对象的代码复用核心机制

C++ 继承:面向对象的代码复用核心机制 💡 学习目标:掌握继承的基本语法与核心特性,理解不同继承方式的访问权限控制,能够通过继承实现代码复用与扩展。 💡 学习重点:继承的语法格式、三种继承方式的区别、基类与派生类的关系、继承中的构造与析构顺序。 一、继承的概念与核心价值 ✅ 结论:继承是 C++ 面向对象三大特性之一,允许一个类派生类继承另一个类基类的属性和行为,实现代码复用,同时支持派生类在基类基础上扩展新功能。 继承的核心价值体现在两个方面: 1. 代码复用:避免重复编写相同的成员变量和成员函数,降低代码冗余度 2. 功能扩展:派生类可以在基类的基础上新增属性和方法,满足更复杂的业务需求 生活中的继承示例:学生和老师都属于“人”,都有姓名、年龄等属性和吃饭、睡觉等行为。可以先定义 Person 基类,再让 Student 和 Teacher 继承 Person,并各自扩展专属功能。 二、继承的基本语法与实现 2.1

By Ne0inhk