TowardsDataScience 博客中文翻译 2020(五百九十八)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

逻辑回归模型拟合和寻找相关性、P 值、Z 值、置信区间等

原文:https://towardsdatascience.com/logistic-regression-model-fitting-and-finding-the-correlation-p-value-z-score-confidence-8330fb86db19?source=collection_archive---------12-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由汉尼斯·沃尔夫Unsplash 上拍摄

静态模型拟合,并使用 Python 的 Statsmodels 库从拟合的模型中提取结果,其中包含一个真实的示例

大多数没有强大统计学背景的数据科学家可能会认为逻辑回归是一种机器学习模型。确实如此。但是在统计学上已经存在很久了。

统计学是数据科学和机器学习中非常重要的一部分。因为对于任何类型的探索性数据分析或机器学习算法来说,了解数据集的特征、它们如何相互关联、一个特征如何影响其他特征以及整体输出都是至关重要的。

幸运的是 python 有一个神奇的库,叫做“statsmodels”库。这个库有很好的功能来理解数据集,我们也可以使用这个库来进行预测。Statsmodels 库已经内置了模型,这些模型可以拟合数据以查找特征之间的相关性、学习系数、p 值、测试统计、标准误差和置信区间。

本文将通过一个例子解释一种统计建模技术。我将在这里解释二元结果变量的逻辑回归模型。这意味着结果变量只能有两个值,0 或 1。

我们还将分析:

1.预测变量(将用于预测结果变量的输入变量)之间的相关性,

2.如何从模型结果中提取有用的信息,

3.更好地呈现和理解数据的可视化技术

4.对结果的预测。我假设你有统计学和 python 的基础知识。

讨论的顺序:

  1. 一元基本逻辑回归模型拟合
  2. 通过示例了解赔率和对数赔率
  3. 双变量 Logistic 回归模型拟合
  4. 三变量 Logistic 回归模型拟合
  5. 拟合模型的可视化
  6. 预言;预测;预告

如果您需要复习置信区间和假设检验,请查看这些文章以清楚地理解这些主题:

[## 置信区间、计算和特征

什么是置信区间,如何计算它,以及它的重要特征

towardsdatascience.com?](/confidence-interval-calculation-and-characteristics-1a60fd724e1d) [## 假设检验、特征和计算

什么是假设检验,它的重要特征,以及如何进行假设检验

towardsdatascience.com](/hypothesis-testing-characteristics-and-calculation-ba3bdf516ea5)

使用的工具

对于本教程,我们将使用:

  1. Numpy 库
  2. 熊猫图书馆
  3. Matplotlib 库
  4. 海洋图书馆
  5. Statsmodels 库
  6. Jupyter 笔记本环境。

资料组

我使用了来自 Kaggle 的心脏数据集。我在我的 GitHub 存储库中有它。如果您想跟进,请从该链接免费下载:

[## rashida 048/数据集

在 GitHub 上创建一个帐户,为 rashida048/Datasets 开发做出贡献。

github.com](https://github.com/rashida048/Datasets/blob/master/Heart.csv)

让我们导入必要的包和数据集。

%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import statsmodels.api as sm
import numpy as npdf = pd.read_csv('Heart.csv')
df.head()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

最后一栏“AHD”只包含“是”或“否”,它告诉你一个人是否有心脏病。用 1 和 0 替换“是”和“否”。

df['AHD'] = df.AHD.replace({"No":0, "Yes": 1})

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

逻辑回归模型提供了一个事件的可能性。

单变量基本逻辑回归

让我们深入建模。我会解释每一步。我建议,在你阅读的时候,不断地为自己运行代码,以便更好地吸收材料。

逻辑回归是线性回归的改进版本。

提醒一下,下面是线性回归公式:

Y = AX + B

这里 Y 是输出,X 是输入,A 是斜率,B 是截距。

让我们深入到建模部分。我们将用一个 广义线性模型***【GLM】***为例。

变数太多了。哪一个可能是那个变量?

众所周知,一般来说,心脏病大多发生在老年人群中。年轻人口不太可能患心脏病。我现在把“年龄”作为唯一的协变量。我们稍后将添加更多的协变量。

model = sm.GLM.from_formula("AHD ~ Age", family = sm.families.Binomial(), data=df)result = model.fit()
result.summary()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

结果总结看起来很复杂很吓人吧?我们将主要关注这一部分。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

现在,让我们来理解上面所有的术语。

系数

首先,我们有系数,其中-3.0059 是 B,0.0520 是 A(想想线性回归公式 Y = AX + B)。

根据表中的 p 值,如果一个人的年龄增加 1 个单位,他/她患心脏病的几率将增加 0.052 个单位(上表中与年龄相关的系数)。

标准错误

标准误差为 0.014,表示估计斜率与真实斜率的距离。

z

z 统计值为 3.803 意味着预测的斜率将比零高 3.803 个单位。

置信区间

最后两列是置信区间(95%)。这里的置信区间是 0.025 和 0.079。稍后,我们将可视化整个数据长度的置信区间。

赔率和对数赔率

逻辑回归模型提供了事件的“可能性”。记住,“几率”是不同尺度上的概率。公式如下:

如果事件的概率为 p,

那件事的概率是 p/(1-p)

赔率是概率的变换。根据这个公式,如果概率是 1/2,那么‘赔率’就是 1。

为了清楚地理解概率和对数概率,让我们来看一个例子。我们将使用性别变量。

**因为一个分类变量对此是合适的。**检查数据集中患有心脏病的男性和女性的比例。

df["Sex1"] = df.Sex.replace({1: "Male", 0:"Female"})
c = pd.crosstab(df.Sex1, df.AHD)
c = c.apply(lambda x: x/x.sum(), axis=1)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

让我们计算一下男性和女性患心脏病的几率。

c["odds"] = c.loc[:, 1] / c.loc[:, 0]

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

“几率”显示,女性患心脏病的概率大大低于男性(32%比 53%),这在几率中得到了很好的反映。在处理两个人群时,比值比是常用的。

c.odds.Male / c.odds.Female

这个比率是 3.587,这表明男性患心脏病的几率是女性的 3.587 倍。

记住,个体概率不能从奇数比率中计算出来

另一个重要的惯例是使用对数比数,即对数标度的比数。

回想一下,概率的中性点是 0.5。使用“赔率”的公式,0.5 的赔率是 1,“对数赔率”是 0(1 的对数是 0)。

在我们的实验中,男性患心脏病的几率更大,几率在 1 到无穷大之间。与此同时,女性患心脏病的几率为 0 比 1。

下面是对数赔率的计算:

c['logodds'] = np.log(c.odds)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

这里,女性人口的对数优势为负,这表明不到 50%的女性患有心脏病。

男性的对数比是正的,略大于 0,这意味着超过一半的男性患有心脏病。

**从下面的模型总结中,log odds 和 logistic 回归之间的关系会更加清晰。**让我们看看仅使用性别变量的模型摘要:

model = sm.GLM.from_formula("AHD ~ Sex1", family = sm.families.Binomial(), data=df)result = model.fit()
result.summary()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

看上面的系数。

男性的逻辑回归系数为 1.2722,应该等于男性的对数优势减去女性的对数优势。

c.logodds.Male - c.logodds.Female

这个差值正好是 1.2722。

一个有三个协变量的逻辑回归模型

我们可以使用多个协变量。我在这里同时使用了“年龄”和“性别 1”变量。在我们深入研究这个模型之前,我们可以对分类变量进行初步分析。检查数据集中患有心脏病的男性和女性的比例。

df["Sex1"] = df.Sex.replace({1: "Male", 0:"Female"})
c = pd.crosstab(df.Sex1, df.AHD)
c = c.apply(lambda x: x/x.sum(), axis=1)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

现在,使用“年龄”和“性别”变量生成一个模型。

model = sm.GLM.from_formula("AHD ~ Age + Sex1", family = sm.families.Binomial(), data=df)
result = model.fit()
result.summary()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

更好地理解系数。将性别添加到模型中会稍微改变“年龄”参数的系数(0.0520 到 0.0657)。

根据这个拟合模型,老年人比年轻人更容易患心脏病。心脏病的对数几率每年增加 0.0657 个单位。

如果一个人老了 10 岁,他或她患心脏病的几率会增加 0.0657 * 10 = 0.657 个单位。

在性别变量的情况下,女性是参考,因为它没有出现在输出中。

在比较同龄的男性和女性时,男性患心脏病的几率要高 1.4989 个单位。

现在,让我们看看性别和年龄的影响。如果将 40 岁的女性与 50 岁的男性进行比较,男性患心脏病的对数优势比女性大 1.4989 + 0.0657 * 10 = 2.15559 个单位。

所有的系数都是对数比标度。您可以对这些值取幂,将其转换为赔率

一个有三个协变量的逻辑回归模型

现在,我们将拟合一个有三个协变量的逻辑回归。这一次,我们将添加“胆固醇”或“年龄”和“性别 1”的胆固醇变量。

model = sm.GLM.from_formula("AHD ~ Age + Sex1 + Chol", family = sm.families.Binomial(), data=df)
result = model.fit()
result.summary()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

如你所见,在添加了“Chol”变量后,“Age”变量的系数降低了一点,“Sex1”变量的系数升高了一点。

“性别 1”系数的变化大于“年龄”系数。这是因为与“年龄”协变量相比,“胆固醇”与“性别 1”协变量的相关性更好。让我们检查一下相关性:

df[['Age', 'Sex', 'Chol']].corr()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

拟合模型的可视化

我们将从绘制回归模型定义的不同亚人群的心脏病人口比例开始。我们将绘制心脏病发病率随年龄变化的曲线图。

我们将修正一些我们希望在可视化中关注的值。我们将设想“年龄”对胆固醇水平为 250 的女性人口的影响。

from statsmodels.sandbox.predict_functional import predict_functionalvalues = {"Sex1": "Female", "Sex":0, "AHD": 1, "Chol": 250}pr, cb, fv = predict_functional(result, "Age", values=values, ci_method="simultaneous")ax = sns.lineplot(fv, pr, lw=4)
ax.fill_between(fv, cb[:, 0], cb[:, 1], color='grey', alpha=0.4)
ax.set_xlabel("Age")
ax.set_ylabel("Heart Disease")

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

我们刚刚绘制了患心脏病概率的拟合对数比数和 95%的置信区间。置信带更合适。信心带看起来是弯曲的,这意味着它在整个年龄范围内是不一致的。

我们可以用概率而不是对数几率来形象化。可以使用公式 1 / (1 + exp(-lo))从对数优势计算概率,其中 lo 是对数优势。

pr1 = 1 / (1 + np.exp(-pr))
cb1 = 1 / (1 + np.exp(-cb))
ax = sns.lineplot(fv, pr1, lw=4)
ax.fill_between(fv, cb1[:, 0], cb[:, 1], color='grey', alpha=0.4)
ax.set_xlabel("Age", size=15)
ax.set_ylabel("Heart Disease")

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

这就是概率尺度有时存在的问题。

虽然概率值限于 0 和 1,但置信区间不受限制。

上面的图描绘了平均值。平均来说,如果胆固醇水平为 250,那么女性患心脏病的概率就是这样。接下来,我们将以一种不同的方式可视化,这种方式称为部分剩余图。

在这个图中,它将只显示一个协变量的影响,而其他协变量是固定的。这显示了更小的差异。所以,剧情不会像以前那样一帆风顺。记住,如果样本量不是很大,那么小的差异是不可靠的。

from statsmodels.graphics.regressionplots import add_lowess
fig = result.plot_partial_residuals("Age")
ax = fig.get_axes()[0]
ax.lines[0].set_alpha(0.5)
_ = add_lowess(ax)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

这张图显示,从 53 岁到 60 岁,心脏病发病率迅速上升。

预言;预测;预告

利用模型的结果,我们可以预测一个人是否患有心脏病。我们之前拟合的模型是为了解释模型参数。为了预测的目的,我将使用数据帧中的所有变量。因为我们没有太多的变量。让我们检查变量之间的相关性。

df['ChestPain'] = df.ChestPain.replace({"typical":1, "asymptomatic": 2, 'nonanginal': 3, 'nontypical':4})df['Thal'] = df.Thal.replace({'fixed': 1, 'normal': 2, 'reversable': 3})
df[['Age', 'Sex1', 'Chol','RestBP', 'Fbs', 'RestECG', 'Slope', 'Oldpeak', 'Ca', 'ExAng', 'ChestPain', 'Thal']].corr()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

我们可以看到,每个变量都与其他变量有一定的相关性。我将使用所有的变量来得到一个更好的预测。

model = sm.GLM.from_formula("AHD ~ Age + Sex1 + Chol + RestBP+ Fbs + RestECG + Slope + Oldpeak + Ca + ExAng + ChestPain + Thal", family = sm.families.Binomial(), data=df)
result = model.fit()
result.summary()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

我们可以使用预测函数来预测结果。但是预测函数只使用数据帧。因此,让我们准备一个包含变量的数据框架,然后使用 predict 函数。

X = df[['Age', 'Sex1', 'Chol','RestBP', 'Fbs', 'RestECG', 'Slope', 'Oldpeak', 'Ca', 'ExAng', 'ChestPain', 'Thal']]
predicted_output = result.predict(X)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

预测输出应该是 0 或 1。当输出大于或等于 0.5 时为 1,否则为 0。

for i in range(0, len(predicted_output)):
    predicted_output = predicted_output.replace()
    if predicted_output[i] >= 0.5:
        predicted_output = predicted_output.replace(predicted_output[i], 1)
    else:
        predicted_output = predicted_output.replace(predicted_output[i], 0)

现在,将该预测输出与指示心脏病的数据帧的“AHD”列进行比较,以确定准确性:

accuracy = 0
for i in range(0, len(predicted_output)):
    if df['AHD'][i] == predicted_output[i]:
        accuracy += 1
accuracy/len(df)

精度达到 0.81%或 81%,非常好。

结论

在本文中,我试图解释统计模型拟合,如何解释拟合模型的结果,一些可视化技术来呈现置信区间的对数优势,以及如何使用拟合模型结果预测二元变量。我希望这有所帮助。

欢迎在推特上关注我,并喜欢我的脸书页面。

更多阅读:

[## 数据科学家假设检验完全指南,Python 示例

用样本研究问题、解决步骤和完整代码清楚地解释

towardsdatascience.com](/a-complete-guide-to-hypothesis-testing-in-python-6c34c855af5c) [## 置信区间的完整指南,以及 Python 中的示例

对统计学中一个非常流行的参数——置信区间及其计算的深入理解

towardsdatascience.com](/a-complete-guide-to-confidence-interval-and-examples-in-python-ff417c5cb593) [## 单变量和多变量高斯分布:用视觉完全理解

详细的高斯分布及其与均值、标准差和方差的关系

towardsdatascience.com](/univariate-and-multivariate-gaussian-distribution-complete-understanding-with-visuals-97951897503c) [## 学习机器学习和深度学习的优质免费课程

顶级大学高质量免费课程的链接

towardsdatascience.com](/great-quality-free-courses-to-learn-machine-learning-and-deep-learning-1029048fd0fc) [## Numpy 完全指南

日常工作中需要的所有数字方法

towardsdatascience.com](/a-complete-guide-to-numpy-fb9235fb3e9d) [## 练习数据科学技能和制作优秀投资组合所需的所有数据集

一些有趣的数据集提升你的技能和投资组合

towardsdatascience.com](/all-the-datasets-you-need-to-practice-data-science-skills-and-make-a-great-portfolio-857a348883b5)

逐步实施逻辑回归

原文:https://towardsdatascience.com/logistic-regression-step-by-step-implementation-f032a89936ca?source=collection_archive---------35-----------------------

从理论到实践

假设我们正在执行一个经典的预测任务,其中给定一个包含 n n n个变量的输入向量:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

并预测 1 个响应变量 y y y(可能是明年的销售额、房价等。),最简单的形式是使用线性回归进行预测,公式如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中 W W W是维数为 n n n的列向量。比如现在我们的问题变了一点,我们希望预测一个概率,比如明天下雨的概率是多少?在这种意义上,这种线性回归可能有点不合适,因为线性表达式可以是无限的,但我们的概率范围是 [ 0 , 1 ] [0,1] [01]

Sigmoid 函数

为了将我们的预测限制在 [ 0 , 1 ] [0,1] [01],广泛使用的技术是应用一个sigmoid函数:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用numpy,我们可以很容易地将功能可视化。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

损失函数

逻辑回归的损失函数的定义是:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中,y_hat是我们的预测值,范围是$[ 0,1]$而y是真实值。当实际值为y = 1时,等式变为:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

y_hat越接近 1,我们的损失就越小。而y = 0也是如此。

梯度下降

给定这个实际值y,我们希望将损失L最小化,我们这里要应用的技术是梯度下降(细节已经在这里说明),基本上我们需要做的是对我们的变量应用导数,并将它们稍微向下移动到最优值。

这里我们有两个变量,Wb,对于这个例子,它们的更新公式是:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中W是一个列向量,其n权重对应于x^(i)n维度。为了得到我们目标的导数,将应用链式法则:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

你可以自己试着推导,唯一棘手的部分是sigmoid函数的导数,要得到一个好的解释你可以参考这里的

批量训练

上面给出了向前和向后更新的过程,如果我们一次一个地输入我们的训练模型,这足以实现逻辑回归。然而,在大多数培训案例中,我们不会这样做。取而代之的是,训练样本被分批馈送,并且反向传播用该批次的平均损失来更新。

这意味着对于一个一次输入m个样本的模型,损失函数将是:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中i表示ith训练样本。

批量训练的正向传播

现在,代替使用单个向量x作为我们的输入,我们指定大小为n x m的矩阵X,其中如上所述,n是特征的数量,m是训练样本的数量(基本上,我们在矩阵中排列m个训练样本)。现在公式变成了:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

注意,这里我们使用大写字母来表示我们的矩阵和向量(注意这里的b仍然是单个值,更正式的方式是将b表示为向量,但是在 python 中,将单个值添加到矩阵会自动广播)。

让我们逐个分解矩阵的大小。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

生成分类任务

我们的公式到此结束,让我们实现我们的算法,在此之前需要生成一些数据来完成分类任务(整个实现也在我的 git repo 中)。

履行

现在一切都准备好了,让我们开始实现吧。

助手功能

  1. 接受数组的 sigmoid 函数
  2. Wb初始化为零的权重函数
  3. 精度函数来衡量我们的二进制预测的准确性

预言;预测;预告

我们的predict函数将简单地通过给定训练权重的正向过程

培养

注意,对于train函数,X的输入形状需要具有n x m的形状,Y需要具有1 x m的形状,其中m是批量大小。

输入需要转置,以适应我们的培训要求。

班级中的合奏

现在让我们把所有的东西集成到一个类中,看起来更有结构。为完整起见,还将实施分批培训

完整的培训详情可点击查看

逻辑回归:基础

原文:https://towardsdatascience.com/logistic-regression-the-basics-b1716661c71b?source=collection_archive---------19-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

尼克·霍克斯在 Unsplash 上的照片

理解逻辑回归技术的基础

介绍

逻辑回归是一种模拟事件概率的技术。就像线性回归一样,它帮助你理解一个或多个变量与一个目标变量之间的关系,只不过,在这种情况下,我们的目标变量是二元的:它的值不是 0 就是 1。例如,它可以允许我们说“吸烟会使你患肺癌的风险增加 20%”,因为患肺癌是一个二元变量:你要么有,要么没有(希望没有)。由此,我们可以推断出分类问题的答案。例如,它可以帮助我们做出有根据的猜测,如果某人不吸烟,住在污染的城市,并且有肺癌家族史,他/她是否会患肺癌。

也就是说,逻辑回归的结构也类似于线性回归模型的结构:你有一组解释变量(X1,X2…)和我们的目标二元变量(Y)。然而,其背后的功能有点复杂:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

P(Y=1)表示 Y 等于 1 的概率,而 b0 是与 X 无关的参数,B 是系数向量,表示 Y 与 X1、X2 等中的每一个之间的关系。

然后,逻辑回归将估计更适合您的数据的 b 参数值,通常使用最大似然法。一旦我们有了这些估计量,我们就可以计算新数据点的 P(Y=1 ),或者坚持这个概率,或者使用它根据一个阈值(例如:如果某人患肺癌的概率大于 50%,我们可以有根据地猜测他们会得肺癌)。

为了更好地理解线性回归和逻辑回归之间的差异,假设我们在 Y 轴绘制了肺癌变量(如果患者患有肺癌,Y = 1,否则为 0 ),在 X 轴绘制了患者的年龄。下面是每次回归的结果线。哪一个似乎更符合我们的数据?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:https://bit.ly/35MhQwg

开始弄脏我们的手

处理分类问题的最著名的数据集之一是泰坦尼克号数据集,其中有泰坦尼克号乘客的名单,他们的一些特征,如年龄、性别和姓名,以及他们是否在灾难中幸存(出于某种原因,许多分类问题往往与坏事有关,如肺癌和在灾难中死亡)。我们将在 R 中工作,但是如果你愿意,你可以在 Python 中做同样的事情。

让我们先来看看可用的变量:

**IN:** path = 'insert you file path here'
data = read.csv(paste(path,'train.csv', sep = ""))
colnames(data)**OUT:**
 [1] "PassengerId" "Survived"    "Pclass"      "Name"        "Sex"         "Age"         "SibSp"      
 [8] "Parch"       "Ticket"      "Fare"        "Cabin"       "Embarked"

所以,除了 Id,我们还有一些可能有用的信息,比如他们在船上的级别(第一、第二或第三)和他们的性别。

数据清理

在我们开始建模之前,我们必须清理我们的数据。但是,请记住,本文的目标是介绍逻辑回归,而不是数据清理,所以我们在这里不做太深入的讨论。

**IN:** data$Age[is.na(data$Age)] = median(data$Age,na.rm=T)
data$Pclass = as.factor(data$Pclass)

我们必须首先用年龄的中位数来代替缺失的年龄。然后,我们将乘客类特性转化为一个因子:这意味着,R 将把它作为一个类别读取,而不是作为整数读取,这在这种情况下更有意义。

训练/测试分割

下一步是将我们的数据集分为训练和测试,这样我们就可以构建我们的模型,然后在另一个数据集中计算我们的模型尚未使用的一些准确性指标。我们为训练集选择了一个任意的大小,但它通常是原始数据集的 70%到 80%左右。

**IN:**
train = data[1:700,]
test = data[701:889,]

系统模型化

对于我们的第一个模型,让我们选择一些我们凭直觉认为可能与泰坦尼克号灾难幸存概率有某种联系的变量。我个人认为,乘客的阶级、年龄和性别可以帮助我们预测他们是否幸存:

**IN:**
model = glm(Survived ~ Pclass + Sex + Age,
             family = binomial(link = 'logit'), data = train)
summary(model)**OUT:**
Call:
glm(formula = Survived ~ Pclass + Sex + Age, family = binomial(link = "logit"), 
    data = train)Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.5352  -0.7055  -0.4390   0.6186   2.3728Coefficients:
             Estimate Std. Error z value Pr(>|z|)    
(Intercept)  3.226908   0.398636   8.095 5.73e-16 ***
Pclass2     -0.908714   0.288174  -3.153 0.001614 ** 
Pclass3     -2.153203   0.268262  -8.026 1.00e-15 ***
Sexmale     -2.603025   0.209018 -12.454  < 2e-16 ***
Age         -0.027199   0.008157  -3.334 0.000855 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1(Dispersion parameter for binomial family taken to be 1)Null deviance: 934.43  on 699  degrees of freedom
Residual deviance: 645.20  on 695  degrees of freedom
AIC: 655.2Number of Fisher Scoring iterations: 4

哇,一下子这么多信息,对吧?但是现在让我们把注意力集中在基础上,从我们如何构建模型开始:

glm(存活~ Pclass +性别+年龄,家庭=二项式(link = 'logit '),数据=训练)

我们首先调用一个名为 glm 的函数,用于拟合广义线性模型。为了使它像逻辑回归一样工作,我们设置家庭=二项式和*链接=‘logit’。*对于我们的问题,我们也可以将 link 设置为’ probit’ 或’ cochit’ ,但是我们将坚持使用 logit 函数。它们之间的差异主要是理论上的,它们的结果通常是相当相似的。

Coefficients:
             Estimate Std. Error z value Pr(>|z|)    
(Intercept)  3.226908   0.398636   8.095 5.73e-16 ***
Pclass2     -0.908714   0.288174  -3.153 0.001614 ** 
Pclass3     -2.153203   0.268262  -8.026 1.00e-15 ***
Sexmale     -2.603025   0.209018 -12.454  < 2e-16 ***
Age         -0.027199   0.008157  -3.334 0.000855 ***

现在,继续讨论系数,我们可以看到它们都是负的(看一下估计值栏),这意味着所有这些变量都与生存概率负相关。那就是:作为一名男性或处于 2 类或 3 类(而不是作为一名女性或处于 1 类)使你在泰坦尼克号灾难中幸存的可能性更小。年龄系数也是负的,所以,年龄越大,存活的可能性越小。为了解释系数的精确值,让我们回到概率函数:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这里的截距系数是 b0,其他系数是向量 b。我们的模型看起来像这样(为了更好的可读性,我将系数四舍五入):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中,如果乘客在 2 等舱,Pclass2 = 1,否则为 0(其他变量类似,除了年龄,年龄等于乘客的实际年龄)。除了是我们概率方程的一部分之外,它们还帮助我们解释几率:性别男性的系数为-2.6 意味着当你是男性时存活的几率是女性时存活几率的 0.07 倍。

表中另一个重要的列是 Pr(>|z|),我们称之为 p 值。它显示了我们对估计系数显著性的确信程度(越接近零,我们越有信心)。如果我们有一些高 p 值的系数,我们可能不应该在我们的模型中包括相关的变量。

最后,我们将讨论的最后一项是 Akaike 信息标准(AIC),显示在模型总结的末尾。简而言之,AIC 是对我们将模型应用于测试样本时的误差的估计,它有助于我们比较模型(AIC 越小越好)。

现在,让我们尝试第二个模型,添加票价变量(乘客为机票支付了多少钱):

**IN:**
model2 = glm(Survived ~ Pclass + Sex + Age + Fare,
 family = binomial(link = ‘logit’), data = train)
summary(model2)**OUT:**
Call:
glm(formula = Survived ~ Pclass + Sex + Age + Fare, family = binomial(link = "logit"), 
    data = train)Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.5225  -0.7060  -0.4382   0.6187   2.3749Coefficients:
              Estimate Std. Error z value Pr(>|z|)    
(Intercept)  3.2957397  0.4738515   6.955 3.52e-12 ***
Pclass2     -0.9500899  0.3265572  -2.909 0.003621 ** 
Pclass3     -2.2016346  0.3229743  -6.817 9.31e-12 ***
Sexmale     -2.6085804  0.2100784 -12.417  < 2e-16 ***
Age         -0.0275303  0.0082521  -3.336 0.000849 ***
Fare        -0.0006707  0.0024848  -0.270 0.787211    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1(Dispersion parameter for binomial family taken to be 1)Null deviance: 934.43  on 699  degrees of freedom
Residual deviance: 645.13  on 694  degrees of freedom
AIC: 657.13Number of Fisher Scoring iterations: 4

请注意,票价的 p 值很高,这意味着它不是一个重要的变量,AIC 增加了,这意味着模型稍微差一些。一种可能是,由于我们已经考虑了乘客的等级,机票票价并没有增加太多新的信息。为了测试这一点,让我们运行第三个模型,使用 fare 但删除 Pclass:

**IN:**
model3 = glm(Survived ~  Sex + Age + Fare,
             family = binomial(link = 'logit'), data = train)
summary(model3)**OUT:**
Call:
glm(formula = Survived ~ Sex + Age + Fare, family = binomial(link = “logit”), 
 data = train)Deviance Residuals: 
 Min 1Q Median 3Q Max 
-2.2015 -0.6174 -0.5889 0.8093 1.9786Coefficients:
 Estimate Std. Error z value Pr(>|z|) 
(Intercept) 0.835415 0.250798 3.331 0.000865 ***
Sexmale -2.429141 0.192294 -12.632 < 2e-16 ***
Age -0.005092 0.007294 -0.698 0.485142 
Fare 0.009933 0.002412 4.119 3.81e-05 ***
 — -
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1(Dispersion parameter for binomial family taken to be 1)Null deviance: 934.43 on 699 degrees of freedom
Residual deviance: 701.47 on 696 degrees of freedom
AIC: 709.47Number of Fisher Scoring iterations: 4

这一次,我们的 AIC 显著恶化,票价有一个重要的系数,但年龄不再重要。知道为什么吗?在这里评论你的假设:)

现在,让我们将我们的第一个模型应用于测试样本,看看效果如何,该模型的性能优于以下两个模型:

**IN:**
predictions = ifelse(predict(model, newdata = test) > 0.5, 1, 0)accuracy = mean(predictions == test$Survived)
print(paste(‘Accuracy :’, accuracy))**OUT:**
"Accuracy : 0.825396825396825"

我们首先将我们的模型应用于测试集,并声明如果计算的概率大于 0.5,则乘客幸存。我们计算的第一个指标是准确性,它代表我们正确预测的比率。0.82 的准确度意味着我们 82%的预测是正确的。不错吧?嗯,看情况。想象一下 99%的乘客都死了。然后,我们可以预测所有乘客死亡,我们的准确率将达到 99%,而不需要为此建立模型。因此,我们应该在我们的度量中考虑幸存者的比率。这就是 ROC 曲线和 AUC 出现的原因。

ROC 代表接收器操作特性,它是真阳性率(当实际值为 1 时预测为 1 的概率)与假阳性率(当实际值为 0 时预测为 1 的概率)的曲线图。当我们绘制曲线并计算其下方的面积时,我们得到 AUC,代表曲线下的面积。该区域始终在 0.5 和 1 之间,考虑到 1 和 0 的样本分布,这为我们提供了衡量模型性能的良好尺度。

为了在 R 中进行这些计算,我们需要 ROCR 包:

**IN:**
library(ROCR)probabilities = predict(model, newdata = test)
prediction_object = prediction(probabilities, test$Survived)
roc = performance(prediction_object, measure = "tpr", x.measure = "fpr")
plot(roc)**OUT:**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们第一个模型的 ROC 曲线

曲线下的面积越大,我们的模型就越好,所以我们希望曲线尽可能靠近图的左上角。请注意,在我们的代码中,我们是如何使用 performance()函数创建它的,并对 x.measure 使用“fpr ”,对 measure 使用“tpr”。FPR 代表假阳性率,TPR 代表真阳性率。为了计算 auc,我们再次使用 performance()函数,但是这次我们输入“AUC”作为测量值:

**IN:**
perf_auc = performance(prediction_object, measure = “auc”)
auc = perf_auc@y.values[[1]]
print(paste(‘AUC :’, auc))**OUT:**
"AUC : 0.863385354141657"

我们有一个 0.86 的 AUC,这对于一个分类问题来说是相当不错的。

结论

逻辑模型用于分类问题,与更复杂的替代方案相比,它们的优势之一是可解释性:它们的结果很容易用外行人的话来解释。我们已经看到了如何在 R 中运行逻辑回归,理解它的结果,如何比较不同的模型并评估它们的性能。正如标题所示,这是一篇介绍性文章,我鼓励您深入挖掘由此产生的所有可能性。您可以通过为 glm()函数设置不同的链接或者添加/删除变量来尝试改进这个模型。也许有一种自动化的方法,比如线性回归?

你可以在这里访问完整的 R 脚本

逻辑回归-理论与实践

原文:https://towardsdatascience.com/logistic-regression-theory-and-practice-6442ed0692ff?source=collection_archive---------25-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由 ja maUnsplash

简介:

在这篇文章中,我将解释如何使用回归的概念,在具体的逻辑回归涉及分类的问题。分类问题在我们身边无处不在,经典的问题包括邮件分类、天气分类等。如果需要,所有这些数据可以用于训练逻辑回归模型,以预测任何未来实例的类别。

背景:

本文将涵盖以下子主题:

  1. 分类问题介绍。
  2. 逻辑回归及其所有性质,如假设、决策边界、成本、成本函数、梯度下降及其必要分析。
  3. 使用 python、pandas、matplotlib 和 seaborn 从头开始开发逻辑回归模型,并在乳腺癌数据集上对其进行训练。
  4. 使用乳腺癌数据集训练来自 sklearn 的内置逻辑回归模型,以验证之前的模型。

分类问题介绍:

分类问题可以基于乳腺癌数据集来解释,其中有两种类型的肿瘤(良性和恶性)。它可以表示为:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在哪里

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这是一个有两类的分类问题,0 和 1。通常,分类问题有多个类别,比如 0、1、2 和 3。

数据集:

本文中使用的乳腺癌数据集的链接如下:

[## 乳腺癌威斯康星州(诊断)数据集

预测癌症是良性还是恶性

www.kaggle.com](https://www.kaggle.com/uciml/breast-cancer-wisconsin-data)

  1. 让我们将数据集导入熊猫数据框架:
import pandas as pd
read_df = pd.read_csv('breast_cancer.csv')
df = read_df.copy()

2.获得以下数据帧:

df.head()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

df.info()<class 'pandas.core.frame.DataFrame'>
RangeIndex: 569 entries, 0 to 568
Data columns (total 33 columns):
 #   Column                   Non-Null Count  Dtype  
---  ------                   --------------  -----  
 0   id                       569 non-null    int64  
 1   diagnosis                569 non-null    object 
 2   radius_mean              569 non-null    float64
 3   texture_mean             569 non-null    float64
 4   perimeter_mean           569 non-null    float64
 5   area_mean                569 non-null    float64
 6   smoothness_mean          569 non-null    float64
 7   compactness_mean         569 non-null    float64
 8   concavity_mean           569 non-null    float64
 9   concave points_mean      569 non-null    float64
 10  symmetry_mean            569 non-null    float64
 11  fractal_dimension_mean   569 non-null    float64
 12  radius_se                569 non-null    float64
 13  texture_se               569 non-null    float64
 14  perimeter_se             569 non-null    float64
 15  area_se                  569 non-null    float64
 16  smoothness_se            569 non-null    float64
 17  compactness_se           569 non-null    float64
 18  concavity_se             569 non-null    float64
 19  concave points_se        569 non-null    float64
 20  symmetry_se              569 non-null    float64
 21  fractal_dimension_se     569 non-null    float64
 22  radius_worst             569 non-null    float64
 23  texture_worst            569 non-null    float64
 24  perimeter_worst          569 non-null    float64
 25  area_worst               569 non-null    float64
 26  smoothness_worst         569 non-null    float64
 27  compactness_worst        569 non-null    float64
 28  concavity_worst          569 non-null    float64
 29  concave points_worst     569 non-null    float64
 30  symmetry_worst           569 non-null    float64
 31  fractal_dimension_worst  569 non-null    float64
 32  Unnamed: 32              0 non-null      float64
dtypes: float64(31), int64(1), object(1)
memory usage: 146.8+ KB

数据分析:

让我们画出丛的平均面积和它的分类,看看能否找到它们之间的关系。

import matplotlib.pyplot as plt
import seaborn as sns
from sklearn import preprocessing
label_encoder = preprocessing.LabelEncoder()
df.diagnosis = label_encoder.fit_transform(df.diagnosis)
sns.set(style = 'whitegrid')
sns.lmplot(x = 'area_mean', y = 'diagnosis', data = df, height = 10, aspect = 1.5, y_jitter = 0.1)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以从图中推断出,大多数面积小于 500 的肿瘤是良性的(用 0 表示),而面积大于 1000 的肿瘤是恶性的(用 1 表示)。平均面积在 500 到 1000 之间的肿瘤既有良性的也有恶性的,因此表明分类取决于除平均面积之外的更多因素。还绘制了线性回归线用于进一步分析。

为什么线性回归不是完美的拟合?

如果我们要基于绘制的线性回归线进行预测,我们可以将阈值分类器输出值设置为 0.5。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这意味着平均面积小于阈值(y 轴上对应于 0.5 的面积)的肿瘤将被分类为良性,而平均面积大于阈值的肿瘤将被分类为恶性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

但是从图中,我们可以陈述线性回归不是完美模型的以下原因。

  1. 对于具有小于 0.5 的相应假设值的 x 值,将其预测为 0(或恶性)以及反之亦然是不合适的。
  2. 我们还可以看到,假设值大于 1,在某些情况下小于 0,这不可能是真的(因为只有两个类 0 和 1)。

这就是逻辑回归发挥作用的地方。逻辑回归是一种专门用于分类问题的回归模型,即输出值是离散的。

逻辑回归简介:

我们从上面的部分观察到,当使用线性回归时,假设值不在[0,1]的范围内。这是逻辑回归的基本要求。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这意味着所有的预测都应该在 0 和 1 之间。

假设:

线性回归的假设由下式给出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于逻辑回归,上述假设稍加修改:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

z 是一个实数。g(z)被称为 Sigmoid 函数或逻辑函数(这给了我们逻辑回归的名字)。

将上面给出的两个等式放在一起:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

标绘物流功能:

让我们看看逻辑函数的形状:

def sigmoid(x):
 return 1/(1+ np.exp(-x))
x = np.linspace(-10,10,num = 1000)
fig = plt.figure(figsize = (10,10))
sns.set(style = 'whitegrid')
sns.lineplot(x = x, y = sigmoid(x))

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以从图表中推断出以下几点:

  1. 它在 0.5 处穿过 y 轴。
  2. 当 z 趋于无穷大时,逻辑函数在 1 处渐近,当 z 趋于负无穷大时,逻辑函数在 0 处渐近。
  3. 当 g(z)取(0,1)范围内的值时,h(x)的值也位于(0,1)之间。

假设是这样的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们需要找到适合训练示例的参数,以便可以使用假设进行预测。

假设的解释:

假设 h(x)给出的输出可以解释为对于给定的输入 x,y = 1 的概率。

以乳腺癌数据集为例。特征平均面积的特征向量可以形成为:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

假设假设 h(x)给我们的上述特征向量的值是 0.7。因为我们用 1 表示恶性肿瘤,用 0 表示良性肿瘤,所以我们可以说肿瘤是恶性的概率是 70%。

这可以用数学方法表示如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

RHS 可以读作

给定 x,用θ参数化,y=1 的概率

由于这是一个分类问题,我们知道 y 只能等于两个值 0 或 1(在这种情况下)。这既适用于训练示例,也适用于我们做出的任何未来预测。因此,给定假设 h(x ),我们也可以如下计算 y=0 的概率:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

进一步分析假设:

考虑我们上面绘制的逻辑函数:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

假设做出 y=1 和 y=0 的预测时,我们更好理解。

假设预测 y=1 发生在

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从该图中,我们注意到上述情况发生为:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

即,当 z 为正时,g(z)取大于 0.5 的值。

因此考虑到我们的假设 h(x ),我们可以说:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

类似地,假设预测 y=0 发生在

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通过与上面类似的论证:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以利用上述结论更好地理解逻辑回归的假设是如何做出预测的。

决策界限:

考虑下面显示的简单训练集:

os = np.array([[0, 0.5], [0.5, 0.5], [1.5, 0.5], [1, 0.5], [0.5, 0.5], [0.5, 1.5], [0, 1.5], [0,2.5]])
xs = np.array([[1.5, 3], [2, 3.5], [2, 3], [2, 2.5], [2.5, 3.5], [3, 3], [3, 1.5], [3, 2], [3, 1], [3.5, 1.5]])
fig = plt.figure(figsize = (10,10))
sns.set(style = 'whitegrid')
ax = sns.scatterplot(x = os[:,0], y = os[:,1], marker = 's', s = 100, color = 'r')
ax = sns.scatterplot(x = xs[:,0], y = xs[:,1], marker = 'x', s = 100, color = 'k')
ax.set(xlabel = 'x1', ylabel = 'x2')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们假设 X 对应于 y = 1,正方形对应于 y = 0。认为它的假设是:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中 x1 和 x2 是两个特征。

假设我们最终选择了符合方程的参数(选择参数的过程将在后面讨论):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

参数向量会是:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

参考上一节中的论点,预测 y=1 发生在以下情况:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

根据我们最后得到的参数,我们得到

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

绘制直线 x1+x2 = 3:

x = np.linspace(0, 3, num = 10)
ax = sns.lineplot(x = x, y = 3-x)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以看到,线右侧的区域对应于条件 x1+x2≥3,假设预测 y=1,如果在该区域,反之亦然。划分两个区域的这条线被称为该训练数据集的判定边界,并且它精确地对应于 h(x)=0.5。

非常清楚的是,决策边界和区域是假设及其参数的属性,而不是训练数据集的属性。

非线性决策界限:

考虑下面给出的有点复杂的数据集:

os = np.array([[0,0], [0,0.5], [0.5,0.5], [0.5,0], [-0.5,0.5], [-0.5,0], [-0.5,-0.5], [0,-0.5], [0.5, -0.5],])
xs = np.array([[1,1], [-1,1], [1,-1], [-1,-1], [0,1.5], [-1.5,0], [0,-1.5], [1.5,0]])
fig = plt.figure(figsize = (10,10))
sns.set(style = ‘whitegrid’)
ax = sns.scatterplot(os[:,0], os[:,1], marker = ‘s’, s = 100, color = ‘r’)
ax = sns.scatterplot(xs[:,0], xs[:,1], marker = ‘x’, s = 100, color = ‘k’)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如上例所示,X 属于区域 y=1,正方形属于区域 y=0。假设我们的假设是这样的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

假设我们最终选择参数值为:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那么我们的参数向量看起来像:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

根据我们之前的讨论,假设将预测 y=1,当:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以看到,上面的等式对应的是一个以原点为圆心,半径为 1 的圆。

绘制方程式:

theta = np.linspace(0, 2*np.pi , 1000)
r = np.sqrt(1)
x = r*np.cos(theta)
y = r*np.sin(theta)
ax.plot(x,y, color = 'b')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

圆圈是我们的决策边界,圆圈外的区域对应于 y=1,圆圈内的区域对应于 y=0。我们可以看到,决策边界不一定是直线,也可以是更复杂的形状,如圆形、椭圆形和任何其他不规则形状。同样,决策边界是假设及其参数的属性,而不是训练数据集的属性。

成本:

逻辑回归问题的成本由下式给出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中,如前所述,h(x)是假设的预测,y 是实际的类别标签。

绘制成本图:

让我们画出这个函数,看看它是如何对应每种情况的。我们需要将 h(x)的极限设为[0,1],因为它位于逻辑回归的范围内。

  1. 如果 y=1
x = np.linspace(0,1, num = 100)
fig = plt.figure(figsize = (10,10))
sns.set(style = 'whitegrid')
ax = sns.lineplot(x = x, y = -np.log(x))
ax.set(xlabel = 'h(x)', ylabel = 'cost')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从这个情节可以得出以下推论:

a.当 h(x)=1 且 y=1 时,成本变为零。这是显而易见的,因为假设预测 y 为 1,这是真的,那么成本将为零。

b.当 h(x)接近零时,成本趋于无穷大。这种情况的发生是因为该图特定于 y=1,但是当 h(x)预测其为 0 时,成本趋于无穷大。

2.如果 y=0

ax = sns.lineplot(x = x, y = -np.log(1-x))

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如上所述,可以推断出以下情况:

a.当 h(x)=0 且 y=0 时,成本变为零。

b.由于 y=0,当 h(x)接近 1 时,成本趋于无穷大。

成本函数:

逻辑回归的成本函数由下式给出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

需要注意的是,在有两个类别的分类问题中,y=0 或 1 总是存在的。

成本可以用一行表示,如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这是成本的更简洁的表示。因此,成本函数可以写成如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

梯度下降:

我们需要找到参数,使成本函数值最小。这在数学上可以表示为:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

微分项由下式给出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

将其代入梯度下降方程:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从头开始使用 python 进行逻辑回归:

让我们使用上述等式对乳腺癌数据集执行逻辑回归。

x = df.area_mean
y = df.diagnosis
x = preprocessing.scale(x)
theta_0_gd = 0
theta_1_gd = 0
alpha = 0.01
h_theta_0_gd = 1
h_theta_1_gd = 1
epoch = 0
m = len(x)
fig = plt.figure(figsize = (10,10))
sns.set(style = 'whitegrid')
ax = sns.scatterplot(x,y)
while h_theta_0_gd != 0 or h_theta_0_gd != 0:
    if epoch > 5000:
        break
    h_theta_0_gd = 0
    h_theta_1_gd = 0
    for i in range(len(x)):
        h_theta_0_gd += ((1/(1+np.exp(-(theta_0_gd + (theta_1_gd * x[i]))))) - y[i])
        h_theta_1_gd += (((1/(1+np.exp(-(theta_0_gd + (theta_1_gd * x[i]))))) - y[i]) * x[i])
    h_theta_0_gd = (1/m) * h_theta_0_gd
    h_theta_1_gd = (1/m) * h_theta_1_gd
    theta_0_gd -= (alpha * h_theta_0_gd)
    theta_1_gd -= (alpha * h_theta_1_gd)
    epoch += 1
ax = sns.lineplot(x,(1/(1+np.exp(-(theta_0_gd + (theta_1_gd * x))))) , color = 'r', linewidth = 3)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

θ_ 0 和θ_ 1 的值为:

print(theta_0_gd, theta_1_gd)output>>-0.4173702618170074 3.0623106036104937

我们还可以在每个时期之后绘制成本函数值,以检查算法的收敛性:

x = np.array(df.area_mean)
y = np.array(df.diagnosis)
x = preprocessing.scale(x)
theta_0_gd = 0
theta_1_gd = 0
alpha = 0.01
h_theta_0_gd = 1
h_theta_1_gd = 1
epoch = 0
Epoch = []
m = len(x)
j = 0
J = []
fig = plt.figure(figsize = (20,10))
ax1 = fig.add_subplot(1,2,1)
ax2 = fig.add_subplot(1,2,2)
style.use('ggplot')
ax1.scatter(x,y)
while h_theta_0_gd != 0 or h_theta_0_gd != 0:
    if epoch > 5000:
        break
    h_theta_0_gd = 0
    h_theta_1_gd = 0
    for i in range(len(x)):
        h_theta_0_gd += ((1/(1+np.exp(-(theta_0_gd + (theta_1_gd * x[i]))))) - y[i])
        h_theta_1_gd += (((1/(1+np.exp(-(theta_0_gd + (theta_1_gd * x[i]))))) - y[i]) * x[i])
    h_theta_0_gd = (1/m) * h_theta_0_gd
    h_theta_1_gd = (1/m) * h_theta_1_gd
    theta_0_gd -= (alpha * h_theta_0_gd)
    theta_1_gd -= (alpha * h_theta_1_gd)
    for i in range(m):
        j += ((y[i] * (np.log(1/(1+np.exp(-(theta_0_gd + (theta_1_gd * x[i]))))))) - ((1-y[i]) * np.log(1-(1/(1+np.exp(-(theta_0_gd + (theta_1_gd * x[i]))))))))
    J.append((-1/m) * j)
    epoch += 1
    Epoch.append(epoch)
ax1.scatter(x,(1/(1+np.exp(-(theta_0_gd + (theta_1_gd * x))))) , color = 'k')
ax2.plot(Epoch,J)
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以看到,该算法在大约 500 个时期收敛,此时成本函数达到最小值-30,之后开始增加,直到 5000 个时期。这是因为学习率(0.01)非常大,所以算法在某一点后开始发散。考虑进一步降低学习率。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上述曲线对应于 0.001 的学习率。我们可以看到,在成本函数值为-375 时,该算法在大约 6000 个时期收敛,之后它再次开始增加。我们可以由此得出结论,降低学习率有助于微调参数以获得成本函数的更小值,但是该算法需要更多的历元,即需要更多的时间来收敛。

使用 sklearn 逻辑回归模型:

让我们检查在我们的模型中获得的参数值是否与逻辑回归的 sklearn 模型相当

X **=** x.reshape(**-**1,1)
x_train, x_test, y_train, y_test **=** model_selection.train_test_split(X, y, test_size **=** 0.33)
clf **=** LogisticRegression(max_iter **=** 5000)
clf.fit(x_train, y_train)
clf.coef_
output>> array([[3.5028]])
clf.intercept_
output>> array([-0.31180412])

正如我们所看到的,当比较时,参数具有足够接近的值。我们甚至可以使用获得的参数绘制回归线,以检查我们是否得到了类似的曲线。

Theta_1 = clf.coef_
Theta_0 = clf.intercept_
fig = plt.figure(figsize = (10,10))
ax = sns.scatterplot(X,y)
ax = sns.lineplot(X, (1/(1+np.exp(-(Theta_0 + (Theta_1[0] * X))))), color = 'r')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

结论:

在本文中,我们已经看到了分类问题在数学上的含义,线性回归在分类问题中的作用,逻辑回归及其假设,成本,成本函数,决策边界和梯度下降。我们还从 scratch 建立了一个逻辑回归模型,并使用乳腺癌数据集对其进行了训练。我们还使用了 sklearn 的内置模型进行验证。

推论:

  1. 我正在从这个 Youtube 播放列表中学习大多数关于机器学习的概念。这很有帮助,也很容易理解。

[## sklearn.linear_model。逻辑回归-sci kit-学习 0.23.1 文档

逻辑回归(又名 logit,MaxEnt)分类器。在多类的情况下,训练算法使用一对其余…

scikit-learn.org](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html)

2.考虑检查 sklearn 的逻辑回归分类的官方文档,以便进一步使用。

Python 中使用梯度下降优化器的逻辑回归

原文:https://towardsdatascience.com/logistic-regression-using-gradient-descent-optimizer-in-python-485148bd3ff2?source=collection_archive---------9-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Unsplash 上的 chuttersnap 拍摄

在本文中,我们将对逻辑回归进行硬编码,并将使用梯度下降优化器。如果你需要梯度下降的复习,可以看看我之前的文章。在这里,我将使用著名的 Iris 数据集来预测使用逻辑回归的类,而不使用 scikit-learn 库中的逻辑回归模块。开始吧!

导入库

让我们从导入所有需要的库和数据集开始。这个数据集有 3 个类。但是为了让你更容易理解,我将用两个类来演示梯度下降法。数据集有 150 个实例,3 个类中的每一个都有 50 个实例。因此,让我们只考虑前 100 个实例中的两个类:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

标签编码

这里的类必须标签编码算法才能工作。让我们通过 scikit-learn 的 LabelEncoder 模块来完成它。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这个虹膜数据集是一个相当简单和直接的数据集。如你所见,只有 4 节课。没有空值和差异,因为在标签编码后它是纯数字的。

洗牌和分割数据帧

这些类在数据帧中被排序,因此它需要被打乱并分成两部分——训练和测试。使用 scikit-learn 中的 train_test_split 只需一行即可完成。但是让我们在没有它的情况下做,看看在引擎盖下会发生什么。这个方法可能不是 train_test_split 的实际工作方式,但这肯定是一种实现方式。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

此外,让我们使用 scikit-learn 的 StandardScaler 对数据进行标准化,即使它的规模几乎相同:

现在我们的数据看起来像这样:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

将训练和测试数据 70:30 分开,

数据准备好应用梯度下降优化器。下一步将应用 GD 来寻找损失最小的权重的最佳值。由于有 4 个参数影响类别,因此使用的公式为:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中,ŷ是预测值,w 是权重,x 是输入数据。但是我们需要将类预测为 0 和 1,因此我们需要修改上面的回归方程,以便输出成为默认类的概率,该概率将在 0 和 1 之间。如果高于 0.5,我们将其分配到 1 类,反之,如果低于 0.5,我们将其分配到 0 类。

因此,为了修改回归方程,我们将它与 sigmoid 函数、 σ 相乘,其输出如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源

sigmoid 函数定义为:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

逻辑函数和大多数二元分类器中使用的损失函数是二元交叉熵损失函数,由下式给出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

求解上述方程,我们得到误差为(P - Y ),其中 P 是属于默认类别的预测概率。因此,权重的更新规则如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在让我们在准备好的训练数据集上实现它,看看结果。

完整的代码可以在我的 Git 上找到。预测概率后,实例被分成两类。如果概率是> 0.5,则分配给等级 1,否则为 0。权重被更新,并且运行 70 次迭代。现在权重已经达到它们的新值,这应该是最佳值。

现在我们必须评估模型的表现。让我们检查一下模型是否对任何实例进行了错误分类。此外,让我们来看看算法最后一次迭代后更新的权重:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在为了评估,我们将构建一个 混淆矩阵 。混淆矩阵包含 4 个值:真阳性,假阳性,真阴性,假阴性。

我们得到以下值——TP:34,FP: 0,TN: 36,FN: 0,混淆矩阵为:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源

酷毙了。现在,让我们最后将学习到的权重应用到我们的测试数据中,并检查它的表现如何。

完成了。现在,让我们通过构建混淆矩阵来检查它的表现如何:

好吧!我们得到了 TP: 16,FP: 0,TN: 14,FN: 0。这意味着 100%的精确度和 100%的召回率!你也可以继续检查 F1 的分数。

这是一个非常小的玩具数据集,因此结果是准确的。当您处理稍大的数据集时,情况就不一样了。但是本文的目的是向您展示使用梯度下降的逻辑回归到底是如何工作的。

使用 Minitab 进行逻辑回归

原文:https://towardsdatascience.com/logistic-regression-using-minitab-d58a80ec548a?source=collection_archive---------43-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

鲍鱼图片来自 pixabay

当输出变量取离散值时,逻辑回归有效。更一般地说,输出变量由分类值组成的问题称为分类问题。例如,传入的电子邮件不是垃圾邮件或垃圾邮件,或者血液值具有诸如生病或未生病的输出值。让我们创建一个分类器来决定收到的邮件是否是垃圾邮件。如果我们使用线性回归,我们会说 1 代表垃圾邮件,0 代表非垃圾邮件。例如,如果阈值为 0.4,我们将标记值为 0.41,而不是 0.39 及以下,而不是垃圾邮件。然而,在这种情况下,由于概率值的范围从 0 到 1,我们将无法找到值在-∞ +∞之间的分类结果。因此,我们得出结论,简单的回归对于这种类型的分类是不够的。输出变量不限于线性回归。因此,在分类问题中应该建立逻辑回归作为回归模型。逻辑回归中的独立变量,即输入变量,可以是连续数据,也可以是离散数据。

在逻辑回归中,通过查看输出变量将采用的值来进行区分。有 3 种类型的逻辑回归,它们是:

  1. 二元逻辑回归:因变量可以取值 0 或 1。比如垃圾邮件-非垃圾邮件,病人-病人,非故障-非故障。
  2. 多重逻辑回归:当有两个以上的类别时适用。像图像处理的结果由像猫、狗、鸟这样的类别组成。
  3. 有序逻辑回归:如果因变量由序列值组成,则使用有序逻辑回归。如差、中、好输出。

在逻辑回归中,属于类别的概率作为输出给出。因此,它们没有被命名为量词。相反,逻辑回归用于创建分类器。属于某一类别的概率按以下公式计算。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当线性回归中的方程写成 z 值,即输出变量;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这里的方程称为 Sigmoid 函数或 logistics 函数。返回它连续接收的介于 0 和 1 之间的值。如果输出值为无穷大,分类结果将取值 1。如果输出值趋于-无穷大,分类结果将取值 0。为了确定数据属于哪一类,首先确定一个阈值。根据所确定的阈值来决定数据的类别。例如,如果在垃圾邮件或非垃圾邮件示例中阈值为 0.5,则小于 0.5 的值可以被称为垃圾邮件。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

奇数是通过将一个事件的概率除以非事件的概率得到的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

样本研究

在这个例子中,让我们根据一些度量标准对男性和女性的骨骼建模。数据集可以在这里找到。或者准备好 Minitab 的 csv 文件可以从这里下载。
要在 minitab 中打开 csv 格式的样本数据集,我们需要选择>文件>打开。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那么我们的数据就准备好了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

stat > > Regression > > Binary Logistic Regression > > Fit Binary Logistic Model 选项被选中。如下图所示,变量确定,调用 OK。

通过单击结果菜单,可以按如下方式创建报告文件。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

说“确定”, Minitab 报告屏幕打开。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们已经把作为 M 的状态,也就是男性,作为一个参考事件。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在模型总结和拟合优度测试表中,它显示了我们建立的模型在多大程度上是由参数解释的。在这里的例子中,这些值是不好的,但是让我们继续统计研究。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在系数表中,我们可以看到所有自变量得到的系数及其显著性水平。例如,在本例中,权重变量的系数为-3.54,p 值为 0.082。我们可以说该变量具有统计显著性,因为 P 值显著性水平小于 0.05。当所有其他变量保持不变时,权重变量的 1 个单位的变化实现了因变量的 3.54 个单位的减少。为了使模型有意义,所有自变量的 P 值的显著性水平必须小于 0.05。让我们找到具有最高 p 值的变量,并将其从模型中减去。在这里,由于 ring(halkalar)变量具有最高的显著性,因此它首先从模型中删除。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这一次,总重量(toplam_agirlik)从模型中移除,因为它具有最高的 p 值。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

高度(Uzunluk)也从模型中删除。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

和卡布克-阿吉利吉

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在所有的 p 值都小于 0.05。我们的模式变得有意义了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

回归模型如上。现在我们可以使用该模型进行估算。

参考

辛塔斯、佩德罗·格里马、Lluis Marco-Almagro 和 Javier turt-Martorell Llabres。用 Minitab 进行工业统计。威利在线图书馆,2012 年。

埃哈特、埃里克 b、爱德华 j .贝德里克和罗纳德 m .施拉德。“高级数据分析-课堂笔记”,2016 年。

卡拉格兹,穆拉特。i̇statistik·恩特姆勒里。第 9 版。ekin kita bevi yaynlar,2015 年。

Khan,Rehman M. 使用 Minitab 解决问题和分析数据:六适马方法的简明指南。约翰·威利的儿子们,2013 年。

Lesik,Sally A. 使用 MINITAB 进行统计推断。CRC 出版社,2018。

"分类变量的多元回归."2020 年 3 月 30 日访问。http://psych stat 3 . missourstate . edu/Documents/multi book 3/MLT 07 . htm

牛顿艾萨克。迷你食谱。帕克特出版有限公司,2014 年。

"支持| Minitab。"2020 年 3 月 29 日访问。【https://www.minitab.com/en-us/support/】T4。

Excel 中的梯度下降逻辑回归

原文:https://towardsdatascience.com/logistic-regression-with-gradient-descent-in-excel-52a46c46f704?source=collection_archive---------35-----------------------

这样你就能更好地理解逻辑回归是如何工作的

虽然使用 Excel/Google Sheet 来解决机器学习算法的实际问题可能是一个坏主意,但使用简单公式简单数据集从头实现该算法对于理解算法如何工作非常有帮助。

在一系列文章中,我将介绍如何在 Excel 中从头开始实现不同的算法。

在这篇文章中,我将分享我如何实现一个简单的****逻辑回归梯度下降**。**

现在让我们开始吧!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由 Sushil GhimireUnsplash 拍摄

从零开始为 ML 的谷歌表

如果你想得到谷歌表,请在 Ko-fi 上支持我。

你可以得到我创建的所有谷歌表单(梯度下降的线性回归,逻辑回归,神经网络,KNN,k-means,等等)。)和下面的链接。

https://ko-fi.com/s/4ddca6dff1

使用简单的数据集

首先,我使用一个非常简单的数据集和一个特征,您可以看到下图显示了目标变量 y 和特征变量 x。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

创建模型

逻辑回归使用以下模型:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以在 Excel 文件的“res”表中看到最终的模型,有 a 和 b。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那么 a 和 b 是如何确定的呢?让我们在下一页“mlh”中查看最大可能性。

模型的成本函数

首先我们可以考虑模型的可能性**,我们必须最大化:**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后我们取可能性的对数。为了得到损失函数,我们必须取对数似然的反面。****

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们也将这个损失函数命名为逻辑损失**、交叉熵对数损失。**

您可以修改参数 a 和 b,以查看模型的可能性会发生变化。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

梯度下降

现在让我们找出最优参数 a 和 b。

为此,我们必须找到损失函数对 a 和 b 的导数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传****外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在工作表“graddesc”中,您将找到实现梯度下降的所有 Excel 公式。尽情享受吧!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

各种公司的人都用 Excel 工作。虽然它不会被用来做机器学习,但它是一个理解原理的优秀工具,因为你可以看到所有的计算是如何完成的,并可视化所有中间步骤的图形。这种方法对于那些想要了解机器学习算法如何工作以及还不太擅长编码的人来说也非常有帮助。

现在,如果你能够理解并在 Excel 中实现逻辑回归,你也可以对一个简单的神经网络进行逻辑回归,你可以阅读这篇文章以获得所有的公式。接受挑战?

** [## 想象一下神经网络是如何从头开始工作的

通过可视化每一步的结果,您可以更好地理解神经网络的工作原理

towardsdatascience.com](/visualize-how-a-neural-network-works-from-scratch-3c04918a278)**

使用优化函数的 Python 逻辑回归

原文:https://towardsdatascience.com/logistic-regression-with-python-using-optimization-function-91bd2aee79b?source=collection_archive---------19-----------------------

学习用 python 编写逻辑回归算法来执行二元分类

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

资料来源:Franck V. 的 Unsplash

逻辑回归是一个强大的分类工具。只有当因变量是分类变量时,它才适用。有几种不同的方法来实现它。今天我将解释一个简单的方法来执行二进制分类。我将使用 python 中可用的优化函数。

概念和公式

逻辑回归使用 sigmoid 函数来估计返回值从 0 到 1 的输出。因为这是二进制分类,所以输出应该是 0 或 1。这是 sigmoid 函数:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这里 z 是输入变量 X 和随机初始化的系数θ的乘积。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

需要为每个输入要素初始化一个θ值。成本函数中一个非常重要的参数。成本函数给出了预测与实际产出的差距。下面是成本函数的公式:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这里,y 是原始输出变量,h 是预测输出变量。我们的目标是尽可能降低成本。现在,我们需要更新θ值,以便我们的预测尽可能接近原始输出变量。如果我们用θ对成本函数进行偏导数,我们将找到θ值的梯度。我不想在这里讨论微积分。我们用来更新θ的梯度下降将会是:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果你不理解所有的方程式,先不要担心。请看实现部分。希望你能理解如何使用所有的方程。

逻辑回归的 Python 实现

  1. 导入必要的包和数据集。我从吴恩达在 Coursera 上的机器学习课程中找到了这个数据集。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.read_csv('ex2data1.txt', header=None)
df.head()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.将输入变量和输出变量分开。在该数据集中,列 0 和 1 是输入变量,列 2 是输出变量。所以我们必须预测第二列。

X = df.iloc[:, :-1]
y = df.iloc[:, -1]

3.向 x 添加一个偏差列。偏差列的值通常为 1。

X = np.c_[np.ones((X.shape[0], 1)), X]
X[:10]

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4.这里,我们的 X 是二维数组,y 是一维数组。让我们把“y”做成二维的,以匹配维度。

y = y[:, np.newaxis]
y[:10]

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

5.定义 sigmoid 函数

def sigmoid(x, theta):
    z= np.dot(x, theta)
    return 1/(1+np.exp(-z))

6.使用此 sigmoid 函数写出预测输出的假设函数:

def hypothesis(theta, x):
    return sigmoid(x, theta)

7.使用上面解释的公式写出成本函数的定义。

def cost_function(theta, x, y):
    m = X.shape[0]
    h = hypothesis(theta, x)
    return -(1/m)*np.sum(y*np.log(h) + (1-y)*np.log(1-h))

8.根据上式写出梯度下降函数:

def gradient(theta, x, y):
    m = X.shape[0]
    h = hypothesis(theta, x)
    return (1/m) * np.dot(X.T, (h-y))

9.导入一个优化函数,为我们优化 theta。这个优化将把要优化的函数、梯度函数和要传递给函数的参数作为输入。在这个问题中,要优化的函数是成本函数。因为我们希望最小化成本,梯度函数将是 gradient_descent,参数是 X 和 y。该函数还将采用“x0 ”,这是要优化的参数。在我们的例子中,我们需要优化θ。所以,我们必须初始化θ。我把θ值初始化为零。正如我前面提到的,我们需要为每个输入特征初始化一个θ值。我们有三个输入特性。如果你看 X,我们有 0 和 1 列,然后我们增加了一个偏差列。所以,我们需要初始化三个θ值。

theta = np.zeros((X.shape[1], 1))
from scipy.optimize import minimize,fmin_tnc
def fit(x, y, theta):
    opt_weights = fmin_tnc(func=cost_function, x0=theta, fprime=gradient, args=(x, y.flatten()))
    return opt_weights[0]
parameters = fit(X, y, theta)

参数出来是[-25.16131854,0.20623159,0.20147149]。

10.使用这些参数作为θ值和假设函数来计算最终假设。

h = hypothesis(parameters, X)

11.使用假设来预测输出变量:

def predict(h):
    h1 = []
    for i in h:
        if i>=0.5:
            h1.append(1)
        else:
            h1.append(0)
    return h1
y_pred = predict(h)

12.计算准确度。

accuracy = 0
for i in range(0, len(y_pred)):
    if y_pred[i] == y[i]:
        accuracy += 1
accuracy/len(y)

最终准确率为 89%。

您也可以使用梯度下降作为优化函数来执行此逻辑回归。下面是一篇实现梯度下降优化方法的文章:

  1. 梯度下降优化逻辑回归。
  2. 用梯度下降法进行多类分类。
  3. Python 中的多项式回归从无到有。

转到此页面获取数据集:

[## rashida 048/用 Python 进行机器学习

Permalink GitHub 是 5000 多万开发人员的家园,他们一起工作来托管和审查代码、管理项目以及…

github.com](https://github.com/rashida048/Machine-Learning-With-Python/blob/master/ex2data1.txt)

以下是完整的工作代码:

[## rashida 048/用 Python 进行机器学习

permalink dissolve GitHub 是超过 5000 万开发人员的家园,他们一起工作来托管和审查代码,管理…

github.com](https://github.com/rashida048/Machine-Learning-With-Python/blob/master/logisticRegressionWithOptimizationFunc.ipynb)

自动化集成测试的物流过程模型

原文:https://towardsdatascience.com/logistics-process-models-for-automated-integration-testing-bce081553ef5?source=collection_archive---------66-----------------------

物流软件持续集成和虚拟调试案例研究

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

物流系统的规划和设计——包括供应链和内部物流——通常由模拟研究支持,用于比较设计方案,评估其可行性,以及估计关键绩效指标,如提前期或吞吐量。

当谈到物流系统的实现时,主要的挑战与控制和操作 it 系统的开发有关。鉴于这些系统的测试、集成、试运行(和错误修复)往往会消耗实现阶段的很大一部分,很明显,尽早测试一个开发的系统是非常有益的——甚至在任何物理设置发生之前。
虚拟调试 描述了针对系统的数字对应物的软件测试,利用模拟模型模拟真实世界的交互。

这篇文章将展示一个将基于模拟的测试集成到当今敏捷软件开发过程中的例子,调查一个订单管理和交付优化的案例研究。

获得回购:https://github.com/fladdimir/csa-vcom

1.场景和范围

还记得汉堡-阿尔托纳的一家小法国面包店 La Pâ tisserie 吗?这家面包店正在经历一场需求的大规模转移,他们的甜点正被送上门。

在创新的开源城市配送网络模拟方法的帮助下,评估了如何扩展其业务模式的不同选项后,不断增长的网络现在变得越来越难以管理,需要增加对面包店日常物流运营的基于软件的支持…

2.流程和要求

为了能够专注于他们的核心竞争力(变出美味的点心,而不是与难以处理的不一致的电子表格数据作斗争),我们的面包店决定采用基于 web 的物流规划应用程序。
要支持的核心流程有:

  • 登记客户,并跟踪他们的订单
  • 管理仓库的位置,以计划最佳可能的交付
  • 跟踪卡车,根据计划路线运送货物

下面的 BPMN 图显示了这些过程和一个简单的令牌流动画:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

带有令牌流动画的简单订购和交付流程

3.测试优先:模拟模型+构建管道

为了确保所开发的软件能够充分支持所有需要的流程,我们面包店的软件开发部门选择了测试驱动的方法,由一个构建管道来支持,该管道会自动检查推送到仓库的所有代码。基于指定的业务流程,一个 Casymda 仿真模型被生成,准备好模拟实际系统,开发的软件应该与该系统一起工作。随着应用程序的过程和范围的变化,模拟模型可以以敏捷的方式发展。

GiteaDrone 构成了持续集成设置的基础。作为虚拟调试步骤的一部分,管道在服务容器中启动应用程序,模拟模型根据服务容器运行测试场景,模拟交互并验证软件的预期行为:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作为持续集成管道一部分的虚拟调试

管道由一个 .drone.yml 文件描述。注意,可以以各种方式改进流水线,例如,通过适当地等待 app(服务)变得可用于模拟步骤。一个 docker-compose.yml 允许使用单实例设置在本地启动 gitea+drone,这并不理想,但足以用于演示:

docker-compose -f gitea/docker-compose.yml up

4.应用程序设计和实施

我们面包店的应用程序正在处理客户、订单、仓库、旅游和卡车的数据管理。此外,还需要通过计算有效行程并将其分配给可用卡车来支持交付流程的规划。

该应用程序采用了一个基本的三层结构,包括一个基于浏览器的用户界面,一个包含业务逻辑和优化算法的后端,以及一个持久数据库。下图总结了设置,包括在自动构建管道中充当客户端的模拟模型:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

具有基于模拟的测试客户端的 3 层应用程序

后端用 Python 实现,使用Django+Django-Rest-Framework,依靠 Google-OR-Tools 完成优化任务。旅游规划被建模为一个有容量限制的多站点车辆路径问题(CVRP)。对于未完成的行程到可用卡车的最优分配,OR-Tools 提供了一个最小成本流求解器,用于相应的二分图上。

所需的距离矩阵从开源路由机器中获得,以现成的 Docker 图像( OSRM 盒)的形式提供。OSRM 提供了一个方便的 API,在创建新的客户或仓库时同步使用。开放街道地图数据可从https://download . geofabrik . de下载。汉堡的地图大小约为 35 MB,OSRM 预处理(汽车轮廓)大约需要 30 秒(i5 双核笔记本 cpu)。

SQLite 提供了一个简单的数据库解决方案,然而,Django 使得切换到像 Postgres 或 MariaDB 这样的客户机/服务器 RDBMS 变得很容易。

前端采用棱角材质小叶. js (得益于ngx-小叶,易于集成)。

要在本地启动应用程序,通过 http://localhost:4200 为前端提供服务,只需在存储库根访问 docker-compose.yml。

5.结果

下面的截屏从用户的角度展示了工作流程。它包括注册新客户、发布订单、规划旅程、分配卡车,以及随着旅程的进行跟踪交付情况:

通过网络前端进行客户注册和旅游规划的截屏

所示流程与虚拟调试管道构建步骤中仿真模型执行的流程相匹配,确保软件每个版本的稳定功能:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作为无人机管道的一部分,成功的基于模拟的集成测试

使用模拟模型进行广泛的自动化集成测试有助于支持和保持软件质量,尤其是在以流程为中心的物流应用环境中。正如我们所看到的,今天的软件开发工具和标准允许将模拟技术和虚拟调试方法有效地集成到开发工作流中。

使用早期语言阶段数据的 LOL 匹配预测|机器学习

原文:https://towardsdatascience.com/lol-match-prediction-using-early-laning-phase-data-machine-learning-4c13c12852fa?source=collection_archive---------30-----------------------

使用大约 10K 游戏的前 10 分钟数据来预测高 ELO 等级游戏的结果

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

英雄联盟:蓝队(左)对红队(右)|图片作者

介绍

英雄联盟是一款以团队为基础的策略游戏,两队五名强大的冠军对抗,摧毁对方的基地。(【https://na.leagueoflegends.com/en-us/how-to-play/】T2

一场典型的英雄联盟游戏通常持续 30 到 45 分钟,每场游戏可以分为三个阶段:游戏开始阶段、游戏中期和游戏后期。玩家通常会花前 10 到 15 分钟在他们自己的球道(顶部,中部,机器人,JG)耕作,以获得早期的建造和等级优势。在游戏中期,玩家开始关注宏观层面:推车道,拿下塔,获得地图目标,和群体战斗。在游戏后期,如果游戏还没有结束,每个队都要决定如何结束游戏,比如:逼一个男爵/长老龙或者 1–4 推等。

在这个项目中,我使用了名为“米歇尔的粉丝”的 Kaggle 收集的数据,数据集包含第一个 10 分钟。大约的统计数据。从高 ELO(钻石 I 到大师)开始的 10k 排名游戏(单人队列)。你可以在这里找到完整的描述和数据来源。

每支队伍的冠军组合将显著影响游戏的结果,因为一些冠军在游戏的早期很强,而其他冠军将在游戏的中期和后期有很大的发展。这就是为什么所有的排名赛和职业赛在赛前都会有一个禁赛/选赛阶段。然而,很多玩家可以用他们的技能和地图意识对游戏产生的影响不会在冠军连击中体现出来。尤其是一些球员,比如 RNG。无论对手是否有反挑,简自豪都可以在拉宁阶段获得显著优势。

此外,正如我们所看到的,在许多高水平的游戏中,团队组合,特别是游戏后期的组合,并不总是如预期的那样工作,因为拉宁阶段往往比游戏中期和后期阶段有更多的不确定性,例如其中一个团队能够创造一个差距,这个差距对于另一个团队来说太大了,无法在游戏后期填补。我的目标是了解拉宁阶段的表现(前 10 分钟)如何影响最终结果。

我使用 Jupyter 笔记本和 R studio 作为代码编辑器。我用 Pandas、NumPy 和 Matplotlib 包做了一些数据探索。然后,我实现了九个模型,包括一个集成模型、一个堆叠模型和七个其他分类器。最一致的模型是堆叠模型,其交叉验证的平均准确度得分为 0.732158,标准偏差为+/- 0.005171。

数据浏览

数据集总共有 9879 场比赛的信息,蓝队赢了其中的 4930 场,占 49.9%。这是一个非常平衡的数据集。

图 1 显示了两个团队杀死的数量。紫色点代表红队获胜,黄色点代表蓝队赢得比赛。我了解到蓝队在前 10 分钟杀死 15 只以上就赢得了所有的比赛。蓝队的胜率在戏剧性地干掉 7 个之后开始增加。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 1:蓝色与红色的杀戮

图 2 显示了两队的助攻次数。这和谋杀案有着相同的模式。然而,在拉宁阶段,每支球队只有一场比赛获得 20 次以上的杀球,而在拉宁阶段,有许多比赛两支球队都能够获得 20 次以上的助攻。这表明大部分的杀戮可能来自最底层的车道,或者丛林者经常开枪。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 2:蓝色与红色在助攻上的对比

图 3 显示了黄金对比。这个图给了我一个明显的暗示,如果蓝队能在前 10 分钟内获得超过 20,000 枚金牌,他们极有可能赢得比赛。我还手动设置了一个“绿色区域”,它涵盖了蓝队在前 10 分钟内能够获得超过 21,055 枚金牌的游戏。在这个数据样本中,蓝队赢得了所有落在“绿区”的比赛。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3:金色中的蓝色与红色

然后,我研究了蓝队在比赛阶段的金牌差距和比赛结果之间的关系。图 4 显示,当蓝队在前 10 分钟(红区)有-6324 和 6744 之间的金牌差距时,游戏非常轻率,最终结果可能有利于任何一方。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 4:蓝队的金牌差距(W/L)

在英雄联盟的游戏中,游戏中后期视野较好的队伍会更容易获得主动权。然而,愿景在早期游戏中有多重要?图 5 并没有显示出早期游戏中视觉的重要性,这有点出乎我的意料。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 5:视觉中蓝色与红色的对比

图 6 说明了蓝队在比赛阶段的经验差异和比赛结果之间的关系。游戏实际上是 50-50,而前 10 分钟的体验差异大约是+/- 5000 XP。在一个正常的框架游戏中,中巷和顶巷可以达到 8 级,机器人巷和丛林可以分别达到 6 级,大约需要 10 分钟。从 7 级到 8 级需要 1150 XP,从 5 级到 6 级需要 880 XP。5000 经验值的优势意味着在早期游戏中,每条通道平均高出大约 1 级(11502+8803=4940)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 6:蓝队在 W/L 的体验差异

除了以上这些,我还想分享一些有趣的数据:

  1. 当蓝队的 KDA 在前 10 分钟大于或等于 3 时,他们有 76.51%的胜率。
  2. 当蓝队可以在前 10 分钟摧毁一座塔时,他们有 75.43%的胜率。
  3. 蓝队在前 10 分钟能有 8 杀的时候,胜率是 69.86%。

特征工程

既然有很多值大的特性,比如经验,总金等。我将 StandardScaler()和 MinMaxScaler()应用于这些特性。经过测试,我决定对项目的其余部分使用 StandardScaler()转换。

我还创建了以下功能:

蓝 KDA / 红 KDA :蓝队前 10 分钟的杀伤率。是通过[(蓝杀+蓝助攻)/蓝死]计算出来的。我也使用相同的过程来创建 redKDA。

KDADiff :两队的 KDA 差。计算为[blueKDA-redKDA]。

blueGoldAdv :该特征是一个二元变量。它表明蓝队在比赛的前 10 分钟是否有至少 20,000 金的优势。

blueDiffNeg :该特征是一个二元变量。它指示蓝队在比赛的前 10 分钟内是否有小于或等于-6324 的负金差。

blueDiffPos :该特征是一个二元变量。它指示蓝队在比赛的前 10 分钟是否有大于或等于 6744 的正金牌差值。

建模

因为我没有真正的维持集来测试我的模型的有效性,所以我选择使用交叉验证技术,并使用准确性和 ROC 作为评估指标。

我测试了以下九种型号:

AdaBoostClassifier,CatBoostClassifier,XGBoostClassifier,支持向量分类器,LogisticRegression,RandomForestClassifier,KNeighborsClassifier,EnsembleVoteClassifier,StackingClassifier

eclf = EnsembleVoteClassifier(clfs=[cat,logreg, knn, svc,ada,rdf,xgb], weights=[1,1,1,1,1,1,1])labels = ['CatBoost','Logistic Regression', 'KNN', 'SVC','AdaBoost',"Random Forest",'XGBoost','Ensemble']cv=KFold(n_splits = 5, random_state=2022,shuffle=True)for clf, label in zip([cat,logreg, knn, svc, ada, rdf, xgb,eclf], labels): scores = cross_val_score(clf, info_x, info_y, 
                             cv=cv, 
                             scoring='accuracy',
                             n_jobs=-1) print("[%s] Accuracy: %0.6f (+/- %0.6f) Best: %0.6f " 
          % (label,scores.mean(), scores.std(), scores.max()))

图 7 显示了九个模型的输出。超参数调整后,叠加模型的平均精度为 0.732158,是第三好的分数。尽管如此,它也有最低的标准偏差,表明它在交叉验证测试中在防止过度拟合方面做得最好。集合模型和堆叠模型也具有最好和第二好的 ROC 分数。这个结果与我在上一篇文章中讨论的一致:简单加权平均集成|机器学习

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 7:模型性能表

图 8 是我上面提到的所有模型的 ROC 图:

plt.figure()
lw = 1#knn
knn.fit(X_train,y_train)
knn_pred = knn.predict_proba(X_test)
fpr, tpr, threshold = roc_curve(y_test,knn_pred[:,1])
roc_auc = auc(fpr, tpr)
plt.plot(fpr, tpr, color='tab:blue',
             lw=lw, label='KNN ROC curve (area = %0.4f)' % roc_auc)
... ...plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')
plt.xlim([-0.02, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC curve')
plt.legend(loc="lower right")
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8:测试数据集上的 ROC 图

错误预测分析

在这个项目结束时,我以 7 比 3 的比例将数据集分为训练数据集和测试数据集,并用堆叠模型拟合训练数据集。然后,我对我的模型错误预测的实例做了更多的分析。我想知道在什么样的条件下比赛会变得更加不可预测。

图 9 和图 10 说明了前 10 分钟两队的总金和总经验。这两幅图清楚地表明,在金牌和经验方面具有早期优势的球队最终输掉了比赛。测试集中有 799 个错误的预测。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 9:错误预测的蓝色和红色

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10:蓝色和红色在错误预测中的对比

我还进一步观察了丛林者的表现,因为在拉宁游戏中,两个队的队员通常都需要丛林者的帮助来获得主动权。图 11 显示了荣格勒的性能。这是整个测试数据集、错误预测和正确预测的“blueTotalJungleMinionsKilled”和“redTotalJungleMinionsKilled”之间的平均差异。错误预测的“JGDiff”小于整个测试数据集的平均水平,这意味着当蓝色丛林者的表现超过平均水平时,预测将变得有点困难。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 11:荣格勒的性能

结论

我的模型显然遇到了瓶颈,因为它们都不能产生高于 0.75 的准确度分数。我的假设是最终的数据集只包含 44 个特征,这是一个非常低维的数据集,因为英雄联盟可能会从每个游戏中捕捉数百个变量。对于进一步的实验,我建议加入一些特性,比如冠军组合,时间范围,特定玩家的冠军熟练程度等等。进入分析。

《英雄联盟》是过去十年全球最受欢迎的游戏之一。它将来自不同大陆的玩家聚集在一起,让他们在召唤师裂缝中分享快乐。尽管我试图预测排名赛的结果,但我一直认为,让比赛保持精彩的唯一方法是尽可能让它变得不可预测。最激动人心的时刻总是在终极群殴之后,紧接着是大反击。著名的容格勒,RNG。MLXG,曾经说过,“如果你不知道如何翻转一个失败的游戏,为什么要去玩英雄联盟。”

— — — —

你可以在我的 GitHub 库中找到这个项目的代码。

请随时与我联系LinkedIn

棒棒糖图表

原文:https://towardsdatascience.com/lollipop-charts-2f748b90f6f0?source=collection_archive---------41-----------------------

为什么&怎么样,用棒棒糖讲故事

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来自 Unsplash 的 Amy Shamblen

**又名:**棒棒糖剧情

为什么:棒棒糖图(LC)是条形图的一种便捷变体,其中条形被一条线和一个点代替。就像条形图一样,棒棒糖图用于在不同的项目或类别之间进行比较。它们也用于排名或显示随时间变化的趋势。我们只比较每个项目或类别的一个数字变量。它们不适用于关系、分布或构成分析。

当您必须显示大量类似的高值时,LCs 比条形图更受欢迎。在标准条形图的情况下,您可能会得到一个混乱的图表,并体验到一种称为莫尔条纹 (#1)的光学效果。图 1 在左侧显示了一个条形图,在右侧显示了一个棒棒糖图。两者都是基于相同的数据,但是很明显,棒棒糖的极简替代方案产生了更吸引人和更清晰的视觉效果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 1:条形图和棒棒糖图的比较。

莫尔效应是当观看叠加在另一组线或条上的一组线或条时出现的视觉感知,其中这些组在相对大小、角度或间距上不同。莫尔条纹是透过层层栅栏或者在拍摄电视或电脑屏幕时看到的黑色条纹。即使莫尔效应可以产生有趣和美丽的几何图案,但在数据可视化任务中应避免使用它们,以免混淆观众。

**如何:**棒棒糖图是二维的,有两个轴:一个轴显示类别或时间序列,另一个轴显示数值。这些数值由线末端的点的位置表示。垂直方向的 LC 在 y 轴上显示分类变量,而水平方向的 LC 在 x 轴上显示分类变量。图 2 显示了水平 LC 的示意图,其中细线末端的点表示每个类别的数值。使用 Matplotlib ,您必须使用 stem 功能来绘制水平棒棒糖。 stem 功能绘制从基线到 y 坐标的垂直线,并在顶部放置一个标记(#2)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 2:棒棒糖图的示意图。

LCs 是排名的一个很好的选择。标准程序是按降序排列类别,并垂直表示它们。使用 Matplotlib ,您必须结合使用函数 hlinesplot 来绘制垂直棒棒糖。 hlines 从标量 xminxmax (#3)在每个 y 处画水平线。函数图有几种可能的标记,但我们建议使用经典的圆形符号,如本文中的图所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3:垂直有序的棒棒糖图。

您必须始终从 0 开始数轴:如果行被截断,实际值将无法正确反映。请记住,在比较数据时,我们的视觉对长度差异非常敏感。如果我们修改基线,我们不可避免地会扭曲视觉。如果其中一个变量是时间(年、月、日、小时),请始终将其设置在水平轴上。时间总是从左到右,而不是从上到下。

LCs 等同于条形图,但这种等同只对标准条形图有效;不要试图将它扩展到堆积、聚集或重叠条形图(#4、#5)。

LCs 是两个数据可视化重量级人物之间一场有趣的辩论的主题,在理论和概念层面上都是如此:Stephen 少数人和 T21。很少通过讽刺的标题“棒棒糖排行榜:”谁爱你,宝贝?声称“LCs 的灵感来源于激发了如此多愚蠢图形的同一事物:对可爱和新奇的渴望”。他补充说,LCs 的主要问题是:“棒棒糖末端的圆心标记着值,但圆心的位置很难判断,与条形的直边相比,它不精确,而且圆的一半延伸到它所代表的值之外,使它不准确”。

对他来说,开罗站出来为图表辩护说:“我相信棒棒糖有它的用途。比如说,有 8 个或 9 个以上条形的条形图,看起来通常很忙,很笨重。棒棒糖图可以通过显著增加条形之间的空白来解决这个问题。他提出了一种解决方案,即减小圆的尺寸,甚至用圆的顶点来标记数值。

Eli Holder 在 Nightingale (#7)上发表了一篇非常有趣的文章,标题是:“解决争论:棒糖与棒棒糖(与点状图)的对比”,描述了一个实验,揭示了“棒棒糖图表如何影响读者的理解?为了好玩的美学,我们牺牲了多少认知责任?”最后,他得出结论,实验结果显示条形图和棒棒糖图之间没有显著差异,它们导致了大致**相同的准确性和相同的响应时间。**最后,LCs 为数据提供了一个很好的极简可视化,它们应该在与条形图完全相同的情况下使用。

用棒棒糖讲故事

1。—mtcars数据集的燃料消耗:人类活动增加了二氧化碳(CO2)和其他温室气体(GHC)的排放,推高了气温。大多数人为的二氧化碳排放来自燃烧化石燃料。GHG 交通运输的排放约占美国温室气体排放总量的 28%,是美国最大的温室气体排放源(排名第八)。美国环境保护署为 GHG 制定了一项国家计划,并为轻型车辆(乘用车和卡车)制定了燃油经济性标准。

之前对油耗的研究是基于通过 mtcars 数据集进行的汽车趋势道路测试。数据摘自 1974 年的《美国汽车趋势》杂志,包括 32 款汽车(1973-74 款)的油耗以及汽车设计和性能的 10 个方面。以下 LC 显示了 32 个汽车品牌的每加仑行驶里程。顶部的蓝色点划线对应于油耗低于平均值(20.09 mpg)的车辆,而红色点划线对应于油耗高于平均值的车辆。显然,对于比较如此大量的不同类别,棒棒糖图比条形图更好。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 4:基于 mtcars 数据集的每加仑行驶里程。

    • 阿根廷政府预算:政府预算是政府收到的款项(税收和其他费用)和政府支付的款项(购买和转移支付)的分项核算。当政府支出大于收入时,就会出现预算赤字。预算赤字的对立面是预算盈余。

由于经常性的政府预算赤字,阿根廷是世界上通货膨胀率最高的国家之一。下图显示了该国 2012-2018 年期间的月度预算赤字。现在,棒棒糖图可以让我们以一种美观的方式跟踪一段时间内的预算模式。如上所述,时间在水平轴上从左向右运行。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 5:阿根廷月度预算赤字。

总之:棒棒糖图与标准条形图在相同的情况下使用,以相同的方式对数值进行编码:线条的长度和线条末端的点的位置相当于水平或垂直矩形条的长度或高度。当您处理大量相似的数值时,棒棒糖图比条形图更受欢迎。

如果你对这篇文章感兴趣,请阅读我以前的:

“气泡图,为什么&如何,用气泡讲故事”

[## 气泡图,为什么和如何

用泡泡讲故事

towardsdatascience.com](/bubble-charts-why-how-f96d2c86d167)

“平行坐标图,为什么&如何,用平行线讲故事”

[## 平行坐标图

为什么&如何:用类比讲故事

towardsdatascience.com](/parallel-coordinates-plots-6fcfa066dcb3)

参考文献

第一名:【https://en.wikipedia.org/wiki/Moir%C3%A9_pattern

2:https://matplotlib . org/3 . 1 . 1/gallery/lines _ bars _ and _ markers/stem _ plot . html

3:https://matplotlib . org/3 . 1 . 1/API/_ as _ gen/matplotlib . py plot . hlines . html

#4: Darío Weitz,“堆积条形图,为什么&如何,讲故事&警告”
https://towardsdatascience . com/Stacked-Bar-Graphs-Why-How-f1 b 68 a 7454 b 7

#5: Darío Weitz,“群集和重叠条形图,为什么和如何”
https://towardsdatascience . com/Clustered-Overlapped-Bar-Charts-94 f1 db 93778 e

#6:斯蒂芬·菲罗,《棒棒糖排行榜》:谁爱你,宝贝?
https://www.perceptualedge.com/blog/?p=2642

#7:伊莱·霍尔德,https://medium . com/nightingale/bar-graphs-vs-lollipop-charts-vs-dot-plots-experiment-ba 0 BD 8 aad 5d 6

8:https://www . EPA . gov/transportation-air-pollution-and-climate-change/carbon-pollution-transportation

用图卷积网络预测伦敦自行车骑行

原文:https://towardsdatascience.com/london-bike-ride-forecasting-with-graph-convolutional-networks-aee044e48131?source=collection_archive---------18-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

人们在伦敦海德公园的林荫道上骑自行车,摄于 istockphoto.com

端到端 PyTorch 深度学习从概念到验证

深度学习方法的名册上最近增加了一个新成员是图卷积网络 (GCN)。像其著名的祖先卷积神经网络 (CNN)一样,可学习的卷积运算是关键,因为已知输入和预测输出之间的大量非线性关系串在一起。然而,广义细胞神经网络中的卷积运算与细胞神经网络中的不同。

我将分享 GCN 对一个问题的实际端到端应用,对于该问题,读者应该能够将 GCN 中的数学实体与现实世界的前兆联系起来。英国伦敦自行车共享的时间序列预测是我构建并展示的 GCN 的具体应用。

一个实用、简单、真实的介绍是我这次探索的目标。肯定会有遗漏,高级读者可以在别处找到复杂的数学处理方法。我的实现使用了 PyTorchPyTorch Geometric ,代码片段在整个文本中共享。

为什么要用图表呢?

CNN 是根据其维度来描述的,例如一维或二维。这对应于一个给定的结构的问题。文本或语音分析可以被视为沿着一个维度构建的问题。图像分析或物体识别可以被看作是沿着两个维度构造的问题。

然而,有许多问题在结构上并不那么规则——它们可能并不完全适合欧几里得空间。

一个是一个通用的数学结构,许多问题都被映射和分析在上面。生物学中有大量的抽象图形,例如交互组代谢网络。社交媒体上有趣或可怕的模因扩散与图表上的动态有关,这也适用于病毒传播和传染病。

交通是另一个很好的例子。在国王十字车站跳上一辆自行车,在用力踩踏板之后,在查尔斯·狄更斯博物馆下车,这是一个涉及图表中两个顶点的时空运输事件。

城市交通主要沿着两个方向进行。然而,在相同距离的城市中的两对顶点在各自的顶点之间可能经历非常不同的交通,因为在顶点处或顶点之间存在什么商业活动、住宅或道路。城市环境是异质的,地点和道路很少可以互换。欧几里得距离(或者曼哈顿距离)在许多运输问题的模型中是不够的,因此城市图是优选的。

因此,GCNs 可以应用于城市图上的运输问题。这些是时空问题——事件的时间和地点以及它们的耦合性质。显而易见,定义问题结构的图是 GCNs 的核心。

桑坦德自行车数据集的描述性统计

在 GCN 建立和应用之前,我对伦敦自行车共享数据集进行了简明的描述性分析,因此概念清晰,直觉明确。我过去做过一个更详细的伦敦自行车共享的数据分析

在英国伦敦市,有一个自行车共享系统桑坦德自行车,也被称为鲍里斯自行车,以 2010 年引入该系统的前市长鲍里斯约翰逊命名。伦敦(TfL) 交通局详细记录了自行车的使用情况。

原始数据中的一行对应于单个运输事件:自行车从哪个自行车站出发的时间,以及所述自行车到达另一个(或同一个)自行车站的时间。原始数据不包含关于自行车在出发和到达时间之间的位置的信息。

每个自行车站点可以理解为拥有两个与时间相关的数据流:在一个时间间隔内自行车出发的数量和自行车到达的数量。

在必要而乏味的数据争论(总结在脚注中)之后,我考虑 2017 年和 2018 年 709 个自行车站的双重数据流,除非另有说明。

这些站点在数据流方面有多大的不同?下面的直方图显示了伦敦有多少个自行车站有特定的每周发车和到达次数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

大多数车站一周有 200 到 600 人到达和离开,而少数车站有更多。这显然是而不是只是一个普通平均值的正常变化。

也有季节性变化。2017-2019 年每周自行车租赁总数如下所示。这三个尖点对应着伦敦温暖少雨的月份。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一周之内,几天之内,都会有变化。下图显示了 2017 年连续五天内每半小时发生的租赁总数。周末和工作日在性质上是不同的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因此,自行车租赁活动随时间变化很大。这种时间上的变化有着直观的意义:在雨中和寒冷中骑自行车不那么吸引人了;上下班主要发生在工作日的早上和晚上。

顺便提一下,由于新冠肺炎疫情引起的主要时间变化可以通过通勤数据签名的变化来跟踪。

709 个站点之间的空间关系。根据原始数据,我确定从某一特定车站出发的列车到达另一个车站的百分比。人们经常骑自行车的一对车站是联系更紧密的,或者用非欧几里得空间的术语来说,是图中靠得更近的

站与站之间行程百分比的聚类热图如下所示,红色-黄色表示相应站对之间的联系较强,蓝色表示相反,绿色表示中间关系。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

热图显然是聚集的。非对角线颜色不是均匀分散的。因此子集站可以具有与其他站的相同子集相似的距离。

可见的星团大致与伦敦的地理相吻合。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

左上角的集群包括巴特西公园和克拉彭枢纽附近的车站。下一个小而独特的集群包括富勒姆和普特尼附近的车站。下一个更大的集群包括海德公园和整个肯辛顿附近的车站。然后沿着试剂公园、马里波恩周围的车站,尤其是主要通勤枢纽国王十字车站。这个庞大但相当分散的集群包含了伦敦市中心的大多数车站,包括索霍区、威斯敏斯特区、利物浦街以及滑铁卢站。最后,维多利亚公园白教堂最东边的车站形成了一个相当独特的集群,肖尔迪奇周围的车站是伦敦中心集群的关键。

因此,空间关系类似于二维度量将产生的空间关系。这有助于我们理解这个方法。然而,该图隐含地体现了城市自行车交通在方向和范围上的异质性,这是欧几里德度量所没有的。

与上面的热图一致的加权有向邻接矩阵是下面的图卷积的关键。

图形卷积应该做什么

邻接矩阵说明了数据流是如何耦合的。如果从一个车站出发的人数突然增加,那么在不久的将来到达其他车站的人数突然增加的概率是不一致的。

因此,邻接矩阵可以定义 i 感应偏差。直观地说,我们对问题结构的了解应该允许我们指导归纳、推理或机器学习拟合。像 CNN 中的标准正方形卷积窗口,其偏向于发现最接近像素中的特征,图形卷积操作应该能够挖掘图形中具有预测性的局部关系。

是时候建立模型并找出答案了。

时空图卷积网——逐步构建

我下面描述和探索的深度学习模型是建立在于等人关于交通预测的工作基础上的。他们将该方法应用于北京和加州的公路交通数据。偶尔会出现与他们的模型和我下面介绍的有所不同的情况。尽管如此,他们定义了架构,理应受到表扬。

我的目标是而不是为手头的任务开发另一种最先进的模型。这将需要更多的架构和合适的元参数。相反,我从于等人的模板模型中建立了一个模型,描述了它的组成部分和它们的作用,并探索了在自行车问题导向的过程中 gcn 可以是什么。

据我所知,这是伦敦自行车数据集上的第一个预测任务,因此至少在这方面,我提出了新颖的工作。

展示模型的后续步骤:

  1. 首先通过一维卷积加上门控激活的时间维度。
  2. 首先用图卷积穿越空间维度,以及它们在概念上和实践上的作用。
  3. 第二次沿时间传递,也使用层规格化。
  4. 在使用多层感知器得出最终预测之前,重复步骤 1-3。

沿时间维度的第一次通过:1D 卷积

特定自行车站的时间信号以一维卷积开始,随后是门控线性单元激活。如上所述,每个车站有两个输入通道:到达人数 s1 和离开人数 s2

九个最近的数据点沿着单个时间维度进行卷积,核大小为 3。左侧两行方框的动画演示了这些步骤。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

卷积是两个输入通道(每次三个连续数据点)到 128 个输出通道的线性变换。动画中的变换权重和偏差 Wb 是可学习的参数。另请注意,卷积没有任何填充,因此输出的长度比输入的长度少两个,在此过程中为七个。

门控线性单元 (GLU) 为非线性激活功能。到 GLU 的一个通道充当门的控制器,第二个通道充当可以或不可以通过门的数据。严格来说,门是一个二进制的开或闭系统。由于不连续的函数难以优化,门被模拟成一个连续的 sigmoid 函数,𝝈,介于 0 和 1 之间。

因此,GLU 消耗两个长度为 7 的数据通道,并产生一个长度为 7 的通道。动画仅显示了应用于 128 个通道中的两个通道的 GLU。在所有通道都被处理后,64 个通道的数据是任何特定站的结果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

下面的代码片段显示了使用 Pytorch 执行卷积和非线性激活的自定义类的关键部分。省略了关于如何分割和连接数据张量的细节。

对所有 709 个自行车站点应用相同的卷积核集合的这些步骤,并且维度 709x2x9 的输入数据张量变成维度 709x64x7 的输出数据张量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第一遍时间变换的输入和输出张量;灰色阴影框表示图中省略的行和列。

我简要地指出,像这样对时间序列问题建模的更常见的方法是递归神经网络(RNNs)。最近发现一维卷积也表现得很好。

打个比喻来说,一维卷积是为沿着时间维度发现多达 64 个特征而定制的机器,如急剧增加相反趋势的出发和到达自行车出发从零开始的短暂跳跃急剧减少 —与输入数据流中几个连续点相关的属性。这是留给训练的方法,以了解什么功能是有用的,在最终的预测,但更多关于这一点。

第一次穿越空间维度:图形卷积

接下来,时间特征之间的空间关系将被转换成另一组特征。这就是时空特征开始出现的地方,也就是说,空间中特定点之间随时间的变化是相关的。

由于图中可能存在多种局部结构,在所述多种结构上一致地进行卷积的适当方式并不明显。因此,自 2005 年第一种以来,大量不同的图卷积被公式化并发表,所有这些图卷积都有其假定的优点。这里不适合调查所有选项或整理它们的逻辑关系。相反,我使用两种类型的图卷积,并集中描述定性和概念性的属性。这两种类型是:

在进入细节之前,我从图卷积的共享属性开始。

时间卷积之后的输入张量首先被切片,使得仅考虑七个时间维度中的一个。因此,709 个顶点或自行车站的 64 个数据通道构成了输入,请参见下面动画图像中的左侧块。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

操作 A 选择自行车站点的子集ω1,并重新称重相应的数据。选择和重新加权由图、其权重和拓扑来控制,这些是邻接矩阵中表示的属性。在前面的部分中,伦敦桑坦德自行车的集群矩阵显示为热图。

重新加权的子集ω1用可学习的参数 W 进行线性变换。站子集的 64 个数据信道变成 16 个输出数据信道。众所周知的 整流线性单元 (ReLU) 被用作非线性激活,并且已经获得第一时间维度的第一自行车站的输出向量。

下一个:第二个自行车站,第一个时间维度。进行不同的局部选择和重新加权,ω2,而带有可学习参数的线性变换和带有 ReLU 的非线性激活与之前相同。由此获得第二自行车站的时空特征。

不断重复,直到计算并收集了所有自行车站点和所有时间维度的输出。

在图形卷积结束时,获得了 709×16×7 维的张量。它代表了 709 个自行车站点的本地时空特征。如前所述,卷积跟踪的精确特征是那些被证明对预测任务有用的特征,如在方法训练期间所揭示的。

简要说明:我在中描述的步骤顺序并不是它是如何实现的。有许多方法可以评估累积算法并得到相同的输出——实际上是神经网络的优点之一,它使能够有效地实现。该描述旨在帮助概念更加清晰,而不是作为实现规范。

下图详细介绍了 Kipf 和 Welling 对伦敦自行车站的选择和重新称重方法。左边的图表显示了七个自行车站点以及站点之间自行车的相对流量。在模型的这一层,每个站有 64 个数据通道。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为了获得斯坦福德街站的输出,选择了图中连接到斯坦福德街的其它站。带有紫色粗边框的五个站点定义了该子集。相关数据作为图权重和图拓扑的函数被重新加权并求和。获得 1×64 张量。

重新加权取决于在图中的拓扑中进出斯坦福德街的权重。定性地说,这意味着平衡更强连接和弱连接的站,以及归一化一些站比其他站具有更多的邻居(更高的程度)。这些是图卷积的独特问题。精确的等式需要一个更正式的证明,这可以在链接的文章中找到。

斯坦福德街站输出计算的最后一步是使用可学习的权重将 64 个通道的数据线性转换为 16 个通道的数据。最后,用 ReLU 完成非线性激活。

下图说明了 Hatton Wall bike station 的等效步骤及其在图中的本地环境。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最后,对另一种图形卷积方法 TAGCN 进行了说明。它也为感兴趣的自行车站选择本地环境。然而,该环境不仅包括直接相邻的站。相反,它考虑长度小于或等于上限的站之间的所有路径,我在下面的计算中将上限设置为 2。重新加权基于路径上权重的总和。

查看 TAGCN 的另一种方式就像不同内核大小的两个卷积的聚合——一个是直接邻居,一个是直接邻居的邻居。CNN 中的一个类似物是不同大小的方形核的集合,它已经被用于一些图像识别任务中。

下面的代码片段显示了使用 Pytorch 和 Pytorch Geometric 执行图形卷积和非线性激活的类的关键部分。省略了关于如何分割和连接数据张量的细节。

我将操作 AW 表示为一个空间操作, S1 ,我们现在进入模型的更深一层。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我使用的邻接矩阵是上一节中彩色热图的调整版本。成对的自行车站之间很少有人骑行,有时一年只有一次。相关的重量非常小。稀疏矩阵导致更快的计算,许多微小的权重充其量是空间无信息的,但也有增加噪声的风险。

由于这些原因,将测试重量的两个较低阈值。任何低于 1%或 2%的连接都不予考虑。为了了解稀疏性,邻接矩阵如下所示,1%或以上的权重为黑点,1%以下的权重为空白。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

沿时间维度的第二遍:1D 卷积

图形卷积和激活之后是时间维度上的另一个一维卷积。操作与第一遍相同。然而,可学习的参数可以不同,并且时间维度的长度是 7,而不是 9。此外,特定站点的每个数据元素不仅包含该站点的过去数据,而且由于图形卷积,数据元素取决于给定站点本地站点的趋势。

到目前为止的图层如下图所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

标准化数据

具有许多层的神经网络对于优化和训练是具有挑战性的。已经发现某种形式的标准化在这方面有所帮助。这种增强的一个常见原因是,通过归一化操作对网络施加的数值限制消除或回拨了可能通过许多连接层放大的数值问题,其中主要是协变移位

接下来增加的是一个图层归一化,这里直观描述为。它拟合每个站点和时间维度的参数,以便将 64 个通道中的数据缩放到大约零平均值和单位标准偏差。

适当的 PyTorch 类被初始化

layer_norm_1 = torch.nn.LayerNorm([n_spatial_dim, n_temporal_dim - 2 * time_conv_length + 2])

其中空间维度是 709,时间维度 9 减去与长度为 3 的核的卷积的影响,即 5。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所有的,再来一次

接下来的卷积步骤是上述步骤类型的重复。即,每个自行车站点随时间变化的一维卷积、每个时间维度的图形卷积以及另一个一维卷积加图层归一化。可学习的参数不同,但概念相同。

因为随着时间的推移,每个卷积沿时间轴收缩张量,所以卷积后的输出仅由沿时间轴的一个切片组成。

该方法的压缩说明:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从特性到预测

卷积旨在发现和表示有用的时空特征。最后一步是计算回归,该回归基于时空特征预测未来某个时间站点的自行车到达和离开。

神经网络的主力多层感知器(MLP) 用于此目的。它有一个隐藏层,ReLU 激活,并完全连接。它将卷积序列的输出作为输入,并返回 709 个站点的出发和到达的预测值,换句话说,就是一个 709x2 张量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

返回值不是整数,而是实数值。在现实世界的问题中,只能有整数的到达和离开。由于这个原因,输出被解释为可能的整数值分布的集中趋势(像平均值或模态值)。我没有以其他方式描述这种分布,尽管原则上这是可能的。

从头到尾的模型:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

定义要训练的回归

将使用的时间间隔是 15 分钟。也就是说,9 个时间输入中的每一个都描述了 709 个自行车站点中每一个站点在 15 分钟间隔内的自行车出发和到达数量。这些是给该方法的已知输入。

我选择的预测目标是比最近的输入超前四步,换句话说,超前一小时。想象一下这样一个场景,我们希望预测某个特定时刻一小时后的自行车流量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我使用 2017 年的数据作为训练数据。因此,大约有 35,000 个可能的训练数据实例可用。我随机选择其中的 17%用于训练。这意味着训练数据涵盖早上、晚上、工作日、周末、夏天、冬天等。

培训的目标是与 2017 年选定的地面真实数据相比,最小化所有车站的预测自行车到达和离开的均方差。

优化和批处理

优化神经网络有大量的艺术和科学,它们的大小意味着一个数学和计算上的棘手问题。然而,我不会深究这些细节。这里有一个两个三个不错的地方可以去看看。我在训练中使用随机梯度下降法。

批次是深度神经网络训练中的附加概念。我建议读者去其他来源了解这是什么以及为什么这是一种常见的做法。对于图形神经网络来说,实现批处理是很自然的。如 Pytorch 几何文档中所述,一批,比如说 64 个训练数据点可以被表示为一个具有 64✕709 顶点的图,但是其中 64 个子图是不相交的。因此,对于这种较大的不相交子图连接,大部分计算可以保持原样。

训练可以开始了。培训代码的基本部分如下面的代码片段所示。

上面描述的模型是用定制类 STGCN 初始化的,在前面的小节中显示了其中的代码片段。

LondonBikeDataset 做了大量繁重的工作来解析、切片、格式化和过滤原始数据。正如在处理现实世界的问题时经常发生的那样,这是必须为不一致的数据实践付出代价的混乱部分,在第一百万行附近草率地使用分隔符是一个令人头疼的问题。熊猫图书馆是无价之宝。

我在 GPU 上运行的部分培训可从 Google Colab 获得——对于没有免费专业配置的计算机集群的实验者来说,这是一个惊人的资源。

六月在斯坦福德街的结果图解

斯坦福街是一个车站,没什么特别的。我用它来说明结果是怎样的——所有测试数据的汇总统计数据将在后面给出。Kipf 和 Welling 的图形卷积方法与邻接矩阵一起使用,对于权重具有 2%的较低阈值。

所有测试数据都选自 2018 年,因此保证不是训练数据的一部分。

在六月的四天中,在斯坦福德街站观察到的自行车到达数据显示为带有细连接线的紫色圆圈。相应的预测数据显示为绿线。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

事实上,15 分钟内自行车到达的数量通常很少,在一些情况下为零,这意味着观察到的数据是有噪声的。为什么在一个季度没有到达,而在下一个季度有三个到达,除了偶然之外,通常没有别的原因。在处理小数字时,这个过程的随机性是很明显的。

为了消除噪声,对观测数据计算五窗口滚动平均值。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

平滑后更容易看出观测值和预测值之间的异同。捕捉到工作日早晚的明显峰值。请注意,该模型并不明确知道它要预测一周中的哪一天。尽管如此,观测值和预测值之间的偏差仍然明显存在。

海德公园和隐藏的天气参数

海德公园角是另一个车站——这是不一般的,它是最繁忙的车站之一,尤其是在周末。由于天气原因,该站在周末之间变化很大。显示了 2018 年 9 月四个周日的平滑观测(紫色)和预测(绿色)数据。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

该模型没有明确说明对天气的依赖性。但由于一种持续的模式,在训练中间接学到了一些天气的结果。9 月 23 日早上下雨的事实必须在输入数据的某个地方表现出来,这样 9:00 左右租金的通常增长就不是预测的一部分。

这说明,仅仅因为该模型没有直接考虑星期几、天气、季节或一大堆其他因素,而这些因素直觉上应该影响伦敦人在公园里兜风的胃口,但所述因素的累积影响在某种程度上仍然由该模型处理。

空间卷积有用吗?

简而言之:有一点,但没那么多。

为了进行公平的比较,我运行了上面模型的一个版本,其中邻接矩阵的所有非对角线元素都设置为零。因此,在卷积步骤期间,图中顶点之间的时间特征不会混合。

我比较了这种纯时间模型的均方误差(到达 0.657,离开 0.683)和一些具有图形卷积的变量(Kipf 和 Welling 具有 1%和 2%的阈值,TAGCN 具有相同的阈值)。相对而言,图卷积模型的均方误差始终低 2%-6%。这两种图形卷积的表现大致相同,对到达的预测比离开的好一些。

一个额外的复杂因素是少数电视台有更多的租赁活动。因此,适度减少的误差主要来自这几个台站的变化。我称之为复杂性,而不是缺陷,因为这是对还是错取决于应用程序的最终目标是什么。也许高流量站才是我们关心的?

我还训练了一个具有邻接矩阵的模型,该矩阵将所有权重替换为相同的值(1.0),假设它们高于 1%阈值。称之为对问题结构信息的有意破坏。均方误差远高于纯时间模型。这个测试表明,对问题结构的糟糕描述会使结果变得更糟。简单就是错的时候少错。

更好的图形清晰度?

结果表明,平均而言,图卷积对伦敦城市交通的预测帮助不大。有很多模型元参数的其他变化可供尝试。

不过,我想知道,一刀切的邻接矩阵是否对精确度设置了更严格的限制?周末和工作日是桑坦德自行车最明显的不同使用时段。因此,从非欧几里德图的角度来看,在工作日靠近的两个站在周末可能不那么靠近。问题的结构本身是动态的,并且依赖于全局变量,因此平均结构有其作为归纳偏差的基本限制。

因此,也许可以扩展架构,使用不同的邻接矩阵并行包含两个(或更多)图卷积?或者为周末和工作日,或者中午之前和中午之后,或者晴天和雨天训练完全不同的模型?

为了更深入地挖掘,在给定这种类型的输入数据流的情况下,任何方法所能预测的内容肯定是有限的。桑坦德自行车骑行的图表是高度分支的。因此,在没有附加信息的情况下,在一个车站的已知的发车增加在大量可能的终点车站上被抹杀。伦敦自行车共享是高熵的。这不是一条道路分布狭窄的高速公路。为了提高精度,需要其他类型的输入数据流。

解决这个问题需要更多的工作、灵感、数据挖掘、数据争论和宝贵的 GPU 时间。这些山不是今天就能爬上去的,而是留给未来的探索和实践——任何一个好的知识获取项目都应该得出这样的结论。

这有用或有趣吗?或者仅仅是值得鼓励?亲切的鼓掌。

脚注

  • 总共约 800 个站点中包括 709 个站点。排除集包括在至少一周的时间段内总共停止运行至少四周的台站,其中包括退役台站。
  • 少数租赁活动持续时间非常长,或者从未结束。他们被排除在考虑之外。
  • 训练误差非常接近测试误差,表明在 2017 年和 2018 年之间没有发生过拟合,也没有发生明显的概念漂移。
  • 不同模型的测试误差是在 2018 年数据的相同 17%样本上计算的。

长期联系:Johansen 协整方法简介

原文:https://towardsdatascience.com/long-run-linkages-a-briefer-on-the-johansen-cointegration-methodology-6744ee253012?source=collection_archive---------28-----------------------

经济变量能有长期关系吗?是啊!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

协整背后的动机

在经济学中,有许多变量一开始看起来可能是非平稳的,但是当这些非平稳序列进行线性组合时,该线性组合可以被描述为平稳的。虽然大多数经济学家认为协整是某种深层的理论建构,但其定义实际上是本文的第一句话。理论上,它不需要任何形式的理论来推动。然而,经济学家认为,一些潜在的长期趋势或稳定状态可能会拉动这些变量一起运动。就像一个人在公园遛狗,脖子上拴着皮带,即使狗被长凳左手边的大花或另一只在角落里吠叫的狗分散了注意力,他们也会一起移动。

约翰森的方法论

在计量经济学领域,最流行的方法是基于 Soren Johansen 的协整检验。

Johansen 的方法是基于这样一种想法,即估计的秩给了我们关于 pi 是否存在协整以及这些协整关系的数量的信息。根据定义,π的秩是这个矩阵中独立向量的最大数量。如果我们有三个内生变量,我们只能有三个独立的向量,不能再多了。等级可以是零或至多三或该范围内的任何值。也就是说,秩不能超过系统中内生变量的个数。

如果 pi 的秩等于零,那么就说不存在协整。这意味着 pi = 0,你可以在等式中看到这一点。如果你把它代入方程,那么所有的误差修正项都将消失,因此系统将崩溃为一个简单的变量差。如果的秩等于我们称为满秩的内生变量的数量,那么它表明所有变量都是 I(0)或者变量都是平稳的。所以在这种情况下,我们不能谈论非平稳变量之间的协整,因为变量已经是平稳的。因此,您可以在不同的级别上运行 VAR。如果的秩严格介于零和内生变量数之间,0

约翰森方法中有两种类型的测试。第一个是每个秩 r 的跟踪统计量。在我们的模型中有三个内生变量,r 是 0、1 或 2。第二个是每个秩 r 的最大特征值统计。零假设是秩等于秩(pi)而另一个假设是秩是秩(pi) + 1。

R 中的示例

是时候为 r 中的协同集成提供一个实际的示例测试了。为此,我们需要使用“urca”包,其中包含 ca.jo 命令来实现测试。首先,我们加载所需的包,并使用 read_csv()命令加载数据集“VECM_LectureNotes.csv”。数据集和代码可以在这里找到:https://drive . Google . com/drive/folders/1 qhuws 83 gauovnxnoi-OZ6-shmtwo 8 MDB?usp =共享

library(urca)
library(forecast)
library(tidyverse)data <- read_csv(file.choose())head(data)

然后,我们使用 ts()命令声明我们的时间序列变量。我们注意到这个系列从 2001 年的 Q1 开始,一直到 2020 年的 Q1。这显然是季度数据,因此我们将频率设置为四次。

GDP <- ts(data$lnGDP, start = c(2003,1,31), frequency = 4)
CPI <- ts(data$lnCPI, start = c(2003,1,31), frequency = 4)
M3 <- ts(data$lnM3, start = c(2003,1,31), frequency = 4)

在将系列声明为 ts 对象后,我们需要将变量绑定到一个单一系统中。为此,我们使用 cbind()命令。我们把这个系统存储到一个对象中,在这个例子中是数据集

dset <- cbind(GDP,CPI,M3)

之后,我们需要选择最佳的滞后阶数。现在回想一下,在 VECM(或协整假设)中,使用的最佳滞后阶数是 p -1。为了确定最佳的滞后数量,我们使用 VARselect()命令。

lagselect <- VARselect(dset, lag.max = 7, type = "const")
lagselect$selection

由于汉南奎因和最终预测误差中出现了 5,我们选择使用 4 滞后。鉴于数据的频率是每季度一次,预计会有 4 次滞后。现在我们已经完成了滞后选择,我们可以继续指定测试。正如我们提到的,约翰森测试有两种变体。这些是最大特征值和跟踪统计方法。方便的是,ca.jo()命令允许我们轻松地指定这些。

我们从跟踪统计方法开始。同样,ca.jo()命令请求在我们的系统(dset)上使用 Johansen 协集成方法。在这种情况下,我们使用指定为类型的“跟踪”统计方法。接下来,我们指定我们的规范有一个常量(ecdet = "const "),并且我们使用 4 个滞后。

ctest1t <- ca.jo(dset, type = "trace", ecdet = "const", K = 4)
summary(ctest1t)

如果您正确运行了测试,您应该会看到下表。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Johansen 协整检验结果

在表中,您应该看到 4 列。test 列包含测试统计信息,而其他三列包含 10%、5%和 1%级别的临界值。在这种情况下,作为标准做法,我们通常使用 5%的临界值作为参考。表中的 r 代表等级,我们知道这是协整关系数量的某种指示。当 r = 0 时,测试统计值 87.77 > 22。这意味着我们拒绝了 r > 0 的零假设。因此,存在一些协整关系。当 r <1, 21.64 > 15.67。这再次意味着我们拒绝了 r > 1 的零假设。最后,当 r < 2 时,我们不能拒绝零假设,因为 7.89 < 9.24。因此,我们得出结论,最多存在 2 个协整关系。

我们也可以使用下面的命令,使用最大特征值变量来运行测试。

ctest1e <- ca.jo(dset, type = "eigen", ecdet = "const", K = 4)
summary(ctest1e)

正如我们所看到的,我们得到了与跟踪方法相似的结果。总的来说,我们可以得出结论,至少存在两种协整关系。到现在为止,你应该已经把这两个关系联系起来了,这两个关系可能是价格和货币供应量,以及价格和 GDP。一旦我们正式估算了 VECM,我们将在后面讨论这个问题。

为了更好的解释,请查看下面我的 YouTube 视频链接。

参考

[1]布鲁克斯,C. 金融计量经济学导论。(2019)剑桥大学出版社。

[2]汉密尔顿,j .时间序列计量经济学。(1994) 普林斯顿大学出版社,普林斯顿

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值