软件工程师挣多少钱?
Photo by Markus Spiske temporausch.com from Pexels
写代码是目前城里最热门的游戏——让我们看看薪水是否与宣传相符
2012 年,当我搬回硅谷时,我记得曾听说优秀的软件工程师越来越难招到了。大型科技公司正在竭尽全力争夺给最优秀的工程师开巨额支票的特权。
当时,我距离获得莱斯大学的 MBA 学位仅差两年。我最近没有查看统计数据,但在当时,作为一名排名相当不错的 MBA 毕业生(当然,如果你去了哈佛或斯坦福,你会期望更多),你对 10 万至 11 万美元的基本工资加上适度的奖金相当满意。因此,当我搬回湾区时,我震惊地听说,顶尖计算机科学本科项目的应届毕业生除了获得公司股票或期权的丰厚奖励外,还获得了越来越多的收入。
自那以后的几年里,软件工程师的薪酬只是在大型科技公司(脸书、谷歌、苹果等)赚取巨额利润的推动下上涨的。),资本从软银这样的非传统风险公司大量涌入创业公司,以及华尔街(在大多数情况下)愿意专注于使命和机会而不是损益表。
今天,我们将使用 H1B 工资数据来探索硅谷软件工程师的基本工资有多高,以及过去几年的趋势如何。我将借用我之前两篇与薪酬相关的文章中的许多方法和代码,您可以在这里找到:
希望你喜欢!如果你想用我的代码进行你自己的分析,你可以在我的 GitHub 上找到它。
他们挣多少钱?
在我们深入研究这些数字之前,让我们先了解一些细节:
- 所有数据都是从 H1B 工资数据库中抓取的。
- 我只收集了硅谷(旧金山湾区)城镇的数据。
- 我的数据只包括以下两个职位——软件工程师和高级软件工程师。
- 最后,我给出的数字只是基本工资,不包括年度奖金、限制性股票单位(rsu)或股票期权。
让我们先把基本数字弄清楚。2019 年,我发现软件工程师的底薪中位数是 13 万美元。拥有高级软件工程师头衔的人年薪为 14.8 万美元。
以下是 H1B 数据中软件工程师头衔的 2019 年基本工资四分位数:
- 第 25 位百分位数—【12 万美元
- 第 50 个百分位数—13 万美元
- 第 75 个百分位数—15 万美元
以下是高级软件工程师头衔的相同值:
- 第 25 个百分位数—132,000 美元
- 第 50 个百分位数—148,000 美元
- 第 75 个百分位数—164,000 美元
这些数字很大,我想再次提醒你,这些数字是在年度奖金(如果适用)和股权(绝对适用)之前的。
哪些公司工资最高?
上一次,人们对哪些公司向数据科学家支付最高工资颇感兴趣,所以让我们来看看软件工程师的类似图表。为了提醒大家我们在看什么,下表中的值捕捉了 2018 年和 2019 年硅谷软件和高级软件工程师(我把他们都放在一起)在公司中的 H1B 工资中位数。我只标出了在此期间雇佣了至少 30 名 H1B 软件工程师的公司。
Median Software Engineer Salary by Company (2018–19)
有几件事引起了我的注意:
- 在我调查的所有公司中,只有一家公司的薪资中值低于 10 万美元。
- 这份名单上有 14 家公司(都是你应该认识的公司)给他们的软件工程师支付的平均基本工资是 15 万美元或者更多。
- 我们稍后会看到,谷歌是 H1B 软件工程师的最大雇主之一。他们的基本工资中值为 14 万美元,相当可观,但这仅使他们在我们的榜单上排名第 23 位。话说回来,他们可能会以其他方式弥补,比如更高的奖金、大量的股权、高于平均水平的加薪,以及波霸鸡尾酒(主宰他们所有人的一项特殊待遇)。
- 第一是……我们工作!我没想到会这样。话又说回来,他们从风险投资家那里获得了大量资金,并极其努力地将自己塑造成一家科技公司,而不是房地产公司。此外,它们目前的价值为 470 亿美元。无论你有多乐观,都很难指望股票在这些泡沫水平上有很大的上涨(特别是在它继续消耗大量现金的情况下)——所以最近的新员工可能会要求更高的现金薪酬来弥补风险。
但是更重要的是,不管你选择在哪里编码,看起来你都会得到一份相当不错的薪水,
过去几年谁雇佣的人最多?
现在我们来看看过去 6 年(2014-19 年)谁雇佣了最多的 H1B 软件工程师:
Who Hired the Most H1B Software Engineers (2014–19)
哇,看看谷歌——他们雇佣的员工数量比其他任何人都多。脸书和 LinkedIn 远远落后于第二名和第三名——在我研究的这段时间里,他们仍然雇佣了几千名软件工程师。
所以看起来谷歌在我的数据集和软件工程师招聘中占据了主导地位。不过,这并不一定会扭曲我的数据。请记住,所有这些公司都在竞相招聘高质量的工程师——没有人会在真空中招聘。因此,谷歌对程序员的兴趣成为了水涨船高(工资)的潮流,其薪酬方案成为了许多薪资谈判中使用的标准基准。有趣的是,这一点得到了证实,正如我经常听到工程师告诉他们的同事,“如果你认为自己的薪酬不够,那就去谷歌(Google)找一份有竞争力的工作。”当然,说起来容易做起来难。
过去几年软件工程师的工资趋势
现在我们来看看软件工程师(包括软件工程师和高级软件工程师)的工资中位数在过去几年的趋势如何。从 2014 年到 2019 年(五年一期),工资增长了 14.8%,相当于年增长率为 2.8%。这并不比通货膨胀高多少(也比硅谷的通货膨胀低很多)。作为比较基准,2014 年斯坦福大学 MBA 毕业生的平均工资为 12.5 万美元,2018 年为 14.2 万美元(4 年增长率为 13.6%,年增长率为 3.2%)。
因此,虽然水平很高,但过去几年的增长率低于我的预期。话说回来,这只是基本工资的增长——薪酬的大部分增长可能发生在股权方面,既可以获得更多股权,也可以提高已获股份的估值。
Software Engineer Median Salary by Year
如果你对 H1B 软件工程师工资的分布趋势感到好奇,下面是箱线图。这没什么太令人震惊的——随着时间的推移,工资的差异保持相对稳定。
Distribution of Software Engineer Median Salary by Year
数据中的其他趋势
既然大型科技公司,尤其是谷歌和脸书,在数据中占据主导地位,让我们也来看看不为这些公司工作的软件工程师的薪水。下面的图表用橙色(is_tech=True)显示了大科技软件工程师的工资中位数,用蓝色(is_tech=False)显示了其他人的工资中位数。我对大型科技公司的定义是为以下公司工作的工程师——谷歌、脸书、微软、优步、AirBnB、Lyft、苹果、网飞和 LinkedIn。
大型科技公司支付的价格肯定要高得多(这可能不仅仅是因为它们的盈利能力更高,也是因为它们股票的上涨空间更小)。然而,两组的增长率大致相等(5 年期间都在 14%左右)。
Median Software Engineer Salaries for Big Tech (in Orange) and Everyone Else (in Blue)
最后,虽然我不是这方面的专家,但软件工程师的头衔似乎在大型科技公司使用得更广泛——在较小、不太知名的公司被视为高级软件工程师的人,可能是谷歌或脸书的软件工程师。这也许可以解释为什么大型科技软件工程师的薪水和其他人之间存在差距(这体现了更广泛的经验水平)。
在大技术类别中有一些高级软件工程师的工资,所以我们可以通过比较“其他所有人”(X 轴上为假)和大技术(X 轴上为真)类别中的软件工程师和高级软件工程师的工资来检验我的假设:
这似乎证实了我的假设——“其他所有人”类别(左边的蓝色和橙色方框图)的分布重叠比大型科技公司(右边的蓝色和橙色方框图)的分布重叠少得多。因此,看起来“软件工程师”或多或少是一个包罗万象的头衔,涵盖了大型科技公司的各种经验水平和工资级别。
结论
随着软件继续“吞噬世界”,颠覆和改变传统行业,软件工程师的技能对于任何想要在这个竞技场上竞争的公司来说都是至关重要的。
数字支持了这一点——虽然增长率比我想象的要低,但程序员的基本工资水平非常令人印象深刻(甚至不要说软件工程师年复一年赚了多少钱)。
这是否可持续是另一个时代的故事(对世界上的谷歌来说是这样,对世界上的 WeWorks 和 Ubers 来说可能不是这样)。我希望这对你有所帮助和启发。干杯!
更多数据科学、职业、教育相关岗位由我:
根据模拟,30 岁退休需要多少钱
Photo by Fabian Blank on Unsplash
任何人都有在年轻时辞掉工作,环游世界,同时保持经济独立的梦想。达到这个目标需要多少钱?
在本文中,我们运行了一个统计(蒙特卡罗)模拟来估计基于历史数据的退休投资组合(首先是资产配置)的成功率。
假设和策略
让我们考虑一下利亚姆。他存了一些钱,打算在 30 岁时退休。我们将假设他的:
- 预期寿命又是 65 岁。
- 月收入/提现 4000 美元。
他用以下策略投资他的钱:
- 在标准普尔 500 指数和美国债券指数(以先锋总债券指数基金为代表)中分配退休投资组合。
- 最初%的股票和债券将每月进行再平衡。例如,给定 50%股票和 50%债券的初始设置,如果股票市场表现良好,并且他的股票投资组合的价值比债券增加了很多,那么投资组合将通过出售股票和购买债券来重新平衡,以回到最初的 50/50 分割。
利亚姆在未来 65 年面临的经济形势是:
- 股票/债券市场的年度回报率与 1986 年至 2019 年的市场有些相似。为了模拟这种情况,我们随机抽取了四个 15 年的市场周期和一个 5 年的市场周期,总共是 65 年。我们用这些收益来投资他的投资组合。
- 通货膨胀率为每年 3%。所以 Liam 的月收入/提现每年都会以这个速率上去。
结果
这个模拟的目标是看看在给定初始资金和资产分配策略的不同组合的情况下,Liam 在余生中保持每月提款的可能性有多大。
我们查看了 9 种不同的场景,并对每种场景进行了 1000 次模拟。成功率是以他的投资组合在整个 65 年中保持在 0 美元以上的次数的百分比来计算的。
- 30 岁时舒适的提前退休需要 200 万美元左右
如你所见,在初始资金只有 100 万美元的情况下,利亚姆的成功率很低。所有 200 万美元投资组合的例子都有很高的成功率,值得一试。当利亚姆有 300 万美元时,他可能希望每月提取更多的钱。
- 资产配置很重要
事实上,资产配置是投资者根据自己的风险偏好应该做的第一件事。
在模拟中,当利亚姆的钱更少时,即 100 万美元,如果他冒更大的风险——购买更多的股票,他就有更大的成功机会。从长期来看,债券的回报不足以跟上他的提款和通货膨胀。
如下表所示,股票的波动性更大。1986 年至 2019 年的月度股票收益率范围为-21.76%至 13.18%。债券指数的波动范围更窄,为-3.34%至 3.95%。
然而,即使利亚姆将一切都配置到股票中,成功率仍然很低,只有 25.6%。这些成功很可能是牛市中的一些连续的幸运抽奖。
当利亚姆有一笔合理的资金(超过 200 万美元)时,如果他只想维持稳定的提取金额(经通胀调整),最好投资于债券等更稳定的投资。
更多考虑?
这里讨论的模拟是简化的。在现实生活中,还有很多其他的事情需要考虑。
- 投资策略或偏好可能会有所不同
除了股票和债券指数,你还可以投资许多其他资产。你可以进行彻底的分析,自己挑选特定的股票/债券产品。许多人还购买了出租房地产。
还有许多不同的策略,人们试图增加收益或降低风险——购买并持有并不是唯一的策略。
- 撤军计划可能改变
在现实生活中,你可能会根据你的投资表现来调整你的提款额度。如果你的投资在一年内下跌 50%,继续同样的撤资计划并不是一个好主意。如果你突然需要一大笔钱,你最好也有一些应急基金。
- 经济状况可能转变
与过去相比,债券和股票市场的回报在未来可能会发生变化。一些人认为,由于世界经济增长放缓,股市在未来十年的表现不会那么好。然而,我们 1986 年至 2019 年的时间段确实包括 1987 年 10 月 20%的下跌以及 2000 年和 2008 年的严重熊市。
- 税务考虑
这绝对是要考虑的重要因素。由于定期派息较低,股票指数可能优于债券。这将有效地推迟税收。
- 养老金计划包容性
许多政府确实有帮助人们退休的社会项目。在加拿大,CPP(加拿大养老金计划)和 OAS(老年保障)是两个通常在 65 岁开始实施的计划。这些也应该包括在退休计划中。
Elo 有多重要?
elo 是什么?
Elo 是一个计算出来的分数,用于在国际象棋或篮球比赛中对选手进行排名。许多人已经看到了这个算法背后的实际公式,因为安德鲁·加菲尔德把它写在了社交网络中哈佛宿舍的窗户上。
Image from https://www.akitaonrails.com
有多重要?
当芒努斯·卡尔森与法比亚诺·卡鲁阿纳争夺国际象棋世界锦标赛时,马格努斯的 Elo 评分为 2835,而法比亚诺为 2832。这种差异有什么关系吗?Elo ~ 1250,我打败 Magnus 的几率有多大?在这篇文章中,我详细介绍了我如何使用 Python 来收集、转换和分析数据,以理解 Elo 对于预测游戏赢家有多么重要。
收集数据
为了理解 Elo 与游戏预测结果之间的关系,我首先使用下面的脚本从 chess.com 的 100,000 多场游戏中收集数据。在这里,我通过在 URL“【https://www.chess.com/live/game/】”的末尾添加一个随机数来遍历国际象棋游戏,并使用辅助函数 get_chess_info()获取游戏结果。这个函数返回一个字符串,如下例所示,所以我使用第二个辅助函数 parse_text()将它转换成有用的数据。
eono619 (1243) vs Rogeriothales (1201). eono619 won on time in 59 moves. The average chess game takes 25 moves — could you have cracked the defenses earlier? Click to review the game, move by move.
我用两个助手函数提取数据,然后用 csv 库的 DictWriter 方法将其全部写入一个. csv 文件。
在一些额外的特征工程之后,我得到了如下形式的数据:
探索性分析
现在有了收集和转换的数据,我继续进行分析。为了确定 Elo 在预测游戏结果中的重要性,我查看了 1)两个玩家之间的 Elo 评分差异,以及 2)谁赢得了游戏。但是首先,我很快检查了数据,从玩家评分的分布开始,不出所料,它是正态分布的。
然后,我继续讨论玩家评级之间的差异。Chess.com 将技能水平相似的玩家配对,因此两个玩家之间的 Elo 差异分布也呈正态分布并以 0 为中心是有道理的。
要了解玩家之间的 Elo 排名差异有多大,一种方法是查看在 Elo 差异的每个级别上赢得游戏的百分比。然而,小样本会引入很多噪声,所以我首先检查在两个玩家评级之间的每个增量点上,我是否有足够数量的游戏。对于-100 到+100 的 Elo 差异,看起来我在每个级别至少有 100 场比赛,所以我很高兴继续前进,看看胜率。
通过对玩家之间的 Elo 差异进行分组,并取“赢”列的平均值(赢=1,输=0),我就可以得到每个 Elo 差异的胜率。除了数据中的一点噪音之外,玩家之间 Elo 差距的前 50 分与游戏结果之间有着非常明显的关系。在这个范围之外,趋势似乎趋于平稳,一个人高于或低于对手的每一个增量点似乎对她赢得比赛的机会都不太重要。
逻辑回归
另一种观察 Elo 重要性的方法是通过使用玩家之间的 Elo 差异训练逻辑回归模型来预测获胜者。
顺便提一下,我展示了 ROC 曲线,该曲线针对不同的分类阈值绘制了真阳性对假阳性。曲线下的面积,通常称为 AUC,是. 69;对于一个单一预测模型来说还不错。
Credit to Susan Li’s article (https://towardsdatascience.com/building-a-logistic-regression-in-python-step-by-step-becd4d56c9c8) on TDS for the code to make the ROC curve
我现在可以使用我训练的逻辑回归模型来预测在两个玩家的 Elo 评级之间的每个差异点上赢得游戏的概率。将预测叠加到原始数据的观察结果上,我们看到一个非常相似的关系,如果不是稍微平滑的话。
用这个模型来预测我和国际象棋世界冠军芒努斯·卡尔森的比赛,我被给出了 2.227e-08 的获胜概率,老实说,这听起来是对的。对于更现实的游戏,我在 Elo 差异的 5、10、15、20、30、40 和 50 点水平上观察逻辑回归模型的预测。
本文背后的完整代码和数据可以在我的 GitHub 上找到,感谢阅读。要获得所有媒体文章的完整访问权限,请点击此处!
一平方米要加多少钱?
Photo by Deva Darshan
里士满建筑面积与房价的简单线性回归分析
我们研究了澳大利亚墨尔本郊区里士满的建筑/楼层面积和房屋的价格之间的关系。
这里的目的是展示探索数据以揭示关系、为分析做准备以及理解线性关系的端到端过程。
这篇文章分为两部分:
- 探索数据
- 应用线性回归
请随意跳到您感兴趣的步骤,因为它们可以按任何顺序阅读。
我们的分析使用了从域刮来的来自 Kaggle 的墨尔本住房市场数据(完整版)。它包含价格,房间数量,郊区,建筑面积等房屋信息。
我们开始吧!完整的代码请访问我的 GitHub 库。
1.探索数据
在这一节中,我们深入研究了住房市场数据,看看房子的建筑面积和价格之间是否存在可能的关系,并希望应用线性回归模型。
首先,让我们快速浏览一下我们的数据。
Viewing and cleaning our data
Table 1 — Summary Output
现在,如果我们看第一个表(从melbourneHousePrices.head()
开始),有几个 NaN 值。理想情况下,我们应该调查这些值存在的原因,并适当地处理每一个值,但是对于本例,我们将删除所有包含 NaN 值的行。因此,在清理数据集之后,我们还剩下 8887 行。
总共有 21 个栏目,每个栏目都有描述房屋的有趣而有用的信息。虽然我很想深入分析每一个问题,并将其纳入我们的分析中,但我们今天的主要关注点将是BuildingArea
和Price
。
- 建筑面积,指房屋占用的建筑面积。这通常以平方米或平方英尺来衡量。
- 价格,这是指房屋的价格,用澳元($)表示
就我个人而言,我发现可视化两个变量之间关系的最快和最好的方法是散点图。所以,让我们就这么做吧!
Figure 1: Scatter plot of House Price and Building Area
好了,没有明显的线性关系,所以这将是文章的结尾…
坚持住!我们有一些异常值!
正是这些异常值扭曲了我们的散点图。我们无法辨别 0 到 500 米之间拥挤的房屋的大致位置,因为房屋的高度超过 3000 米(有趣的事实是,这是一个足球场的一半大小)。
**我们应该放弃这个离群值吗?**也许吧,但让我们先调查一下,因为它可能会给我们更多关于数据集的信息。
Table 2: 46 Athelstan Rd, Camberwell
如果我们查看显示的数据点,您会注意到一些非常有趣的事情。的土地面积是 730 m,比的建筑面积还小,这怎么可能?这可能意味着它有多个故事。
不幸的是,我看了一下的平面图和这个房子的描述,我一点也不明白它怎么会有 3112 平方米的建筑面积。
如果你能解释为什么,请留言,我很想知道答案!
让我们试着去除这个异常值,看看我们的散点图是如何变化的。
Removing outlier with Building Area of 3112 m²
Figure 2: Scatter plot of House Price and Building Area (with outlier removed)
好的,我们的数据集开始看起来好一点了,但是仍然有异常值扭曲了我们的图,没有明确的线性关系。
记下我们上次的异常值调查,让我们根据建筑面积调查前 10 所房屋,看看我们是否能观察到任何模式。我们也将只提取总列的子集(即郊区、距离、建筑面积和价格)。
Table 3: Top 10 Building Areas
查看表 3,你可以看到每栋房子都属于不同的郊区。一些与墨尔本中央商务区距离相似的郊区房屋也有相似的建筑面积(例如Brunswick
和Kew
)
是否值得对某个特定的郊区进行过滤,以查看其房屋在建筑面积和价格之间是否呈现线性关系?
首先,让我们看看哪些郊区的房子在数据集中最多,因为我们希望有一个良好的样本量。
Table 4: Suburbs with most houses in data set
我们可以选任何一个郊区,但是我们选里士满吧!
酷,让我们过滤里士满的房屋数据,并再次在散点图上可视化。
Figure 3: Scatter plot of Richmond House Price and Building Area
好吧,好吧,好吧…我们这里有什么?线性关系。
里士满房价和建筑面积之间似乎存在正相关关系。这让我们可以开始构建我们的线性回归模型。
继续下一个!
2.应用线性回归模型
在这一节中,我们试图用一个线性回归模型来拟合里士满房价和建筑面积之间的关系。
我们将清除数据中的任何异常值或错误点,然后理解回归输出。
首先,让我们用一个箱线图来可视化我们的数据。
Figure 4: Box plot of building area for Richmond houses
我们可以从图 4 中确定以下几点:
- 看起来最小值为 0 米
- 从 200 米向前有 5 个异常值
先说第一点,里士满有一套建筑面积为 0 平方米的房子,很奇怪,让我们来看看。
Table 5: House with Building Area of 1 m²
建筑面积实际上是 1 平方米,但的土地面积为 0 平方米。在调查了这个在线房产后,很明显这不是一个茶水间,但比那个大得多。因此,这个数据点是不正确的,所以让我们把它过滤掉。
接下来,我们有 5 个 200 米以上的异常值。为了识别这些异常值,我们使用 1.5 倍 IQR 法则。
Table 6: Richmond house outliers based on Building Area
虽然根据 IQR 计算,这些房子被认为是高异常值,但我将把它们保留在数据集中。原因是,如果我们回到图 3 中的散点图,这些值对于捕捉房价和建筑面积之间的线性关系非常重要。
现在我们已经清理了数据并评估了所有的异常值,我们可以使用最小二乘回归来构建我们的回归模型了!
Figure 5: Linear Regression Plot
我们可以看到我们的回归线与数据非常吻合,所以让我们看看结果:
Table 7: OLS Regression Results
我们的回归模型如下:
价格($)= 14140+10620 *建筑面积
OLS 回归结果的关键要点:
- 基于调整后的 R 平方,我们的回归模型解释了其均值附近 70.6%的价格可变性。
- 我们有一个截距 14,140,根据 0.05 的显著性水平,它是不具有统计显著性 (p 值= 0.817)。
- 建筑面积系数为 10620,具有统计显著性 (p 值很小)。
让我们详细阐述每一点。
外卖 1:
尽管我们已经发现我们的模型解释了其均值附近价格总方差的 70.6%,但我们不能就此罢休。重要的是我们检查残差图,以检查我们的模型的任何解释能力是否存在于我们的残差中,因为这些是随机的和不可预测的。
回归存在两个组成部分,一个确定性的和随机的组成部分。对于随机成分,这意味着我们观察到的价格和实际价格之间的差异应该是随机的。
Figure 6: Standardised Residual Plot
我们可以看到,残差图上的点随机分布在零附近,我们无法辨别任何模式。这意味着我们不能用一个价格剩余来决定下一个价格剩余的价值,因此不存在解释力。(这就好!)
外卖 2:
我们有一个统计上无关紧要的截距 14140,我们如何解释这个?
对于我们的模型,截距是当我们的建筑面积为 0 平方米时里士满的一栋房子的价格。这意味着对于一栋没有建筑面积的房子,它的价格将是 14,140 美元。我的信念是,无论截距是否显著,它都应该被忽略,因为一栋没有建筑面积的房子卖 14140 美元是不现实的。然而,对于建筑面积变得更加现实的情况,例如 30 平方米,截距在建立基线房价时将是重要的。
外卖 3:
我们发现建筑面积的系数为 10620,具有统计学意义。我们如何解读这一点?
首先,由于系数大于零且具有统计学意义,里士满房价与其建筑面积之间存在正相关关系。
其次,在所有其他变量保持不变的情况下,*建筑面积每增加一个单位,*里士满的房价就会增加 10,620 美元。
然而,重要的是我们要考虑回归系数的不确定性(即 95%置信区间),因此我们可以将其表示为:
保持所有其他变量不变,楼面面积增加 1 平方米,里士满的房价将大约增加 9524 美元,达到 11700 美元。
最后…
我希望这篇文章已经让你理解了准备线性回归数据的过程,以及如何理解结果。这个例子用于说明简单线性回归的应用,但是在以后的文章中,我计划应用不同的方法,比如多元线性回归。
如果您对我的工作有任何反馈,我可以如何改进或任何您认为不正确的地方,请告诉我!感谢您的阅读!
数据科学到底需要多少数学?
如果你目前正在学习数据科学,我确信一切看起来比实际需要的要复杂得多。只要在谷歌上快速搜索一下这个领域的先决条件,就会发现一些让你焦虑的东西——那就是数学。
但是数据科学家在现实中到底用了多少数学? 继续阅读了解。
Photo by Doug Maloney on Unsplash
如果你要在谷歌上快速搜索数据科学中的数学,你可能会看到一个 Quora 帖子,一些数学博士、智商 180 的大脑互动体以如下方式回复了这个帖子:
“嗯,老姐,你需要掌握**😗*
-高等线性代数、多元微积分、向量微积分、弦理论、广义相对论、量子场论、生命的意义、功夫
只有这样,你才能考虑学习一些基本的编程和分析。"
好吧,也许,只是也许我有点夸张了。但是你明白了。许多“参考资料”陈述了许多先决条件,在考虑 Python 和机器学习的外部世界抽象之前,您应该在睡梦中了解这些先决条件。
By GIPHY
是啊,好像有道理。
事实并非如此,这让我很恼火,因为虽然我非常尊重任何拥有数学或类似领域高等学位的人,但并不是所有的数据科学工作都是为他们保留的。
在接下来的几节中,我将把我第一次进入这个领域时发现的最相关的东西进行分类,希望它们也能很好地适合你。
先学习直觉
人类不应该手动进行高级计算,我很想知道为什么这么多大学强制采用这种方法。好像考完试两个星期后你还会记得。
为什么我有勇气这么说?嗯,这是因为我们在 21 世纪,我们有该死的电脑。这些不仅仅是为了发送电子邮件和玩游戏,也是为了繁重的数学工作。速度有多快,错误有多少就不用说了。
作为一个人,你应该专注于发展每一个主要数学主题背后的直觉,并知道在什么情况下该主题适用于你的数据科学项目。不多不少,但这让我想到了下一点。
By GIPHY
手工做东西是没有意义的
你没听错。现实生活不是学校,在你的工作中,很可能只有最终结果才是最重要的,因此你可以用你现有的知识做出什么。
****你的老板很可能不会在意你已经先在笔和纸上实现了渐变下降,然后在 Python 中实现了渐变下降。在他/她关心的极少数情况下,这可能是针对你在解决琐碎任务上花费了过多的时间。
如果你在写方程上犯了什么错误,那就留给你自己的时间吧。
By GIPHY
所以,你是说我不需要数学学位?
完全正确。
不要误解我的意思,我认为数学或重数学的学位是进入数据科学的一个很好的方式,但是没有必要知道所有的事情。
然而,这伴随着一个问题**。**
By GIPHY
如果你在面试一个潜在的数据科学职位,而面试官是一个比你懂更多数学的人,那么他很可能会给你一个的难题**。你应该为那种情况做好准备。不代表每次都会发生,但要做好准备。**
这与你不知道你应该知道什么(可能)无关,而是与你的面试官是阿迪·海德有关。他想通过让你看起来渺小来显得聪明。问问你自己, 那是你想要的工作环境吗?
金科玉律
你很可能以前听过这句话,但我觉得它需要一遍又一遍地重复:
比一般的数学家更擅长编程。
比一般的程序员更擅长数学。
就这么简单。数据科学是多个领域的混合体。你不应该在任何一个方面都是最好的,而是应该努力在每一方面都做到足够好。牢记大局。
在你走之前
我只想再说一次,这篇文章不是针对数学专业或博士的垃圾言论。正如我之前所说的,我对他们怀有最高的敬意。
只是当涉及到现实世界和一个普通的数据科学工作角色时,有比了解数学的一切更重要的事情。数学只是你用来获得所需结果的工具,对于大多数事情来说,有一个好的直观方法就足够了。
感谢阅读。保重。
喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。
** [## 通过我的推荐链接加入 Medium-Dario rade ci
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
medium.com](https://medium.com/@radecicdario/membership)**
在 21 点中,100,000 美元将为您赢得多少?
赌场不是很神奇吗?从戏剧的角度来说,你走进一个赌场,所有明亮的灯光照耀着你,有一种强烈的,舒缓的和感性的气味,你听到人们庆祝他们的胜利!现在你欣喜若狂,你迫不及待地想感受手中的筹码,你对自己说,这是你一直梦想的夜晚,你将赢得一生的胜利!你开始玩 21 点,你取得了重大的胜利,你觉得你在九霄云外,然后繁荣来了。连胜持续了多久?不多,嗯,这个场景你看着眼熟吗?(还是只有我经历这个!)
在我最近去了一次赌场后,我想一定有赢的策略,我必须找出赢这场游戏的概率。我在谷歌上搜索了 21 点策略,几乎所有的网站都将我引向赌博的基本21 点图表,我很快就明白了,现在是测试的时候了,除了模拟玩家和庄家之间随机分配 21 点,还有什么别的方法呢?
嗯,这正是我所做的,让我们假设我们有 100,000 美元来下注(我真希望!),每次下注将花费我们 10 美元,我们玩 10,000 手牌。让我们想一想通过我们的模拟可以尝试回答的问题;
- 我玩一万手牌赢了多少?
- 赢和输的百分比是多少?
- 我打了几个 21 点?(最少 1000,十分之一手?)
- 经销商赚多少钱?
- 哪些手最幸运?
- 我们能否创建一个矩阵,显示玩家牌相对于庄家牌的胜率?(我将在下次去赌场时用它来赚钱!)
模拟设置
为了模拟赌场游戏,让我们有 6 个玩家在玩,每个人都有 100,000 美元的底池(大玩家,伙计!)和一个经销商。每次下注 10 美元,赢 21 点的回报率为 3 : 2,也就是说,10 美元的赌注将返回 25 美元(包括您的 10 美元赌注),而正常的高赢或庄家破产的回报率为 1 :1,也就是说,10 美元的赌注将返回 20 美元。出于模拟的目的,让我们忽略保险,分裂,双倍下注和任何其他奖金发挥。由于所有赌场现在通常处理一副牌中的 6 组牌,我们将使用相同的牌,即每轮总共 312 张牌——我们将每轮洗牌以模仿连续洗牌机(拜拜算牌!).庄家开始与玩家 1 至玩家 6 发牌,并结束与自己的发牌。他的第一张牌也面朝上。玩家将根据他们发出的前两张牌和庄家面朝上的牌的总和,再次根据基本二十一点策略(请参考此处),决定打出更多牌还是继续。好吧,现在让我们运行模拟,看看结果,好吗?
游戏结果
让我们先来看看所有玩家一起玩的所有牌的总统计数据,然后再来看看单个玩家的统计数据:
在总共玩了 60,000 手和总共下注 600,000 美元之后,玩家们总共只赢了 586,625 美元即下降了 2%。赢款与下注的比率为 0.98,只有大于 1 的系数才能让您从下注中获利。让我们看看赢的概率 —从多次运行来看,范围总是在 42%到 43% 之间,输的概率总是在 47%到 49% 之间,输的概率总是高于赢的概率,这表明如果我们玩大量的手牌,那么赌场最终将比我们任何人都赚钱。让我们来看看21 点命中率** —我们最初的目标是从 10,000 手牌中打出 1,000 个 21 点,也就是说 10%中有 1 个23,我们已经从 60,000 手牌中打出了 2845 手牌,命中率只有 5%左右。我们最幸运的手是哪一只?—毫无疑问,它们是一对10(10,J,K,Q——在 21 点中具有相同的值)。让我们来看看单个球员的数据。******
玩家统计
一个有趣的观察结果是,每个玩家的统计数据彼此相似,并且与总体组合统计数据相似。上一节的所有推论在这里同样适用。我们来看看一些失败的统计数据怎么样?
从多次运行中,我们看到一个玩家爆发(他们的牌和超过 21)~17%到 19% ,而他们打败了**(庄家的牌和高于他们)**大约 28%到 30%。这清楚地表明基本 21 点策略使人在打出更多牌时非常保守。当庄家的赔率为 24%到 25% 倍时,**少于玩家的赔率%。**也许我们应该看看输赢矩阵,做一些调整来改善输赢统计。
幸运手有什么惊喜吗?不完全是,正如预期的那样 20 和 21 给你最多的胜利。有趣的是,17&18****输 的概率非常高~60%比 70% 。而 13,14,15&16——概率是输 是>的 50%到 60%。这可能是我们可以改善损失的战略领域。
赢百分比矩阵,玩家面对庄家正面牌的牌数总和
突出显示(加框)的区域胜率很低,这可能是我们改进的重点,目前 14,15,16 & 17 对 8,9,10 & 11 的庄家正面牌的策略是打出更多的牌以获得对庄家的优势,如果我们能更仔细地看看我们到底是如何输掉这些牌的——如果我们把牌弄坏了,或者如果我们被庄家的大牌打败了,我们就可以根据需要临时制定策略。
推理
就策略而言,玩家和为 12,13 的胜率相当不错,20 和 21 的胜率非常高。**基本策略看起来肯定能让我们在重要牌(~50 手)**中获得 42%的胜率,但这个胜率根本不足以盈利。如果我们能把胜率提高到 50%或 55%左右,我们肯定会有利润。那么,我们如何提高胜率呢?—等着瞧吧,鼓声——本文的第二部分将为您提供这些细节。现在,请记住我的朋友,如果你在玩 21 点,并且你当前的胜率(赢的手数与玩的手数之比)超过 55%或更高,我建议你离开牌桌,领取你的奖金!我希望这篇文章能对赌博模式有所启发,并让你对赢的几率有所了解。
试试模拟?
对于所有想看代码和尝试模拟的人来说——https://github.com/Mojocolors/Blackjack-Odds。直到第二部分——快乐阅读,快乐玩耍!
神经网络是如何学习写作的
写作文本的自然语言处理模型的发展综述
在一些历史学家的在线论坛上,一个用户问了一个问题:
普通的苏联公民有幽默感吗?
不久之后,他们收到了一封长达五段的回信。在阐述一个复杂的答案之前,首先要有一个合理的介绍性解释:
在苏联,有一种普遍的幽默感,这种幽默感常常与苏联身份和共产党联系在一起。
一些巨魔回复了一个没用的嗨,并立即被版主指责。乍一看,这个线程没有什么特别不寻常的。除了…这个论坛上的帖子不是来自人类,而是来自人工智能代理,或机器人。
我提到的帖子只是来自 r/SubSimulatorGPT2 的一个例子,这是一个专门用于由基于 OpenAI 的 GPT2 的 bot 自动生成的帖子的子编辑。如果你认为上面关于苏联幽默的段落只是它记忆和复制的东西,那很可能不是这样:谷歌搜索显示这句话的一半都没有出现。
让机器人在 Reddit 上互相对话并不新鲜:r/SubredditSimulator 已经这样做了几年。这里的区别是生成的文本质量有了巨大的飞跃。虽然较老的机器人可以用一些随机的胡说八道来逗你开心,但基于 GPT2 的机器人实际上可以让你暂时相信他们是真实的人——当他们最终说出一些荒谬的声明时,这往往会变得更有趣。
为什么会有如此聪明的人工智能模型?事情不是一夜之间就变成这样的。开发能够复制人类语言的模型的研究已经进行了几十年,但直到最近才真正令人印象深刻。在这里,我将展示语言建模进化的概述,以及为什么它除了创建有趣的机器人之外如此有用。
文本生成的演变
马尔可夫链和 N 元文法
来自旧的 r/SubredditSimulator 的机器人使用马尔可夫链,这是一种成熟的生成序列的技术。像现代神经网络一样,它们从数据中学习,但要简单得多。
基于马尔可夫链的模型假设一个句子中的每个单词只依赖于它前面的最后几个单词。因此,它将观察到一个给定句子的概率建模为组成该句子的所有 n 个字母——由 n 个单词组成的序列——的组合概率。一个 n 字母的概率可以近似为你在你的语言中能找到的所有可能的 n 字母中看到该特定序列的次数。
训练马尔可夫链模型基本上包括从文本数据中估计这些概率。下图说明了这个概念:
A small sentence decomposed in trigram probabilities. N-grams near the sentence beginning usually include a pseudo-token to indicate their position.
在上面的例子中,基于三个单词(或三元模型)序列的马尔可夫链决定了令牌巧克力跟随我喜欢的概率。接下来,它将确定看到像巧克力一样跟随的令牌蛋糕的概率,但不再考虑令牌 I 。
然后,为了生成新的文本,我们只需要从模型给我们的概率中一次抽取一个单词。这种过程被称为自回归,其中每一步的结果都取决于前一步模型的预测。
抽样给了我们一些模型输出的变化。如果我们总是根据模型选择最可能的单词,它将总是产生相同的文本。
问题是,如果我们像这样分解问题,我们永远不会发现一句话有什么奇怪的地方,比如我喜欢巧克力蛋糕,我喜欢巧克力蛋糕,我喜欢巧克力蛋糕:三个记号的每一个序列听起来都非常正常,除此之外这个模型不关心。
如果我们尝试观察更长的序列,我们会看到一个指数爆炸。考虑到 1 万(10⁴)单词的小词汇量,我们有 1 亿(10⁸)可能的二元模型,1 万亿(10)可能的三元模型和 10 万亿(10)可能的四元模型!其中大多数都是无意义的,例如香蕉香蕉漩涡香蕉,但这是问题的一部分:许多完美的 4-grams 也不会出现在训练数据中,并且模型没有办法区分哪些序列是荒谬的,哪些序列是好的,但不幸的是没有被发现。
Banana banana maelstrom banana
规避较长字母的稀疏性的一种方法是使用一种语言模型,将它们与较短的字母组合起来。所以,也许我们的训练语料库没有出现普遍幽默感,但它确实有一些幽默感。与此同时,甚至连香蕉风暴和香蕉风暴都闻所未闻。这当然会有所帮助——但是考虑到价格,我们不能如此信任更长的克数。
N-gram 计数是我们多年来语言建模中最好的,并且它们在使用大量的谷歌 n-grams 时表现得相当好。尽管如此,我们可以看到它们非常脆弱,由马尔可夫链生成的超过五六个单词的句子几乎没有任何意义——同样,你可以查看更老的 subreddit 模拟器。
单词嵌入和神经语言模型
单词嵌入是当今任何人在 NLP 中首先学会的事情之一:单词到多维空间的投影。它们的巨大优势是,用余弦相似度来衡量,具有相似用法/意义的单词会得到相似的向量。因此,涉及相似单词的单词向量的矩阵乘法倾向于给出相似的结果。
这是基于神经网络的语言模型的基础。现在,我们可以将每个单词视为数百维的密集向量,并对其进行数值运算,而不是将每个单词视为一个原子符号。
在其最简单的形式中,神经语言模型查看一个 n 文法,将它的每个单词映射到它们相应的嵌入向量,连接这些向量,并将它们馈送到一个或多个隐藏层。输出层决定词汇表中每个单词下一个出现的概率,计算为分数的 softmax 。
有趣的是,神经模型并不计算出现次数来确定概率,而是学习可以为任何输入计算它们的参数(权重矩阵和偏差)。这样,当我们对较长单词的计数不可靠时,我们不需要退回到较短的n-gram,最好的是,我们甚至可以在训练数据中从未见过的 n -gram 之后计算下一个单词的合理概率分布!
A simple MLP (multilayer perceptron) language model predicting the next word after the last given three.
第一个神经语言模型于 2003 年提出,比深度学习时代早了十年。那时候,没有人在 GPU 上运行神经网络,计算机更慢,我们还没有发现很多现在常用的技巧。这些模型会慢慢变得更受欢迎,但真正的突破只发生在递归神经网络上。
递归神经网络
可以说,语言生成的最大进步来自于递归神经网络(RNNs)的出现,更具体地说,是长短期记忆(LSTMs)的出现。与我之前提到的最简单的网络不同,RNN 的上下文不仅限于 n 个单词;它甚至没有理论上的极限。
Andrej Karpathy 有一个很棒的帖子,解释了他们是如何工作的,并展示了很多例子,在这些例子中,他们学会了制作类似莎士比亚戏剧、维基百科文章甚至 C 代码的文本。
与我之前展示的简单网络相比,RNN 的主要改进在于它们保留了一个内部状态——也就是说,一个表示网络记忆的矩阵。因此,RNN 可以一个字一个字地连续阅读,更新其内部状态以反映当前的上下文,而不是只看固定的窗口。
使用 RNNs 的文本生成遵循与马尔可夫链相似的基本原理,以自回归的方式。我们对第一个单词进行采样,将其输入神经网络,获得下一个单词的概率,对第一个单词进行采样,以此类推,直到我们对一个特殊的句子结束符号进行采样。
RNNs 在 2014 年和 2015 年左右在 NLP 中变得非常流行,并且仍然被非常广泛地使用。然而,他们优雅的体系结构和谨慎的内部状态有时会成为一种负担。让我用这个例子来说明:
和约翰一起来的男孩非常聪明。
注意和的男孩意见一致,而不是和约翰意见一致,尽管两者更接近。为了正确地生成这样的句子,RNN 需要跟踪复数名词,直到它生成匹配的动词。这个例子相当简单,但是一旦你有了更长的句子,事情就变得更难了,特别是在更喜欢屈折和长距离依赖的语言中。如果我们不需要将如此多的信息塞进有限空间的内存,而是只需要回头看看前面的单词,检查还缺少什么,那就太好了。
The RNN internal state keeps track of information about all seen words. In this example, the colors show how it can get increasingly difficult to fit everything into a limited space.
为了缓解这种情况,引入了注意机制。它允许 RNN 这样做:在产生下一个输出之前回顾所有以前的单词。计算关注度实质上意味着计算过去单词的某种分布(也就是说,对它们中的每一个进行加权,使得权重之和等于 1),然后根据接收到的关注度成比例地聚集这些单词的向量。下图阐释了这一概念。
The attention mechanism allows an RNN to look back at the outputs of previous words, without having to compress everything into the hidden state. The condensed RNN block before the intermediate outputs is the same as when not using attention.
但是还是有一点不方便。训练 RNN 没有利用可并行化的硬件操作,因为我们需要在查看字 i+1 之前处理每个字 i 。
除此之外,你有没有注意到上图中的中间输出向量在每个单词之后变得更加丰富多彩?这象征着句子中更靠后的词可以接触到前面的词,而开头的词看不到后面的词。根据单词后面的内容对单词进行建模,起初听起来可能违反直觉,但我们一直都在这样做。考虑英语中的名词-名词复合词,比如第一个例子中的巧克力蛋糕。当我们一听到或读到蛋糕这个词,我们就知道巧克力只是在描述它,并不是短语的中心。我们这样做是因为我们可以回溯我们头脑中的信息,但线性 RNN 做不到这一点。因此,虽然 RNNs 可以做得很好,但仍有改进的空间。
变形金刚(电影名)
Transformer 是 2017 年推出的神经网络架构,旨在解决 RNNs 的缺点。它的核心思想是严重依赖注意力,以至于根本不需要内部状态或复发。
变换器中的每个隐藏层都有一个注意力组件,后跟一个默认的前馈(或 MLP)变换。首先,转换器计算每个单词对所有单词的关注程度,包括它自己和它后面的单词。在 RNN 中,这些单词的向量按照接收到的注意力的比例进行缩放和求和,从而产生上下文感知向量。这个结果向量然后经过前馈变换,结果是该变换器层的输出。
变形金刚通常有很多层,这使得它们能够学习单词之间越来越复杂的相互作用。并且为了考虑单词顺序,输入单词嵌入用编码其位置的附加向量来扩充。
这是对转换器的一个相当简单的描述,下面展示了一个这样的层。实际的架构相当复杂,你可以在后的图解变压器中找到更详细的解释。
Simplified view of the first layer of a transformer network. The same weights are used in all the attention and feedforward operations in a given layer.
堆叠大约 6 层、12 层甚至 24 层,我们就能得到非常丰富的编码向量。在最后一个之上,我们可以放置最终的输出层来产生下一个单词的概率分布,就像在其他模型中一样。
当生成一个新句子时,我们必须在每个新单词后重新运行整个转换器。这是必要的,以便允许以前的单词考虑新的单词,这是 rnn 所不能做到的。
在巧克力蛋糕的例子中,变形金刚可以让巧克力在蛋糕的第一层上出现。因此,它的向量编码了更精确的意义信息,这些信息将被传播到更高的注意力层。
我之前也提到过,RNNs 没有让我们利用并行操作的优势。您可能已经注意到,由于我们也必须用 Transformer 一步一步地生成新单词,这里也是如此。嗯,在运行你的模型时是,但在训练时不是。
在训练过程中,我们可能会让一个转换器并行预测一个句子中的所有单词。我们只需要屏蔽我们想要预测的位置 i 处的单词及其后面的单词,因此网络只能查看过去的位置。没有隐藏状态-无论前一个时间步长如何,都会在每个时间步长重新计算变换器中的所有隐藏层。
我们现在在哪里
在许多 NLP 任务中,包括语言建模,转换器是目前最先进的。研究人员不断提出一些改进建议,但整体架构几乎保持不变。
我在本文开头提到的 GPT-2 模型是一个 Transformer 实例。那个特定的有 3.45 亿个参数,由 OpenAI 在一个巨大的文本集合上进行训练,然后在 Reddit 的几十兆字节的文本上进行微调。
OpenAI 提供的预训练模型在生成文本方面总体来说很棒,但要使一些东西更具体,你需要对它进行微调——也就是说,用一些你感兴趣的数据对它进行进一步训练。在子漩涡模拟器中,GPT-2 的不同版本在 100 多个子漩涡中相互对话,你可以清楚地看到它们是如何学习自己的风格和特质的。这对于在不同子线程中对机器人进行微调的线程来说尤其有趣!
顺便说一句,那个预训练的模型甚至不是 OpenAI 最好的。他们已经训练了一个更强大的,有 15 亿个参数的,但是因为害怕恶意使用而决定不发表。这引发了一些关于人工智能会带来什么危险的有趣问题:不是科幻小说中的杀人机器人,而是一位可以不知疲倦地争论或创造故事的多产作家。机器学习领域内外的许多人不同意这种语言模型是危险的,但这一集至少表明,人工智能的影响正成为一个更重要的辩论话题。
除此之外还有什么呢?
好吧,但是除了创建有趣的 Reddit 线程,这些模型还有什么用呢?当然,有很多 NLP 应用程序!你可能已经意识到,一个非常简单的键就在你手机的键盘上,就是 对。
任何涉及文本生成的 NLP 任务都可以从这些模型中受益。语音识别就是一个例子:在这里,语言模型必须根据一些语音输入找到最可能的单词序列,而不仅仅是以前的单词。
另一个自然的应用是翻译:这是一项给定另一种语言的文本,寻找最可能的单词序列的任务。事实上,机器翻译正是关于变形金刚的原始论文所处理的应用。
神经语言模型的有用性不需要局限于语言生成。一旦一个模型能够生成看起来几乎像人类的文本,这意味着它学到了很多关于单词如何相互作用的知识。这些知识编码在许多参数中,对于初始化许多不同任务的新 NLP 模型非常有用:文本分类、实体识别、问题回答和许多其他任务。
利用预先训练的模型来初始化新的模型被称为迁移学习,它现在被非常频繁地使用,并取得了巨大的成果——事实上,它是训练这些庞大的神经语言模型的主要动机。这是一个非常有趣的工作,值得另发一篇文章。
一些有趣的资源
- OpenAI 发布的 GPT-2 模型你可以用它来生成文本
- 一个在线平台尝试 GPT-2
- 微调 GPT-2 的教程和生成假对话的例子
- 另一个关于产生笑话的教程。可悲的是,神经网络仍然不是超级有趣。
- 代码用于训练字符级 RNN 语言模型
- 由 LSTM 制作的莎士比亚戏剧样本
神经科学家如何分析来自透明鱼脑的数据:第 2 部分,聚类神经数据。
PCA 和 K-means 将具有相似活动的神经元分组
在第一篇文章中(你可以在这里阅读),我描述了神经科学家如何将来自透明鱼脑的大脑图像预处理成可利用的数据集:一个 2D 矩阵[神经元 x 时间],代表每个时间点每个神经元的活动。
Two non-overlapping populations of amygdala neurons in the mouse brain. Picture from Mark Cembrowski, from the Cell Picture Show 2018 (have a look here for many gorgeous photos !)
在这篇文章中,我们将看到这些数据如何被用来回答这个问题:**我能把具有相似活动特征的神经元归为一组吗?**对于神经科学家来说,找到具有相同活动的神经元群是一个极其重要的问题,因为同步神经元群可能是大脑区域电路中的“构建模块”的基础。
第一步是归一化每个神经元的活动,以减去背景活动。确定称为 F0 的基线活动值:例如,它可以是记录的前 3 分钟期间的平均活动。归一化的方法是去除 F0,然后除以 F0: (F — F0)/F0。因此,最终结果用δF/F0(简称“DFF”)表示:这个四维值代表活性相对于基线的增加或减少,用百分比表示。举个例子,
- 当 F=F0 时,则δF/F0 = 0(与基线相比没有增加)
- 当 F=2*F0 时,则δF/F0 = 1(与基线相比增加 100%)。
(注:F 代表“荧光”,因为神经活动是通过神经元活跃时发出的荧光强度间接测量的。)
数据标准化后,就可以进行聚类了。目标是将神经元分组在一起,因此——对于记录在 T 个时间戳中的 N 个神经元——在 T 维空间中将有 N 个数据点。为了可视化,让我们在 3 个时间戳期间在 3D 空间中绘制 6 个神经元的数据集:
An example data set for visualisation : 6 neurons recorded over 3 time frames = 6 data points in a 3D space.
事实上,神经元不仅仅在 3 个时间步长内被记录…实际数字可以是大约 50000 帧(例如:20Hz 下 45 分钟的记录= > 54000 个记录帧),所以这个图应该有 50000 个维度…
但是,我听到你说“ 50000 个维度,太多了!我真的要把它们都留着吗?反正我肯定所有维度都没那么有用”。你可能是对的:想象一下,有一段时间,大脑什么也没发生?(在健康的大脑中,这在生理上不太可能,但让我们假设一下)。或者在某个时候,所有的神经元突然变得超级活跃:这可能是可能的,但是如果我们的目标是将神经元分成几个集群,这将不会提供太多信息…所以,在集群之前,我们可以用 PCA (主成分分析)减少我们数据集的非常高维度。
降维在很多帖子里都有描述,这里我就长话短说。让我们看一个简单的 2D 数据集,如图 a):十几个人的年龄和身高。我们可以在 b)中看到,数据遵循一个总体“趋势”,用箭头表示。如果我们将数据点投影到那个箭头上(如 c 中所示),我们仍然可以很好地了解数据的分布。这个“趋势”就是第一主成分(PC)。在图 d)中,我们可以选择仅在一维而不是二维中表示我们的数据。我们减少了维度的数量,但我们仍然可以捕获关于数据集的重要信息。
Little sketch of dimensionality reduction with PCA.
PCA 的目标是基于数据集的“原始”成分(这里是年龄和身高)计算主成分。借助上面的示意图,您可能已经注意到箭头捕捉到了数据集方差最大化的方向**,或者更简单地说,在原始空间(a 中)最远的 2 个点在 PCs 空间(d 中)仍然最远。因此,PCA 背后的基本原理是找到数据集中方差最大的维度。**
(备注:这是与 tSNE 完全不同的基本原理——t 分布随机邻居嵌入——这也是一种在神经科学中广泛用于高维数据集可视化的降维技术。这将在下一篇文章中描述!**
Diagonalization of the covariance matrix
一种方法是计算数据集的协方差矩阵并将其对角化。因此,你找到了一个新的空间,其中协方差矩阵是对角的:特征向量是主分量,特征值量化了每个主分量所解释的方差的百分比。对于 PCA,主成分是正交的。****
由于主成分是由原始成分组合而成的,它们不一定“意味着”与数据相关的任何东西。在我的例子中,沿着第一个 PC 的值将是年龄平方的平方根加上身高平方…这个组合允许我们只保留一维。
在我们的神经数据集中,第一维是神经元的数量(几百个)。使用 PCA,我们可以将第二维从大约 50000(时间帧)减少到 10(主成分)。
一旦对数据进行了归一化处理,降低了第二个维度,我们就可以使用一个简单的、众所周知的算法进行聚类: K-means 。同样,许多 TDS 帖子已经致力于这一算法(你可以在这里 观看动画)。因此,我将简单地评论一下毕晓普书中著名的方案。在下面的 2D 数据集中,我想分成 2 组:
From C. Bishop’s book “Pattern recognition and machine learning”, page 426
- 初始化 (a):随机选择聚类的中心(红色和蓝色十字)。
- 期望 (b):每个数据点被分配到最近的聚类中心。
- 最大化 ©:重新计算聚类中心(它们是彩色点的质心)。
- (d-e-f):重复期望最大化步骤,直到收敛(即聚类中心不再移动)。
(备注:如这里 所讨论的 ,聚类数 K 必须由用户选择。对于简单的数据集,这可以通过视觉检查来完成。但是对于高维数据集,选择正确的 K 可能很棘手。有几种方法可以帮助你找到一个合适的 K,如 这篇帖子中所述。)
使用 PCA 和 K-means,神经科学家可以将具有相似活动的神经元分组在一起。让我们看一个来自挪威 Yaksi 实验室的研究的例子。研究人员调查了斑马鱼的嗅觉以及大脑如何处理气味。他们对缰核(一个被认为整合来自感觉区域的信息的大脑区域)进行了成像,并检测了神经元,如我在第一篇帖子中所述。
在实验的第一部分,研究人员没有做任何具体的事情,但一些神经元无论如何都是活跃的。这叫做“自发活动”。科学家们执行了 PCA 和 K-means(要求 K=6),并根据神经元在时间上的活动将它们分成 6 个簇。我们首先可以看到的是,自发活动并不是随机的,具有相似活动的神经元在空间上是接近的*!下图显示了按簇分组的神经元的活动概况,以及每个神经元在缰核中的位置:用相同颜色表示的神经元属于同一个簇。***
Spontaneous activity of habenular neurons. Left) neural activity in time (the traces are grouped in 6 clusters). Each row is a neuron, the color represents the DFF, introduced before. Right) spatial map showing the position of each neuron in the habenula (color-coded by cluster number). Figure found here.
在实验的第二部分,研究人员通过水向鱼传递一种气味(传递的时间由下图中的箭头表示)。他们再次执行了 PCA 和 K=6 的 K-means,并注意到气味传递期间的簇与自发活动期间的簇非常相似。****
Same legend than above, but during odor delivery. Figure found here.
因此,自发同步的神经元在气味处理过程中也很可能是同步的!这就像一些神经元已经“预先连线”在一起,使它们更有可能以类似的方式对气味做出反应。
大脑中的自发活动是如何组织的?这对信息处理意味着什么?这些问题非常好,激励了许多神经科学家!
我的搜救犬多大了?
Ruth, My Dog of Unknown Age
在相关数据集似乎不存在的情况下调查问题
去收容所挑选一只狗
如果你从未去过狗收容所,那里到处都是需要一个家的可爱狗狗。但它们通常也充满了规则,可能会妨碍找到适合你的宠物。例如:
- 在指定的参观空间一次只能遇到一只狗。
- 一天只能见几只狗。三只狗是我最常看到的极限。
- 你可以根据狗狗的简历来选择你会遇到的狗狗。在你去拜访他们之前,根本没有机会去了解他们的个性。
当然,这些避难所很棒。这些规则是为了狗和游客的健康和安全。但它们不是我所希望见到的我未来的毛皮宝宝。
当我到达马特维尔时,我找到了我一直在寻找的东西:
Muttville’s open visiting room (photo property of Muttville)
我坐在一张狗床上,等着看哪些狗向我走来。我想要一只既好奇又可爱的狗。我想要一只能和其他狗友好相处的狗。最重要的是,我不想选一只狗。我想让一只狗来选我。
当我想到去收容所找一只狗来收养时,我就想到了这一点。
爱上马特维尔和高级狗
在我准备带一只回家之前,我在一年的时间里去过马特维尔几次。在此期间,我爱上了马特维尔。
马特维尔的任务是为老年狗寻找家园。创始人知道收容所更容易为年轻的狗找到家。它们在传统方式下仍然很可爱,主人可能更容易训练它们,它们也不太可能有健康问题。马特维尔只收留年长的狗。他们向新宠物主人提供与狗的年龄相关的医疗费用报销。例如,当我第一次得到我的狗时,它需要做牙科手术,马特维尔支付了手术的全部费用。
The “Golden Mutts” getting dolled up for an early bird special adoption event (photo property of Muttville).
这篇博文的目的不是为庇护所做广告,所以我最后要说的是,他们的社交媒体很可爱。当我对着他们可爱的狗哇哇大叫的时候,他们的工作人员向我推销了养一只老狗的想法。
收养一只年长的狗的一些好处:
- 他们(有时)比小狗更容易训练,尤其是如果他们已经被以前的主人以任何方式训练过。
- 他们往往要冷静得多。
- 它们通常不需要像幼犬那样多的关注。
作为一个第一次养狗的忙碌的人,它吸引了我去养一只更安静的狗,它不需要我一直全神贯注。
露丝出场了
去了马特维尔很多很多次后,我遇到了 8 岁的露丝(当时她叫克丽克特),我开始了人生的新篇章。
Ruth and I just before I took her home for the first time. These days, she and I both look much less nervous when I carry her!
作为我收养文件的一部分,我得到了她的医疗记录和信息。我几乎懒得看一眼,因为我是第一次养狗,我不能更兴奋地把露丝带回家。
I was told to expect her not to be too clingy, but this is one of the only places she’ll sleep
露丝和我开始更加了解对方。当我在 Instagram 上贴满她的照片时,她的害羞消失了。我很快发现,虽然我被告知要期待她冷静和超然,但她实际上是充满活力和粘人的。
Ruth has a perpetual case of THE ZOOMIES
我越了解她,就越开始问这个问题——这只狗真的只有 8 岁吗??
然后我会接着问——在我遇见她之前,她的生活是什么样的?
挖掘曾经流浪狗的秘密
给我的记录很少。我有她在收容所接受的疫苗的信息,以及她在未来几周需要加强的疫苗。我被告知她患有牙病,需要尽快手术。除此之外,我只知道:
- 她可能一半是吉娃娃,一半是腊肠狗(有些人——不是我——称之为腊肠)。
- 我得到她的时候她大约 8 岁。
- 她有两个良性肿瘤。
- 当她到达收容所时,她超重了,在我把她带回家后,她需要继续减肥。
- 她到达收容所几天后就被阉割了。
- 她至少生了一胎,可能更多。
- 她被发现时是一只流浪狗,但她也有一个微芯片。安装微芯片的公司几年前就倒闭了,他们关于她的信息无法获取。
我根据露丝的个性、她喜欢/不喜欢的东西以及她在旧金山某些地区散步时的反应,对她之前的生活提出了一些理论。
A few quick hints about Ruth’s likes and dislikes (her second favorite activity after running around the house is, of course, sleeping)
但事实上,我不知道她是谁。我创造的故事将所有的片段组合在一起,这就是故事。
故事很难评价。但是作为一个数据科学家,一个简单到“我的狗多大了?”似乎很容易回答。我可以把她的所有特征代入回归模型并得到她的年龄作为输出的模型在哪里?
当我纠结于她小狗般的个性和她年迈的医疗记录之间的关系时,我只是不停地掉进谷歌兔子洞,试图找到这个问题的答案。
狗的年龄是怎么估计的?
简短的回答:牙齿。
Source: https://www.rescuedogs101.com/3-big-clues-to-how-old-is-my-dog/
对于幼犬来说,特征的比例(和客观的可爱程度)是一个很明显的迹象,表明这只狗非常年轻。根据一些兽医的说法,观察幼崽的乳牙/成年牙是如何生长的,可以提供+/-几周的年龄估计。
你会注意到上图中狗的年龄越大,估计它的年龄就越不精确。如果没有关于狗一生中牙齿护理类型的信息,这些界限就会变得更加模糊。一位兽医曾经告诉我,她猜我的狗在 4 到 10 岁之间——这不是一个令人满意的置信区间。
狗的年龄的其他暗示包括:
- 变老——和人类一样,随着年龄的增长,狗也变老了。但也像人类一样,这种情况的发生没有明确的年龄(查看一些资料,听起来像是狗在 5 +/- 3 岁时发生灰色)。
- 眼睛——年长的狗会丧失视力。他们也可能会在眼睛周围形成一种良性混浊,称为晶状体硬化。这似乎开始发生在 4 到 10 岁之间,并随着时间的推移而恶化。
- 听力——随着年龄的增长,狗会丧失听力。狗的听力损失很难量化。即使不是这样,我也认为这是另一个听力损失范围很广的领域。
- 体型——狗和人类一样,随着年龄的增长,越来越难保持脂肪。
我发现的模糊指标还包括:丧失行动能力、疼痛、丧失认知功能,甚至摇尾巴的次数…
According to Ruth’s tail wagging, she’s about a week old.
据一位兽医说:
估计狗的年龄是一门艺术,而不是科学。
品种是如何影响的?
我再从简短的回答开始:很多!据 PetMD 报道,
一只年老的吉娃娃可能是 18 岁,一只年老的大丹狗可能是 7 岁。
不仅品种起作用,而且品种内的狗的大小也起作用。例如,一只 6 磅的约克比一只 12 磅的约克衰老得更慢。然而,关于不同品种的狗和不同大小的狗如何变老,甚至有很多不同意见。
Disagreement between Sources on “Human Age Equivalent” of Dogs
狗的特征和年龄的数据集在哪里?
主观特征不在某个地方的数据集中是可以理解的。然而,有一个客观特征似乎可以提供一些见解。
从狗身上拔掉的牙齿数量以及狗的体重、品种和年龄的数据集在哪里?
在世界各地,都有兽医给狗做牙科工作。许多个体诊所可能有他们治疗的所有狗的这些信息。
这就是我们面临数据收集整体挑战的地方。不幸的是,即使所有的数据都已经被记录在某个地方,它也是昂贵的。并非每个办公室都以同样的方式记录数据。也许它都保存在一个文件中,但更有可能的是,它存储在每只狗的文件中。我不指望这些办公室有理由让这些数据可查询。他们可能连电脑里都没有。
我没有数据收集方面的背景知识,无法猜测需要花费多少人力去接触每一位兽医获取数据,跟进直到数据收集完毕,然后对数据进行分类,使其以相同的方式存储,但我相信这将需要大量的时间,并且从每一个品种中获得足够的样本量,以及足够的数据来解释该品种体重的影响,这将是一项昂贵的工作。
数据收集往往非常困难。 随着数据科学家越来越擅长创建程序来自动分析数据,我们可能会忘记,在计算机完成人工智能之前,许多许多人都在幕后记录、收集和清理这些数据。
在预测狗的年龄的情况下,收集所有这些数据的成本是否值得或许更好地预测狗的年龄的回报?收集所有这些数据只会发现目前可用的非常粗略的估计和预测一样准确。与此同时,在某个时间点后知道狗的年龄对你如何照顾那只狗没有什么影响。能够回答这个问题真的只是为了满足人类主人的好奇心。
还有一个关于创造这种预测模型的伦理问题。如果随着年龄的增长,狗越来越难被收养,那么创建这样的模型可能会对狗被收养的能力产生负面影响。也许问题不在于这些数据是否值得收集,而在于是否应该收集。
那么一个好奇的狗主人该怎么做呢?
我发现,如果你仍然对你的狗的年龄感到好奇,最好的建议是一年左右拍一次相关特征的特写照片。这不会告诉你你的狗的年龄,但它会告诉你你的狗衰老得有多快,并给你一个主意,什么应该保持最密切的关注。
Ruth’s features that may indicate aging
You’ll come back and read our next post, won’t you??
[1]晶状体硬化的解释(在狗的眼睛里堆积):https://www . petmd . com/blogs/fully vetted/2011/nov/catarats _ or _ Lenticular _ Sclerosis-11975
【2】Embark 估计狗狗年龄指南:https://Embark vet . com/how-old-is-your-dog-how-veterinaries-estimate-dog-age/
[3]宠物医生估算狗狗年龄指南:https://www . petmd . com/dog/slides shows/how-old-my-dog-5-tips-determining-your-dogs-age
OpenAI 如何用机械手解决魔方
人工智能的突破还是只是烟幕弹?
A robotic hand holding a Rubiks Cube.
如果你没看过视频。 结账 。
强化学习在过去的几年里取得了很多成功。我们已经看到人工智能通过强化学习在围棋、Dota 和星际争霸中击败了职业选手。前围棋冠军李时斗在输给高手 AI 后甚至完全退出了比赛。
强化学习的问题是
但是强化学习有一个巨大的问题——它的成功仅限于虚拟环境。没有一个人工智能能像人类一样驾驭现实世界。甚至一个 2 岁的孩子都比我们最复杂的人工智能做得更好。当然,这是一个非常复杂的问题——进化花了 40 亿年才创造了人类,而我仍然设法找了 10 分钟的钥匙,才意识到它们一直在我的口袋里,所以智能生命并没有达到它的顶峰。
尽管如此,人类还是设法在不死亡的情况下学习复杂的任务。如果人类完全像我们的算法一样学习,他们将不得不从悬崖上开下数千次,才能意识到留在路上可能不是一个坏主意。
更糟糕的是,这些算法是如此的数据饥渴,以至于人类的一生都没有足够的时间来学习哪怕是一些有点困难的任务。例如,Dota AI 在能够击败职业选手之前玩了 40,000 年的游戏。当然,仍然令人印象深刻,但是加快时间在虚拟环境中更有效。
那么 OpenAI 是如何在没有利用虚拟环境优势的情况下,利用强化学习来控制物理手臂的呢?
他们没有。他们使用了虚拟模拟。但是一个模拟可以精确到它的结果可以直接转移到现实世界吗?OpenAI 的结论是否定的,现实世界太复杂了,摩擦和弹性之类的东西太难精确测量和模拟。
这是他们试图通过这个实验解决的核心问题。这是 sim2real 迁移问题,它描述了将在模拟中学到的知识应用到现实世界的挑战。
自动域随机化(以及为什么比听起来更容易理解)
他们解决这个问题的方法是一种叫做自动域随机化(ADR)的方法。ADR 的思想是,随着 AI 性能的提高,随机产生越来越多的具有不断变化因素的困难环境。这迫使人工智能学习一种适用于所有随机生成的环境的通用策略,这在理论上导致了这样一种健壮的人工智能,其结果可以转化为现实世界。
让我们再深入一点。这听起来很复杂,但是很简单。让我给你介绍一个人——他是 ADR 算法,他就像一个邪恶的老师。
Great illustration
他喜欢看他的学生努力奋斗。这个例子中的人工智能是他的学生。他面前有几个旋钮。第一个控制魔方的大小,第二个控制手的摩擦力,最后一个控制魔方的重量。还有几个参数,但那不是重要的部分。
当 AI 开始训练时,它仍然在挣扎,所以 ADR 什么也不做。旋钮停留在固定位置。然后在某些时候,人工智能是相当好的,并设法解决立方体的大部分时间。由于 ADR 不喜欢看到 AI 成功,他开始随机转动旋钮。但在现实中,即使 ADR 是邪恶的,他的心是好的。所以他不会全力以赴,只是随意地转动旋钮。足以让人工智能再次挣扎,但不要太随机,因为这将使学习变得不可能。这种情况会永远持续下去——随着人工智能改善 ADR,其随机性范围也会增加。
How the size of the Rubik’s Cube changes over time.
好了,现在我们明白了 ADR 是如何工作的,但是实际的人工智能控制机器人手臂呢?我会给你一个简短的总结他们的设置。
在后台
实现这一目标的神奇调料是以下几点的结合:
- 卷积神经网络从三个摄像机角度预测立方体的 3D 变换。
- Kociemba 的算法,这是一个手工制作的算法,可以计算出解决任何混乱的魔方的步骤。
- 一个神经网络,它根据预测的立方体位置和指尖位置(从机器人手接收)决定下一个动作
During development OpenAI sometimes used a smart Rubiks Cube (Giker Cube) instead of cameras as a stepping stone.
戏剧
你们中的许多人可能会惊讶地看到他们使用手工算法来计算解决方案。别担心,社区的大部分人也是。声称已经用神经网络解决了魔方,但实际解决部分使用了手工制作的算法,这有点不真诚。另一方面,为什么要尝试解决一个已经有完美解决方案的问题。
既然我们已经在戏剧中,让我们继续:当观看视频时,你得到的印象是,该网络在做什么是相当好的。但是,成功率有点令人失望:对于需要 26 次面部旋转的立方体,他们的最佳策略的成功率只有 20%左右。公平地说,26 次旋转是最坏的情况,大多数立方体不需要那么多。对于需要旋转 15 次面的立方体,成功率高达 60%。
另一个警告是修改魔方。OpenAI 使用贴纸来打破旋转对称,这使得模型可以从单个图像中唯一地识别角度。这是人类不需要的修改,虽然很好理解。
不要误会我,我并不是想淡化 OpenAI 的惊人壮举。重点是,我认为 OpenAI 想通过使用 clickbait 策略来炒作他们的作品,获得更多关注。通过投资获得炒作,他们研究的准确性和科学有效性开始变得可疑。
你怎么看?
今天到此为止。如果你喜欢学习人工智能,请到我的 Youtube 频道来看看我。和平!✌️
我们对待 ITSM 的方式让我们的客户非常失望
如果我们要绘制全球企业对技术的需求以及 IT 提供技术的能力,我们会看到一条向上的右曲线。在这个图表中,企业在要求技术方面比在提供技术方面更加积极。这让我们质疑我们的做法是否正确,ITSM 是否让我们的客户失望。
我们认为是的。
一点历史
我们认为 ITSM 正在失败。但平心而论,我们并不认为这是一个新的发展。更确切地说,这是一个漫长而稳定的下降过程。在过去的几十年里,出现了范式转变和分水岭式的时刻。想想当 PC 成为一件大事的时候,互联网出现了,大数据,虚拟化等等。
创新一直不缺乏,这是肯定的。很难想象在我们历史上的任何时候,有 20-30 年左右的时间可以看到如此突然和持续的发展和创新。
那么我们为什么认为 ITSM 失败了呢?因为自始至终,我们都没有用正确的方式做事。问题不在于技术。是我们。
我们哪里出错了
在这个过程中的某个时刻,整个 IT 部门认为他们是一个服务管理组织,于是 ITSM 诞生了。这就是我们开始出错的地方。
“好吧,”你说,“所以它变成了 ITSM,并采取了‘服务提供商’的心态。这有什么不好?”
这种方法的固有问题是,在成为服务提供商的过程中,我们要说两件事。
- “是的,我们可以为您提供这项服务”
- “…但是我们也希望你知道足够多,知道你想要什么,你什么时候想要,以及你如何想要。”
最明显的问题是我们提供前者而假设后者。更大的问题?在假设企业知道他们需要什么、如何以及何时需要什么的时候,我们忽略了他们通常不知道的部分。
所以,是的,技术不是问题。太棒了。但是通过创新,新的实践,闪亮的新玩具,算法,程序和工具;我们忽略了一个事实,即尽管企业对技术的需求正在增长(甚至飙升),但他们不太可能知道自己需要什么,也不知道技术对他们有什么好处。
“是的,我们可以提供这项服务……但我们希望您知道该怎么做。”
随着 ITSM 的成长和成为标准,企业想要什么和团队愿意或能够交付什么之间的鸿沟已经扩大。有了它,商业和技术之间的鸿沟扩大了,结果团队和人之间的鸿沟也扩大了。
这就是 ITSM 让我们的客户失望的地方。但这又能怪什么呢?
是云惹的祸吗?
我们行业中的一些人倾向于将云视为一个分水岭,将事情引向了错误的方向。如果我们退后一步,看看随着时间的推移这种下降,我们可能会指着一个时间说“啊哈!这就是云出现的地方。”
然而,在我们看来,云并不是导致这个问题的原因。在这方面,我们认为它实际上可能有所帮助。
从这个角度来看,云真正解决的问题是如何弥合企业需要的东西和他们能够合理获得的东西之间的差距。
如果我们把这个问题看作是技术无法满足商业期望的问题;或者是企业无法理解自身需求的问题,因为这与技术有关;至少,云没有让这些事情变得更糟。
云是很多东西,但对业务需求和技术交付能力之间日益扩大的差距的指责不是其中之一。
那是什么?
根据我们的估计,技术在这一领域的失败是由于 ITSM 运动的意外但明显的后果,即技术和业务之间的鸿沟越来越大,以至于技术可以提供能力,但业务需要自己解决问题。
ITSM 没有兑现承诺。不是云。不是大数据(尽管它有自己的问题)。而不是任何闪亮的工具。相反,我们对待行业的态度并没有产生最佳结果。改变这种心态是扭转趋势的关键。
而在过去,技术团队可能会花费大量时间来弄清楚企业想要实现什么,与不同的部门联络,并从全局角度看待手头的问题、期望的结果以及如何实现;我们现在看到技术团队提供服务。有时提供预先打包、预先形成和预先加载的单一服务,期望公司知道如何最好地运行它。
我们以首席技术官及其预算为目标。不是业务需要。首席技术官是伟大的,不要误解我们。他们通常是决策者。但是他们不一定是合适的倾诉对象。他们可能不知道,也经常不知道真正的需求是什么。是技术问题吗?是营销问题吗?操作问题?
首席技术官可能会签署合同,但他们可能并不处于真正确定或阐明整体业务目标的最佳位置,尽管他们自己没有任何过错。
ITSM 失败了,因为我们忘记了我们服务的 IT 部门是一个完整的企业,实现积极的业务成果不一定只是一个 IT 实施问题。
没有开拓新的领域
这不是一个全新的想法,也不是一个大胆的声明。这不是旨在颠覆行业的杰里·马奎尔式的宣言。在私人谈话或会议的分组会议中,这个话题会被详细讨论。我们都知道这是一个需要解决的问题。并且已经尝试这样做。
一路上,我们有各种尝试、技术和方法,试图更好地连接商业和技术。这带来了一些积极的结果,但更重要的是带来了更多的项目管理部门、产品经理、产品营销经理等。IT 或工程部门内的专门角色和部门;或者是营销或运营部门的分支,旨在帮助保持联系。
这是有帮助的,但是我们也无意中创造了一些角色,这些角色充满了毫无疑问有能力的人,他们有时会“代替”企业;但他们往往无法弥补能力上的差距。
我们需要转移注意力
IT 服务管理层采取了这种立场,并宣称:“我们在这里提供服务…但也仅此而已。”简而言之,我们已经成为科技世界的 UPS、联邦快递和邮局。只要准时到达那里。不管接下来发生什么,那都取决于接受者。我们在这里的工作完成了。事情就是这样。但是应该吗?
在这些快递公司花费数百万了解客户行为的时候,进行这种比较也许是具有讽刺意味的;以更便捷的方式提供更多服务,优先考虑客户体验。
这发生在当今世界数据为王、货币为王的时代。还有很多等着我们去使用。顺便问一下,这些快递公司向谁寻求帮助?
美国。很讽刺,不是吗?
我们能做什么?
ITSM 正在失败,我们的方法需要改进。就像包裹运送公司将他们的服务视为一个完整的产品一样;从销售到发货,都需要跟风。它需要管理结果。不仅仅是物流。
答案并不那么简单,因为它需要我们作为一个行业来思考。不再把 ITSM 作为标准,而是把 ITSM 作为我们工作的一个方面,只要执行得当。
这不仅仅是工具或技术的问题。这不是关于云或 DevOps,也不是关于我们明年推出的闪亮新玩具。这实际上是从 360 度的角度恢复我们所服务的企业的信心和信心。
恢复伙伴关系心态
它需要伙伴关系来取得成果。我们需要重新获得我们失去的东西,这是提供服务的真正意义,也是实现预期结果、解决问题所需要的东西,并与我们服务的企业合作,而不是无视它们。
通过重新建立这种方法,我们可以开始不通过我们设定的服务级别指标或目标来衡量成功。不要误解我们,服务级别指标很好…但是有多少服务提供商根据业务的成果来衡量成功,而不是他们自己提出的任意指标?
业务试图实现的目标之间是有区别的;服务提供商确定的是成功的衡量标准。这些往往不是一回事。
同样,在实现这些服务级别目标和为服务提供商所帮助的企业的成功做出贡献之间存在着越来越大的差距。一方当然可以帮助另一方,但它们并不总是一回事。
简而言之:ITSM 心态已经失败。基本上,如果我们想更好地服务我们的客户,推动我们的行业向前发展,我们就用了错误的方式和错误的思维方式。如果不从整体的角度来看待我们的行业和我们能够提供的服务,我们就会有所欠缺。
IT 需要看到并确定对业务有影响的成果,而不是在服务级别目标上打勾。如果我们不缩小差距,并开始将客户的实际需求与我们的能力联系起来,我们将继续玩“我们只是提供服务”的游戏。这就是我们对 ITSM 的心态不仅让我们失望,也让我们的客户失望的症结所在。
最终,我们只会做更多同样的事情。从本质上来说,这导致了企业的失败,更重要的是,这种分化永久化了。
原载于 2019 年 12 月 1 日https://introspectdata.com。
我们的黑客马拉松项目如何激励谷歌对抗阿片类药物危机
对于那些从未参加过黑客马拉松的人来说,这是一次独特的经历。睡眠不足、垃圾食品、紧迫的截止日期和竞争(但合作)精神的结合会产生创新的想法。
然而,尽管黑客马拉松很受欢迎,但对它们的一个普遍批评是,它们几乎没有真正的影响力。一旦糖的高潮消退,红牛消退,参与者回到他们的日常生活,他们努力开发的想法和原型通常会半途而废。这是一种耻辱。虽然在黑客马拉松上开发的许多项目都是简陋的原型,但这些原型背后的想法可能有真正的价值。通过额外的工作,一些支持你的伙伴,再加上一点运气,这些想法会产生真正的影响。我知道是因为这发生在我的团队身上。
2017 年 12 月,我和我的团队(三名数据科学家和一名软件工程师)参加了美国卫生与人类服务部(HHS)阿片类药物代码马拉松。我们和其他 50 个团队有 24 小时的时间来梳理 70 多个提供的数据集,以帮助 HHS、卫生从业者和公众找到解决阿片类药物危机的新方法。不是来自公共卫生背景,我们很难(现在仍然如此)理解助长阿片类药物危机的许多相互依赖的行为者、行为和动机。在这样一个复杂的系统中,“速赢”,特别是那些可以在代码马拉松中在 24 小时内解决的,可能是难以捉摸的;但这并不是说,如果你足够努力地去寻找,它们就不存在。
在事件发生前的几周,我们尽可能多地阅读了有关阿片类药物危机的信息。从学术期刊到 Reddit,我们投入了大量时间试图理解危机带来的挑战的类型和规模。正是通过这项研究,我们发现了一个惊人的事实:71%的滥用处方止痛药的人从家人或朋友那里获得药物(赠送、购买或盗窃)。
CDC — Policy Impact — Prescription Painkiller Overdoses — 2011
这个事实迫使我们重新评估我们对成瘾最常见途径的假设。危险不仅存在于过度热心的医生或药品经销商身上,还存在于全国各地医药柜中数百万陈旧且未使用的药物中。单独来看,这些药物似乎无害,但总的来说,我们知道这些过量的药物最终导致每年数千人死亡。这一认识迫使我们不断回到同一个问题:我们能做些什么来安全地清除已经在流通的阿片类药物(和其他药物)?
安全处置药物并不是一个新概念。多年来,美国药品管理局的分流控制部门为全国范围内选择允许他们接受旧的或未使用的药物的药店提供许可证。此外,美国药品管理局每年都会举办全国回收日,在此期间,公众可以将药物退回到由当地执法机构运营的其他站点。虽然这些项目为安全处置药物创造了必要的基础设施,但找到安全处置药物的方式、时间和地点仍然是一项艰巨的任务。有关许可处置地点、时间和限制的信息分散在多个联邦、州和地方政府网站以及 CVS 和 Walgreens 等私营公司的网站上。
除此之外,众所周知,让公众参与到预防行为中来是非常困难的,比如退回未使用的药物。这并不是说我们是坏人,我们只是忙碌、疲惫,被工作、账单和家庭压得喘不过气来的人。虽然我们很多人都渴望做“正确的”事情,但我的团队意识到,没有一种资源可以让公众轻松找到并利用他们周围现有的回收地点。为了真正激励公众退回他们未使用的和多余的药物,我们意识到我们需要建立一个工具来完成两件事:1)建立一种紧迫感,2)使公众尽可能容易地找到他们附近的回收地点。有了这些事实、大量的数据和大量的咖啡,我们开始了代码马拉松。
24 小时后,我们展示了我们的原型:夺回美国
TakeBack America Prototype — April 2018
简而言之,“回收”旨在通过让公众更容易找到他们附近有执照的处理场所来消除安全处理药物的障碍。TakeBack 利用县一级阿片类药物风险和处方数据(由 HHS 提供),以及我们从各种网站收集的药物回收地点数据。在 TakeBack 中,这些数据在县一级进行合并和显示,使用的是一个动态且易于使用的界面中内置的综合热点和点地图。最终,我们相信以一种本地化的、简洁的、令人信服的方式呈现这些信息将会促使公众退回他们的旧的和过量的药物;其他人同意了。在两轮闪电测试中演示了我们的工具后,TakeBack 被来自 HHS、Stanford Medicine X、Socrata 等公司的评委选为三个获奖解决方案之一。
Team Visionist — HHS Opioid Code-a-thon Awards Ceremony (Photo Credit: HHS)
在代码马拉松之后,我们继续给 TakeBack 一些 TLC。最初的更新很小;增加一些新的处理地点或者调整我们的地图,但是很快其他人开始聚集在我们周围。首先,我们 Visionist 的领导鼓励我们改进 Takeback 的用户界面,包括一天晚上我们工作到很晚时送披萨。很快,我们许多了不起的同事来帮助我们,一些人在下班后留下来帮助我们自动化数据流,微调我们的用户体验,或完善我们的用户界面。随着 TakeBack 的基础数据和功能不断增长,网站的访问量也开始增加。
虽然我们对 TakeBack 的技术细节感到满意,但我们坚信未来对 TakeBack 的增强应该由用户来引导。为此,我们首先联系了代码马拉松的赞助商 HHS。举办完比赛后,HHS 的首席数据官 Mona Siddiqui 和她的团队与我们会面,讨论如何更好地推广我们的工具。这些讨论让我们在 2018 年健康数据收集大会上展示了 TakeBack 和关于数据共享政策、数据驱动的解决方案和阿片类药物危机的圆桌会议。在这些活动中,我们有机会与患者、医生和其他卫生从业者直接互动。我们发现这些对话非常有帮助,引导我们对 TakeBack 进行改进,这是我们自己从来没有想到过的。
然后在九月,出乎意料的,谷歌联系了我们。原来谷歌(Code-a-thon 的原始赞助商)看过我们的演示,觉得 TakeBack 有很大的潜力。事实上,谷歌深受启发,他们告诉我们,他们想在谷歌的地图和搜索产品中复制 TakeBack 的见解。从 10 月份开始,我们与谷歌的法律和数据科学团队反复通话,审查我们的数据、方法以及 TakeBack 的底层代码。上周,谷歌、HHS 和 Visionist 终于宣布向更广泛的公众发布这一新工具。
不用说,我们很荣幸谷歌和 HHS 都看到了 TakeBack 的独特价值,我们很高兴在过去的一年里与这两个组织合作,将 TakeBack 推广到全国观众。我们相信,这些与谷歌搜索和地图的新整合将成为他人的宝贵资源,甚至有助于拯救生命。作为一名数据科学家,没有什么比看到您的工具惠及如此多的人更值得骄傲的了。
然而,这只是朝着正确方向迈出的一步。通过这次经历,我们了解到阿片类药物危机是多么复杂和多方面的。真正解决这一危机需要医疗系统内外的人继续做出贡献。在 Visionist,我的团队继续寻找机会将我们的分析技能应用于阿片类药物危机及其他问题。我希望这篇文章能鼓励你们中的一些人加入到我们的努力中来。无论是深夜的想法、课堂作业,还是你自己的黑客马拉松项目,我们和其他人都想听听你带来了什么想法和原型来应对这场危机。我们的经验表明,这种项目可能是未经雕琢的钻石。如果你相信你的项目,继续给它你的时间和注意力。与他人分享,并寻求他们诚实的反馈。你永远不知道它会激励谁,也不知道它最终会变成什么。
再次感谢所有让这一切成为可能的人,包括我在 Visionist 的出色团队,他们帮助我们回到今天的状态(Dillon Mulroy、Kelsey Campbell、Will Sutton、Brian Lehman、Matt Loff、Eric Reidelbach、Trish Willard、Enrique Caballero、Greg Friedman 和 Ruth Goulding)。另外,感谢谷歌的法律团队和 HHS 办公室的首席技术官。
Python 如何帮助我选择新家——第 1 部分
一个简单的端到端应用程序,使用 Python 来自动化枯燥的工作。
Public Housing in Singapore. Photo by DollarsAndSense.
一点背景
最近,我向住房发展委员会(HDB)申请建造一套新公寓(BTO)。对于那些不熟悉新加坡公共住房的人来说,新加坡人可以申请 HDB 建造的全新公寓,等待期为 3-5 年。那些成功的申请人将获得一个排队号码,决定他们在项目中选择一个单位的顺序。谢天谢地,我很幸运地拿到了一个排队号。剩下要做的就是选择一个我喜欢的单元,然后努力祈祷直到我的约会日期它仍然是可用的。
最初,根据我自己的标准,比如潜在的转售价值、屏蔽/未屏蔽的视图等,很容易列出几个单元。然而,他们总是说现实是残酷的,我最喜欢的单位被别人拿走了。
问题来了…
最终,我开始发现自己陷入了一个痛苦的循环每天:
1)查看是否有单位在 HDB 网站上被选中。如果是,它们在我的入围单位中吗?如果是的话,c̶r̶i̶e̶s̶̶i̶n̶t̶e̶r̶n̶a̶l̶l̶y̶会重新评估我的选择。
The very page I can’t help but stare at every single day before our appointment.
显然,我不是唯一有这种问题的人。在和我未来的邻居在一个电报小组呆了一天后,我很快就意识到了这一点。是的,你没听错,聪明的国家。所以我想,现在是 Python 的时代了。
计划是什么?
为了自动化检查单元的整个过程和个性化体验,同时对我来说成本最低或为零。
该过程
首先,内容。我需要从 HDB 网站提取单位和其他杂项信息的可用性。这可以用 Python 中的 BeautifulSoup 包或 Selenium 来完成。在这种情况下,我选择了 BeautifulSoup,因为这个任务非常简单。我不会详细讨论实现,因为这将是一个单独的话题。然而,对于那些感兴趣的人来说,网上有很多教程,这里有一个很好的。
二、存储。为了迎合个人,我将不得不在单元数据上存储用户数据以供将来参考,这是我与 MongoDB 自由层云数据库(M0 阿特拉斯)一起进行的。对于手头的任务,阿特拉斯·M0 绝对绰绰有余。此外,Python 有 pymongo 包,这使得设置非常简单。
最重要的是,消费。我将如何查看此信息,从哪里获取更新?还有,还有谁会想用这个?自然地,因为我从 Telegram 中找到了我未来的邻居,所以以 Telegram bot 的形式提供服务就有了直接的意义。毫无疑问,我选择了 python-telegram-bot 包,因为它的社区给了我第一手的经验,并且我可以用它进行大量的定制。
Process of setting up an Azure VM
在花了几个小时来创建基本功能,如用户注册,当他们选择的单位被占用时的通知和发送每日摘要后,这个机器人已经准备好部署在**。在虚拟机上托管脚本将允许机器人全天候运行。我把它放在微软自己的云计算平台 Azure 上。顺便说一下,学生在 Azure 上注册时可以获得 100 美元的积分。在 Azure 上设置一个 VM 简直是小菜一碟,只需点击并决定我的 VM 的层和位置。几分钟后,BTO·巴迪上线了。**
用户反馈的重要性
这次我确定要做的一件事是在第一个版本中加入一个反馈按钮,允许用户匿名留下关于我如何改进 BTO 巴迪的建议。你会对收到的反馈感到惊讶。一位用户建议,他们可以输入堆栈,而不是一次手动键入一个设备(例如# 07–111、# 08–111、# 09–111),所有带有#xx-111 的设备都将包含在观察列表中。我继续为他们开发这个特性。
结果呢
最后,经过几次修改和听取用户的反馈后,BTO 巴迪能做的是:
- 监视列表和通知的个性化
Example of heartbreaking notification sent to users when their favourite units are taken
2.基于用户排队数的用户机会估计
Example of a user’s profile and chances
3.显示单位的当前状态及其受欢迎程度
Example of how a user can check the status of their units
至此,BTO 巴迪已经或多或少地完成了,目前服务于 200 多个用户。至于它的可持续性**,也许我可能得想办法抵消托管的成本(5~10 美元)。如果你有机会申请 BTO,一定要试试 BTO 哥们 (@btobuddy_bot)!**
更新 : Part 2 已经发布!
Python 如何帮助我选择新家——第 2 部分
Photo by Muhd Asyraaf on Unsplash
在第 1 部分的中,我分享了如何使用 Python 来自动化我的 BTO 应用程序中的普通流程,例如跟踪单元的可用性,并在单元被占用时通知我。截至目前,它正在为大约 700 名用户提供服务🎉非常感谢大家的支持!
由于它开始从监控单元中释放出我的时间,我能够花更多的时间来比较单元并决定如何对它们进行排序。在这个过程中,我意识到我必须手动计算每个单元的“因子”(例如,一个单元得到的阳光类型,窗户方向),然后才能比较它们。这既重复又耗时。不得不分析场地平面图来加工这些因素,并从数百个单元中确定哪些是“理想的”单元,这可能需要几天的时间。
不要误解我,这绝对是我珍惜的里程碑之一。然而,我相信每个单元因素的搅动可能是瞬间的,你可以花更多的时间和你的伙伴一起选择单元。因此,在这篇文章中,我将分享 Python 和一点计算机视觉是如何为我做到这一点的。
哦,如果你不熟悉 BTO 的话:
按单建造(BTO) 是新加坡的一种公共住房分配制度,单身人士(35 岁及以上)和夫妇可以通过投票选择新的住房。公寓通常会在 3-5 年内准备好,因项目而异。偶尔被称为新加坡大抽奖。
解释流程
为了让您更好地理解,请允许我向您介绍一下这个过程。想象一下,你非常幸运地申请了坦帕因斯的一套 5 居室,得到了 10 号排队号。这意味着你将是第十个选择一个单位的人,可能是一个有有利因素的单位。然后,您会得到一份项目现场平面图,以帮助您做出决策:
Site Plan of Tampines Green Glen. Photo by HDB.
让我们假设你是利润驱动的并且想要最大化你的单位的未来转售价值。您决定根据以下因素选择一个单位:
- 没有阳光直射到你的窗户上— 为了凉爽的温度
- 卧室外畅通无阻的视野— 谁不喜欢好的视野
- 位于高层— 向上,向上,远离噪音
注意:这些因素只是众多因素中的一部分。其他的例子还有到火车站的距离,到学校的距离,甚至与风水相关的属性。
尽管每个因素的重要性因人而异,但其潜在的计算方法是相似的。希望你开始明白这有多麻烦。记住上述因素,我们现在可以将它们转换成 Python 程序。
将流程转换为代码
下面是我们需要在代码中实现的目标:
- 确定 5 个房间的单元在场地平面图中的位置。
- 对于每个单元,确定窗户位于哪一侧。
- 对于每个单元,确定窗户朝向哪个方向。
以上为我们提供了每个单元的空间理解,形成了我们目标的基础。毕竟,大多数因素是基于一个单位的定位。
实施
在我们开始之前,你必须了解一点关于计算机如何感知图像的基础知识。这将有助于你理解我的方法。
Image as an array. Photo by Stanford.
与人类不同,计算机将图像视为三维阵列中的数字,即宽 x 高 x 通道。
- 每个数字代表像素的强度,范围从 0(最暗)到 255(最亮)。
- 对于彩色图像,有 3 个通道(红色、绿色和蓝色),而对于灰度图像,只有 1 个通道。
- x,y 轴用于参考某个像素,有趣的是,原点[0,0]是图像左上角的像素。
在 Python 中,有几个包我们可以用来处理图像,比如 OpenCV 、 Pillow 和 Scikit-Image 。在我的例子中,我们将主要使用 OpenCV。
有了这些新知识,让我们回到我们的第一个目标:
确定 5 个房间的单元在场地平面图中的位置。
为了确定它们的位置,我们可以利用的一种技术是颜色分割。请注意 5 个房间的单元是如何用蓝绿色进行颜色编码的,这也显示在图例中。这意味着,如果我们能够获得颜色的精确值,我们就可以找到单元在我们的三维数组中的位置。
通过使用颜色选择器,我们可以确定蓝绿色的值为 191,227,211 (R,G,B)。现在让我们对图像进行颜色分割:
我们必须交换我们周围的颜色值成为 BGR,并将其转换成 HSV(色调,饱和度,亮度)。HSV 是颜色的另一种表现形式。从我们的颜色分割得到的图像看起来像:
Site Plan with Color Segmented for 5-Room units
看起来棒极了!然而,这仍然没有给我们每个 5 室单元的确切位置。因此,我们将不得不使用另一种称为轮廓检测的技术。对于这项技术,我们将首先把图像转换成灰度。这意味着图像只包含一个通道。然后,我们应用一个简单的阈值,将所有值为 127 及以上的像素转换为 255,将 127 以下的像素转换为 0。最后,我们使用 OpenCV 中的 findContours 函数来检测单元的位置。
我们的图像看起来会像这样:
Contours drawn around all 5-Room units
我们也可以将我们的轮廓*(多点)*转换成矩形 *(4 点)*以便于计算,同时保留我们想要的信息。
Contours converted to Bounding Box using cv2.minAreaRect(contour)
好了,我们现在有了场地平面图中每个 5 室单元的坐标!继续我们的第二个目标:
对于每个单元,确定窗户位于哪一侧。
通过查看一套五居室公寓的布局,我们确定窗户位于“矩形”的扁平端。
Layout of a 5-room unit. Photo by HDB
为了确定单元的方向,我们可以利用图像处理中的另一种常见技术,称为 模板匹配 。模板匹配的主要思想是使用一个模板 (duh) 并在我们的基础图像上滑动它。给你最小差异的位置可能包含你的模板。
不是滑动,我们必须每次旋转模板 90 度,用翻转的模板重复。这是为了说明我们的单位出现在它们的边界框中的方式。总的来说,我们有 8 个不同的方向进行比较,并获得最小的差异。
下面是一个简短的例子:
Template (Left) with varying orientation and Base Image (Right)
给出最小差异的方向是最佳匹配。使用这个方向,我们可以确定边界框坐标中的哪两个点是矩形的平边。因此,我们的第三个目标是:
对于每个单元,确定窗户朝向哪个方向。
这相当简单,不需要使用任何技术。通过计算包围盒的平均点和窗口边上两点的平均点,我们可以投影一条线来表示窗口面向哪个方向。
Direction of which the windows are facing
应用
有了边界框的坐标和窗口的方向,我们现在可以在它们上面构建因子(特征)。继续我们的例子,我们想要确定每个单元将面对的太阳的类型。
Animation of sun movement. Animation by Stacked Homes
一个单元有朝阳窗朝东**、午后阳窗朝西和间接阳窗朝北/南。因为北也是场地平面图的北,所以我们可以通过计算两条线之间的角度来确定窗户的角度和指南针方向。第一条线是上面画的蓝色箭头,第二条线只是一条垂直线。两条线之间的角度公式为:******
Photo by Steemit
一个简单的基于规则的方法可以帮助将罗盘方向转换成一个单位将要面对的太阳类型。比如【NNW,N,NNE,SSW,S,SSE】会是间接太阳,【E,ENE,ESE,NE,SE】会是上午太阳,【W,WNW,WSW,NW,SW】会是下午太阳。
另一个我们可以计算的因素是一个单位的视野是否被阻挡,如果是,还有多远?通过对每个其他房间类型执行颜色分割,我们可以获得每个单元周围的“障碍物”的边界框。
Bounding box of each block
还记得我们的蓝色箭头(窗户方向)吗?现在让我们在同一个方向上进一步投射它,直到它击中其中一个盒子,这与寻找一条直线和一个矩形的交点是一样的。
一个巧妙的技巧是确定该直线与构成矩形的 4 条直线的交点。如果相交,我们可以画一个绿色箭头表示堵塞,并计算其长度:
Projection of window direction and potential view blockage
为了确定实际距离,我们可以参考原始地图上的比例,即地图上的距离与地面上相应距离的比例。
最后,我们可以将所有内容放入一个简单的电子表格中,以便根据我们的喜好轻松引用和过滤:
Summary of 5-Room units with factors
鉴于大多数因素都围绕着单元的定位,您可以进一步扩展这些因素,并建立一个相当全面的列表。然而,我决定将重点放在这 3 个因素上,作为概念验证,并收集关于其可用性的反馈。
结论
尽管这最终比我节省的几天时间要长得多,但考虑到为未来的房主节省的时间,这绝对是值得的。事实上,它已经被集成到 BTO 好友(第一部分中的机器人)中。最后,我希望你和我一样喜欢这篇文章。非常感谢所有反馈,干杯!
免责声明: 你可能会发现整个过程并不像描述的那样一帆风顺(生活也是如此),需要一些小技巧,比如放大和稀释图像,才能让它成功运行。
PyTorch 如何让你建立和实验一个神经网络
我们一步一步地展示了一个在 PyTorch 中构建分类器神经网络的简单示例,并强调了使用自定义层和激活函数等高级概念进行实验是多么容易。
介绍
深度学习(DL)火热。这是时尚的 T2。它有很酷的工具可以玩。
Source: This tweet
尽管许多 DL 实践者是从 TensorFlow 开始他们的旅程的,但 PyTorch 已经成为一个同样受欢迎的深度学习框架,因为它是由脸书人工智能研究(FAIR)团队在 2017 年初推出的。自推出以来,它引起了全球 AI 研究人员和从业者的关注,并已显著成熟。
本质上,PyTorch 为程序员提供了极大的灵活性,使他们能够创建、组合和处理流过网络(称为计算图)的张量,并配有相对高级的面向对象的 API。
当然,原始 TensorFlow 提供了类似级别的低级灵活性,但通常很难掌握和排除故障。
此外,PyTorch 还提供了强大而简单的 API 方法来自动区分基本的反向传播流程。
见它的核心创造者,sou Smith chint ala谈谈它的起源和演变。
下面这篇文章实际上很好地提炼了 PyTorch 的本质,以及它与其他非常流行的框架 Keras/TensorFlow 的主要区别。
从 TensorFlow 迁移到 PyTorch
towardsdatascience.com](/pytorch-tutorial-distilled-95ce8781a89c)
在本文中,我们将展示在 PyTorch 中构建 2 层神经网络分类器(密集连接)的简单逐步过程,从而阐明一些关键特性和风格。
PyTorch 为程序员提供了极大的灵活性,让他们可以创建、组合和处理流过网络的张量…
核心组件
PyTorch 的核心组件将用于构建神经分类器,
- 张量(py torch 中的中心数据结构)
- 张量的自动签名的特征(自动微分公式烘焙到
**nn.Module**
类,用于构建任何其他神经分类器类- 优化器(当然,有很多可供选择)
- 损失功能(有大量选择供您选择)
使用这些组件,我们将通过五个简单的步骤构建分类器,
- 构建我们的神经网络作为我们的自定义类(从
nn.Module
类继承而来),包括隐藏层张量和一个forward
方法,用于通过各种层和激活函数传播输入张量 - 使用这种
forward
方法通过网络传播特征(来自数据集)张量——假设我们得到一个output
张量作为结果 - 通过比较
output
和地面真实值并使用内置损失函数计算T4 - 使用自动微分能力()和
backward
方法传播的渐变 - ****使用损失梯度更新网络的权重,这是通过执行所谓的优化器的一个步骤
optimizer.step()
来完成的。
仅此而已。这五个步骤构成了一个完整的训练时期。我们只是重复它一堆次,以降低损失,并获得高分类精度。
The five-step process with the five core components.
在 PyTorch 中,我们将神经网络定义为一个自定义类,从而可以获得面向对象编程(OOP)范例的全部好处。
张量
[torch.Tensor](https://pytorch.org/docs/stable/tensors.html#torch.Tensor)
是包含单一数据类型元素的多维矩阵。它是框架的中心数据结构。我们可以从 Numpy 数组或列表中创建张量,并执行各种操作,如索引、数学、线性代数。
张量支持一些额外的增强功能,使它们变得独一无二。除了 CPU 之外,它们还可以加载到 GPU 中(通过极其简单的代码更改)以获得更快的计算速度。并且它们支持使用 、动态计算图(DCG) 来形成跟踪应用于它们的每个操作以计算梯度的反向图。
在这里阅读关于张量的官方文档。或者,看这个优秀的视频介绍。
亲笔签名
当涉及到复杂的神经网络时,我们都不擅长微积分。高维空间搅乱了我们的思维。还好有亲笔签名救我们。
为了处理 14 维空间中的超平面,想象一个 3 维空间并大声对自己说“14”。每个人都这样做——杰弗里·辛顿
张量对象支持神奇的自动签名功能,即自动微分,这是通过在张量流经网络时跟踪和存储对其执行的所有操作来实现的。您可以观看这个精彩的教程视频,获得直观的解释。
nn.Module
类
在 PyTorch 中,我们通过将神经网络定义为自定义类来构建它。然而,这个类继承自[nn.Module](https://pytorch.org/docs/stable/nn.html)
类,而不是从原生 Python object
派生而来。这给神经网络类注入了有用的属性和强大的方法。我们将在文章中看到这样一个类定义的完整例子。
损失函数
损失函数定义了神经网络的预测与实际情况有多远,损失的定量测量有助于驱动网络向对给定数据集进行最佳分类的配置靠近。
PyTorch 为分类和回归任务提供了所有常见的损失函数—
- 二元和多类交叉熵,
- 均方和平均绝对误差,
- 平滑 L1 损失,
- 负对数似然损失,甚至
- 库尔贝克-莱布勒散度。
关于这些的详细讨论可以在本文中找到。
优化器
优化权重以实现最低损失是用于训练神经网络的反向传播算法的核心。PyTorch 通过[**torch.optim**](https://pytorch.org/docs/stable/optim.html)
模块提供了大量的优化器来完成这项工作
- 随机梯度下降(SGD),
- 亚当,阿达塔,阿达格勒,斯巴达姆,
- BFGS,
- RMSprop 等。
“五个步骤的过程构成了一个完整的训练时期。我们只是重复了很多次。”
神经网络类及其训练
数据
对于这个示例任务,我们首先使用 Scikit-learn 函数创建一些带有二进制类的合成数据。在下面的图中,数据类别由颜色区分。很明显,数据集不能通过简单的线性分类器来分离,神经网络是解决该问题的合适的机器学习工具。
The synthetic dataset used for the classification example
建筑
我们为这个演示选择了一个简单的全连接、2 隐藏层架构。如下所示,
类别定义
我们定义对应于这个架构的变量,然后定义主类。神经网络类定义如下所示。如前所述,它继承自nn.Module
基类。
添加注释后,代码几乎一目了然。在方法forward,
的定义中,与 Keras 的模型定义有很强的相似性。
此外,请注意内置线性代数运算的使用,如**nn.Linear**
(层间)和激活函数的使用,如**nn.ReLU**
和**nn.Sigmoid**
在层的输出。
如果我们实例化一个模型对象并打印出来,就会看到结构(平行于 Keras 的model.summary()
方法)。
损失函数、优化器和训练
我们为此任务选择二元交叉熵损失,并将其定义如下(是的,按照惯例,损失函数在 PyTorch 中通常被称为criterion
)
criterion = nn.BCELoss() *# Binary cross-entropy loss*
此时,让我们通过我们定义的神经网络模型运行输入数据集,即向前传递一次,并计算输出概率。由于权重已经被初始化为随机的,我们将看到随机的输出概率(大多接近 0.5)。这个网络还没有被训练。
logits = model.forward(X) *# Output of the forward pass (logits i.e. probabilities)*
如果我们打印前 10 个概率,我们会得到这样的结果,
tensor([[0.5926],[0.5854],[0.5369],[0.5802],[0.5905],[0.6010],[0.5723],[0.5842],[0.5971],[0.5883]], grad_fn=<SliceBackward>)
所有的输出概率看起来都接近 0.5,
平均损耗是使用简单的,
loss = criterion(logits,y)
对于优化器,我们选择简单的随机梯度下降(SGD ),并指定学习率为 0.1,
from torch import optim
optimizer = optim.SGD(model.parameters(),lr=0.1)
现在开始训练。我们再次遵循一个五步流程
- 将梯度重置为零(防止梯度累积)
- 通过层向前传递张量
- 计算损失张量
- 计算损失的梯度
- 通过将优化器增加一个步长(在负梯度的方向上)来更新权重
令人惊讶的是,如果你阅读了上面的五个步骤,这正是你在所有关于神经网络的理论讨论(以及所有教科书)中看到的。使用 PyTorch,你可以用看似简单的代码一步一步地实现这个过程。
没有什么是对你隐藏或抽象的。您会感受到用五行 Python 代码实现神经网络训练过程的原始力量和兴奋!
多个时期的训练
那只是一个时代。现在,我们很清楚一个时代是不够的,不是吗?对于运行多个时期,只需使用一个循环。
并且当运行 1000 个周期时,可以容易地产生所有熟悉的损失曲线。
想看看概率是如何随时间演变的吗?
PyTorch 赋予你实验、探索、打破和动摇事物的力量。
只是为了好玩,如果您想检查输出层概率如何在多个时期内演变,对前面代码的简单修改就可以做到这一点,
这就对了,
显然,未训练的网络输出都接近 1,即不区分正类和负类。随着训练的继续,通过调整网络的权重,概率彼此分离,逐渐试图匹配地面真实的分布。
PyTorch 赋予你实验、探索、打破和动摇事物的力量。
有其他时髦的想法吗?试穿一下
PyTorch 从其早期发布开始,就非常受欢迎,尤其是在学术研究人员和创业公司中。这背后的原因很简单——它让你通过简单的代码重构来尝试你疯狂的想法。实验是任何科学领域新思想进步的核心,当然,深度学习也不例外。
用两个激活功能混起来?
(有点)疯狂的是,让我们假设我们想用两种不同的激活函数混合它——ReLU 和双曲正切(tanh)。我们想把张量分成两个平行的部分,分别对它们应用这些激活,把结果张量相加,然后正常传播。
看起来很复杂?实现这个的代码正是你所想的。将输入张量(如 X )通过第一个隐藏层,然后通过单独的激活函数创建两个张量 X1 和*【X2****】流动合成张量。简单地将合成张量相加,并通过第二个隐藏层。***
你会得到什么好处吗?谁知道呢?但是你可以用 PyTorch 很容易地做这种实验性的东西和改变网络的架构。
实验是任何科学领域新思想进步的核心,当然,深度学习也不例外。
试试自己定制的损失函数?
你可能想试试你自己定制的损失函数。我们从高中时代就开始使用均方差了。试一下回归问题的误差的四次方如何?
只需定义函数…
然后在您的代码中使用它(注意新的模型reg_model
,它可以通过关闭我们的Network
类的输出中的 sigmoid 激活来构造。
现在,你有这种感觉吗?
摘要
这个演示 的所有代码都可以在我的 Github repo 这里找到。
PyTorch 是一个很棒的软件包,可以深入到神经网络的核心,为您的应用程序定制它,或者尝试网络的架构、优化和机制方面的大胆的新想法。
在本文中,我们总结了几个关键步骤,可以遵循这些步骤来快速构建用于分类或回归任务的神经网络。我们还展示了如何用这个框架轻松地试验出好的想法。
走出去,建立你最喜欢的网络,解决你的机器学习问题。可能性是无限的!
如果你有任何问题或想法要分享,请联系作者tirthajyoti【AT】Gmail . com。此外,您可以查看作者的 GitHub 资源库中的代码、思想和机器学习和数据科学方面的资源。如果你像我一样,对人工智能/机器学习/数据科学充满热情,请随时在 LinkedIn 上添加我或在 Twitter 上关注我。
*** [## Tirthajyoti Sarkar - Sr .首席工程师-半导体、人工智能、机器学习- ON…
通过写作使数据科学/ML 概念易于理解:https://medium.com/@tirthajyoti 开源和有趣…
www.linkedin.com](https://www.linkedin.com/in/tirthajyoti-sarkar-2127aa7/)***
回归分析如何工作
不同形式的回归分析及其应用
R 回归分析是一种机器学习算法,可用于衡量自变量与因变量的相关程度。回归分析的一个广泛应用是在数据集上建立模型,精确预测因变量的值。
回归分析分步指南
在回归分析开始时,数据集可以分为两组:训练数据集和测试数据集。训练数据集可用于创建模型,以找出将最佳拟合线应用到图表中的最佳方法。因此,它可以是一条直线,也可以是一条曲线,很容易与自变量对因变量的图形相吻合。
这个新创建的模型可用于预测测试数据集的因变量。然后,预测值可以通过使用不同的精度测量值(如 R 平方、均方根误差、均方根误差、皮尔逊相关系数等)与原始因变量值进行比较。
如果准确度分数不够准确,并且想要建立更强的模型,则可以改变分配给训练和测试数据集的数据集的百分比。例如,如果训练数据集有 70 %的数据集,而测试数据集有 30%,那么训练数据集现在可以有 80%的数据集,而测试数据集有 20%。
获得更强模型的另一种方式是通过从线性回归分析变为多项式回归分析或者从多元线性回归分析变为多元多项式回归分析。
对于连续变量有不同的回归分析方法,如线性回归、多元线性回归、多项式回归和多元多项式回归。
不同形式的回归分析
线性回归
线性回归通过使用自变量来预测因变量的值。
在线性回归中,最佳拟合线用于从训练数据集中获得方程,然后该方程可用于预测测试数据集的值。该方程可以是这样的形式: y = mx + b 其中 y 是预测值*,m* 是直线的斜率,而 b 是直线与 y 轴相交的点。以下是在 python 中运行线性回归的一组代码:
该代码是基于 FIFA 19 球员评级的数据集完成的。在这里,潜力被用来预测玩家的总体评分。
**import** **numpy** **as** **np** ## The dataset is split into two groups below. The training dataset ## had 75% of the dataset and the testing dataset had 25%
split = np.random.rand(len(df_fifa)) < 0.75
train = df_fifa[split]
test = df_fifa[~split]
## A regression model is created
regr = linear_model.LinearRegression()
## Training and fitting the model
fifa_x_train = train[['Potential']]
fifa_y_train = train[['Overall']]
regr.fit(fifa_x_train, fifa_y_train)
## Predicting the dependent variables in the testing dataset
fifa_x_test = test[['Potential']]
fifa_y_test = test[['Overall']]
df_fifa_pred = regr.predict(fifa_x_test)
## Testing the accuracy of the linear model using R-squared
r2_score(fifa_y_test, df_fifa_pred)
多项式回归
多项式回归可以用一个自变量来预测因变量的值。
在多项式回归中,最佳拟合曲线用于从训练数据集中获得方程,然后该方程可用于预测测试数据集的值。
在多项式回归的情况下,方程可以是以下形式: y = ax^n + bx^n-1 + …+ c 其中 y 是预测值*,a 和 b* 是方程的常数, n 是确定曲线形状的方程的最高次,而 c 是 x 为 0 的点。基于 n 的值,该等式可以是二次、三次、四次或更多次。以下是在 python 中运行多项式回归的一组代码:
该代码是基于 FIFA 19 球员评级的数据集完成的。在这里,潜力被用来预测玩家的总体评分。
**import** **numpy** **as** **np** ## The dataset is split into two groups below. The training dataset ## had 75% of the dataset and the testing dataset had 25%
split = np.random.rand(len(df_fifa)) < 0.75
train = df_fifa[split]
test = df_fifa[~split]
## A regression model is created
regr = linear_model.LinearRegression()
## Training ,transforming the independent variable into a polynomial ## fit and fitting the model
fifa_x_train = train[['Potential']]
fifa_y_train = train[['Overall']]
poly = PolynomialFeatures(degree=4)
fifa_x_train_poly = poly.fit_transform(fifa_x_train)
regr.fit(fifa_x_train_poly, fifa_y_train)
## Transforming the testing dataset and predicting the dependent
## variables in the testing dataset
fifa_x_test = test[['Potential']]
fifa_y_test = test[['Overall']]
fifa_x_test_poly = poly.fit_transform(fifa_x_test)
df_fifa_pred = regr.predict(fifa_x_test_poly)
## Testing the accuracy of the polynomial model using R-squared
r2_score(fifa_y_test, df_fifa_pred)
多元线性回归
多元线性回归使用两个或多个自变量来预测因变量的值。
在多元线性回归中,多条最佳拟合线用于从训练数据集中获得通用方程,然后该方程可用于预测测试数据集的值。一般方程可以是这样的形式: y = ax+ bx2 +…+ c 其中 y 是预测值*,a 和 b 是*连接自变量和因变量的直线的斜率,而 c 是直线与 y 轴相交的点。以下是在 python 中运行多元线性回归的一组代码:
该代码是基于 FIFA 19 球员评级的数据集完成的。年龄、潜力、货币价值和释放条款被用来预测球员的总体评分。
**import** **numpy** **as** **np** ## The dataset is split into two groups below. The training dataset ## had 75% of the dataset and the testing dataset had 25%
split = np.random.rand(len(df_fifa)) < 0.75
train = df_fifa[split]
test = df_fifa[~split]
## A regression model is created
regr = linear_model.LinearRegression()
## Training and fitting the model
fifa_x_train = train[['Age','Value','Potential','Release Clause']]
fifa_y_train = train[['Overall']]
regr.fit(fifa_x_train, fifa_y_train)
## Predicting the dependent variables in the testing dataset
fifa_x_test = test[['Age','Value','Potential','Release Clause']]
fifa_y_test = test[['Overall']]
df_fifa_pred = regr.predict(fifa_x_test)
## Testing the accuracy of the linear model using R-squared
r2_score(fifa_y_test, df_fifa_pred)
多元多项式回归
多元多项式回归是通过使用两个或多个自变量来预测因变量的值。
对于多元多项式回归,最佳拟合的多条曲线用于从训练数据集中获得通用方程,该方程然后可用于预测测试数据集的值。
在多元多项式回归的情况下,一般方程可以是这样的形式: y = ax^n + bx^n-1 + …+ c 其中 y 是预测值*,a 和 b* 是方程的常数, n 是确定曲线形状的方程的最高次,而 c 是 x 为 0 的点。基于 n 的值,该等式可以是二次、三次、四次或更多次。以下是在 python 中运行多元多项式回归的一组代码:
该代码是基于 FIFA 19 球员评级的数据集完成的。年龄、潜力、货币价值和释放条款被用来预测球员的总体评分。
**import** **numpy** **as** **np** ## The dataset is split into two groups below. The training dataset ## had 75% of the dataset and the testing dataset had 25%
split = np.random.rand(len(df_fifa)) < 0.75
train = df_fifa[split]
test = df_fifa[~split]
## A regression model is created
regr = linear_model.LinearRegression()
## Training ,transforming the independent variable into a polynomial ## fit and fitting the model
fifa_x_train = train[['Age','Value','Potential','Release Clause']]
fifa_y_train = train[['Overall']]
poly = PolynomialFeatures(degree=4)
fifa_x_train_poly = poly.fit_transform(fifa_x_train)
regr.fit(fifa_x_train_poly, fifa_y_train)
## Transforming the testing dataset and predicting the dependent
## variables in the testing dataset
fifa_x_test = test[['Age','Value','Potential','Release Clause']]
fifa_y_test = test[['Overall']]
fifa_x_test_poly = poly.fit_transform(fifa_x_test)
df_fifa_pred = regr.predict(fifa_x_test_poly)
## Testing the accuracy of the polynomial model using R-squared
r2_score(fifa_y_test, df_fifa_pred)
结论
回归分析是一种非常有趣的机器学习技术,可以应用于不同的领域来预测数值,例如预测产品/房屋的价格,预测足球运动员在一个赛季中的进球数量以及预测人的身体质量指数。
亚马逊评论有多靠谱?
建立一个识别虚假评论的索引
简介
作为一个自称的技术爱好者,我关注技术评论社区已经有一段时间了,尤其是在 YouTube 上。在那段时间里,我发现每次新 iPhone 发布后都会出现一种特定的模式:非常受欢迎的视频(以及文章)会被发布,批评新 iPhone 的初始问题。
然而,苹果的销售数字似乎并没有受到其发布日期周围的负面气氛的影响。这让我想知道谁受这些视频和文章的影响最大,以及它们是否会影响苹果的客户满意度。事实上,如果这些评论影响了苹果的客户,一个更宽松的发布时间表,给苹果更多的时间来完善 iPhone 的新功能,可能会提高苹果的客户满意度。
为什么是 amazon.co.uk 的 T2?
我选择刮 amazon.co.uk 有几个原因。首先,除了中国,欧洲可以说是 iPhone T5 在 T4 最重要的海外市场。因此,来自英国的顾客评论呈现了苹果的相关信息。其次,亚马逊让我不仅可以收集评论本身的信息(评分、标题、文本、有用的投票),还可以收集发布评论的亚马逊用户的信息。通过点击用户名,我可以收集每个用户的信息,比如有用的投票和评论的总数,以及所有发布的评论。
在进行我的研究时,我选择专门关注 2017 年 11 月至 2018 年 9 月期间对 iPhone X 的评论,以便只收集该时间点最新 iPhone 的评论。未来的研究可能会将同样的概念应用于老款 iPhones。
工作流程
我使用 Selenium 来抓取 amazon.co.uk,主要是因为它在不同网站间导航的灵活性。
在收集了数据之后,我准备并清理了数据,主要是使用 Pandas、NumPy 和 RE。这一步包括识别和适当地处理丢失的值,修改我的代码,以及重新格式化收集的数据,以便进行进一步的处理和分析。
然后,我处理并分析了这些数据,将它们分成小组并比较它们的特征。
最后,我用 matplotlib、seaborn 和 wordcloud 可视化了我的分析结果。
每月审核次数
我分析的第一部分重点是从 2017 年 11 月 iPhone 的第一批评论到 2018 年 9 月每个月的评论数量。与我最初的预期相反,在 iPhone 发布期间,相关评论相对较少。然后,在 2017 年 12 月左右,评论数量开始显著增加,在 2018 年 3/4 月达到顶峰。
我对此次发布的评论数量相对较低的怀疑是,首先,iPhone 在欧洲的发布时间晚于美国,这可能会导致评论延迟。此外,英国的消费者可能会等到圣诞节才购买 iPhone,这可以解释 12 月份的增长。
已验证与未验证的评论
接下来,我将评论分为两类:已验证和未验证的评论。一般来说,经过核实的评论明显多于未经核实的评论。然而,唯一一次未经核实的评论数量超过经核实的评论数量的时刻是 2017 年 11 月,就在 iPhone 发布之后。这一发现让我更加怀疑,iPhone 发布时互联网上普遍负面的气氛并不是由苹果的客户造成的,而是由不喜欢苹果公司的人造成的。
此外,该折线图显示,之前确定的评论增加几乎完全由已验证的评论驱动,而未验证的评论在 2017 年 11 月之后减少,并且从未真正再次增加。
在证明了经过验证和未经验证的评论数量之间的实质性差异后,我决定深入研究并比较这两组评论的平均评分。下面的箱线图显示了结果:
这个箱线图表明,这两种类型的评论不仅在评论数量上有很大差异,而且在平均评分上也有很大差异。虽然已验证评论的平均评级集中在 4.50 和 4.75 之间,第一和第三四分位数彼此非常接近,但未验证评论的平均评级显示出很大的可变性。最重要的是,未经核实的平均评分中值约为 3.50,这进一步证明了我的猜测,即实际的苹果客户普遍对他们的 iPhone 非常满意,并且没有受到互联网上负面评论的影响。
为了证实这些发现,我仔细研究了 2017 年 11 月发表的按评论类型分组的评论:
虽然相对少的评论数量不允许非常可靠的结论,但是在已验证和未验证的评级之间仍然存在明显的差异,已验证的评级通常比未验证的评级更受欢迎。
分析复习课文
在我的下一步中,我专门关注已验证评论的评论文本,并在准备数据后,生成了一个词云,允许快速概述已验证评论的总体情绪:
同样,这个词云中的大多数词都是积极的,表示对 iPhone X 的满意(“开心”、“优秀”、“最好”)。此外,交付似乎对客户非常重要,这不一定是苹果的洞察力,但肯定是亚马逊的。
在这个词云中找到否定词,要么需要非常好的眼睛,要么需要放大镜。如果你拥有其中任何一个,你可能会发现“崩溃”或“粉碎”,然而,负面词汇的大小和罕见程度为实际苹果客户的高满意度提供了进一步的证据。
造假审查指标
在这一点上,我几乎准备好结束我的项目,并包括一些更多的描述可视化来证明我的观点。
然而,在抽样调查了一些评论后,我开始怀疑到底有多少评论是由真正购买了该产品的人发表的。有些评论,甚至是经过验证的评论,在我看来都非常可疑。为了减少由于不知道哪些评论是真实的而带来的不确定性,我想出了一个我命名为虚假评论指数的东西。
为了将虚假评论指数纳入我的研究,我决定重新开始搜集,不仅收集评论,还收集每个用户的相关信息。然后,我使用这些信息,根据以下 6 个因素来计算虚假评论指数:
我通过为这些因素分配权重和分类几个场景来计算虚假评论指数。例如,有用投票数/评论数因子的最高分是 10。这个因素的一种情况如下:如果给定用户的这个计算结果返回小于或等于 1 的数字(=用户对他的所有帖子平均收到小于或等于 1 的有用投票),则用户的虚假评论指数增加 10。因此,假评论指数越低,越有可能是真评论。
虽然虚假评论指数还不是非常复杂,但我非常有信心它至少能够识别最明显的虚假评论并将其过滤掉。
为了说明虚假评论指数,我加入了两个不同用户对 iPhone X 的评论:
这个用户收到了 74.5 的假评论指数。从他的评论中可以明显看出,他几乎没有得到有用的投票,他的评论看起来也不真实。此外,该用户主要使用 5 星评级,并在同一天发布不同产品的几条评论。因此,他得到高的虚假评论指数分数。
第二个用户收到的虚假评论指数为 27,这使得他的评论很可能是真实的。事实上,这个档案似乎属于亚马逊评论社区的一名活跃成员,因为他的评论实际上详细描述了他对该产品的体验,不仅包括 5 星评级,还获得了更多有用的投票:
最后,在根据评论的虚假评论指数对其进行分组后,我得出了一个有趣的观察结果:评论越有可能是真实的,平均评分就越低。虽然下降幅度不是很大,但仍然很显著,因为很可能是真实的评论的平均评分约为 3.8。这个评分仍然很高,证明苹果的客户非常满意,尽管如此,它并不像之前讨论的验证评论的平均 4.5-4.75 那样高。
总结
综上,苹果的客户满意度还是很高的。iPhone 发布时互联网上的负面氛围,主要可以归咎于非客户。然而,当考虑到评论的真实性时,苹果的客户满意度并不像人们乍一看可能怀疑的那样高。
这个项目未来的扩展将包括一个更完善和复杂的虚假评论指数,然后可以普遍应用于不同的评论网站,使公司能够筛选出他们的客户中最相关的评论和趋势。
最初发表于T5【nycdatascience.com】。
圣地亚哥的街道有多安全?
用 Python 和 GeoPandas 来回答一下吧!
Costanera Center, Santiago / Benja Gremler
前段时间我写了一篇文章,解释了如何用 Python 处理地理地图,用的是“硬方法”(主要是 Shapely 和熊猫 ): 用 Python 绘制地理数据。现在是时候再做一次了,但这次,用一种简单的方式解释如何做,使用 GeoPandas,可以理解为 Pandas + Shapely 在同一个包中。
Geopandas 是一个开源项目,旨在简化 Python 中地理空间数据的使用。GeoPandas 扩展了 Pandas 使用的数据类型,允许对几何类型进行空间操作。
这篇文章的动机是最近由 Oscar Peredo 教授提出的一个项目,该项目由我的同事 Fran Gortari 和 Manuel Sacasa 为我们 UDD 大学数据科学硕士学位的大数据分析课程开发。
该项目的目标是利用最先进的机器学习算法,根据 2013 年至 2018 年的公共汽车碰撞数据,探索预测城市电网碰撞风险得分的可能性。另一方面,本文的目的只是学习如何在实际问题中使用 GeoPandas,回答一个问题:
“圣地亚哥的街道有多安全?”。
如果你想知道我们为我们的 DS Master deegre 做了什么,请访问它的 GitHub 库 。
安装 GeoPandas
使用 GeoPandas 时,您应该做的第一件事是创建一个全新的 Python 环境,并从该环境安装软件包。如果所有依赖项都已安装,您可以使用 PIP 简单地安装它:
pip install geopandas
但是正如 GeoPandas 官方页面上所推荐的,在一个全新的环境中实现它的最佳方式是使用 conda (GeoPandas 及其所有依赖项都可以在 conda-forge 频道上获得):
conda install --channel conda-forge geopandas
从 GeoPandas 开始
学习 GeoPandas 的一个很好的开始就是跟随 Benjamin Colley 的文章: 让我们制作一张地图吧!使用 Geopandas、pandas 和 Matplotlib 制作一个 Choropleth 地图 ,还可以看看西班牙语版爱德华多·格雷尔-加里多的作品Workshop de cartografía en Python。
使用地理地图时,定义将使用哪种地球投影至关重要。在本文中,使用的实际坐标是纬度-经度( EPSG: 4326 )模式,其单位是十进制度,并且是在参考球面或椭球面上:
WGS 84 (also known as WGS 1984, EPSG:4326)
另一种可能性是使用横轴墨卡托投影,这将是以米为单位的 2D 地图(对于智利“ESPG: 5361”):
这是你的选择,但要考虑到你不能把它们混在一起。
我们来绘制地图吧!
一旦安装了 GeoPandas,让我们开始导入一些基本的库:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import geopandas as gpd
from shapely.geometry import Point, Polygon
我们将下载的第一个形状将是定义我们工作区域的多边形。在我们的情况下,圣地亚哥市区!矢量地图可以在智利国会图书馆 (BCN)找到。
可用地图以 shapefile 格式包含智利所有 400 个城市区域。我们应该将其过滤为“圣地亚哥”,并将其转换为 ESPG:4326:
sf_path = "../data/BCN/areas_urbanas/areas_urbanas.shp"
sf = gpd.read_file(sf_path, encoding='utf-8')
stgo_sf = sf[sf.NOMBRE == 'Santiago']
stgo_shape = stgo_sf.to_crs({'init': 'epsg:4326'})
stgo_shape
此时,我们有一个 geopandas 数据帧,它只有一条线,除了长度和面积等数据外,还包括“几何图形”,即“包围”所有城市的多边形的坐标:
我们可以绘制这个地理数据框架,就像我们习惯于绘制正常的熊猫数据框架一样:
stgo_shape.plot()
注意,经度(横轴)从大约-70.80(西)到-70.45(东),纬度(纵轴)从-33.65(南)到-33.30(北)。
您可以使用以下方式确认准确的城市边界:
stgo_shape.total_bounds
此外,还可以获得形状的中心坐标(或质心):
stgo_shape.centroid
下面你可以在谷歌地图上看到同样的区域,太平洋在左边(西边),安第斯山脉和阿根廷边界在右边(东边)
Santiago Urban Area — Google Maps
从 OpenStreetMap 导入道路
OpenStreetMap (OSM)是一个合作项目,旨在创建一个免费的可编辑世界地图,由一个地图绘制者社区构建,该社区提供并维护有关道路、小径、咖啡馆、火车站等更多信息的数据。项目生成的数据而非地图本身被视为其主要输出。
网站 GeoFabrik 有来自 OpenStreetMap 项目的数据摘录,通常每天更新。这项开放式数据下载服务由 Geofabrik GmbH 免费提供。
开始从这个链接下载数据,并保存到你的/data/ depository 下的“/OSM/”。
从那里,让我们打开关于道路的形状文件:
roads_path = "../data/OSM_Chile/chile-latest-free/gis_osm_roads_free_1.shp"roads = gpd.read_file(roads_path, encoding='utf-8')
这个文件包含了将近 455,000 条道路。让我们开始用圣地亚哥形状过滤它(为此我们将使用*)。sjoin* ,所以我们只能处理我们感兴趣区域内的道路。
roads = gpd.sjoin(roads, stgo_shape, op='intersects')
即使过滤,我们也完成了大约 83,000 条道路。检查 roads 地理数据框架,我们可以看到它包含一个名为 fclass 的列。我们来看看:
这意味着几条道路主要位于居民区,同时也是用作服务区、人行道、自行车道、人行道等的道路。一旦我们对绘制车祸地图感兴趣,让我们只保留最有可能找到它们的道路,这将把数据集减少到大约 12,000 条道路。
我们也可以只过滤主干道(主要道路和高速公路):
main_roads = car_roads[(car_roads.fclass == 'primary') |
(car_roads.fclass == 'motorway')
]
main_roads.plot()
从公共数据集中导入车祸
在智利,可以在 CONASET 网站上找到 2013 年至 2018 年分类车祸数据的公共数据库。我们将从那里下载关于去年(2018 年)发生的事件的数据。
该数据集包含近 24,000 个已报告的事件,但不幸的是,并非所有事件都进行了地理定位。首先,让我们来看看几何数据遗漏了多少数据:
p0 = Point(0,0)
df_p0 = df_2018['geometry'] == p0
df_p0.sum()
结果是 3537 分。让我们把它们拿出来,看看我们有多少干净的数据:
s_2018 = df_2018[df_2018['geometry'] != p0]
s_2018.shape
结果是:20,402 个事件。非常好!我们可以利用这些数据。让我们对它们进行筛选,仅获取圣地亚哥地区内的事件并绘制它们:
ax = stgo_shape.plot(figsize=(18,16), color='#EFEFEF', edgecolor='#444444')
main_roads.plot(ax=ax, color='green', markersize=0.2)
crashes.plot(ax=ax, color='red', markersize=8)
plt.title("2018 Road Crashs - Santiago, Chile");
plt.axis('off');
哇!目测 2018 年圣地亚哥几乎每条路都发生过车祸!
挖掘数据
为了真正了解发生了什么,我们需要更深入地研究数据。
查看数据集,我们可以看到,除了包含每个碰撞事件的地理定位的“几何图形”之外,我们还会发现以下相关信息:
- 撞车发生的时间(日期和时间)
- 位置和区域(农村和城市)
- 位置类型(交叉路、环形路、直路、弯道等。)
- 车道数量和建筑类型(沥青、混凝土等)。)
- 路况(干燥、潮湿、油污等。)
- 天气状况(雨、雪、清洁等。)
- 事件类型(碰撞、撞击、人员撞击、火灾等。)
- 严重性(致命、严重、中等、轻微、非伤害)
让我们想象一下这些事件及其主要特征:
从上面的可视化结果中,我们可以看到,2018 年圣地亚哥发生的大多数车祸都是在沥青或混凝土道路上发生的碰撞和颠簸,因为几乎所有的车祸都发生在晴朗干燥的一天。
那么发生在的时候呢?让我们用与时间相关的数据创建新列:
crashes['Fecha'] = pd.to_datetime(crashes['Fecha'])
crashes['Hora'] = pd.to_datetime(crashes['Hora'])crashes['month'] = crashes['Fecha'].dt.month
crashes['day'] = crashes['Fecha'].dt.day
crashes['weekday'] = crashes['Fecha'].dt.weekday_name
crashes['hour'] = crashes['Hora'].dt.hour
不出意外。大多数事件发生在早上 7 点到晚上 10 点,交通挑选时间(早上 8 点和下午 6 点)是最复杂的。此外,撞车事故在周末和月末发生得更少(这是一个有趣的点,应该更好地调查)。请注意,二月是事件较少的月份。这是因为这是智利人的暑假季节,圣地亚哥通常在这个月成为“沙漠”。
创建热图
在 GeoPandas 上可视化数据的一个很好的方法是聚合小区域上的数据,这些小区域具有向我们显示特定区域中存在的数据量的颜色模式。例如,事件越少,颜色越浅(如黄色),事件越多,颜色越深(如棕色)。
首先,我们需要将城市分割成小区域(或多边形)。你可以使用网格、感觉区域等。在我们的案例中,我们将使用上一次智利起点-终点调查(EOD)中定义的区域,该调查可从 SECTRA(智利交通规划部长)处获得。
一旦你下载了 shapefile,你应该将它与你感兴趣的区域相交(在我们的例子中,stgo_shape)。结果将是 743 个更小的区域来获取我们的汽车碰撞数据。
接下来,您应该将事件聚合到城市区域中。为此,应该完成两项主要任务:
- 上述文件形状和崩溃数据集之间的连接。生成的数据集将为每条线提供一个点(碰撞)和一个相关联的面(大约 20,000)。您将会注意到,对于在其区域上捕获的每个点(事件),每个多边形都将重复。
- 一组结果数据集,按区域 id。合成形状应具有与原始形状相同的线条数(743)。
可视化热图非常简单。为此,您应该使用一个简单的绘图函数,但是定义 2 个参数:
- cmap:将要使用的 colomap 名称。在我们的例子中是“magma_r”。
- k:你想要“分割”你的数据范围的类的数量。在我们的例子中,5(通常,建议不要使用超过 7 种颜色来表示您的数据范围)。
ax = crash_zone_2018.plot(column='crashes', cmap='magma_r', k=5, legend=True)
plt.title("2018 Crashes by Zone - Santiago");
ax.set_axis_off()
现在,从视觉上很容易区分最危险的区域(较暗的区域)。但是这些区域和道路有什么关系呢?让我们在最后一张地图上想象圣地亚哥的主要道路:
fig, ax = plt.subplots(figsize = (10,6))
crash_zone_2018.plot(ax=ax, column='crashes', cmap='magma_r', k=5, legend=True)
main_roads.plot(ax=ax, color = 'blue')
plt.title("2018 Crashes by Urban Zone and main roads - Santiago City");
ax.set_axis_off();
看最后一个图像,我们可以看到,例如,靠近主干道交叉口的区域,更容易发生事故。
在地图上查看大量数据的另一个非常有用的方法是使用“地形视图”。就像看一座山,山越高,颜色越深(当然,会有不是高,而是事故的数量)。爱德华多·格雷尔斯-加里多在圣地亚哥市探索移动性方面做得很好。基于他的代码,我们可以创建自己的代码:
乍一看,我们可以意识到城市中最危险的区域在哪里。
在 gitHub 上,你可以看到用于创建这种虚拟化的代码。
创建严重性指数
到目前为止,我们对每一个碰撞事件都一视同仁,但当然,与它们相关的严重程度非常重要。让我们将严重性指数与每个事件相关联。为此,我们应该创建一个函数,将其应用于所有数据集:
def sev_index_crash(row):
if row['Fallecidos'] != 0: return 5 # fatal
elif row['Graves'] !=0: return 4 # serious
elif row['Menos_Grav'] !=0: return 3\. # less-serious
elif row['Leves'] !=0: return 2\. # minor
else: return 1 # non-injurycrashes['SEV_Index'] = crashes.apply(sev_index_crash, axis=1)
有了这个列,让我们来看看新的数据:
SEV_Index = crashes.SEV_Index.value_counts()
SEV_Index.plot.bar(title="Crash Severity Index", color = 'red');
幸运的是,2018 年的大多数撞车事故都没有造成伤害(1),其次是超过 5000 起轻伤(2)。
将严重性指数与道路相关联
对于本文,将使用一个更简单的解决方案,它是由 Alex Raichev 在 KIWI PYCON 2017 上提出的。
对于每条道路的线性路段(已经在 OSM 数据集上定义),我们将收集距离该路段给定距离(例如,5 米)发生的交通事故。为此,将使用 GeoPandas 函数缓冲区。注意,单个事件可以在多条道路上被捕获,例如在十字路口。但我们认为,一旦所有细分市场都受到影响,这应该很重要。
一旦我们用度数来表示角度,我们必须首先把米转换成度。我们可以用一个简单的公式来计算:
- 度数=(米* 0.1) / 11000
并为每个崩溃事件创建一个缓冲区:
meters = 5
buffer = (meters*0.1)/11000 # degrees
c = crashes[['geometry', 'SEV_Index']].copy()
c['geometry'] = c['geometry'].buffer(buffer)
接下来,我们需要空间连接道路和缓冲碰撞点
r = roads[['geometry', 'osm_id', 'name', 'fclass']].copy()
f = gpd.sjoin(r, c, how='inner', op='intersects')
下面我们可以检查生成的地理数据框架。请注意,lineString 是捕获了单个碰撞事件的路段。例如,前 2 行是名为“Rosas”(osm _ id:7981169)的街道的同一路段,其中捕获了 2 个碰撞事件(index_right: 11741 和 23840)。
现在,按路段 osm_id 对地理数据框架进行分组将非常重要。这样做,我们将有段聚合崩溃。我们将添加崩溃和严重性指数。这样,例如,一个致命的事件将比一个非伤害事件重要 5 倍。
注意,这种方法完全是武断的,不科学的。这只是本文中用来比较路段危险程度的个人指标。
f['num_crashes'] = 1
g = f.groupby('osm_id', as_index=False).agg({
'name': 'first',
'num_crashes': 'sum',
'SEV_Index': 'sum',
'geometry': 'first',
})
g = gpd.GeoDataFrame(g, crs='4326')
对我们将获得的地理数据框架进行排序:
生活在圣地亚哥,这个结果很有意义。至少从名字上看,Americo Vespucio 和 Bernardo O’Higgins 是两条最重要的城市动脉。
让我们想象一下所有街道,每个路段都有一种颜色(“热点地图”):
fig, ax = plt.subplots(figsize = (10,6))
g.plot(ax=ax, column='SEV_Index', cmap='magma_r', k=7, legend=True)
plt.title("2018 Severity Crashes by roads - Santiago City");
ax.set_axis_off();
但是,我们应该做的是在真实的地图上可视化每一段。为此,我们可以使用叶子。下面是市区的一段,显示了所谓的“阿拉米达”(Ave Bernardo O’Higgins)最危险的一段。
你可以从 GitHub 下载一张“圣地亚哥街道”的互动地图。
就这些了,伙计们!
希望你能像我一样欣赏地理和数据科学!
详情和最终代码,请访问我的 GitHub 库:圣地亚哥的街道
更多项目,请访问我的博客:MJRoBot.org
来自世界南部的 Saludos!
我的下一篇文章再见!
谢谢你,
马塞洛
神经网络的短期预测如何影响长期决策。
神经网络调峰:第二部分
电力公司只需三天的天气预报就能探测到每月的高峰。
与 合作研究开放建模框架 。
这是关于神经网络调峰的三部分系列文章中的第二部分。考虑一下另外两个:
[## 基于神经网络的⚡️负荷预测和调峰
预测技术给了公用事业单位一个机会来拉平他们的负荷曲线,提出了一个全新的家庭…
www.kmcelwee.com](https://www.kmcelwee.com/load-forecasting/)
对于电力公司来说,减少每月的需求费用可以获得巨大的利润。然而,每天实施调峰策略可能成本高昂。如果公用事业公司使用直接负荷控制(付费给客户关闭空调、热水器等)。),如果他们这样做得太频繁,可能会让客户感到沮丧。如果公用事业公司使用存储,过度使用可能会迫使他们不必要地频繁更换昂贵的电池。因此,不仅预测第二天的负荷形状很重要,预测当月的峰值也很重要。在理想情况下,按月收费的公用事业公司需要每月削峰一天。
不幸的是,与天气预测类似,负荷预测在几天后变得不可靠。在过去三天的预测中,我们的预测平均绝对误差为 10%(MAPE)。由于一整个月的日峰值落在 10 MAPE 范围内并不罕见,因此找到月峰值很快就变成了猜测。
令人欣慰的是,通过结合一些统计技术,我们可以将明天的预测放在上下文中,并大大减少我们派遣的天数。
设置
我们被一个简单的问题所激励:明天是这个月的高峰吗?
我们知道我们不可能有 30 天的预测,但是通过查看三天的预测、本月已经发生的情况以及历史峰值,我们可以回答两个较小的问题:
- 明天会是局部高峰吗?
- 这个月明天的负荷特别高吗?
最后,我们将结合这些答案,为我们的激励问题提供信息。
明天会是局部高峰吗?
“本地峰值”将意味着明天是三天预测中最高的,也高于本月已经看到的任何负载。在我们的 web 应用程序的测试版中,它是这样表示的:
以上是 2018 年 12 月 20 日德克萨斯州中北部地区的天气预报。因为“明天的预测峰值”比目前看到的最高峰值低得多,所以电力公司不会在 12 月 20 日实施调峰策略。
考虑到模型的预测可能在正态分布附近是准确的,我们可以为明天将是局部峰值的统计可能性分配一个数字。它由这个公式给出:
Given two normal distributions (subscripts 1 and 2, defined by their mean and standard deviation), what is the likelihood that the sample X₁ will be greater than the sample X₂.
如果你对细节感兴趣,这里有一个链接可以找到完整的解释。下面是我们如何扩展该公式并将其翻译成 python:
Function used to determine likelihood that tomorrow is local peak.
使用 12 月 20 日的示例并四舍五入到两位小数,明天的“局部峰值可能性”为 0.0%,主要是因为明天峰值的正态分布区域比迄今为止的最高峰值小得多。
这个月明天的负荷特别高吗?
这个问题比较容易回答。我们查看前几年的月度数据,并计算明天预测的百分位数。需要注意的是,我们计算的是每日峰值的百分比,而不是每小时的负载。
我们试图最小化什么?
我们有两个因素,“本地峰值可能性”和“峰值百分位数”,我们希望制定一个规则来最小化两个结果,“错过的峰值百分比”和“发出的百分比”
这两个结果是每个公用事业公司必须做出的权衡。如果他们希望确保每个峰值都被捕获(丢失的峰值百分比低),他们必须每天进行调度(进行调度的百分比高)。反之亦然:如果他们想保守调度数量,他们就有错过高峰的风险。
我们需要一个目标来最小化。因此,出于我们的目的,我们将简单地添加两个目标。在下面的热图中,最小化(右)的函数就是其他两个函数的和。自然地,考虑到电力公司的优先级,他们会以不同的方式权衡这个优化函数。由于这也有金钱方面的原因,适当的成本效益分析是必要的。但是这些计算对每个电力公司来说都是独特的。
结果呢
我对 2002 年至 2018 年德克萨斯州各个地区的 ERCOT 数据进行了测试。我从 2008 年到 2018 年运行该计划,以便“峰值百分比”变量有一些后见之明。整个测试过程可以在这本 jupyter 笔记本中找到。
我假设我们对一天的预测有 97%的准确率,对两天的预测有 95%的准确率,对三天的预测有 92%的准确率——这些结果在学术文献中很常见,也反映在我们自己的测试中。
Tests run on ERCOT’s SCENT data (San Antonio, Austin). Minimization of (% peaks missed + % dispatches made) for the two variables (“peak percentile threshold” and “local peak likelihood threshold”)
以上是德克萨斯州中南部地区的一个例子。请注意,在中心热图的顶部有一条明显的线。超过一半的每日峰值有 0%的机会成为局部峰值,这表明无论公用事业公司采用何种优化方法,这种方法都会立即将调度减少一半,同时很少错过峰值。该带在进行该试验的德克萨斯州的所有地区都出现。
The regions of Texas used in testing.
需要特别注意的是,上面的图表和下面的结果在创建调度规则时使用了逻辑“and ”(例如,如果本地峰值的概率≥ 4%,并且明天≥99 %,则进行调度。)我还测试了逻辑“或”,但结果总是更糟。
结果如下图所示。请注意,这些“规则”只有在事后才是准确的。每个电力公司都需要测试以前的政策在未来的负荷上的实施效果。正如人们可能预料的那样,在试图预测月度峰值时,没有一条规则适用于所有情况。然而,一致的趋势是,如果出现局部峰值的可能性大于个位数,并且如果预测的百分比相当高,就要调度。(北部的结果与德克萨斯州的其他地方截然不同,这里有一个链接指向它的热图。)
结果表明,“局部峰值似然性”变量在此函数中起了最大的作用,而百分位数因子有助于检测历史背景中明显的非峰值。
我没有忘记,这种优化也可以通过分解每个月的规则来辅助,甚至可以应用某种机器学习算法;但是,由于未来的负载行为可能会因技术和消费模式的变化而不同于过去,因此这些流程很容易成为过度拟合的牺牲品。
然而,公用事业公司有很大的机会利用机器学习和基本统计数据来更好地通知他们的调度决策,从而节省资金并在此过程中建立客户信任。
有问题吗?更正?数据科学笑话?联系我,查看更多项目在 我的网站 。