机器学习之SGDLR
SGDLR全称为the Stochastic Gradient Descent for Logistic Regression,即随机梯度下降的逻辑回归算法.学习完本实验后,我们将会了解:
如何使用逻辑回归模型进行预测。
如何使用随机梯度下降估计系数。
如何将逻辑回归应用于实际预测问题
从题目中我们就知道这次实验涉及逻辑回归技术和随机梯度下降.
先来说一下逻辑回归.
Logistic 回归是二分类任务的首选方法。它输出一个 0 到 1 之间的离散二值结果。简单来说,它的结果不是 1 就是 0。
Logistic 回归通过使用其固有的 logistic 函数估计概率,来衡量因变量(我们想要预测的标签)与一个或多个自变量(特征)之间的关系。
然后这些概率必须二值化才能真地进行预测。这就是 logistic 函数的任务,也称为 Sigmoid 函数。Sigmoid 函数是一个 S 形曲线,它可以将任意实数值映射到介于 0 和 1 之间的值,但并不能取到 0或1。然后使用阈值分类器将 0 和 1 之间的值转换为 0 或 1。
下面的图片说明了 logistic 回归得出预测所需的所有步骤。
下面是 logistic 函数(sigmoid 函数)的图形表示:
再来看看什么是随机梯度下降(Stochastic Gradient Descent)
首先需要了解梯度下降:
梯度下降(Gradient Descent)是遵循成本函数的梯度来最小化一个函数的过程。这个过程涉及到对成本形式以及其衍生形式的认知,使得我们可以从已知的给定点朝既定方向移动。比如向下朝最小值移动。 在机器学习中,我们可以利用随机梯度下降的方法来最小化训练模型中的误差,即每次迭代时完成一次评估和更新。 这种优化算法的工作原理是模型每看到一个训练实例,就对其作出预测,并重复迭代该过程到一定的次数。这个流程可以用于找出能导致训练数据最小误差的模型的系数.
随机梯度下降(SGD)也称为增量梯度下降,是一种迭代方法,用于优化可微分目标函数。该方法通过在小批量数据上计算损失函数的梯度而迭代地更新权重与偏置项。SGD在高度非凸的损失表面上远远超越了朴素梯度下降法,这种简单的爬山法技术已经主导了现代的非凸优化。
梯度下降的参数依据下面的式子更新
当模型在每见到一组训练数据都对参数进行更新时,我们称这种梯度下降法为SGD,即如下过程:
1.初始化参数(θ,学习率
α
\alpha
α)
2.计算每个θ处的梯度
3.更新参数
4.重复步骤2 和3,直到代价值稳定
本次实验分为三步:做出预测,估计参数,使用实际数据集进行预测
第一步:做出预测
首先写一个可以进行预测的函数。
在随机梯度下降中的候选系数值的评估中以及在模型完成之后,我们希望开始对测试数据或新数据进行预测。
下面是一个名为predict()的函数,它预测给定一组系数的输出值。
第一个系数总是截距,也称为偏差或b0,因为它是独立的,不负责特定的输入值。
我们还可以使用先前准备的系数,以及给出一些数据集来进行预测。
有两个输入值(X1和X2)和三个系数值(b0,b1和b2)。 我们为这个问题建模的预测方程是:
y = 1.0 / (1.0 + e^(-(b0 + b1 * X1 + b2 * X2)))
或者,我们手动选择的具体系数值为:
y = 1.0 / (1.0 + e^(-(-0.406605464 + 0.852573316 * X1 + -1.104746259 * X2)))
运行此函数,我们可以得到与预期输出(y)值相当接近的预测,并在舍入时对类进行正确的预测。
现在我们准备实施随机梯度下降来优化我们的系数值。
第二步,估计参数
我们可以使用随机梯度下降来估计训练数据的系数值。
随机梯度下降需要两个参数:
Learning Rate:用于限制每次更新时每个系数的校正量。
Epochs:更新系数时运行训练数据的次数。
我们需要在函数中执行3个循环:
循环每个Epoch。
循环遍历训练数据中的每一行以获得一个epoch。
循环遍历每个系数并将其更新为一个epoch中的一行。
系数根据模型产生的误差进行更新。预期输出值与利用候选系数进行的预测之间的差异就是产生的误差.
有一个系数可以对每个输入属性进行加权,并且这些系数以一致的方式更新,例如:
b1(t+1) = b1(t) + learning_rate * (y(t) - yhat(t)) * yhat(t) * (1 - yhat(t)) * x1(t)
除非没有输入,否则开头的特殊系数(也称为截距)以类似的方式更新,因为它与特定输入值无关:
b0(t+1) = b0(t) + learning_rate * (y(t) - yhat(t)) * yhat(t) * (1 - yhat(t))
下面是一个名为coefficients_sgd()的函数,它使用随机梯度下降计算训练数据集的系数值。
同样给出数据集进行测试
我们使用更大的Learning rate 0.3并且将模型训练100个epoch.运行该示例在每个epoch打印一条消息,该消息包含该epoch的总和平方误差和最后一组系数。
你可以看到即使在最后一个epoch,error仍会继续下降。 我们可以训练更长时间(更多epoch)或增加每个时期更新系数的量(更高的learning rate)。
前期工作都做完了,接下里我们来使用实际的数据集.
我们将使用糖尿病数据集上的随机梯度下降来训练逻辑回归模型。
数据集名为pima-indians-diabetes.csv。
Pima Indians数据集涉及在皮马印第安人中预测5年内糖尿病的发病情况,并提供基本医疗细节。
这是一个二元分类问题,其中预测是0(无糖尿病)或1(糖尿病)。
它包含768行和9列。 文件中的所有值都是数字.该问题的基线性能为65.098%分类准确率。
首先加载数据集,将字符串值转换为数字,并将每列标准化为0到1范围内的值。这可以通过辅助函数load_csv()和str_column_to_float()来加载和准备数据集.
然后使用dataset_minmax( )和normalize_dataset()来规范化它。
我们将使用k折交叉验证来估计学习模型的性能。这意味着我们将构建和评估k模型并将性能估计为平均模型性能。功能写在cross_validation_split()中了
分类的精度将用于评估每个模型,写在accuracy_metric()
使用k折验证评估算法,写在evaluate_algorithm()
我们将使用上面创建的predict(),coefficients_sgd()函数和一个新的logistic_regression()函数来训练模型。
在调用前加载数据
规范化数据
完整的代码就不截图了,写在SGDLR.py中了
运行后结果如图
可以看到这次得出的准确率比基线65%稍微高了一些.