EPL 幻想 GW29 重述和 GW30 算法选择
我们的钱球方法的幻想 EPL(队 _id: 2057677)
如果这是你第一次登陆我的幻想 EPL 博客,你可能会想看看我在本赛季开始时写的一些原始 EPL 博客(GW1-GW9),以熟悉我们的整体方法和我们随着时间的推移所做的改进。我在这个项目中的犯罪搭档是 Andrew Sproul,他和我一样对数据科学、人工智能和梦幻运动充满热情。
但是在进入统计和建议之前,我们只想送上我们最温暖的祝福给世界各地的每一个人鉴于最近新冠肺炎的更新。我们希望你们都平安无事,我们积极的想法和祈祷会传达给所有的生命为了身体健康和精神力量。在这个充满不确定性的困难时期,我们真的很感谢你,我们的读者,花宝贵的时间阅读我们的博客!
GW29 世界排名前 100 的选手
上周世界排名前 10 的选手表现相当不错,平均 65 分,一名选手以 104 分打破 100 分大关。但是,即使在顶尖高手中,我们也看到了相当数量的 40-50 岁玩家,他们的得分最低,只有 38 分。因此,如果你的得分高于 55-60 分,你会对自己感觉很好。
EPL 100 强球员最佳混合团队
当我们谈论世界前 100 名球员的话题时,让我们看看谁是他们球队中最受欢迎的球员,以及 GW24 最受欢迎的球队阵容。
前 100 名最佳守门员
前 100 名中最受欢迎的捍卫者
前 100 名最佳中场球员
前 100 名中入选最多的前锋
我们使用这些数据和当前的球员价格来创建下面的球队,这是由前 100 名中最受欢迎的球员组成的:
看起来不错的团队,在关键位置上有很多尝试不同选择的余地,同时仍然保持一个坚实的球员核心。
前 100 名 Fantasy 用户选择最多的团队
这一统计数据正在回归正常,大多数顶级球员都试图利用 3-4-3 或 4-3-3 阵型的进攻型中场和前锋。
GW29 团队绩效总结和总体统计
这是我们第一周没有超过平均分数。我们接近了49 分对游戏周平均 51 分。老实说,在过去的几周里,我们错过了做出改变的机会,没能观看很多比赛,正如你所知,我们没有时间发布我们的定期博客更新。我们在挑选队长方面的厄运还在继续,因为我们选择了 TAA,期待不失球和进球/助攻,而不是萨拉赫或瓦迪这样显而易见的选择,我们因为试图变得花哨而受到了惩罚。否则,我们会超过本周的平均分。
GW229 整体统计数据为我们的 GW30 选秀权提供信息
下面让我们从调整后的未来三周的对手难度等级(FDR)开始:
看起来曼城和利物浦都超过了 FDR 的分数,所以对于我们的算法建议来说,这将是一个奇怪的一周。其他赛程艰难的球队好像是布莱顿、埃弗顿、西汉姆。因此,我们的算法不会从这些团队中做出任何选择。赛程相对轻松的球队有狼队、阿森纳、纽卡斯尔、莱斯特、南安普顿、切尔西和曼联。
美国东部时间 1 月 31 日晚 11 点最新伤情更新
以下数据来自一个独立网站,该网站更新最新受伤情况的频率比 Fantasy 网站高得多:
按投资回报率和 90 分钟出场次数统计的顶级球员
根据上周一位读者的要求,我现在将公布投资回报率最高和最低的 50 名玩家,这样我们的读者就可以看到更多高投资回报率的玩家,并远离价格过高和表现不佳的玩家。
按投资回报率排名的后 50 名玩家
投资回报率排名前十的守门员
90 分钟内得分排名前 10 的守门员
投资回报率排名前 10 的防御者
90 分钟内得分最高的 10 名防守队员
投资回报率排名前十的中场球员
90 分钟 pts _ per _ 强中场
投资回报率排名前十的前锋
射手榜前 10 名由 pts_per_90min
GW29 算法选择
我们的算法接受调整后的每队阵型的预算,并试图最大化主要 11 名球员的每个位置的支出,然后让你的个具有良好 ROI 值的替补来填补团队的其余成员。根据当前的投资回报率得分,在接下来的三场比赛中过滤掉任何有 AVG 对手难度(FDR≥75%)的球队,并从可用选择列表中删除受伤的球员,我们的算法选择了以下球队作为花费全部 1 亿美元预算的最佳球队:
就我们自己的团队而言,我们决定淘汰门迪,因为我们几周前买下了他,而他被证明是一笔糟糕的投资,所以我们以便宜的价格从纽卡得到了拉塞尔斯,试图在接下来的几周为更多的轮换腾出预算,因为我们在等待被取消的比赛等的更新。我们的船长不再做实验,瓦迪·梅恩和萨拉赫将成为副船长。
团队统计
查看最佳/最差防守和进攻可以有几种不同的用法——例如,如果一个最佳进攻队与一个最差防守队比赛,你可能想让你的进攻中场或前锋担任队长。此外,当你查看这些位置的算法建议时,你可能想优先考虑防守最好的球队的 DF 和 GK。
最佳 7 项防御
最差的 7 种防御
最佳 7 项犯罪
最糟糕的 7 项罪行
累积团队投资回报统计
下面你可以看到球队,按累积玩家投资回报率排序。请注意,活跃玩家是指已经玩了总可能游戏时间的至少 33.33% 的任何玩家。所以,我们把所有至少打了 787 分钟的球员都算作该队现役球员。
随着我们接近本赛季的最后阶段,球队的统计数据开始很好地趋同,因为价格合理的球员中表现更稳定的球员现在占据了前 5-8 名的位置。最后,曼联和切尔西也爬上了那里。一些拥有太多昂贵的表现不佳球员的球队正在努力追赶并提高他们的整体投资回报率,这些球队是阿森纳、热刺和埃弗顿。
最终想法:
老实说,面对所有新冠肺炎的新闻和担忧,我们只是希望和祈祷每个人都平安,包括教练、球员和医务人员。让我们希望情况很快开始好转,让我们希望赛季也能在正常情况下继续,我们可以继续享受一些令人兴奋的 EPL 行动。祝愿我们所有的读者和世界上的其他人保持强壮和健康!
祝大家本周好运,一如既往——感谢您的阅读!
EPL 幻想 GW3 重述和 GW4 算法选择
我们的金钱球方法到幻想的 EPL(队 _id: 2122122)
如果这是你第一次登陆我们的幻想 EPL 博客,你可能想看看我的媒体档案中的一些我们最初的 EPL 博客,以熟悉这个项目是如何开始的,以及随着时间的推移我们所做的改进。
GW3 前 100 名 FPL 团队统计数据
即使对于世界排名前 100 位的玩家来说,看起来也是一个艰难的 GW,AVG 只有 60 分,一些顶级玩家的得分低于平均水平,只有 40 分。
前 100 名最佳守门员
前 100 名中最受欢迎的捍卫者
前 100 名最佳中场球员
前 100 名中入选最多的前锋
我们使用这些数据创建了下面的团队,它是由前 100 名中最受欢迎的球员组成的:
前 100 名 Fantasy 用户选择最多的团队
这些数据很有意义,因为大多数顶级球员都试图利用 3-4-3 阵型的进攻型中场和前锋。
GW3 团队绩效总结和总体统计
我们所有团队的得分都略高于平均水平,得分最高的团队得到了51 分。每周,我们都会发布前 2 名表演团队的照片。不幸的是,我们没有再次选出最好的队长,这已经连续伤害了我们两周。如果 Son 没有两次击中门柱并且没有在中场休息时被替换,我们可以说完全相反,所以让我们不要忘记,不管一个人的算法可能有多好,运气在一周接一周的表现中仍然具有巨大的重要性。这毕竟是让游戏保持有趣和刺激的原因。
我们还参加了 FPL 的 FanTeam 版本,在那里我们有本周表现最好的团队。再说一次,这不是最好的队长选择,特别是考虑到在第一队我们卖掉了瓦迪换来了 KDB ,这最终让我们损失了一百万积分。所以,我要说我们上周的运气总体来说很差。
为我们的 GW4 选择提供有用的统计数据
由于我们今年在算法中加入了很多新的统计数据,随着时间的推移,这个博客将会有更多的统计数据和图表,更少的文字。让我们从下面三个比赛周的比赛难度等级(FDR)开始:
看起来西汉姆联队、阿森纳队、维拉队、曼联队和谢菲尔德联队【T21 队】即将迎来一些艰苦的比赛,所以我们的算法可能不会从这些球队中挑选球员。在接下来的三周里,、丽芙、CRY、MCI 和雷的日程安排似乎更加轻松。
博彩赔率
我们会尽量把 队中有超过 50 %胜算的 的玩家,比如***【WOL】、车、ARS、LIV、雷、MCI、EVE*** 。我们应该尽量不要有太多来自 AVL、李、WHU、富尔、BHA、CRY、WBA 或者 BUR 的防守球员。
以 较高概率抽 的队伍,尤其是当比赛是 结合高赔率为 2.5 以下的 时,可能会对选择 防守队员 有利,因为如果比赛以 0:0 结束,那将会产生大量的加分。结合 下方的 下/上图,我们可以识别出以下 概率较高的游戏至少有一场不失球——NEW-BUR、WOL-FUL、ARS-SHU、SOU-WBA。
反过来,我们可能希望从 赔率超过 2.5 的游戏中有更多的 攻击玩家,如李-MCI、-LIV、-CRY 和雷-WHU 。同样,上周的赔率表现得相当好,因为大多数游戏预测有超过 2.5 个目标!****
裁判统计
从下面的统计数据来看,在比赛中出现点球的几率更高:伊夫-BHA,李-麦基,雷-WHU,门-托,所以我们建议为这些球队中的一些球队配备点球手。看起来,像游戏 EVE-BHA,雷-WHU,ARS-SHU 有裁判喜欢给很多卡,所以预计会失去一些黄牌,但希望没有红色…
团队惩罚统计
除了裁判判罚的概率之外,让我们也看看在过去的 5 个赛季中哪些球队被判罚最多,看看我们在哪里得到了最高的综合概率。从下面的图表中我们可以得出结论,雷、王文杰、门和伊芙最有可能得到一个点球。
定位球运动员
为了帮助你选择定位球运动员,请看下面的列表,它或多或少是最新的,有几个可疑的预测:
预计首发阵容
在我们运行最终的团队选择器之前,让我们考虑一下每个团队的预计首发 11 人。
请注意右边可疑球员的名字,以及下面最新的伤病消息:
预测模型(球员统计)
现在是今年改进算法的皇冠上的宝石——预测球员统计数据的时候了。在我们将所有的 FDR、赌注系数、裁判首发、预计阵容和伤病分层后,有两个主要指标我们在为接下来的 n 场比赛周团队选择调整我们的团队优化器时会考虑到— 预测总积分和期望值(ROI)。 下面是每个指标的统计数据,也是按职位细分的。
预计总积分—前 25 名玩家
预计预期价值(ROI) —前 25 名参与者
预测积分——顶级守门员
投射点数—顶级防守者
预测得分——顶级中场
预测分数——顶级前锋
正如你所看到的,每个位置都有大量选项可供我们选择,因此我们将把上面的许多统计数据插入 Python 中的 优化函数,该函数将 输出具有最高预期总积分 的团队,给定我们的预算约束和进入我们决策过程的其他指标。在团队选择器代码生效之前应用的一些初步过滤器包括:
- 排除受伤或停赛球员
- 将球员排除在 FDR 高的队伍之外
- 排除在 GW1 中没有固定比赛的队伍中的球员
- 同一团队不能有超过 3 名玩家
- 总共必须有 15 名球员(GK=2,DF=5,MD=5,ST=3)
优化最常用信息的预算
上周前 100 名选手最常用的阵型是 3-4-3,所以我们将展示这种阵型的最佳阵容。正如你在下面看到的,模型首先查看参数,告诉它是否应该向 15 名球员的全队优化,或者向有 11 名关键球员和 4 名廉价替补 的特定阵型优化。对于填充符,它首先查看*,并使用该 来决定每个位置 要获得多少个填充符。然后,该模型从我们的初始预算中减去花费在 4 个填充者上的总金额,并将剩余的预算花费在关键的 11 个玩家上, ,给定优化函数和模型约束 。***
示例 1:向最大期望点数优化
示例 2:向最大期望值(ROI)优化
我们使用优化算法的输出和每个位置推荐的前 10 名球员中的一些人来形成以下混合团队:
我们团队为 GW4
我们将一直使用上周的顶级得分团队,并尝试最多进行 1-2 次转会。所以,我们用儿子和沃德-普鲁斯换来了 KDB 和克里奇,因为我们想得到更多的主罚点球的球员。我们觉得萨拉赫很快就要爆发了,所以我们让他担任队长,希望最终打破可怜队长的诅咒。
结论
我们正努力保持纪律性,在国际比赛日之前不使用我们的通配符。我们球队的主要弱点是门将,因为富勒姆的防守太糟糕了,我们真的想摆脱阿雷奥拉,并得到另一个 4.5 米的门将,预计在赛季中会有更多的不失球。因此,在下一个 GW 之前,我们可能会在我们的几个队伍中使用通配符。感谢您一如既往的阅读,祝您本周好运!
EPL 幻想 GW4 回顾和 GW5 算法选择
我们的金钱球方法到幻想的 EPL(队 _id: 2122122)
GW4 的顶级团队
如果这是你第一次登陆我们的幻想 EPL 博客,你可能想看看我的媒体档案中的一些我们最初的 EPL 博客,以熟悉这个项目是如何开始的,以及随着时间的推移我们所做的改进。
什么是新的?
我们利用空闲的周末,为我们的算法添加了另一个新功能— 队长推荐逻辑。该方法采用了即将到来的比赛的预测得分,球员罚点球、角球或任意球的概率,球员在过去 4 个赛季中的空中威胁系数,他们的球队打进 2 个或更多进球的可能性,并以标准化的方式将所有这些融入到最终队长选择系数。然后,根据玩家的下一个对手调整的 FDR 和本赛季防守强度的标准化得分,该系数被减去对手抗性得分。熊猫 DF 看起来像下面的例子:
基于这个公式,这里列出了这个 GW 的 15 个推荐队长。那里有很多好的选择,所以无论如何都不是一个容易的选择。如果你想稳扎稳打,KDB、凯恩、费尔南德斯、桑恩、萨拉赫和瓦迪似乎是显而易见的选择,而克里斯·伍德有趣地成为第一选择,所以如果你有他,并且你觉得有足够的冒险精神让他成为队长,这可能是一个不错的差异化打法。
GW3 前 100 名 FPL 团队统计数据
鉴于上周比赛的大量进球,世界排名前 100 位的球员度过了非常精彩的一周,平均得分> 100,这在历史上很少发生,排名第一的球员获得了144 分!!!
前 100 名最佳守门员
前 100 名中最受欢迎的捍卫者
前 100 名最佳中场球员
前 100 名中入选最多的前锋
我们使用这些数据创建了下面的团队,它是由前 100 名中最受欢迎的球员组成的:
前 100 名 Fantasy 用户选择最多的团队
这些数据很有意义,因为大多数顶级球员都试图利用 3-4-3 阵型中的进攻型中场和前锋。
GW4 团队绩效总结和总体统计
我们所有团队的得分都高于平均水平,得分最高的团队得到了 76 分。不幸的是,我们没有选出我们顶级球队的最佳队长,沃纳的表现低于预期。如果我们选择了显而易见的选择——Salah-我们可能会得到 87 分。
我们还参加了 FPL 的 FanTeam 版本,幸运的是,我们由 Salah 担任队长,这得到了回报,给了我们两个团队相当稳定的分数。
为我们的 GW5 选择提供有用的统计数据
由于我们今年在算法中加入了很多新的统计数据,随着时间的推移,这个博客将会有更多的统计数据和图表,更少的文本 。让我们从下面三个比赛周的比赛难度等级(FDR)开始:
看起来西汉姆,阿森纳,南安普顿,曼联和利兹都有一些艰难的比赛即将到来,所以我们的算法可能不会从这些球队中挑选球员。在接下来的三周里,CHE,TOT,CRY,MCI 和 WOL 的日程似乎更轻松。
博彩赔率
我们会尽量把 队伍中有超过 50 %胜率的 队员,比如 TOT、 CHE、LIV、雷、MCI、MUN 。我们应该尽量不要有太多来自 ARS、SOU、WHU、FUL、NEW、EVE 或 AVL 的防守球员。
拥有 的队伍以更高的概率抽到了 ,特别是当比赛是 结合高赔率为 2.5 以下的 时,可能会对选择防守队员有利,因为如果比赛以 0:0 结束,那将会产生大量的加分。结合 下方的 下/上图,我们可以识别出以下 概率较高的游戏至少有一场不失球——WBA-BUR、CRY-BHA、SHU-FUL。
相反,我们可能希望从 赔率超过 2.5 的游戏中有更多的 攻击玩家 ,比如 MCI-ARS、EVE-LIV、CHE-SOU、雷-AVL 和 TOT-WHU 。同样,上周的赔率表现得相当好,因为大多数游戏预测有超过 2.5 个目标!
裁判统计
这些将在本周晚些时候更新,因为裁判的分配还没有宣布。
团队惩罚统计
除了裁判判罚的概率之外,让我们也看看在过去的 5 个赛季中哪些球队被判罚最多,看看我们在哪里得到了最高的综合概率。从下图我们可以得出结论,雷、CRY、MCI、MUN 和 TOT 最有可能获得点球。
定位球运动员
为了帮助你选择定位球运动员,请看下面的列表,它或多或少是最新的,有几个可疑的预测:
预计首发阵容
在我们运行最终的团队选择器之前,让我们考虑一下每个团队的预计首发 11 人。
请注意右边可疑球员的名字,以及下面最新的伤病消息:
预测模型(球员统计)
现在是今年改进算法的皇冠上的宝石——预测球员统计数据的时候了。在我们将所有的 FDR、赌注系数、裁判首发、预计阵容和伤病分层后,有两个主要指标我们在为接下来的 n 场比赛周团队选择调整我们的团队优化器时会考虑到— 预测总积分和期望值(ROI)。 下面是每个指标的统计数据,也是按职位细分的。**
预计总积分—前 25 名玩家
预计预期价值(ROI) —前 25 名参与者
预测积分——顶级守门员
投射点数—顶级防守者
预测得分——顶级中场
预测分数——顶级前锋
正如你所看到的,每个位置都有大量选项可供我们选择,因此我们将把上面的许多统计数据插入 Python 中的 优化函数,该函数将 输出具有最高预期总积分 的团队,给定我们的预算约束和进入我们决策过程的其他指标。在团队选择器代码生效之前应用的一些初步过滤器包括:
- 排除受伤或停赛球员
- 将球员排除在 FDR 高的队伍之外
- 排除在 GW1 中没有固定比赛的队伍中的球员
- 同一团队不能有超过 3 名玩家
- 总共必须有 15 名球员(GK=2,DF=5,MD=5,ST=3)
优化最常用信息的预算
上周前 100 名选手最常用的阵型是 3-4-3,所以我们将展示这种阵型的最佳阵容。正如你在下面看到的,模型首先查看参数,告诉它是否应该向 15 名球员的全队优化,或者向有 11 名关键球员和 4 名廉价替补 的特定阵型优化。对于填充符,它首先查看*,并使用该 来决定每个位置 要获得多少个填充符。然后,该模型从我们的初始预算中减去花费在 4 个填充者上的总金额,并将剩余的预算花费在关键的 11 个玩家上, ,给定优化函数和模型约束 。***
示例 1:向最大期望点数优化
****
示例 2:向最大期望值(ROI)优化
****
我们的 GW5 团队
我们将一直使用上周的顶级得分团队,并尝试最多进行 1-2 次转会。然而,本周我们决定使用我们的通配符**,因为国际比赛日以及许多球员受伤或随新冠肺炎回来的可能性。我们也想把预算从昂贵的防守球员身上转移到便宜的防守球员和 T4 昂贵的进攻球员身上,考虑到我们这个赛季看到的绝对雪崩式的进球和极少的零失球。这就是我们球队目前的情况,但我们会密切关注新闻,可能会根据周四 Fri 的伤病更新做出很多最后一分钟的轮换。**
结论
按照本赛季的发展方式,我们建议放弃昂贵的防守球员,尝试只拥有三名中档防守球员,并且在中场和进攻中积累大量筹码,因为本赛季到目前为止一直有大量进球,并且没有迹象表明事情可能会很快放缓。感谢您一如既往的阅读,祝您本周好运!****
EPL 幻想 GW5 重述和 GW6 算法选择
我们的金钱球方法到幻想的 EPL(队 _id: 2122122)
GW5 的顶级团队
如果这是你第一次登陆我们的幻想 EPL 博客,你可能想看看我的媒体档案中的一些我们最初的 EPL 博客,以熟悉这个项目是如何开始的,以及随着时间的推移我们所做的改进。
GW5 前 100 名 FPL 团队统计数据
排名前 100 位的球员又度过了坚实的一周,平均得分> 84,其中,排名第一的球员得分大败 136 分!!!
前 100 名最佳守门员
前 100 名中最受欢迎的捍卫者
前 100 名最佳中场球员
前 100 名中入选最多的前锋
我们使用这些数据创建了下面的团队,它是由前 100 名中最受欢迎的球员组成的:
前 100 名 Fantasy 用户选择最多的团队
这些数据很有意义,因为大多数顶级球员都试图利用 3–4–3 f阵型的进攻型中场和前锋。
GW5 团队绩效总结和总体统计
我们所有团队的得分都高于平均水平,得分最高的团队得分为 78 分。最后选对了队长,帮了大忙。唯一的负面消息是瓦迪受伤后坐在板凳上,但总体来说我们对自己的表现很满意。
我们还参加了 FPL 的 FanTeam 版本,幸运的是,我们也遇到了优秀的队长,这得到了回报,让我们的两个团队获得了相当不错的分数。有了达洛和维斯特加德,我们在板凳上留下了很多分数,所以这么早让布鲁斯特上场可能是个错误。
为我们的 GW6 选择提供有用的统计数据
由于我们今年在算法中加入了很多新的统计数据,随着时间的推移,这个博客将会有更多的统计数据和图表,更少的文本。让我们从下面三个比赛周的比赛难度等级(FDR)开始:
看起来 MUN, SHU,SOU,ARS,LEE 和 NEW 有一些艰难的比赛即将到来,所以我们的算法可能不会从这些球队中挑选球员。在接下来的三周里,CHE、TOT、CRY、BHA、WBA 和 EVE 的日程似乎更加轻松。
博彩赔率
我们将尝试积累来自 队的玩家,他们有超过 50 %的机会赢得 比赛,例如 TOT、 LIV、MCI、WOL、ARS 和 BHA 。我们应该尽量不要有太多的车、李、雷、WBA、、纽卡、布尔这样的防守球员。
以 较高概率抽到 的队伍,特别是当比赛是 结合高赔率为 2.5 以下的 时,可能是 适合选择防守队员 因为如果比赛以 0:0 结束,那将会产生大量的加分。结合 下方的 Under/Over 图,我们可以识别出以下 至少一场不失球概率较高的游戏——FUL-CRY、BHA-WBA、WOL-NEW。
反过来,我们可能希望从 赔率超过 2.5 的游戏中有更多的 进攻型玩家 ,比如**-MCI、LIV-SHU、MUN-CHE、ARS-LEI、AVL-LEE 。同样,上周的赔率表现得相当好,因为大多数游戏预测有超过 2.5 个目标!**
裁判统计
从下面的统计数据来看,在比赛中出现点球的几率更高:WHU-麦克伊,布尔-托,苏-伊夫,和富尔-科尔,所以我们建议为这些球队中的一些球队配备点球手**。看起来,像游戏AVL-李,MUN-CHE 和 BUR-TOT 有裁判喜欢给很多卡,所以预计会失去一些黄牌,但希望没有红色…**
团队惩罚统计
除了裁判判罚的概率之外,让我们也看看在过去的 5 个赛季中哪些球队被判罚最多,看看我们在哪里得到了最高的综合概率。从下面的图表中我们可以得出结论,雷、CRY、MCI、MUN 和 TOT 最有可能获得点球。
预计首发阵容
在我们运行最终的团队选择器之前,让我们考虑一下每个团队的预计首发 11 人。
请注意右边可疑球员的名字,以及下面最新的伤病消息:
团队累计投资回报率统计
**五个游戏周过去了,我们终于有了足够的统计数据,来看看哪些球队被认为是整体上的好投资,哪些球队有很多定价过高的表现不佳的球员。球队按平均每名球员得分排序,所以毫不奇怪,AVL、伊夫、WOL 和 WHU 在名单上名列前茅,因为他们的球员价格已经超出了他们的预期。一些价格更高,表现不佳的球员可以在 **FUL,BUR,SHU,MUN,MCI,NEW,中找到,所以从这些球队中挑选球员是一个很好的主意。
推荐人队长
我们的方法采用了即将到来的比赛的预测得分,球员罚点球、角球或任意球的概率,球员在过去 4 个赛季中的空中威胁系数,他们的球队打进 2 个或更多进球的可能性,并以标准化的方式将所有这些混合成最终队长选择系数**。然后,根据玩家的下一个对手调整的 FDR 和本赛季防守强度的标准化得分,该系数被减去对手抗性得分。熊猫 DF 看起来像下面的例子:**
基于这个公式,这里列出了这个 GW 的 15 个推荐队长。那里有很多好的选择,所以无论如何都不是一个容易的选择。如果你想谨慎行事,萨拉赫、马内、凯恩和儿子应该是你的首选。
预测模型(球员统计)
现在是今年改进算法的皇冠上的宝石——预测球员统计数据的时候了。在我们将所有的 FDR、赌注系数、ref 首发、预计阵容和伤病分层后,有两个主要指标我们在为下一个 n-gameweeks 团队选择调整我们的团队优化器时会考虑到— 预测总积分和期望值(ROI)。 下面是每个指标的统计数据,也按职位细分。
预计总积分—前 25 名玩家
预计预期价值(ROI) —前 25 名参与者
预测积分——顶级守门员
投射点数—顶级防守者
预测得分——顶级中场
预测分数——顶级前锋
如你所见,每个位置都有大量选项可供我们选择,因此我们将把上面的许多统计数据插入 Python 中的 优化函数,该函数将 输出具有最高预期总积分 的团队,给定我们的预算约束和其他进入我们决策过程的指标。在团队选择器代码生效之前应用的一些初步过滤器包括:
- 排除受伤或停赛球员
- 将球员排除在 FDR 高的队伍之外
- 在 GW1 中排除没有赛程的队伍中的球员
- 同一团队不能有超过 3 名玩家
- 总共必须有 15 名球员(GK=2,DF=5,MD=5,ST=3)
优化最常用信息的预算
上周前 100 名选手最常用的阵型是 3-4-3,所以我们将展示这种阵型的最佳阵容。正如你在下面看到的,模型首先查看参数,告诉它是否应该向 15 名球员的全队优化,或者向有 11 名关键球员和 4 名廉价替补 的特定阵型优化。对于填充符,它首先查看,并使用该 来决定每个位置 要获得多少个填充符。然后,模型从我们的初始预算中减去花费在 4 个填充者上的总金额,并将剩余的预算花费在关键的 11 个参与者上, 给定优化函数和模型约束 。****
示例 1:向最大期望点数优化
********
示例 2:向最大期望值(ROI)优化
********
在这种情况下,价值团队看起来非常有吸引力和平衡,如果你担心大量的伤病和关键昂贵球员的轮换,那么这种方法可能是一种保护你自己的好方法。
我们的 GW6 团队
我们将一直使用上周的顶级得分团队,并尝试最多进行 1-2 次转会。因为我们上周打了外卡,所以我们不需要做任何重大改变,所以我们只是得到了基尔曼,他有希望成为长期的主要价值,如果他定期得到 60 分钟以上的比赛,即使他几周不打,在他的价格上涨 0.2 或更多之前得到他 400 万,使他成为一个很好的替代 DF,并为更昂贵的进攻球员腾出资金。对于队长,我们将选择最受推荐的球员——萨拉赫。
结论
按照本赛季的发展方式,我们建议放弃昂贵的防守球员,尝试只拥有三名中档防守球员,并且在中场和进攻中积累大量筹码,因为本赛季到目前为止一直在进球,而且没有迹象表明事情可能会很快放缓。感谢您一如既往的阅读,祝您本周好运!****
EPL 幻想 GW6 回顾和 GW7 算法选择
我们的金钱球方法到幻想的 EPL(队 _id: 2122122)
GW6 的顶级团队
如果这是你第一次登陆我们的幻想 EPL 博客,你可能想看看我的媒体档案中的一些我们最初的 EPL 博客,以熟悉这个项目是如何开始的,以及随着时间的推移我们所做的改进。
GW6 前 100 名 FPL 团队统计数据
一段时间以来,世界排名前 100 位的球员第一次没有疯狂的总得分(T1 ),平均得分只有 65 分左右,一些顶级球员的得分在40-50 分范围内(T3 ),这让我们对自己感觉稍微好一点,因为我们本周也没有做得那么好。
前 100 名最佳守门员
前 100 名中最受欢迎的捍卫者
前 100 名最佳中场球员
前 100 名中入选最多的前锋
我们使用这些数据创建了下面的团队,它是由前 100 名中最受欢迎的球员组成的:
100 强中最受欢迎的团队
这些数据很有意义,因为大多数顶级球员都试图利用 3–4–3 f阵型的进攻型中场和前锋。
GW6 团队绩效总结和总体统计
我们所有团队的得分都高于平均水平,但只是勉强达到。我们的一支球队在替补席上留下了 11 分,另一支球队从迪格内获得了 2 分,加上萨拉赫没有像预期的那样表现。此外,埃里森的早期恢复让我们的两个车队没有了 GK,所以对我们来说没有太多的积极因素。我猜让瓦迪、凯恩船长、儿子和扎哈在我们的一个团队中是一个很好的组合,至少对我们的一个团队来说,这是一个不错的组合。
我们还参加了 FPL 的 FanTeam 版本,幸运的是,我们的运气好得多,我们的大多数玩家都获得了大量积分
为我们的 GW7 选择提供有用的统计数据
由于我们今年在算法中加入了很多新的统计数据,随着时间的推移,这个博客将会有更多的统计数据和图表,更少的文本。让我们从下面三个比赛周的比赛难度等级(FDR)开始:
看起来丽芙、舒、雷、李和新有一些艰难的比赛即将到来,所以我们的算法可能不会从这些球队中挑选球员。在接下来的三周里,CHE、TOT、CRY、WHU、WBA 和 EVE 的日程似乎更加轻松。
博彩赔率
我们将尝试累积来自 队伍中有超过 50 %胜率的 玩家,例如 TOT、 LIV、MCI、CHE、、EVE 和 MUN 。我们应该尽量不要有太多来自 WHU、BHA、科尔、纽卡和布尔的防守球员。
以 较高概率抽到 的队伍,特别是当比赛是 结合高赔率为 2.5 以下的 时,可能是 适合选择防守队员 因为如果比赛以 0:0 结束,那将会产生大量的加分。结合 下方的 下/上图,我们可以识别出以下 概率较高的至少一场不失球的游戏——FUL-WBA 和 WOL-CRY。
相反,我们可能希望从 赔率超过 2.5 的游戏中有更多的 攻击玩家 ,比如丽芙-WHU、舒-MCI、布尔-切、AVL-苏、托特-BHA 和门-阿尔什*。*
裁判统计
从下面的统计数据来看,在比赛中出现点球的几率更高:舒-麦基,布尔-切,李磊,丽芙-WHU ,所以我们建议为这些球队中的一些球队配备点球手。看起来,像游戏 FUL-WBA,TOT-BHA 和 SHU-MCI 有裁判喜欢给很多牌,所以预计会从黄牌失去一些分数,但希望没有红色…
团队惩罚统计
除了裁判判罚的概率之外,让我们也看看在过去的 5 个赛季中哪些球队被判罚最多,看看我们在哪里得到了最高的综合概率。从下面的图表中我们可以得出结论,雷、CRY、MCI、MUN、TOT 和 LIV 最有可能获得点球。
预计首发阵容
在我们运行最终的团队选择器之前,让我们考虑一下每个团队的预计首发 11 人。
请注意右边可疑球员的名字,以及下面最新的伤病消息:
团队累积投资回报统计
这张表可以揭示哪些球队总体上被认为是好的投资,哪些球队有很多定价过高、表现不佳的球员。球队按**平均每名球员得分排序,**所以毫不奇怪 **AVL、伊夫、苏、李、WOL 和 WHU 是排名最靠前的球队,**因为他们的球员价格已经超出了他们的预期。一些价格更高,表现不佳的球员可以在 **FUL,BUR,SHU,MUN,MCI 和 NEW,**中找到,所以从这些球队中挑选球员是一个很好的主意。
防守与进攻团队统计
到目前为止,拥有 TOT、LIV、EVE、雷、车、和 LEE 的进攻球员似乎是一笔不错的投资。
虽然有太多来自 MCI 的进攻球员,CRY,,WBA FUL BUR 和 SHU T1 似乎是一个糟糕的投资,除非你有一个得分 70%的球员,如 WOL 的希门尼斯或 CRY T3 的扎哈。
拥有来自、ARS、、、MCI、TOT 和雷的防守球员似乎是一笔不错的投资。
虽然拥有来自 FUL,WBA,LIV,BHA,MUN 和 NEW T7 的防守球员,似乎是一个糟糕的投资。
推荐人队长
我们的方法采用了即将到来的比赛的预测分数、球员罚点球、角球或任意球的概率、球员在过去 4 个赛季中的空中威胁系数、他们的球队打进 2 个或更多球的可能性,并以标准化的方式将所有这些混合成一个最终队长选择系数。然后,根据球员的下一个对手调整后的 FDR 和本赛季防守强度的标准化得分**,将系数减去对手阻力得分。熊猫 DF 看起来像下面的例子:**
基于这个公式,这里列出了这个 GW 的 15 个推荐队长。那里有很多好的选择,所以无论如何都不是一个容易的选择。这是第一次萨拉赫不再是首选,推荐者认为你应该选择凯恩、儿子、米特洛维奇、KDB 或斯特林,然后是萨拉赫。
预测模型(球员统计)
现在是今年改进算法的皇冠上的宝石——预测球员统计数据的时候了。在我们将所有的 FDR、赌注系数、裁判首发、预计阵容和伤病分层后,有两个主要指标*,我们在为下一个 n-gameweeks 团队选择调整我们的团队优化器时会考虑这些指标— 预测总积分和期望值(ROI)。 下面是每个指标的统计数据,也是按职位细分的。*
预计总积分—前 25 名玩家
预测积分——顶级守门员
投射点数—顶级防守者
预测得分——顶级中场
预测分数——顶级前锋
正如你所看到的,每个位置都有大量选项可供我们选择,因此我们将把上面的许多统计数据插入 Python 中的 优化函数,该函数将 输出具有最高预期总积分 的团队,给定我们的预算约束和进入我们决策过程的其他指标。在团队选择器代码生效之前应用的一些初步过滤器包括:
- 排除受伤或停赛球员
- 将球员排除在 FDR 高的队伍之外
- 排除 GW1 中没有固定比赛的队伍中的球员
- 同一支队伍不能有超过 3 名玩家
- 总共必须有 15 名球员(GK=2,DF=5,MD=5,ST=3)
优化最常用信息的预算
上周前 100 名选手最常用的阵型是 3-4-3,所以我们将展示这种阵型的最佳阵容。正如你在下面看到的,模型首先查看参数,告诉它是否应该向 15 名球员的全队优化,或者向拥有 11 名关键球员和 4 名廉价替补 的特定阵型优化。对于填充符,它首先查看 首选地层 ,并使用那个 来决定每个位置 需要多少个填充符。然后,该模型从我们的初始预算中减去花费在 4 个填充者上的总金额,并将剩余的预算花费在关键的 11 个参与者上, 给出优化函数和模型约束 。**
示例 1:向最大期望点数优化
****
示例 2:向最大期望值(ROI)优化
****
经过我们的一些修改——在这种情况下,价值团队看起来非常有吸引力和平衡,如果你担心大量的伤病和关键昂贵球员的轮换,那么这种方法可能是保护你自己免受这种影响的好方法。
我们的 GW7 团队
我们将一直使用上周的顶级得分团队,并尝试最多进行 1-2 次转会。因为我们的球队上周没有 GK,我们只做了一次转会,就是用马丁内兹换阿德里安。对于我们的队长,我们将选择最受推荐的球员——凯恩**。很难在格里利什和若日尼奥之间做出决定,但我们希望 AVL 在主场对阵苏时能有更多的进攻,然后若日尼奥会得到另一个点球或助攻,所以希望我们不会后悔。**
结论
按照本赛季的发展方式,我们建议放弃昂贵的防守球员,尝试只拥有三名中档防守球员,并在中场和进攻中积累大量筹码**,因为本赛季迄今为止一直在进球,而且没有迹象表明事情可能会很快放缓。感谢您一如既往的阅读,祝您本周好运!******
EPL 幻想 GW7 回顾和 GW8 算法选择
我们的金钱球方法到幻想的 EPL(队 _id: 2122122)
GW6 的顶级团队
如果这是你第一次登陆我们的幻想 EPL 博客,你可能想看看我的媒体档案中的一些我们最初的 EPL 博客,以熟悉这个项目是如何开始的,以及随着时间的推移我们所做的改进。
GW7 前 100 名 FPL 团队统计数据
我们上周在榜首看到了更多的正常数字,前 100 名球员的平均得分约为 72 分,一些顶级球员的得分在40-50 分范围内,这使我们对自己感觉稍微好一点,因为我们的得分与前 100 名的平均得分 72 分持平。
前 100 名最佳守门员
前 100 名中最受欢迎的捍卫者
前 100 名最佳中场球员
前 100 名中入选最多的前锋
我们使用这些数据创建了下面的团队,它是由前 100 名中最受欢迎的球员组成的:
100 强中最受欢迎的团队
这些数据很有意义,因为大多数顶级球员都试图利用 3-4-3 阵型的进攻型中场和前锋。
GW7 团队绩效总结和总体统计
我们所有球队的得分都高于平均水平,接近世界前 100 名球员的平均水平,所以总体来说我们这一周表现不错。我们不得不提到绝对恶劣的裁判失误,没有判兰普提的进球无效**,这让我们至少损失了-8 分**,因为规则是不失球+也在奖金名单上,直到兰普提得分,他们实际上把加分转移到了他身上。除此之外,我们赌了 algo 推荐的前两名队长,萨拉赫和凯恩都做得足够好。
我们还参加了 FanTeam 版的 FPL,在那里我们的两支车队又经历了一个强劲的一周。
为我们的 GW7 选择提供有用的统计数据
由于我们今年在算法中加入了很多新的统计数据,随着时间的推移,这个博客将会有更多的统计数据和图表,更少的文本。让我们从下面三个比赛周的比赛难度等级(FDR)开始:
看起来 LIV,WOL,FUL,LEE 和 MCI 有一些艰难的比赛即将到来,所以我们的算法可能不会从这些球队中挑选很多球员。车、雷、托特、门、哭、夏娃和在接下来的三周里似乎有了更轻松的安排。
博彩赔率
我们会尽量把 队伍中赢 的几率高于 50 %的玩家,比如 TOT、 CHE、ARS、、和 SOU 。我们应该尽量不要有太多来自舒,WBA,,FUL,NEW,BUR 的防守球员。
以 较高概率抽到 的队伍,特别是当比赛是 结合高赔率为 2.5 以下的 时,可能是 适合选择防守队员 因为如果比赛以 0:0 结束,那将会产生大量的加分。结合 下方的 下/上图,我们可以识别出以下 至少一场不失球概率较高的比赛——BHA-布尔、克雷-李、雷-WOL。
相反,我们可能希望从 赔率超过 2.5 的游戏中有更多的 攻击玩家 ,例如 MCI-LIV、CHE-SHU、ARS-AVL、WBA-TOT、EVE-MUN 和 WHA-FUL 。
裁判统计
从下面的统计数据来看,在比赛中出现点球的几率更高:雷-WOL,MCI-LIV,-BUR,和 CRY-LEE ,所以我们建议为这些球队中的一些球队配备点球手。看起来,像 WBA-TOT,ARS-AVL 和 EVE-MUN 这些游戏都有喜欢给很多牌的裁判,所以预计会因为黄牌而失去一些分数,但希望没有红牌…
团队惩罚统计
除了裁判判罚的概率之外,让我们也看看在过去的 5 个赛季中哪些球队被判罚最多,看看我们在哪里得到了最高的综合概率。从下面的图表中我们可以得出结论,雷、CRY、MCI、MUN、TOT 和 LIV 最有可能获得点球。
预计首发阵容
在我们运行最终的团队选择器之前,让我们考虑一下每个团队的预计首发 11 人。
请注意右边可疑球员的名字,以及下面最新的伤病消息:
团队累积投资回报统计
这张表可以揭示哪些球队总体上被认为是好的投资,哪些球队有很多定价过高、表现不佳的球员。球队按照的平均每名球员得分排名,所以毫无疑问,、苏、、、和雷是排名最靠前的球队,因为他们的球员价格已经超出了他们的预期。一些价格更高、表现不佳的球员可以在 **FUL、BUR、SHU、WBA、MUN、MCI 和 CRY 中找到,**所以从这些球队中挑选球员是一个很好的主意。
防守与进攻团队统计
到目前为止,从托特、丽芙、伊芙、雷、车、和苏那里得到进攻球员似乎是一笔不错的投资。
虽然有太多来自 BUR 的进攻球员,SHU,WBA,FUL,,MUN,和 CRY 似乎是一个糟糕的投资,除非你有一个进球 70%的球员,如 CRY 的扎哈。
从、ARS、、MCI、TOT、CHE 和雷那里得到防守球员似乎是一笔不错的投资。
而拥有来自 FUL,WBA,LIV,BHA,MUN 和 LEE 的防守球员,似乎是一个糟糕的投资。
推荐人队长
我们的方法采用了即将到来的比赛的预测分数、球员罚点球、角球或任意球的概率、球员在过去 4 个赛季中的空中威胁系数、他们的球队打进 2 个或更多球的可能性,并以标准化的方式将所有这些混合成一个最终队长选择系数。然后,根据球员的下一个对手调整后的 FDR 和本赛季防守强度的标准化得分**,将系数减去对手阻力得分。熊猫 DF 看起来像下面的例子:**
基于这个公式,这里列出了这个 GW 的 15 个推荐队长。那里有很多好的选择,所以无论如何都不是一个容易的选择。我们的推荐人认为你应该选择凯恩、森、鲍文、沃纳、奥巴、KDB 或多尔蒂。
预测模型(球员统计)
现在是今年改进算法的皇冠上的宝石——预测球员统计数据的时候了。在我们将所有的 FDR、赌注系数、裁判首发、预计阵容和伤病分层后,有两个主要指标*,我们在为接下来的 n 场比赛周团队选择调整我们的团队优化器时会考虑到这两个指标— 预测总积分和期望值(ROI)。 下面是每个指标的统计数据,也是按职位细分的。*
预计总积分—前 25 名玩家
预测积分——顶级守门员
投射点数—顶级防守者
预测得分——顶级中场
预测分数——顶级前锋
正如你所看到的,每个位置都有大量选项可供我们选择,因此我们将把上面的许多统计数据插入 Python 中的 优化函数,该函数将 输出具有最高预期总积分 的团队,给定我们的预算约束和进入我们决策过程的其他指标。在团队选择器代码生效之前应用的一些初步过滤器包括:
- 排除受伤或停赛球员
- 从 FDR 高的队伍中排除球员
- 排除 GW1 中没有固定比赛的队伍中的球员
- 同一团队不能有超过 3 名玩家
- 总共必须有 15 名球员(GK=2,DF=5,MD=5,ST=3)
优化最常用信息的预算
上周前 100 名选手最常用的阵型是 3-4-3,所以我们将展示这种阵型的最佳阵容。正如你在下面看到的,模型首先查看参数,告诉它是否应该向 15 名球员的全队优化,或者向有 11 名关键球员和 4 名廉价替补 的特定阵型优化。对于填充物,它首先查看 优选地层 ,并使用该 来决定每个位置 需要多少填充物。然后,该模型从我们的初始预算中减去花费在 4 个填充者上的总金额,并将剩余的预算花费在关键的 11 个参与者上, 给出了优化函数和模型约束 。**
示例 1:向最大期望点数优化
****
我们的 GW8 团队
我们将一直使用上周的顶级得分团队,并尝试最多进行 1-2 次转会。因为我们在周三发布这个博客,而且明天还有欧洲比赛,我们会等到周五早上才进行转会,所以我们下面要换的球队可能会换一个球员。还不确定会有什么变化,但如果规则变成橙色或红色,我们可能会从一些即将到来的赛程更轻松的车队中寻找一个与 DF 的互换,比如 WHU、门或哭泣。
结论
按照本赛季的发展方式,我们建议放弃昂贵的防守球员,尝试只拥有三名中档防守球员,并且在中场和进攻中积累大量筹码,因为本赛季到目前为止一直在进球,而且没有迹象表明事情可能会很快放缓。感谢您一如既往的阅读,祝您本周好运!****
EPL 游戏周 6 使用数据科学预测:xG 模型
这是我的 EPL 预测系列的一篇文章。你可以在这里查看上一周比赛的预测和实际表现。
预期目标或 xG 是用于预测的参数。如果你对理解预测算法感兴趣,我推荐你去看看这篇文章,里面有详细的解释。
对第 5 周比赛的分析
以上数字显示了每支球队每场比赛的 xG 得分和 xG 失球。我们可以观察到,卫冕冠军利物浦在创造力方面远远超过其他球队。热刺、埃弗顿和切尔西也是很好的进攻球队。名单中还包括目前为止在联赛中表现出色的维拉和铁锤帮。西布朗落后于预期的每场比赛 0.5 个进球!谢菲尔德、狼队、水晶宫也是场均预期进球不到一个。
阿斯顿维拉是联赛中唯一一支没有失分的球队,是防守最好的球队,失球率最低。锤子、太妃糖和海鸥似乎也有难以穿透的防御。另一方面,曼联和西布朗的防守漏洞最多。
根据 xG 得分和 xG 失球,球队可以分为 4 个象限,如上图所示。水平虚线表示每场比赛的平均 xG 得分。水平虚线以上的球队是强攻方,下面的球队进攻弱。
垂直虚线显示每场比赛的平均 xG 失球,左边的球队防守强,右边的球队防守弱。
所有球队的目标都应该是 Q2,那里的进攻和防守都比平均水平要好。例如,刀锋队是联盟中防守最好的球队之一。然而,他们在前期缺乏创造力。红军需要立即解决进攻中的问题。
联赛中进攻最好的球队在 Q1,因为他们的防守不是很强。然而,他们的进攻能力足以弥补防守上的弱点,如左图所示。
提醒一句:所有的分析都是基于一个非常小的样本量,每个队只有 4 或 5 场比赛,因此一场糟糕的比赛或一场好的比赛往往会扭曲结论。
对第六周比赛的预测
基于第五周的表现,第六周的预测如下。
GD 的绝对值显示了比赛的竞争力。该值越高,预计匹配越偏向一侧,预测的准确性也越高。GD 值越低,这场比赛就越可能是任何人的游戏。GD 的正值表示主场胜,负值表示客场胜。
布莱顿 Vs WBA 预计是最一边倒的比赛,海鸥有望获胜。利物浦和阿斯顿维拉也有很高的胜算。热刺、蓝军和太妃糖也有望在客场全取三分。梅切斯特城,最受欢迎的球队之一,预计将与铁锤帮进行一场艰苦的比赛,他们必须需要一些好运气才能在对阵复兴的莫耶斯的球队时不丢分。
狼队对新城堡队预计是任何人的游戏。主场对阵水晶宫的富勒姆和客场对阵阿森纳的莱斯特对他们的对手略有优势。
红魔主场迎战蓝军有望成为本周比赛中得分最高的比赛,蓝军有望获胜。尽管刀片队是联赛中防守最好的球队之一,但他们在安菲尔德的比赛预计将是一场进球盛宴。纸面上的富勒姆 vs 水晶宫,就进球而言,似乎是周末最无聊的一场比赛。
更新:实际与预测
预测的增量 xG 与实际的增量 xG(图片由作者提供)
对阿森纳对莱斯特比赛的预测是最准确的,然而,该算法在预测阿斯顿维拉对利兹的比赛中最不准确(埃尔洛克是马塞洛·贝尔萨的合适称号,他的战术太疯狂了!退一步说。该算法只是一个简单的基线模型,但我仍然希望预测会随着样本量的增加而改善。
目前,样本量非常小,预测受到异常值的巨大影响。
展望未来,我计划考虑比赛风格、主场优势、射门质量等因素。来改进模型。
请让我知道你对如何改进这个模型的建议。
托马斯·塞勒在 Unsplash 拍摄的照片
公平代码:GitHub 上退休的主人
负责任地更新活动存储库的分步指南。
介绍
在 Nines,我们在为我们的放射学实践构建工具时不断迭代。在本帖中,我们将讨论如何更新软件行业中常用的一些基础设施。
近年来,已经开始了一场从软件系统中去除术语“主”和“从”的运动。2018 年, Python 在 3.8 版本移除了很多引用。最近, GitHub 宣布他们将把默认分支从主分支改为主分支。
传统上,git 存储库中使用的规范分支被命名为 master。它是在新的存储库中创建的默认分支,并且通过要求代码变更的同行评审,以及持续集成 (CI)测试,经常受到更强的保护。
在 Nines,我们已经做出了这样的改变。我想分享我对这个话题的一些想法,以及让这种转变对其他人来说尽可能容易的指南。
为什么删除对 master 的引用?
主人这个词可以引发人们对奴隶制、种族主义和系统性不公正的思考。许多人指出,在这种情况下,这种使用类似于唱片业中的主唱片,即权威版本。虽然可能是这样,但这不是重点。这些微妙但频繁的触发被称为微侵袭。它们很常见,通常用于而没有伤害的意图。它们可能听起来很小,但是累积起来,它们会产生很大的影响。这种类型的问题非常普遍,以至于人工智能将影响表现得非常明显。造成的痛苦是实实在在的,我们很容易就能帮上忙。所需要的只是注意力和行动。
我加入了,现在怎么办?
太好了!在我们开始 Nines 的 9 步流程之前,请确保您对正在更新的 GitHub 库拥有管理员权限。您应该能够在存储库中看到 Settings 选项卡:
1。传达即将到来的变化
与使用您的存储库的任何开发人员交流这个过程是很重要的。如果可能的话,最好选择在存储库没有大量活动的时候进行转换,因为在错误的时间合并的拉请求可能会导致信息丢失。
示例:
本着一种 更广泛的运动 ,我将<资源库中的默认分支从 master 重命名为 main。在<日期>上午 8 点到 9 点,将有一个不应该合并钻杆排放系统的计划停机时间。如果您对此流程有任何疑问,请告诉我。
2。创建新分支
在 git 中创建新分支非常简单。从存储库的本地克隆中,签出主分支,并确保您使用的是最新的 GitHub:
git checkout master
git pull
从更新后的基础创建新分支:
git checkout -b main
现在把新的分支推到 GitHub:
git push --set-upstream origin main
这里需要注意的是,所有以前的提交历史都保留在这个过程中。
3。更新分支保护
通常,主要分支机构会受到各种分支机构保护规则的约束。这将出现在 GitHub 分支设置中,如下所示:
在这个阶段,我们可以使用通配符来扩展规则,使其涵盖主分支和主要分支。单击规则上的编辑,并将分支名称模式更新为 ma*。值得注意的是,“应用于 n 个分支”框在保存更改之前不会更新。这应该看起来像这样:
4。更新代码和文档
接下来,在您的存储库中搜索显式包含的 master。通常,这将包括 CI/CD 配置文件,可能还有其他脚本和工具。这需要非常小心,因为这个词可能有很多其他的用法,比如其他的存储库,或者不相关的代码。
您选择的 IDE 可能有一个很好的方法来搜索存储库中的所有文件。如果您没有类似的东西,这里有一个简单的脚本来打印所有事件:
git ls-files | xargs -I {} sh -c ‘echo “<<< {} >>>” && grep -ni master {}’
不要忘记检查 master 中可能需要合并到 main 中的任何新变化。您可以通过在 Code 选项卡中选择主分支,然后单击 compare 来检查这些内容。
5。更新默认分支
现在我们将更新 GitHub,将 main 作为默认分支。这将导致拉请求默认使用 main 作为基础,将改变 Code 选项卡中默认显示的分支,等等。这可在“分支”下的“设置”选项卡中进行更改:
6。更新打开拉式请求
删除主数据后,任何使用它作为基础数据的打开的提取请求都将自动关闭,并且不能重新打开。为了避免这种情况,任何打开的拉取请求都应该将其基础更新为 main。基数列在拉动式请求的顶部,如下所示:
点击右上角的“编辑”会将基础变为下拉列表。更新并保存。
7 .。更新分支保护,第 2 部分
为了删除主服务器,我们首先需要删除仍然适用于它的分支保护。这很像前面的变化,但是现在用 main 替换 ma*。
8。从 GitHub 中删除 master
移除分支保护后,从原点(GitHub)删除分支非常简单:
git push -d origin master
9。传达变更和本地清理
现在是时候结束这个循环并与开发人员交流完成情况了。除了确认工作已经完成之外,还需要在每个开发人员的机器上做一些小的清理工作,删除被删除的主分支的副本。这可以通过在每个克隆中运行以下命令来实现:
git fetch
git checkout --track origin/main
git branch -d master
示例:
在<仓库>中,从主数据库到主数据库的转换现在已经完成。所有未完成的拉取请求都已更新,以反映这一点。作为最后一步,请在您的本地副本<存储库>中运行以下命令来删除过时的元数据:
git fetch && git checkout --track origin/main && git branch -d master
搞定了。
我希望这使得更新您的分支的过程变得简单和相对容易。感谢你们让我们的世界和工业变得更加友好。
NB:本文原载于 Nines 博客 。
Python 中的错误和异常处理:数据科学家基础
用一个具体的例子来理解基础!
图片由 Unsplash 上的 Alexandru Acea 拍摄
Python 中主要有三种可区分的错误:语法错误、异常和逻辑错误。
- 语法错误类似于语言中的语法或拼写错误。如果您的代码中有这样的错误,Python 就无法开始执行您的代码。您会得到一个明确的错误消息,指出什么是错误的,什么需要修复。因此,这是最容易修复的错误类型。
- Python 中常见的语法错误有符号缺失(如逗号、括号、冒号)、关键字拼写错误、缩进不正确。
- 异常可能出现在运行时语法正确的代码块中。当 Python 无法执行请求的操作时,它会终止代码并引发一条错误消息。
- 试图从一个不存在的文件中读取数据,对不兼容类型的变量执行操作,将一个数除以零是 Python 中常见的引发错误的异常。
- 我们必须消除语法错误来运行我们的 Python 代码,而异常可以在运行时处理。
- 逻辑错误是最难修复的错误,因为它们不会让你的代码崩溃,你也不会得到任何错误消息。
- 如果您有逻辑错误,您的代码将不会按预期运行。
- 使用不正确的变量名、不能正确反映算法逻辑的代码、在布尔运算符上出错将导致逻辑错误。
**# Syntax Error-1: Misusing the Assignment Operator** len("data") **=** 4
**Output:** File "ErrorsAndExceptions.py", line 1
len("data") = 4
SyntaxError: can't assign to function call**# Syntax Error-2: Python Keyword Misuse
fr** k in range(10):
print(k)
**Output:**
File "ErrorsAndExceptions.py", line 4
fr k in range(10):
^
SyntaxError: invalid syntax**# Exception-1: ZeroDivisionError**
print (5/0)
**Output:** Traceback (most recent call last):
File "ErrorsAndExceptions.py", line 12, in <module>
print (5/0)
ZeroDivisionError: integer division or modulo by zero**# Exception-2: TypeError**
print ('4' + 4)
**Output:**
Traceback (most recent call last):
File "ErrorsAndExceptions.py", line 10, in <module>
print ('4' + 4)
TypeError: cannot concatenate 'str' and 'int' objects
Uchral Sanjaadorj 在 Unsplash 上拍摄的照片
语法错误
当您的代码有语法错误时,Python 会停止并通过提供代码中错误的位置和明确的错误定义来引发错误。
**# Syntax Error-1: Misusing the Assignment Operator** len("data") **=** 4
**Output:** File "ErrorsAndExceptions.py", line 1
len("data") = 4
SyntaxError: can't assign to function call
您需要更正语法错误才能运行代码。
len("data") **==** 4
**Output:** True
异常处理
异常处理的主要目的是防止潜在的故障和不受控制的停止。
我们可以用一个 try-except 块来捕捉和处理一个异常:
- try 块包含要监控异常的代码。
- except 块包含特定异常发生时要做的事情。如果没有异常发生,则跳过这一部分,并结束 try-except 语句。
- 如果引发的异常与中指定的异常匹配,则执行 except 块中的代码来处理该异常。
- 如果没有在关键字之外的中指定任何类型的异常,您可以捕捉任何异常。
- 当第一个异常发生时,try 块执行终止。
- try-except 块可能有不止一个 except 块来处理几种不同类型的异常。
- 可选的 else 块只有在 **try 块没有出现异常的情况下才会执行。**如果出现任何异常,将不会执行 else 块。
- 可选的最后块用于清理代码。这个块总是被执行。
**try:**
**#code to monitor**
print (5/0)**#this code will not be executed
#as above line raises a ZeroDivisionError**
print ("this code will not be executed")**except** *ZeroDivisionError* as e: **#code to handle the exception when it occurs**
print(e)
print("OPPS")**else:**
print("try block executed if there is no error")**finally:**
print("finally block is always executed")**Output:** integer division or modulo by zero
OPPS
finally block is always executed
照片由 Serenity Mitchell 在 Unsplash 上拍摄
引发异常
如果特定条件发生,您可以使用 raise 关键字手动引发异常。
student_age = -4if student_age < 2:
**raise** *Exception*("Sorry, student age cannot be lower than 2")**Output:** Traceback (most recent call last):
File "ErrorsAndExceptions.py", line 49, in <module>
raise Exception("Sorry, student age cannot be lower than 2")
Exception: Sorry, student age cannot be lower than 2
定义自定义例外
如果我们希望对特定条件下发生的事情有更多的控制,我们可以定义自己的异常类型。
为此,我们从异常类继承。
*class* **InvalidStudentAgeException(*Exception*)**:**"""Exception for errors in the student age
Attributes:
student_age -- student_age that we monitor
error_message -- explanation of the error
"""***def* **__init__**(*self*, *student_age*, error_*message*="Student age should
be in 2-10 range"):self.student_age = student_age
self.error_message = error_message
*super*().__init__(self.error_message)student_age = *int*(input("Enter Student age: "))if not 1 < student_age < 11:
raise **InvalidStudentAgeException(student_age)****Output:**
Enter Student age: 54
Traceback (most recent call last):
File "ErrorsAndExceptions.py", line 68, in <module>
raise InvalidStudentAgeException(student_age)
__main__.InvalidStudentAgeException: Student age should be in 2-10 range: 54 is not a valid age
上面,我们覆盖了异常基类的构造函数,以使用我们自己的自定义参数学生年龄和错误消息。配合使用 super()。_ _ init _ _(self . error _ message),我们实例化了基类 Exception ,参数帮助我们显示错误消息。
照片由 Serenity Mitchell 在 Unsplash 上拍摄
关键要点
- 我们必须消除语法错误来运行我们的 Python 代码,而异常可以在运行时处理。
- 我们可以用 try-except 块捕捉并处理异常。
- 如果我们希望对特定条件下发生的事情有更多的控制,我们可以定义自己的异常类型。
结论
在这篇文章中,我解释了在 Python 中错误和异常处理的基础。
这篇文章中的代码可以在我的 GitHub 库中找到。
我希望这篇文章对你有用。
感谢您的阅读!
理解误差反向传播
从零开始的神经网络解释误差反向传播
介绍
深度学习所基于的技术神经网络(NN)在机器学习中非常流行。我记得早在 2015 年,在阅读了由 Andrew Trask 撰写的文章11 行 python 代码的神经网络后,我立即迷上了人工智能领域。但是尝试从零开始构建一个神经网络,我相信大多数人会同意我的观点,即误差反向传播或简单的反向传播(BP)将是完成这项任务的早期障碍之一,至少取决于你愿意钻研的深度。对于那些不熟悉的人来说,BP 是与优化算法(如梯度下降(GD ))一起使用的算法,用于学习 NN 模型的参数。BP 产生梯度,然后用于优化。在本文中,我将尝试解释这种算法是如何工作的,然后从头开始构建一个简单的神经网络,在我之前的帖子中使用的一个回归问题上测试这个网络。对于那些正在与这种算法作斗争的人来说,我希望这篇文章能作为一个直观的指南。
请注意,为了完全理解这个算法,很好地掌握矩阵代数和多元微积分是非常必要的
设置
为了对 BP 有一个全面的了解,我将从给出我们将要建立的神经网络的大图开始。由此你将有望对神经网络的设计决策以及 BP 中使用的矩阵运算有一个直观的理解。请注意,这只是我的设计,我觉得很直观,其他作者可能有其他设计。我将使用一个简单的前馈神经网络,它只是一个相互堆叠的函数/层的组合,如下图所示。
作者图片
该算法
神经网络的每次训练迭代有两个主要阶段
- 正向传递/传播
- BP
BP 阶段有以下步骤
- 评估每层的误差信号
- 使用误差信号计算误差梯度
- 使用带有优化算法(如 GD)的误差梯度更新层参数。
这里的想法是,网络在正向传递期间估计目标值。然后,我们计算我们的估计与最后一层的实际目标有多远(误差信号 δ_k )。最后,我们递归地计算每个先前层的误差信号。
给定诸如均方根的误差函数,可以使用偏导数找到最后一层的误差梯度。
作者图片
请注意,h’(a _ k)= 1为线性激活,因为这个***【∂e_n/∂y_k】=【∂e_n/∂a_k】。为了保持等式的整洁,忽略了索引 n。最后一层的量 (y_nk - t_nk) 称为误差信号【δ_ k】。因此,链接特定误差信号和输入信号的参数的梯度是输入信号和误差信号*的乘积。使用链式法则,可以使用当前层的误差信号来计算前一层的误差信号。从上图来看,
作者图片
注意,如何通过对来自当前层节点的所有误差信号进行加权求和来获得前一层中的节点的误差信号,前一层节点向当前层节点发送其信号,即在索引 k 上求和。这就是为什么它被称为误差反向传播。同样,为了了解 k 上的这个和在数学上来自哪里,请注意∂e_n/∂a_k 是雅可比向量,而 ∂a_k/∂a_j 是雅可比矩阵。
如前所述,一般而言,链接一层中特定误差信号和输入信号的参数的梯度是该层的输入信号和误差信号的乘积。在前一种情况下,
作者图片
类似地,对于偏置参数,
作者图片
注意,这是递归的,来自当前层的误差信号用于评估前一层中的误差信号。这是拼图中非常重要的一块,因此让我们看看我们如何向量化,然后在代码中实现它。我们将假设批量训练,但是通过将批量大小设置为 1,相同的设计可以用于在线训练。
对于一个输出 K 和输入 P 的层,层权重会初始化为 (PxK) 。因此,对于尺寸为 N 输入和尺寸为 P 的输入,我们得到尺寸为NK的输出。如图所示,这是层向前传播步骤。偏置初始化为 (K,) ,此处未显示,因为它通过 N 广播,不会影响输出尺寸。**
作者图片
误差信号,【δ_ k】,因此有形状 (NxK) 。出于一个我们很快就会看到的原因,我将这个误差信号转置并作为 (KxN) 馈入反向传播函数。现在,将层参数与层误差信号相乘,对所有的图案在 k 上执行加权求和,因此是误差信号首先被转置的原因。我们把这一步得到的矩阵叫做 DM 。**
作者图片
现在是棘手的部分,要完成前一层反向传播误差信号的计算,每个节点加权和,必须乘以*【h’(a _ j),其维数为 (NxP) 。我就把这个导数矩阵 D 。在矩阵代数中,这是通过将特定的输入模式作为对角矩阵,然后将该矩阵乘以相应的 DM 列来实现的。我就把这个对角矩阵叫做, S_n 。我将对一个大小为【PxN】的矩阵进行零初始化,以迭代累加前一层信号*
作者图片
如何构建矩阵 S_n 和 DM_n 由你决定。您将在代码部分看到实现这一点的一种方法。也许有更有效的不涉及循环的方法,如果你知道的话请告诉我:)。
现在这些误差信号被传递到上一层, L_k-1, 来更新它的参数。当前层 L_k 的参数由误差信号更新,该误差信号通过其“反向传播”功能传递到该层。
需要注意的一点是,在更新层 L_k 参数之前,计算 层 L_k-1 误差信号。
如前所述,为了计算层参数梯度,我们将误差信号乘以该层的输入信号。我将称之为 G_w 权重渐变和 G_b 偏移渐变。对于层 K ,矩阵 A 为 (KxN) ,输入信号 I 为 (恩智浦)
作者图片
注意,上面的操作对 N 求和,其效果是累加一批大小为 N 的梯度。
好了,说够了,让我们编码吧!
密码
首先,导入所有需要的东西
接下来,我将创建一个图层类。当调用该层时,它使用 call 执行正向传播。通过将前一层实例传递到当前层的实例中,可以将多个层堆叠在一起。正向传播从最早的层进行到最新的层。并且只有在前一层的输出大小/尺寸与当前层的输入尺寸匹配时,两层才能被附着。
接下来,模特班。这个类处理神经网络的训练过程和预测。
最后是一个生成器类,用于在训练时向网络提供数据
测试
首先,让我们生成一些数据
接下来,让我们创建我们的网络并开始训练。在本例中,我将创建一个 4 层网络。
最后,测试和绘图
图表
作者图片
结论
在这篇文章中,我试图涵盖反向传播的具体细节,并在此过程中展示了如何从头开始创建一个神经网络。测试结果表明,该神经网络比我以前文章中的线性回归模型更加强大和灵活。这篇文章的笔记本可以在我的 Github 上找到。对于感兴趣的读者,我鼓励你尝试修改网络来测试它的分类任务。
谢谢你看我的文章,下次再见!与此同时,在这段艰难的时期要小心!
参考
[1]:主教,C. M. (2006 年)。模式识别与机器学习。斯普林格。
使用 Python 中的 Matplotlib 从数据框绘制误差线
Python 中误差条形图的简单代码!
最近,我不得不为一份报告比较几种方法/算法的性能,我选择了误差线来总结结果。如果你手头有一个类似的任务,用这篇文章为自己节省一些时间。
什么是误差条形图,什么时候应该使用?
误差条形图是表示数据可变性的好方法。简而言之,它们给出了数据可能与报告值(或大多数情况下的平均值)相差多少的直观想法。
这通常可以通过以下方式实现:
- 标准偏差
- 置信区间(最好是 95)
如果你的报告需要对显示结果的精度(或再现性)做出评论,误差条形图在我个人看来是必须的。我也看到一些报告用它来表示适当情况下的公差。
但是,当然,要确保你有合适的观众,可以解释你的幻想形象。
执行:
为了简单起见,我使用 Excel 上的随机数生成器创建了一个样本数据。您可以使用 mean() 和 std() 函数快速计算数据的平均值和标准差。
作者图片
导入 Matplotlib 并使用 Matplotlib 中的 errorbar() 函数。它为剧情提供了相当不错的定制水平。
import pandas as pd ## for handling the dataframe
import matplotlib.pyplot as plt ## for visualizationdf = pd.read_excel("Sample_error_charts.xlsx")## read the Dataframe##Plotplt.errorbar( df['Model'], df['Mean'], yerr=df['SD'], fmt='o', color='Black', elinewidth=3,capthick=3,errorevery=1, alpha=1, ms=4, capsize = 5)
plt.bar(df['Model'], df['Mean'],tick_label = df['Model'])##Bar plot
plt.xlabel('Model') ## Label on X axis
plt.ylabel('Average Performance') ##Label on Y axis
确保调整倾覆和厚度,以适应你的图表。
作者图片
我在这个例子中选择了标准差,但是你也可以使用置信区间或者标准误差,这取决于什么适合你的整体叙述。让你自己完全熟悉基本的描述性统计,这将会让你立即意识到应该选择什么。
快乐阅读!
卡莉安·基萨拉
如何解决数据库的升级问题
了解当您遇到性能问题时升级数据库的最佳技术
当项目增长时,最常见的瓶颈之一是在数据库方面。这可能是因为程序的复杂性由于新的需求而增加,或者更常见的是,由于应用程序应该处理的流量的增加。
之前的考虑
像在许多其他情况下一样,您应该根据指标升级您的数据库。一般来说,在没有首先研究数据库、应用程序和基础设施指标的情况下,我不会建议应用任何数据库升级。此规则的唯一例外是当您的应用程序出现故障时,经常出现超出范围、性能和/或延迟问题,甚至数据库过载和锁定。
此外,我的建议是,除非必要,否则不要应用这些技巧。如果您不希望或没有面临数据库问题,您不应该过度扩展您的系统。您必须意识到不同升级选项的权衡以及它们带来的后果,例如系统复杂性的增加、维护中的问题、调试难度的增加等等。
让我们一起回顾一下可用的主要选项:
添加一个索引
为应用程序所需的搜索向表中添加额外的索引将降低查询的延迟。
这种解决方案的缺点是您将消耗更多的数据库硬盘空间。创建新索引时,会创建一个记录数与原始表相同的新表。
此外,请注意,使用这种解决方案时,对数据库的写操作会比较慢,因为您需要在索引表中执行额外的搜索和写操作。一般来说,这不会是一个问题,除非您的 IOPS 操作在写入方面非常不平衡(尤其是在包含几百万条记录的大型表中),或者/或者您滥用了这个解决方案,在同一个表中添加了几个索引。
使用缓存解决方案
基本上,当您缓存一个查询时,数据库引擎不会在下一次被请求时重复相同的查询。当然,这可以节省时间、减少延迟并提高性能。您可以在不同级别应用缓存:
- 在数据库引擎级别。当查询到达数据库时,如果该查询之前已经完成,引擎提供缓存版本。虽然在数据库级别处理缓存的方式因系统而异,但是当查询的任何元素有任何修改时,整个查询都会被清除。
作者图片
- 在应用程序级别。应用程序接受一个请求,但是它不是获取数据库的信息,而是提供一个缓存响应(例如,使用 Memcache 或 Redis)。该系统为开发人员提供了完全的所有权,因为他们可以控制何时清理缓存并以编程方式配置 TTL。
作者图片
- 在基础设施层面。一旦用户调用应用程序,而不是运行代码,就会提供一个缓存的响应(例如,使用 Varnish)。这种解决方案避免了应用程序,但是作为一种折衷,清理缓存更加困难。同时,它没有连接到应用程序,应该依赖于适当的 TTL 配置。
作者图片
使用复制品
该选项背后的想法是设置一个或多个将与主数据库实例同步的副本。然后,您可以导出副本的读取流量。这样,您减少了主实例的写操作流量,从而提高了整个系统的性能。
这个解决方案的权衡包括复杂性和成本的增加(您应该至少加倍实例)。此外,您应该在数据库端有一个健壮的基础设施,确保正确的复制,没有错误或严重的滞后。
作者图片
应用分片
基本上,这个解决方案将主数据库分成多个更小的数据库,称为碎片。虽然不同的操作将由不同的(更小的)碎片来处理,但在大多数情况下,性能和延迟将显著改善,从而结束几乎所有的数据库瓶颈。
分片有两种不同的实现方式,垂直共享和水平分片:
水平分片:每个原始表的内容被拆分到不同的机器上,保持它们之间相同的表结构(列、索引等)。)
垂直分割:表格在列级分割。
作者图片
虽然每个分片中的数据集更小,但是任何原子查询都会运行得更快;此外,写操作失败和并发问题的风险更低。请注意,情况并不总是如此,当您需要连接来自不同碎片的值时,尤其是当您还按多个列进行分组或排序时,性能会受到严重影响。
分片数据库为您提供了几个好处,但是它也带来了巨大的复杂性。当您需要将您的系统从非分片转移到分片时,它的初始实现需要一个详细的计划和实现。然后,维护需要对现有的新基础设施以及分片架构有深入的了解。任何新的开发都应该记住分片架构,并且需要更多的时间进行规划。
简化分片 App- DB 工作流-作者图片
最后的想法
升级数据库从来都不是一项简单的任务。让我坚持两点:首先,在开始之前,你需要精确的度量。其次,您需要深入理解您的应用程序、需求和缺陷,不仅包括纯技术方面,还包括产品和用户期望。
最后,请注意,我保持文章的一般性。升级数据库问题是一件严肃的事情。我并没有特意介绍代理实现、Viper 或 MariaDB 缓存系统——只是提到一些您可以考虑的潜在情况。本文的目的是让您对可以应用的关键解决方案有一个大致的了解。细节和实现同样取决于您的指标和应用。
将相关矩阵转移到…特征空间。
介绍一种绘制相关矩阵的新技术。它使您能够快速识别数据中的高级结构。
在 Unsplash 上 Juskteez Vu 拍摄的照片。其他所有图片均由作者提供。
我们都有过擅长使用劣质产品的经历。贵公司与不可靠的 CRM 签订了为期四年的合同。带有可怕的数据库连接器的表单工具,您永远也找不到时间来迁移它。MS Access。由于惯性、组织限制或成本,我们经常发现自己使用低劣的工具和技术,学习它们的小怪癖,将肌肉记忆投入到一系列重复的对话框中。您是否尝试过将 Excel 文件保存为 CSV 文件?
如果将工作簿保存为 CSV 格式,其中的某些功能可能会丢失。
有时候,使用这些工具是必要的。谁知道呢,也许它甚至能塑造性格?
但是作为数据科学家,我们通常有能力选择自己的工具。这样做是非常重要的,因为我们的工具塑造了我们对什么是容易的,什么是可能的。
相关矩阵就是这些糟糕的工具之一。更具体地说,在我们习惯性地需要执行大量任务的情况下,它是一种对有限的任务集有效的工具。因为相关矩阵有着悠久的历史,并且在较小的数据集上工作得足够好,所以我们把它视为唯一的游戏。我提出了特征空间图——这是一个补充相关性矩阵的工具,对数据科学家和非专家都有用。代码很容易适应自己——参见最小示例和完整笔记本。
我们如何使用相关矩阵
那么相关矩阵到底有什么问题呢?让我们来看一个例子。假设我们正在使用波士顿住房数据集,我们的目标是为一个社区的中值房价建立一个预测模型。
我们可能会询问缺失值,查看单变量分布,查阅我们的数据字典,但我们最大的问题之一将是:
这些特征之间以及与目标之间是如何关联的?
作为优秀的数据科学家,我们希望尽可能地了解我们的数据集,而不是仅仅向它扔一个神经网络。这将有助于我们:
- 特征工程
- 特征选择
- 降维/解决多重共线性
- 并最终将结果传达给利益相关者
因此,我们开始行动(打个比方,我的运行工作台还没有进来),并构建一个关联矩阵。它计算皮尔逊相关系数(缩写为 r ),数据中的每一对数量特征接收一个从-1 到 0 到+1 的单个数字,分别表示它们的线性相关性为强负、不存在或强正。当输出为表格时,它显示任意两个要素之间的(线性)关系的强度。我们进行一些光视觉化,然后!
但是我们如何使用这个图表呢?让我们扪心自问…
—我们想做什么?
—这东西能帮我们做到吗?
作为数据科学家,我们希望至少做到以下几点:
- 找出任何两个感兴趣的特征之间的相关性。
- 了解数据的高级结构—是否存在大量多重共线性?密切相关的特征的“集群”在哪里?
- 学习一些我们不知道的,也可能想不到要问的东西。
上面的相关矩阵明显优于第一点。它本质上只是一个查找表,通过用颜色对值进行双重编码进行了改进。
第二点有点棘手。这里的“结构”是指存在于个体元素集合体中的组织形式——就像看着一栋房子说“它有三层”或“地基正在下沉”,而不仅仅是“那两块砖是相邻的”。在特征空间中,我们正在寻找的结构是提供独特预测值的共线特征或独立特征的聚类。
在高维空间中,更复杂的关系是可能的,这将我们引向第三个目标——学习我们不知道的东西。如果我们只是想验证一个假设,有大量的统计测试。但是获得一种我们从未想过要考虑的洞察力是分析和可视化的核心。
太相关-太少,太相关
那么,我们的相关矩阵是否有助于我们找到特征的聚类,并产生关于数据的新见解?
算是吧。我们可以从黑方块的盛行来判断我们是否有很多共线性。我们可以观察一行或一列,注意到它很暗或很亮,并了解该特征是否接近许多其他特征。但是,这将需要大量的时间来识别集群。一个问题是所有的列看起来都有点相同,我们必须不断检查轴标签,以确保我们看到的是正确的。
随着时间和努力,我们可以推断出,例如, RAD 、 TAX 、 INDUS 、 AGE 和 NOX 之间高度相关,并可能形成一个集群。做到这一点所需的信息都在这里。
但是可视化的目的是利用我们进化中磨练出来的视觉敏锐度来快速发现仅仅盯着一张图表看不到的模式。
在这一点上,我认为这不是一个产生洞察力的工具。
但是等等!如果集群是我们所追求的,那么为什么不只是对轴进行排序,使相关的特征彼此相邻呢?你能看出从原始版本到这个版本的改进吗?
未排序(左)和排序(右)相关矩阵。在排序后的版本中,特征簇更容易被挑选出来。
现在橡胶上路了!沿着对角线扫描,寻找色块。我们可以立即看到 CRIM 、 RAD 和 TAX 以及 INDUS 、 AGE 、 NOX 和 DIS 之间的集群。
我们在这里所做的是利用我们大脑的进化磨砺的前注意处理来快速挑选出基于格式塔原则的模式,例如接近和相似。
可视化的主要目标之一是将有趣的数据绑定到这些模式上——我们基本上是在建造望远镜,并要求我们的大脑告诉我们森林中有什么在移动。
除了这些群集,我们的大脑还会挑选出其他模式。当然 RAD 和 TAX 相关性较高,但都与 CRIM 和 B 相关性较小。LSTAT 似乎与 Median_Home_Value 和 RM 在一个聚类中,但它与大多数其他特征有相当强的相关性。看起来 NOX / DIS 和 RAD / TAX 簇相互关联,但与 LSTAT / RM 簇的关联度没有那么大。
充分利用二次元
这些是我们之前讨论过的复杂而令人惊讶的结构。我们的排序相关矩阵使它们可见,但我们仍然需要引用轴标签并跟踪一行或一列,对于一个有数百列的数据集,相关矩阵甚至不适合一个页面!
相关矩阵的另一个限制是两个轴的排序顺序相同,因此一个特征只能与另外两个特征直接相邻。这限制了我们用接近度来衡量亲密程度的能力。在排序后的矩阵中,我们试图分析用颜色编码很好的关系,但用距离编码不好。这给了图表一种“魔眼”的特征,并使它对非专家来说不那么容易接近。
嗯,什么图表可以让我们在二维空间中定位元素,这样我们就可以有水平和垂直的接近度?
散点图!
我们所需要的是为每个特征生成 X,Y 坐标的方法。完整的方法可在源代码中找到,总结如下:
- 取相关矩阵的绝对值,从 1 中减去每个值。它被方便地转换成距离矩阵!
- 然后,我们可以使用 PCA 将 NxN 矩阵减少到 Nx2。
- 使用两个主要成分绘制每个特征的位置。
- 利用特征集聚生成特征集群。
- 根据聚类给每个要素着色。
- 画线表示至少 r = 0.7 的关系。
特征空间图
下面的特征空间图(FSD)使用位置、颜色(对于聚类成员)和链接(对于强相关性)的组合来以互补的方式描述特征之间的关系。甚至一眼,我们就可以看出:
波士顿住房数据集的特征空间图。
- CHAS 完全独立。
- 大多数特性被集中到一个大的集群中,但是在这个集群中,一个核心集是紧密相关的。
- 与相关矩阵相比,我们能够快速识别出 LSTAT 在与目标和许多其他特征相关中占据独特的位置,包括 RM ,否则它是独立的。
这是一个快速的洞察,对特征工程和选择非常有帮助。如果我们需要细节,我们可以在我们的相关矩阵中查找它们,把它放在适当的位置,作为一个查找工具。
按比例放大
波士顿住房数据非常小,所以相关矩阵和特征空间图更加匹配。但是 FSD 确实在更大的数据集上大放异彩。让我们看看乳腺癌数据集的 FSD,它有 30 列:
乳腺癌数据集的特征空间图
我们可以立即看到这些数据中有明显的特征聚类。橙色和棕色集群内部以及彼此之间有很强的相关性。红色聚类中的要素都离橙色聚类较远,并且彼此之间的相关性较弱。也有异常值,如平滑度 _ 最差,面积 _ 最差和凹度 _ 平均值。 Radius_sd_error 和凹点 _ 均值奇怪的是相互关联,没有别的。
该数据由几种类型的测量值(半径、周长、对称性等)和为每种测量值计算的统计值(平均值、标准偏差、最差)组成。我们可以尝试回答的一个高级问题是,我们是否可以只使用每种度量类型的“平均值”,而抛弃其余的。换句话说,要素是按测量类型分类的吗?
具有用户提供的颜色映射领域知识的特征空间图
通过对特征到测量类型的颜色映射进行硬编码,我们可以很容易地找到答案!
没有。
有一些物理上相邻的测量类型,例如橙色的密实度 _。但是总的来说,度量类型在这里并不驱动相关性。
然而,这是一个很好的拒绝假设。如果我们已经将几个数据集合并在一起进行分析,并且现在想要确定它们的特征在多大程度上重叠,这种方法也会非常有帮助。只需给每个数据集中的变量赋予它们自己的颜色。
时间序列
我特别惊讶的是为癫痫发作识别上的时间序列数据集创建的 FSD。每个数据点由在一秒钟内进行的 178 次脑电图测量组成。我们想问的关于时间序列的第一个问题是是否有任何重复或循环的行为。
癫痫发作识别数据集的特征空间图
这个看起来有点像澳大利亚的斑点向我们展示了每个特征只与它的邻居相关(例如,前面和后面的时间片)。奇怪的形状来自 PCA 试图根据时间顺序将每个特征从其他特征中推开。
然而,我们如何解释所有的弯曲和花饰?我们可能有理由期望马尔可夫链看起来更像这样:
合成半随机马尔可夫链的特征空间图
换句话说,一个没有环的圆形。这暗示除了 5 个连续时间戳的每个块之间之外,在该数据集中还有其他相关性。让我们检查一下相关矩阵:
乍看之下,相关性矩阵提供了相同的故事——在每个点前后延伸 2-3 个时间戳的高度相关点的带,否则没有相关性。但如果我们仔细观察,可以看到两组与主线平行的微弱线条——一组在每个点前后约 17 个点,另一组在每个点前后约 35 个点。这个奇怪的视觉假象表明,在这个数据中有一个小的循环效应。在 FSD 中,我们甚至可以看到线条弯曲,使得 X18、X33 和 X49 尽可能地靠在一起,接近我们上面看到的趋势。相当酷!
结论
特征空间图是一种工具,它补充了相关性矩阵,并提供了定量特征之间相关性的更快概要。在本文中,我将展示如何使用它来揭示需要进一步研究的有趣关系。代码可从下面获得(或查看完整的笔记本此处),包括额外的配置和交互功能,包括:
- 缩放和平移
- 用于选择聚类数量的小部件
- 更改显示相关线的 r 阈值的小部件
- 显示集群数量和大小的图表
- 能够传入用户定义的颜色方案,如上所示
功能空间图的完全交互式版本
脚注
有关该排序的完整实现,请参见对应的 R 包。
在本文的例子中,CHAS 布尔变量包含在相关矩阵中。尽管皮尔逊相关系数被编码为一个数字,但它不是为处理分类变量而设计的,因此在实践中不应该这样做。请参见预测能力评分以获得可处理任何类型变量的类似特征评分。
分层提取浓缩咖啡
垂直探索提取
在开发断奏镜头时,我注意到用过的咖啡层在镜头后保持分离。我决定弄干这些圆盘,看看每层的咖啡萃取量。我很好奇这将揭示什么,如果这可以告知如何提取一杯普通的浓缩咖啡。
这是提取后的断奏夯实镜头的顶层,看起来像海绵。
断续浓缩咖啡和断续捣实概述
断续浓缩咖啡的制作方法是将咖啡过筛,将过滤篮分层,底部是精细层,然后是粗糙层,最后是中间层。这是一个如何准备冰球的旧图(注意:我现在使用塑料分配器,不再使用回形针。我也不再使用黑色 OCD 风格的分配器)。
有时会有更多的层,这是由于通过 bean 分割精细层或添加一层 Robusta
从断续浓缩咖啡中,我得到了断续捣实,这里有两层不同的捣实压力,如下图所示:
断续浓缩咖啡层的一个例子:
干燥层
一个断奏夯实镜头的顶层看起来像一块海绵。一张断续浓缩咖啡照片的顶层看起来相似,但我没有照片。通常,你可以说这是通道,但在这种情况下,通道通常是穿过圆盘的。由于我在图层之间使用了纸质滤镜,这个不连贯的夯实的照片很容易被分割。纸过滤器是一种有效的方法,可以将照片分层,以了解咖啡是如何提取的。
我拿起每个冰球,把它们放在碗里或纸杯蛋糕架上。用一个碗,我测量了碗的起始重量。有了纸杯蛋糕托盘,我就把它当成了储藏室,在需要称重的时候用勺子把蛋糕渣刮出来。纸杯蛋糕托盘中剩余的粉末量不超过 0.05 克
咖啡壶放在柜台上大约需要一周的时间才能变干。它们可以在低温的烤箱里烤得更快,我偶尔会这么做,但这比把冰球放在托盘里等待需要更多的关注。
我拍了几张显示不同层次的照片。断奏圆盘的主要问题是中/粗层不能保持完整。正如你在照片中看到的,精细层保持完好无损。
小规模分析
我查看了测量提取率(EY)与测量提取干重的对比。
大多数镜头测量提取高于干重,但有可能一些水仍然保留,即使干燥后。
按层查看提取情况,细层比中/粗层提取更多。对于断续的夯实镜头(右边的两个),顶层的提取比底层高。断奏夯实击球的顶层和底层的主要区别在于夯实压力。
我对废弃的场地很好奇。如果中/粗层提取的咖啡较少,我想知道是否可以收集它们并重新研磨。我怀疑,即使是正常拍摄中的球场地面也很少被提取,你可以在拍摄后对它们进行筛选,并尝试重新打磨以进行新的拍摄。这种类型的实验至少可以让我们深入了解水到底有多深,咖啡能被提取出来。
总的来说,该测试表明较细的颗粒具有较高的提取率,但是密度在提取中起着很大的作用。我仍然认为萃取率随时间和粒度的变化是一个难以解开的谜,我希望这里或那里的小实验将有助于这种理解。
如果你愿意,可以在 Twitter 和 YouTube 上关注我,我会在那里发布不同机器上的浓缩咖啡视频和浓缩咖啡相关的东西。你也可以在 LinkedIn 上找到我。
我的进一步阅读:
克鲁夫筛:一项分析
浓缩咖啡过滤器比较:佩萨多 vs VST
每个人一个样本,进行测试
我真的很喜欢我的 VST 过滤篮,但我有机会尝试一个 Pesado 过滤篮。它们由 IMS 制造,设计与普通 IMS 篮筐或 VST 篮筐略有不同。所以我做了一个月的对照实验,用相同的参数拍了两张照片,在 VST 和佩萨多之间交替。之前,我已经研究过 IMS 超细和VST 过滤器,但是我没有看到在味道、提取率和拍摄时间方面的任何一般性能差异。
左:佩萨多,右:VST
我的预期是一个过滤器会比另一个好,但我不确定是哪一个。我还分析了过滤篮本身,看看它们是否会给出哪个篮子会胜出的提示。我想也许会有一个更精确的洞或者有一个更好的空间分布。
最终,我将提前分享,我没有看到性能上的统计差异,也没有看到分析过滤孔本身时的任何指标。大警告是我只有一个 VST 过滤器和一个 Pesado 过滤器,它们很可能是这些公司过滤器的平均分布。
顶排:佩萨多,底排:VST
过滤分析
我使用图像分析来查看过滤孔,看看我是否看到任何重大差异。这包括在一个黑暗的房间里拍摄一张特写图像,将滤镜放在一个明亮的屏幕上。然后,我测量了每个洞的大小,并制作了一张图片,对洞的大小进行颜色编码,以寻找图案。
从上往下看:
左:佩萨多,右 VST
从底部成像:
左:佩萨多,右 VST
在使用相机校准测量孔时,平均尺寸存在差异,但标准偏差(每个孔相对于平均值的变化量)非常小。作为参考,非精密滤波器的标准偏差通常要大 3 倍。
绩效指标
我使用了两个指标来评估过滤器之间的差异:最终得分和咖啡萃取。
最终得分是 7 个指标(强烈、浓郁、糖浆、甜味、酸味、苦味和余味)记分卡的平均值。当然,这些分数是主观的,但它们符合我的口味,帮助我提高了我的拍摄水平。分数有一些变化。我的目标是保持每个指标的一致性,但有时粒度很难,会影响最终得分。
使用折射仪测量总溶解固体(TDS ),该数字用于确定提取到杯中的咖啡的百分比,并结合一杯咖啡的输出重量和咖啡的输入重量,称为提取率(EY)。
数据:成对拍摄
数据收集最简单的部分是我可以同时运行其他实验,只要每次两次拍摄之间的所有参数都相同。结果是在佩萨多和 VST 有 30 多对镜头。
首先,我比较了每一对照片,看看最终得分或 EY 是否有明显的趋势。有时 VST 做得更好,但有时佩萨多做得更好。对于这些图表,如果一个过滤器更好,值将更多地高于或低于沿 y=x 的黑线。
然后我通过咖啡烘焙分离出数据,因为也许过滤器在一些烘焙上比其他的表现得更好。但是,我没有看到数据中的趋势,如下图所示:
然后我整理了所有的数据,比较了使用佩萨多拍摄的最佳照片和使用 VST 拍摄的最佳照片。这不如成对样本好,但我想也许其中一个过滤器会做得更好。在这些排序对中,VST 的得分/EY 比佩萨多高,但那是在更少的样本上。此外,EY 的是低端,我不是完美的分布。在提取的较低端的大多数镜头是由于分布误差和环形图案。
查看相同数据的另一种方式是使用折线图,同样,在下端,它似乎表明 VST 略有优势。但我不会把钱押在这上面。
时间度量
由于我没有在《品味》或《EY》中看到任何可以区分它们的东西,我想我应该通过查看覆盖滤镜的时间(TCF) 和总时间来仔细检查拍摄时间。TCF 是我在其他情况下用来决定预浸何时结束以最大限度地提取和品尝的指标。我将这些时间指标与最终得分和 EY 进行了比较,因为如果一个过滤器更好,那么对于某个拍摄时间,它应该有更高的最终得分和 EY。
TCF 没有显示出这两种过滤器之间有多大的区别。
总拍摄时间也没有显示任何差异。从时间角度来看,考虑到 ey 和最终得分相似,这表明它们具有相似的流量。
就像之前与 IMS 超细过滤器的比较一样,我看不出 Pesado 和 VST 在性能上有什么不同。每个人都希望他们的过滤器是第一名,但我怀疑这将需要另一种类型的创新,以改善艺术的浓缩咖啡过滤篮。
这个测试的大警告是我每种只有一个样本。理想情况下,人们会希望收集控制所有其他变量的几个样本的数据。这当然需要更多的时间和金钱,但这将是一个有趣的实验,可以毫无疑问地证明谁制造的浓缩咖啡过滤器更好,或者一旦你达到一定的精度,过滤器就不那么重要了。
如果你愿意,请在 Twitter 和 YouTube 上关注我,我会在那里发布不同机器上的浓缩咖啡照片和浓缩咖啡相关的视频。你也可以在 LinkedIn 上找到我。
我的进一步阅读:
浓缩咖啡测量:溶解度
用数据看到更大的图景,第 3 部分
咖啡溶解度被证明是使用定性方法区分镜头的最简单和最好的指标。幸运的是,一些团体,如苏格拉底咖啡和复合咖啡已经比较了折光率仪,考虑到它们的成本,这同样重要。这是从苏格拉底咖啡,复合咖啡收集的数据,和我讨论折射仪的数据。这是系列的第三部分,第一部分关注预浸、压力和水温,第二部分关注研磨、分配和捣实。
为了测量溶解度,人们使用折射仪。这可以测量总溶解固体(TDS),如果你有饮料的重量,它可以确定你杯子里有多少咖啡。一旦你知道你的杯子里有多少咖啡,你就可以通过除以输入的咖啡重量来计算提取率(EY)。EY 是你提取的咖啡的百分比。一般来说,30%的咖啡能够被提取出来,而好的浓缩咖啡的提取率大概在 18%到 22%之间。
标准的 VST 数字折射仪价格约为 700 美元,即使是价格更低的也要 300 美元(Atago)。最终,我买了一个 20 美元的白利糖度计,后来,我终于决定买一个更贵的(Atago)。我还收集数据来帮助理解 Atago 的工作情况,以及它与更便宜的工具白利糖度计的比较。
零水
任何折光仪都需要校准,通常使用蒸馏水。 Socratic Coffee 调查了VST 和 Atago 仪表使用蒸馏水和冲泡水的不同之处。
他们发现了与咖啡温度有关的下降趋势,但当比较两米时,似乎没有太大的趋势。
过滤样本
如果我们观察样品是否使用注射器过滤器过滤,未过滤的样品最终具有更高的 TDS。苏格拉底咖啡做了一个很好的调查,在我自己的一个小样本上,我能够看到一个与粗注射器过滤器相似的趋势。
关于滤波的更多数据显示,每个样本中,滤波后的样本具有较低的 TDS。考虑到过滤器的作用,这是有意义的(它过滤掉影响折光仪的较大颗粒)。
当他们又一次观察过滤和未过滤样本之间的差异时,对 ey 也有明显的影响。然而,我不相信一个过滤器是值得的成本或努力。
VST 二/三对阿塔戈
苏格拉底咖啡比较了 VST 折光仪和 Atago ,结果很有趣。首先,VST 二世相对于 VST 三世偏移了一个常数。
他们又看了两个,我们能做的一件事就是把所有的数据结合起来。这样做,有一个明显的趋势之间的阿塔戈和 VST 的意思是,他们在测量能力相当。这两个分布相当大,使用双尾 t 检验,它们的 p 值为 0.9842,这意味着它们是同一个分布。
比较 EY 和 TDS
Socratic Coffee 将他们的大部分数据显示为 TDS,而不是提取产量(EY),值得注意的是,EY 的产量重量略有差异。因此,我根据每次拍摄的预期产量和他们对分发工具的影响所做的一项研究的实际产量来计算 EY。
最明显的区别是,使用 40g 输出的 EY 是对实际 EY 的低估。
我也对 VSTII/III 和 Atago 进行了分析。有一些细微的差别,足以让我停留在 EY 的领域,而不是 TDS。最终,我不认为它对潜在的结论有影响。
白利糖度与数字
复合咖啡对比廉价的白利糖度计看糖分。他们可能不知道白利糖度和 TDS 之间存在直接的转换关系(通常 TDS = 0.85 *白利糖度或白利糖度= 1.176 * TDS)。他们的数据不仅表明了这一点,还表明使用白利糖度计相当于使用 TDS 计。对于他们的数据,方程略有不同(Brix = 1.1367 * TDS + 0.6102),但仍然非常接近。
我做了一项有趣的研究拍摄了大量照片,我用 Atago 测量仪测量了 TDS,用廉价的折射计测量了白利糖度。我发现两者有相似的分布,具有统计学意义,因为我在 1:1,拍摄的后半部分收集,然后计算 3:1 比率标记的最终 TDS。
这些折光仪的数据非常令人兴奋,因为这有助于证明为家庭咖啡师购买廉价折光仪的合理性。目前,折光仪是量化和区分一杯浓缩咖啡的主要工具,通常只由专业咖啡师使用。
我希望考虑使用白利糖度计的人可以买一个便宜的白利糖度计,看看这个信息是否对他们的日常生活有帮助,然后再花几百美元。
如果你愿意,请在 Twitter 和 YouTube 上关注我,我会在那里发布不同机器上的浓缩咖啡照片和浓缩咖啡相关的视频。你也可以在 LinkedIn 上找到我。
我的进一步阅读:
浓缩咖啡参数:预浸、压力和水温
用其他数据看到更大的画面,第 1 部分
在收集了一年多浓缩咖啡的数据后,我感觉自己像一座孤岛。很少有人像我一样在 espresso 上收集数据,espresso 社区几乎没有数据分析。如果它确实存在,它隐藏在付费墙后面,对外界没有太多的指示。总的来说,实验都是单一样本或者忽略了对某些参数的控制,这就是为什么我印象深刻地发现了复合咖啡、苏格拉底咖啡和五感咖啡。当然,学术研究是有的,但它通常不涵盖像压力和温度这样的基本问题,而这些问题在研究领域之外是可以获得的。
关键数据,以防你想跳过其他的。
复合咖啡有过各种各样的实验,但我从未听说过。我很惊讶他们没有更出名或被更多引用,但我怀疑这是因为他们收集的数据都放在表格中,人们很难看到清晰的图片(他们没有用图表显示他们的发现)。Fives Senses Coffee 只有一个我感兴趣的研究,Socratic Coffee 有表格和图表(他们的数据包含在第 2 和第 3 部分中)用于各种实验。
在这项工作中,我将检查与预浸、水温和压力相关的数据,因为它们会影响提取。假设是更高的提取与更好的味道相关,我的数据表明,假设相同的输出量。
我的理解是,大多数人认为最好的办法是在水温为 94 摄氏度、压力为 9 巴的情况下,几乎不预注入水。很好奇数据是怎么说的。
复合咖啡
我挖掘了他们的数据,并写了一些分析,以帮助向世界展示他们的结果。他们的实验得到了很好的控制和很好的记录,但是他们的分析有两个错误:
- 没有图形表示。
- 统计学意义的 p 值误用。
我可以用一些有趣的情节来解决第一个问题,但第二个问题可以让任何人陷入统计上的困境。
统计显著性可以表示为使用 t 检验拒绝零假设。零假设是数据的两个分布样本来自同一个总体分布。如果您有超过 30 个样本,您可以进行 t 检验,以确定分布是否在统计上不同,这意味着检验的 p 值小于 0.05。一个更强的测试是配对 t 测试,其中有成对的数据点。
Compound Coffee 将 t-test 应用于他们的数据,他们所有的测试都只有不到 30 个样本。通常,他们有 10 个样本,他们使用 p 值来确定一种技术是否优于另一种技术。这并不意味着一种技术不是,但他们不能用 p 值来看。我喜欢看数据,我的经验是,通过找到合适的情节,结论(如果有的话)对不熟悉的人来说应该是显而易见的。
在看他们的数据时,我看过未排序和排序的。我对数据进行分类是因为每个样本不应该与前一个相关,所以公平的比较是最好的与最好的比较,第二好的与第二好的比较,…以及最差的与最差的比较。
9 巴提取前的预注入
他们在 9 巴提取压力前查看了预注入,发现预注入无助于提取产量(数据见附录 A)。然而,从他们的表格中很难看出这一点。我绘制原始数据,然后进行排序,在第一组数据中,我使用了与基线样本的直接比较。
这是所有排序后的样本。9 巴是明显的赢家,但有趣的是,30 秒的预输注具有更一致的结果(各次注射之间的差异更小)。似乎提取的可变性随着预灌输的增加而降低。
同样,这些结果不可能有统计学意义,因为它们是欠采样的,但它们仍然是有趣的。
注射压力
复合咖啡研究了在提取过程中改变机器压力的,他们发现 7 到 8 巴是最佳的(数据在附录 B 中)而不是 9 巴。然而,当他们没有足够的样本时,他们声称有统计学意义。
所有样本都已分类排列好。
数据排序后,我看到的情况是,7 巴的提取略好于 8 巴。从这个图表中可以清楚地看出,9 巴不是更高萃取的最佳压力。
所以我们只比较 8 小节和 7 小节:
图上的一个点看起来像异常值,但除此之外,7 根棒线看起来稍微好一点。尽管如此,我们不知道它是否有统计学意义,因为我们没有足够的样本值。
7 巴提取前的预注入
Compound Coffee 随后对预浸进行了测试,使用 7 根萃取棒而不是 9 根萃取棒,考虑到基于之前的结果,7 根萃取棒似乎比 9 根萃取棒产生更高的萃取率。下面是排序值和控制样本之间的比较。
较高的预浸渍产生高得多的提取,即使对于较低的分布也是如此。对于较高的预输注时间,注射之间的可变性比在 9 巴提取时稍高,这给较高的预输注与较低的提取可变性相关的概念带来不确定性。
另一方面,这个结论看起来很清楚,但是同样,这些结果应该放在可行性的背景下,而不是统计证明的确定性。这些结果符合我对更长时间预输注的经验,但我还没有足够控制我的变量来表明更长时间的预输注总是更好。
水温
复合咖啡查看了冲泡时的水温,他们想知道它是如何影响提取的(附录 D)。他们扫描了 91C 到 95C,数据显示 95C 比 91C 好。下面是与 91C 的比较,更高的温度似乎做得更好。
以下是所有经过分类的样本,再次显示 95C 的提取率更高,但这一趋势并不总是成立。方差有点高,无法得出可靠的结论。较高的温度只是提供了更一致的提取,因为它的范围比其他温度小得多。一个可靠的结论是,91C 不能保证提供最高的提取率。
五感咖啡研究了水温,温度高一些,样本少一些。他们没有足够的数据来证明统计意义,但似乎高于 92 摄氏度的温度是更可取的。
我很想看到这些实验在不同的烘烤中进行更深入的研究,收集更多的样本。这些数据表明了以下结论,但需要更多的数据:
- 对于提取来说,7 巴比 9 巴好。
- 15 秒或更长时间的预浸,然后是 7 巴萃取,提供了更高的咖啡萃取率。
- 水温在 95C 左右或更高更好。
浓缩咖啡领域已经爆炸了,但它仍然缺乏一种数据驱动的方法,这种方法在其他研究领域非常有用。我希望重新审视这些数据能帮助人们踏上自己的旅程,发现这些群体的亮点,并激励其他人使用数据来推动创新。
第 2 部分将涵盖研磨、分配和夯实。第 3 部分将介绍咖啡提取工具。
如果你愿意,可以在 Twitter 和 YouTube 上关注我,我会在那里发布不同机器上的浓缩咖啡照片和浓缩咖啡相关的视频。你也可以在 LinkedIn 上找到我。
我的进一步阅读:
被盗浓缩咖啡机的故事
附录 A
附录 B
附录 C
附录 D
浓缩咖啡的制备:研磨、分配和捣实
用其他数据看到更大的画面第 2 部分
之前,我们通过几个数据源查看了预注入、压力和温度,以了解什么提供了最佳提取。现在,让我们看看研磨、分配和捣固。
使用的主要指标是提取率(EY)或总溶解固体(TDS)。使用 TDS、输出重量和输入重量计算 EY。它们与口味关系不大,能够达到更高的 ey 或 TDS,因此目标是更高的 TDS 或 EY。
研磨机刀片锋利度
Socratic Coffee 研究了毛刺锐度与保水性的关系,分类后的数据在提取方面没有显示出太大的差异。我很好奇,如果使用多个研磨设置或豆会提供一个更清晰的图片。
他们继续研究提取率,分类成对比较的数据和线形图显示,刀片越锋利,提取率越高。更锋利的刀片最有可能影响研磨分布,但他们没有进一步深入这些实验。
研磨速度
苏格拉底式咖啡还研究了研磨机的速度以及它如何影响咖啡渣的分布。然而,在最初的图表中,他们没有显示每次烘烤的所有速度,只有一个图表。我拆分了他们的数据,你可以看到中间部分受 500 RPM 的影响最大,所以我放大了那部分数据。很难在看不到味道或 TDS 效果的情况下显示分布,但拍摄一致性的关键是保持 RPM 一致。
圆盘准备中的顶部空间
苏格拉底咖啡在顶空做了一个小研究用 20g 的篮子和 22g 的篮子。他们在最初的演示文稿中使用了方框图,但由于样本数量较少,我认为最好绘制出排序后的样本。箱形图非常适合汇总数据,但是当分布不是高斯分布时,很难理解箱形图。非高斯分布的最佳提示是中值偏离平均值。理想情况下,它们应该居中,如果不居中,不均匀的分布可能表明采样规模太小。
所以我用他们的箱线图估算了他们的原始数据,给出了最小值、最大值、中值、25%和 75%的界限。对于十个样本,该信息立即给出样本 1、3、7 和 10。其余的是点之间的插值,考虑到中值是样本 5 和 6 的平均值。
结果没有显示出明显的差异,苏格拉底咖啡或其他人也没有做过进一步的实验。
过滤篮
苏格拉底式咖啡看了几次过滤篮。首先,他们查看了仿制药与 VST & IMS ,然后是仿制药与 IMS ,然后是一个跨越四个篮子的更大样本:仿制药、佩萨多、铂尔曼和 VST。Pesado 属于 IMS 类别。所有这些数据最初都是箱线图格式的,我根据箱线图参数估计了原始样本。
最左边的奇数样本是由于 IMS 数据中的低 EY 异常值和一般数据中的高 EY 异常值。
总的来说,似乎使用任何精确的篮子都比通用的要好。但是如果我们把所有这些数据结合起来会怎么样呢?对比一下怎么样?对 VST 来说,结果显示它们导致更高的提取率。对于普尔曼过滤器,就不那么清楚了。对于佩萨多,似乎有所增加,但不清楚它是否比 VST 更好。
与 VST 相比,铂尔曼和佩萨多的表现稍差,但统计意义尚不明确。一个更大范围的烘烤对比肯定会很有趣,因为即使是一次烘烤也不能保证讲述整个故事。我想知道是否有些过滤器对某些研磨分布或烘焙水平更好,而对其他的则不是。我再次注意到数据的缺乏,能有这样的数据真是太好了。
咖啡分销
多年来,许多人试图使用不同的技术或工具来改善咖啡的分配。在复合咖啡和苏格拉底咖啡之间,有一些有趣的数据表明大多数经销商弊大于利。
强迫症工具
强迫症工具似乎是高质量咖啡师的必备工具,但数据显示并非如此。我甚至买了一个,但是我已经改用一个弯曲的回形针了。苏格拉底咖啡研究了 OCD 工具与在三台研磨机上敲击 portafilter 的对比。研磨机显然不那么重要,但拍摄时间似乎变化很大。
如果我们取所有的样本,我们实际上每个样本有 30 个样本,现在直接进行有意义结果的两两配对 t 检验,我们得到 p = 8.1384e-11,这意味着两者之间的差异在统计上有意义(p < 0.05 is statistically significant).
OCD2 & BT Tool
They then went to look at two more: the BT and OCD2 distribution tools. Both of which don’t perform well against the control sample.
Bonus Data: Grinder Comparison
Inside this data for OCD tools, they used three different grinders. So we could also do a grinder comparison. I looked at the data with and without sorting. Either way, the K30 looks like a better grinder in this experiment, but there was not an analysis on the grind distribution for this grind setting. It is not clear that each grinder was best dialed in; I would like to assume so, but I can’t be certain. This points to the difficulty of running espresso experiments and controlling all the variables.
Tapping, NSEW, Stockfleth, and OCD
Compound Coffee 比较了四种分布方法,但他们将数据转储到一个没有图表的表格中。我在这里用两种方式想象它们。两者都表明答案不明确,但 Stockfleth 方法似乎更好一点。强迫症工具并不是一个明显的赢家,但它不像在苏格拉底咖啡实验中那样糟糕。
手指、1–8–0 浅、1–8–0 深和捻线分布技术
复合咖啡做了第二批分销商,但他们都没能做得比好的奥莱手指分销更好。
总体印象
分发工具似乎没什么帮助,但不清楚为什么。我只是怀疑,因为大多数只影响冰球的上半部分。我本以为 Twister 工具会做得更好,但事实并非如此。
篡改者!
夯实压力
苏格拉底式咖啡研究了萃取时的夯实压力,结果与许多人声称的正确夯实压力背道而驰。这一数据只表明没有一个明确的趋势。唯一有意思的是,10 磅夯锤的提取时间比其他夯锤略低,但只要提取正常,这并不重要。否则,似乎需要稍大于夯锤重量的低夯压。
篡改类型
苏格拉底咖啡看了很多捣棒,LM、Easy、Pullman(Pullman 的简称)看起来都很相似。有人可能会说 Perg 和 Pull 捣棒更好,但没有足够的证据来证明这一点。
复合咖啡也看了 LM,Pergtamp,和 Levy 。他们的结果似乎有一个更大的不同,那就是 T4 和征税。
因此, Compound Coffee 进一步测试了两者之间的正面交锋,Pergtamp 显然是赢家。我甚至将两个数据集结合起来,进行了 t 检验。抽样只有 25 个样本,并且它具有 0.0178 的低 p 值,这表明对于这些样本,存在统计上显著的差异。
体积与手动
咖啡师 Hustle 做了一个比较,一个咖啡师(Jamie)根据体重停止一杯咖啡,另一个让机器在特定的音量停止一杯咖啡。这是一场机器对人类的测试,虽然一系列结果显示机器赢了,但仍然有太多的混合。这台机器肯定更加稳定,但这并不意味着一个熟练的咖啡师不能拍出令人惊叹的照片。
这些都是有趣的实验来绘制和分析。我真的很喜欢查看数据集,特别是考虑到这些数据集很小,而且不知道咖啡烘焙或咖啡豆如何影响结果。然而,我们可以从这些数据中得出一些有趣的想法:
- 保持你的刀刃锋利。
- OCD 分发工具并没有真正的帮助。
- Stockfleth 方法非常有用。
- 不需要用力夯实。
- 并非所有的篡改者都是生来平等的;Pergtamp 或类似产品将优于其他篡改工具。
- 如果您希望能够像自动机器一样拍摄出相似一致性的照片,请使用标尺。
我希望这些数据的收集能够帮助人们了解或者更好地激励人们收集数据。本系列的下一篇文章将讨论 TDS 测量工具。
如果你愿意,可以在 Twitter 和 YouTube 上关注我,我会在那里发布不同机器上的浓缩咖啡视频和浓缩咖啡相关的东西。你也可以在 LinkedIn 上找到我。
我的进一步阅读:
克鲁夫筛:一项分析
熊猫数据准备的基本命令
熊猫“小抄”争夺数据
如果你喜欢烹饪,你会非常了解这一点。打开炉子烹饪食物是整个烹饪过程中很小的一部分。你的大部分汗水和泪水实际上都花在了准备正确的配料上。
老生常谈,但值得再说一遍——数据准备是任何数据科学项目中 80%的工作。无论是制作仪表板、简单的统计分析,还是拟合高级机器学习模型,都是从找到数据并将其转换为正确的格式开始,这样算法就可以处理其余的事情。
如果你是 Python 爱好者,那么pandas
就是你数据科学之旅中最好的朋友。配备了所有的工具,它可以帮助您完成项目中最困难的部分。
也就是说,像任何新工具一样,你首先需要了解它的功能以及如何使用它们。许多数据科学的初学者仍然很难充分利用 Pandas,而是将大量时间花在堆栈溢出上。我认为,这主要是因为无法将 Pandas 的功能与其分析需求相匹配。
只要列出典型的数据准备问题清单,并为它们配备合适的 Pandas 工具,就可以解决大部分问题。下面,我将介绍一个典型的数据准备和探索性分析工作流程,以及必要的 Pandas 功能。我并不是要记录下世界上所有关于熊猫的事情,而是演示创建你自己的数据争论备忘单的过程。
建立
启动您最喜欢的 Python IDE 后,您可能想马上开始并导入必要的库。这很好,但是您仍然需要设置您的环境来设置工作目录、定位数据和其他文件等。
# find out your current directory
import os
os.getcwd()# if you want to set a different working directory
os.chdir("folder-path")# to get a list of all files in the directory
os.listdir()
数据导入
接下来是数据导入,这是你第一次使用熊猫。
您的数据可能位于世界上的任何地方—您的本地机器、SQL 数据库、云中甚至在线数据库中。数据可以保存为各种格式— csv、txt、excel、sav 等。
根据数据的来源和文件扩展名,您需要不同的 Pandas 命令。下面是几个例子。
# import pandas and numpy libraries
import pandas as pd
import numpy as np# import a csv file from local machine
df = pd.read_csv("file_path")# import a csv file from an online database
df = pd.read_csv("[https://raw.githubusercontent.com/uiuc-cse/data-fa14/gh-pages/data/iris.csv](https://raw.githubusercontent.com/uiuc-cse/data-fa14/gh-pages/data/iris.csv)")
数据检查
在导入数据后,您想要检查一些东西,如列和行的数量,列名等。
# description of index, entries, columns, data types, memory info
df.info() # check out first few rows
df.head(5) # head# number of columns & rows
df.shape # column names
df.columns # number of unique values of a column
df["sepal_length"].nunique()# show unique values of a column
df["sepal_length"].unique()# number of unique values alltogether
df.columns.nunique()# value counts
df['species'].value_counts()
处理 NA 值
接下来,检查 NA、NaN 或缺失值。一些算法可以处理缺失值,但其他算法要求在将数据投入使用之前处理缺失值。无论如何,检查缺失值并理解如何处理它们是“了解”数据的重要部分。
# show null/NA values per column
df.isnull().sum()# show NA values as % of total observations per column
df.isnull().sum()*100/len(df)# drop all rows containing null
df.dropna()# drop all columns containing null
df.dropna(axis=1)# drop columns with less than 5 NA values
df.dropna(axis=1, thresh=5)# replace all na values with -9999
df.fillna(-9999)# fill na values with NaN
df.fillna(np.NaN)# fill na values with strings
df.fillna("data missing")# fill missing values with mean column values
df.fillna(df.mean())# replace na values of specific columns with mean value
df["columnName"] = df["columnName"].fillna(df["columnName"].mean())# interpolation of missing values (useful in time-series)
df["columnName"].interpolate()
列操作
通常情况下,您可能需要执行各种列操作,例如重命名或删除列、对列值进行排序、创建新的计算列等。
# select a column
df["sepal_length"]# select multiple columns and create a new dataframe X
X = df[["sepal_length", "sepal_width", "species"]]# select a column by column number
df.iloc[:, [1,3,4]]# drop a column from dataframe X
X = X.drop("sepalL", axis=1)# save all columns to a list
df.columns.tolist()# Rename columns
df.rename(columns={"old colum1": "new column1", "old column2": "new column2"})# sorting values by column "sepalW" in ascending order
df.sort_values(by = "sepal_width", ascending = True)# add new calculated column
df['newcol'] = df["sepal_length"]*2# create a conditional calculated column
df['newcol'] = ["short" if i<3 else "long" for i in df["sepal_width"]]
行操作(排序、过滤、切片)
到上一节为止,您已经清理了大部分数据,但数据准备的另一个重要部分是切片和过滤数据,以进入下一轮分析管道。
# select rows 3 to 10
df.iloc[3:10,]# select rows 3 to 49 and columns 1 to 3
df.iloc[3:50, 1:4]# randomly select 10 rows
df.sample(10)# find rows with specific strings
df[df["species"].isin(["Iris-setosa"])]# conditional filtering
df[df.sepal_length >= 5]# filtering rows with multiple values e.g. 0.2, 0.3
df[df["petal_width"].isin([0.2, 0.3])]# multi-conditional filtering
df[(df.petal_length > 1) & (df.species=="Iris-setosa") | (df.sepal_width < 3)]# drop rows
df.drop(df.index[1]) # 1 is row index to be deleted
分组
最后但同样重要的是,您通常需要按不同的类别对数据进行分组——这在探索性数据分析和深入了解分类变量时尤其有用。
# data grouped by column "species"
X = df.groupby("species")# return mean values of a column ("sepal_length" ) grouped by "species" column
df.groupby("spp")["sepal_length"].mean()# return mean values of ALL columns grouped by "species" category
df.groupby("species").mean()# get counts in different categories
df.groupby("spp").nunique()
摘要
这篇文章的目的是展示一些必要的 Pandas 函数,这些函数用于数据分析。在这次演示中,我遵循了一个典型的分析过程,而不是以随机的方式显示代码,这将允许数据科学家在项目中以正确的顺序找到正确的工具。当然,我不打算展示处理数据准备中的每个问题所需的每个代码,而是展示如何创建一个基本的 Pandas cheatsheet。
希望这有用。如果你喜欢这篇文章,请在 Twitter 上关注我。