深度学习的两大问题概述——分类和回归

一、分类和回归的本质区别

1、输出不同:分类(Classification)问题预测一个离散类别,通常是多个类别输出;回归(Regression)问题估计一个连续值,是单连续数值输出。

2、目的不同:分类的目的是寻找决策边界,用于对数据集中的数据进行分类。回归的目的是通过回归算法得到一个最优拟合线,这个线可以最好的接近数据集中的各个点。

3、结果不同:分类的结果很明确,分类正确即为对,分类错误即为错,没有逼近,最终结果只有一个。回归是对真实值的一种逼近预测,当预测值与真实值相近时,误差较小时,认为这是一个好的回归。

二、分类和回归常用的激活函数

1、为什么要使用激活函数

不使用激活函数时,无论神经网络有多少层,输出都是输入的线性组合,这种情况就是最原始的感知机。使用激活函数能够给神经元引入非线性因素,使得神经网络可以任意逼近任何非线性函数,使深层神经网络表达能力更加强大。

2、激活函数分类

激活函数可以分为饱和激活函数非饱和激活函数。

什么是饱和激活函数?假设存在激活函数f(x)

\lim_{x\rightarrow+\infty}f{}'(x)=0x趋近于正无穷时,f(x)的导数趋近于0右饱和
\lim_{x\rightarrow-\infty}f{}'(x)=0x趋近于负无穷时,f(x)的导数趋近于0左饱和
\lim_{x\rightarrow\infty}f{}'(x)=0x趋近于无穷时,f(x)的导数趋近于0饱和

不符合上述条件的即为非饱和激活函数

饱和激活函数有:sigmoid……

非饱和激活函数有:ReLU、Leaky Relu……

3、输出层常见的激活函数

对于分类问题

分类问题目的常用的激活函数

二分类问题

只用把目标分为两个类别,获得其分类概率值,设置分类阈值即可得到分类类别

阶跃函数、sigmoid函数

多分类问题

需要把目标分为多个类别,所得到的概率是一个向量,数值最大的数作为分类类别

softmax函数

①阶跃函数

例如对房价进行分类,要求为房价高于100万为高档住宅,低于100万为普通住宅。首先对房价进行预测,这是一个回归问题,然后设置一个单位阶跃函数,实现住宅的分类。这类问题属于二分类问题,分类结果为0,1,由此可以写出下面的公式。

阶跃函数形式简单,计算简便,但函数不光滑,不连续,对于z值无限接近于0的数据很难进行正确分类。使用很少。

②sigmoid函数(也称对数几率函数)

Sigmoid函数

优点:①将输入的正无穷大到负无穷大的连续输入变化为[0,1]的输出。

②当输入比较小时神经元被抑制,超过阈值时产生兴奋。

③输出可直接看做概率。

缺点:①输出在[0,1],会导致多层神经网络中后面一层神经元的输入发生偏移,导致梯度下降收敛速度变慢。

②函数中含有对数运算,误差反向传播计算导数时所需时间比较长。

③导函数的范围在[0,0.25],误差反向传播计算导数时会存在多个[0,0.25]的数相乘,导致误差经过每一层都不断衰减。如果层数较深,梯度值趋近于0,参数更新几乎停滞。

③softmax函数

使用exp(z)使输出值之间的差距拉大,大的更大,小的更小,能更好区分各个类别,最后中心化使其分布在[0,1]之间,各个概率之和为1。Softmax函数是sigmoid函数在多分类问题上的推广。

对于回归问题

输出层一般使用线性激活函数,使模型的输出值可以覆盖整个实数域。

4、隐藏层常见的激活函数

ReLU函数

ReLU函数

Leaky-ReLU函数

PReLU函数 和 RReLU函数

优点:①z>0时,导数等于1,缓解了梯度消失问题。

②不存在幂运算,计算速度快。

③导数恒等于1,训练模型收敛速度快。

优点:①避免了ReLU神经元死亡

②神经网络的计算和训练速度快

PReLU函数:参数化修正线性单元,a是可训练参数;

RReLU函数:训练阶段,负值部分的斜率是随机分配的(均匀分布);测试阶段,负值的斜率是固定的(训练阶段所有α的平均值)

缺点:①输出不是以0为均值的,会影响收敛的速度

②z<0时,梯度为0,神经元死亡

缺点:超参数a需要人工调整

 

PReLU函数:

优点:①将输入的正无穷大到负无穷大的连续输入变化为[-1,1]的输出,避免了Logistic函数存在的输入偏移问题。

 


缺点:①函数中含有对数运算,误差反向传播计算导数时所需时间比较长。②导函数的范围在[0,1]同样存在梯度消失问题。

三、分类和回归常用的损失函数

1、为什么要使用损失函数

在模型训练的过程中,损失函数用于计算模型预测的输出与实际标签之间的差异。这个差异值,即损失值,能够直观地反映出模型在当前参数下的性能。通过最小化这个损失值,我们可以驱使模型不断学习和改进,直至达到满意的预测精度。

2、常见的损失函数

基于距离度量的损失函数

L1 Loss、L2 Loss、Huber's Robust Loss

基于概率分布度量的损失函数

交叉熵损失函数:用于衡量模型输出的概率分布与真实概率分布之间的差异。常用于分类问题中。

二分类问题交叉熵损失函数
平均交叉熵损失函数
平均交叉熵损失函数求导数
多分类问题多分类交叉熵损失函数

 

为什么分类问题中常使用交叉熵损失函数而没有使用均方差函数呢?

如下图证明所示,使用梯度下降法更新w和b时,sigmoid函数求导数会存在很多趋于0的数,使得迭代更新时更新缓慢。而使用交叉熵损失函数不需要对sigmoid函数求导数。

四、常见的分类和回归算法

1、回归算法:主要用于预测数值型数据。

线性回归(Linear Regression):这是最基本和常见的回归算法,它假设因变量和自变量之间存在线性关系,并通过最小化预测值和实际值之间的平方差来拟合数据。
线性回归实现见前一篇文章深度学习实现——线性回归-CSDN博客
决策树回归(Decision Tree Regression):决策树回归是一种基于树结构的回归方法,它通过构建决策树来划分数据空间,并在每个叶节点上拟合一个简单的模型(如常数或线性模型)。
随机森林回归(Random Forest Regression):随机森林回归是一种集成学习方法,它通过构建多个决策树并将它们的预测结果组合起来来提高回归性能。能够处理高维数据和非线性关系。

2、分类算法:主要用于发现类别规则并预测新数据的类别。

逻辑回归(Logistic Regression):尽管名字中有“回归”,但实际上逻辑回归是一种分类算法,常用于二分类问题。它通过逻辑函数将线性回归的输出映射到(0,1)之间,得到样本点属于某一类别的概率。
支持向量机(SVM):支持向量机是一种基于统计学习理论的分类算法。它通过寻找一个超平面来最大化不同类别之间的间隔,从而实现分类。SVM在高维空间和有限样本情况下表现出色,并且对于非线性问题也可以使用核函数进行扩展。
K近邻(KNN):K最近邻是一种基于实例的学习算法,它根据输入样本的K个最近邻样本的类别来确定输入样本的类别。
 

### KNN算法在分类回归任务中的差异 #### 分类任务中的KNN 在分类任务中,K近邻(KNN)算法通过计算测试样本与其最近邻居的距离来预测类别标签。具体来说,在给定的数据集中找到距离最近的`k`个训练实例,并依据这些邻居所属的主要类别决定新数据点的类别归属[^2]。 对于分类问题而言,最终输出的是离目标样本最接近的一组已知样本所占比例最的那一类标签作为预测结果。例如: ```python from sklearn.neighbors import KNeighborsClassifier from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score # 加载鸢尾花数据集并划分训练集与测试集 data = load_iris() X_train, X_test, y_train, y_test = train_test_split(data.data, data.target) # 创建KNN分类器对象并将模型拟合到训练数据上 clf = KNeighborsClassifier(n_neighbors=15) clf.fit(X_train, y_train) # 计算准确率得分 accuracy_train = accuracy_score(y_train, clf.predict(X_train)) accuracy_test = accuracy_score(y_test, clf.predict(X_test)) print(f'Training Accuracy: {accuracy_train:.4f}') print(f'Testing Accuracy: {accuracy_test:.4f}') ``` #### 回归任务中的KNN 而在回归场景下,KNN的工作方式略有不同。此时的目标不再是寻找多数投票最多的类别,而是基于选定的`k`个临近点估计连续型变量值。通常采用的方法是对这`k`个邻居的实际数值取平均数或加权均值以得出预测值。 针对回归分析,可以利用如下代码实现简单的线性关系建模: ```python from sklearn.neighbors import KNeighborsRegressor import numpy as np # 构造简单的人工数据用于演示目的 np.random.seed(0) X_reg = np.sort(5 * np.random.rand(40, 1), axis=0) y_reg = np.sin(X_reg).ravel() # 添加一些噪声使情况更贴近现实世界应用 y_reg[::5] += 1 * (0.5 - np.random.rand(8)) # 使用默认参数初始化KNN回归器并进行拟合操作 regressor = KNeighborsRegressor(n_neighbors=5) regressor.fit(X_reg, y_reg) # 预测新的输入向量对应的响应变量值 new_input = [[2.]] predicted_value = regressor.predict(new_input) print(f'Predicted value for input {new_input}: {predicted_value[0]:.4f}') ``` 种情况下虽然都依赖于相似的核心概念——即考虑周围样本来做出决策,但在处理不同类型的任务时采取的具体策略存在明显区别
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值