python实战教程python机器学习

初学者应该如何学习Python?
对于初学者来说,要做的就是专注于 Python 这一门语言,明确学习的重点,把握好学习节奏,由浅入深循序渐进地学习。根据本人多年的学习工作经验,把编程语言的学习分为以下 3 步,无论你是否有编程基础,都可以对照着来做。

  1. 多实践,积累代码量
    任何一门编程语言,其囊括的知识面都是非常广泛的,从基本的变量赋值、条件循环、到文件操作、并发编程等。但是,千万不要等到把所有知识点都学完了才开始练习,因为到那时你会发现,前面好不容易记住的知识都忘记了。

学习编程,是十分讲究实战的,没有捷径可走,越早练习,练得越多越勤,学习效果就越好。

  1. 时刻注意代码规范
    学习编程语言,在追求快和高效的同时,每一种编程语言都有必要的编码规范,一定不能忽略。

要想成为一名优秀的程序员,从起步阶段就要刻意地去培养自己的编程规范。例如,在刚开始编写代码时,不要将原本多行的代码全部写到一行,也不要随便用 a、b、c 等字母作为变量的名称。

  1. 开发经验是必不可少的
    要想真正熟练地掌握 Python(或者其它编程语言),拥有大中型产品的开发经验是必不可少的,它会让你站得更高,望得更远。

例如,我们几乎每天都会用搜索引擎,但你了解一个搜索引擎的服务器端实现吗?这是一个典型的面向对象设计,需要定义一系列相关的类和函数,还要从产品需求、代码复杂度、效率以及可读性等多个方面综合考量,同时在上线后还要进行各种优化等。
想象一下-你已经在给定的数据集上训练了机器学习模型,并准备好将它交付给客户。但是,你如何确定该模型能够提供最佳结果?是否有指标或技术可以帮助你快速评估数据集上的模型?

当然是有的,简而言之,机器学习中损失函数可以解决以上问题。

损失函数是我们喜欢使用的机器学习算法的核心。但大多数初学者和爱好者不清楚如何以及在何处使用它们。

它们并不难理解,反而可以增强你对机器学习算法的理解。那么,什么是损失函数,你如何理解它们的意义?

在本文中,我将讨论机器学习中使用的7种常见损失函数,并解释每种函数的使用方法。

  1. 什么是损失函数?

假设你在山顶,需要下山。你如何决定走哪个方向?

我要做的事情如下:

环顾四周,看看所有可能的路径
拒绝那些上升的路径。这是因为这些路径实际上会消耗更多的体力并使下山任务变得更加艰难
最后,走我认为的坡度最大的路径
关于我判断我的决策是否好坏的直觉,这正是损失函数能够提供的功能。

损失函数将决策映射到其相关成本

决定走上坡的路径将耗费我们的体力和时间。决定走下坡的路径将使我们受益。因此,下坡的成本是更小的。

在有监督的机器学习算法中,我们希望在学习过程中最小化每个训练样例的误差。这是使用梯度下降等一些优化策略完成的。而这个误差来自损失函数。

损失函数(Loss Function)和成本函数(Cost Function)之间有什么区别?

在此强调这一点,尽管成本函数和损失函数是同义词并且可以互换使用,但它们是不同的。

损失函数用于单个训练样本。它有时也称为误差函数(error function)。另一方面,成本函数是整个训练数据集的平均损失(average function)。优化策略旨在最小化成本函数。

  1. 回归损失函数

此时你必须非常熟悉线性回归。它涉及对因变量Y和几个独立变量 X_i 之间的线性关系进行建模。因此,我们在空间中对这些数据拟合出一条直线或者超平面。

Y = a0 + a1 * X1 + a2 * X2 + …+ an * Xn我们将使用给定的数据点来找到系数a0,a1,…,an。

python实战教程python机器学习
我们将使用著名的波士顿住房数据集来理解这个概念。为了简单起见,我们将只使用一个特征-每个住宅的平均房间数(Average number of rooms per dwelling)(X)来预测因变量-1000美元价位的房屋的中位数价值(Median Value)(Y)。
python实战教程python机器学习
我们将使用梯度下降(Gradient Descent)作为优化策略来查找回归线。我不会详细介绍Gradient Descent的细节,但这里提醒一下权重更新规则:
python实战教程python机器学习
这里,θ_j 是要更新的权重,α 是学习率,J 是成本函数。成本函数由 θ 参数化。我们的目标是找到产生最小总成本的 θ 值。

我已经为下面的每个损失函数定义了我们将遵循的步骤:

写出预测函数f(X)的表达式,并确定我们需要找到的参数
确定每个训练样本计算得到的损失
找到成本函数(所有样本的平均损失)的表达式
找到与每个未知参数相关的成本函数的梯度
确定学习率并在固定次数中进行迭代执行权重更新规则
2.1. 平方误差损失

每个训练样本的平方误差损失(也称为L2 Loss)是实际值和预测值之差的平方:

python实战教程python机器学习
相应的成本函数是这些平方误差的平均值(MSE)。

推荐你引用以下代码时先尝试自己计算出梯度

def update_weights_MSE(m, b, X, Y, learning_rate): m_deriv = 0 b_deriv = 0 N = len(X) for i in range(N): # 计算偏导数为 # -2x(y - (mx + b)) m_deriv += -2X[i] * (Y[i] - (mX[i] + b)) # -2(y - (mx + b)) b_deriv += -2*(Y[i] - (m*X[i] + b)) # 我们减去它,因为导数指向最陡的上升方向 m -= (m_deriv / float(N)) * learning_rate b -= (b_deriv / float(N)) * learning_rate return m, b在波士顿住房数据上,在不同的学习率中分别迭代了500次得到下图:

python实战教程python机器学习
让我们再谈谈MSE损失函数,它是一个二次函数(形式为ax^2+bx+c),并且值大于等于0。二次函数的图形如下图所示:
python实战教程python机器学习
二次函数仅具有全局最小值。由于没有局部最小值,所以我们永远不会陷入它。因此,可以保证梯度下降将收敛到全局最小值(如果它完全收敛)。

MSE损失函数通过平方误差来惩罚模型犯的大错误。把一个比较大的数平方会使它变得更大。但有一点需要注意,这个属性使MSE成本函数对异常值的健壮性降低。因此,如果我们的数据容易出现许多的异常值,则不应使用这个它。

自学python,可以找我领取参考教程。我的抠抠前面是169,中间是0729,后面是198,数字连起来就行了
2.2. 绝对误差损失

每个训练样本的绝对误差是预测值和实际值之间的距离,与符号无关。绝对误差也称为L1 Loss:
python实战教程python机器学习
正如我之前提到的,成本是这些绝对误差的平均值(MAE)。

与MSE相比,MAE成本对异常值更加健壮。但是,在数学方程中处理绝对或模数运算符并不容易。我们可以认为这是MAE的缺点。

以下是MAE成本更新权重的代码

def update_weights_MAE(m, b, X, Y, learning_rate): m_deriv = 0 b_deriv = 0 N = len(X) for i in range(N): #计算偏导数 # -x(y - (mx + b)) / |mx + b| m_deriv += - X[i] * (Y[i] - (mX[i] + b)) / abs(Y[i] - (mX[i] + b)) # -(y - (mx + b)) / |mx + b| b_deriv += -(Y[i] - (mX[i] + b)) / abs(Y[i] - (mX[i] + b)) #我们减去它,因为导数指向最陡的上升方向 m -= (m_deriv / float(N)) * learning_rate b -= (b_deriv / float(N)) * learning_rate return m, b在不同学习速率中分别迭代500次后,我们得到以下图:
python实战教程python机器学习
2.3. Huber损失

Huber损失结合了MSE和MAE的最佳特性。对于较小的误差,它是二次的,否则是线性的(对于其梯度也是如此)。Huber损失需要确定 δ 参数:

python实战教程python机器学习
def update_weights_Huber(m, b, X, Y, delta, learning_rate): m_deriv = 0 b_deriv = 0 N = len(X) for i in range(N): # 小值的二次导数,大值的线性导数 if abs(Y[i] - mX[i] - b) <= delta: m_deriv += -X[i] * (Y[i] - (mX[i] + b)) b_deriv += - (Y[i] - (mX[i] + b)) else: m_deriv += delta * X[i] * ((mX[i] + b) - Y[i]) / abs((mX[i] + b) - Y[i]) b_deriv += delta * ((mX[i] + b) - Y[i]) / abs((m*X[i] + b) - Y[i]) #我们减去它,因为导数指向最陡的上升方向 m -= (m_deriv / float(N)) * learning_rate b -= (b_deriv / float(N)) * learning_rate return m, b我们以0.0001的学习速率分别对 δ 参数的不同值进行500次权重更新迭代得到下图:
python实战教程python机器学习
自学python,可以找我领取参考教程。我的抠抠前面是169,中间是0729,后面是198,数字连起来就行了

Huber损失对于异常值比MSE更强。它用于稳健回归(robust regression),M估计法(M-estimator)和可加模型(additive model)。Huber损失的变体也可以用于分类。