如何使用 Python 中的 Geopandas 绘制全球抗生素耐药性数据
制作信息丰富的 Geopandas 图
Stephen Fordham(作者)使用 Python 中的 Geopandas 库制作的图像
介绍
越来越多的细菌出现了抗生素耐药性。令人担忧的是,对最后手段抗生素的耐药性正在上升。在本教程中,我将演示如何使用 Python 中的 Geopandas 库作为工具来引起全球对抗生素耐药性的关注。为此,我使用了两个数据源:
- 抗性评分数据集,其中抗性评分 1 至 3 对应于细菌对最终抗生素的抗性增加。
- 来自 ArcGIS 的数据集,包含每个国家的地理坐标。
如何绘制阻力位
目标是获取世界上所有国家的几何信息,并将这些数据与另一个列出全球抗生素耐药性得分的数据源合并。最后,我将演示如何绘制全球抗生素耐药性地图,这将作为一个有用的汇总信息图,有助于检测高和低耐药性区域。此外,通过绘制包括没有可用信息的区域的整个地图,将暴露可能缺乏监控的区域(至少对于此处使用的数据集而言)。
我遵循以下工作流程:
- 读入数据集
- 代表性提取(消除偏倚)
- 数据清理
- 合并数据集
- 测绘
如果您想访问这里使用的 Jupyter 笔记本,可以在我的 Github 页面上找到。
1.解析数据集:世界各国和抗生素耐药性得分
首先,使用 geopandas read_file 函数读取来源于 rcG 的形状文件。该文件包含与每个国家相关的必要几何信息。生成的对象是一个 geopandas 数据帧,其行为类似于本地 pandas 数据帧。
接下来,我们将使用 pandas read_csv 函数读取阻力分数数据集。我们可以简单地检查数据帧的头部,以确认数据已经被正确解析。我们现在可以创建一个新的列,使用 lambda 函数提取分数,如代码片段所示。我还重命名了这些列,以更准确地反映它们的内容。
2.代表性国家抽样
理想情况下,阻力分数应尽可能提供更多信息。为了实现这一点,明智的做法是对有≥ 10 个分离株的国家进行代表性采样。这将有助于避免我们在以后绘图时引入偏差。这可以通过对 country 列执行 groupby 方法调用并对这个 groupby 对象调用 size 方法来实现。然后,我们可以根据没有应用大小筛选的 groupby 对象进行筛选,对值进行排序,并检索由≥ 10 个隔离区表示的所有国家/地区。下面的代码片段演示了如何实现这一步。
现在我们有了一个代表性国家的列表,我们可以过滤原始 res 数据框架以产生一个新的数据框架,该数据框架对平均耐药性得分进行平均,并且只包括≥ 10 个分离物的国家。
res 数据框架现在在国家和抗性分数之间有一个很好的连接关系。
3.数据清理
我们接下来需要执行一点数据清理。这是必需的,因为有时国家可能有不同的名称。合并时,我们需要一个通用名称,因此包括美国在内的国家信息不会出现在单独的行中,例如一行代表“美国”,另一行代表“美国”。为了识别共享国家和非共享国家,我创建了一个简单的 for 循环,遍历 resistance score 数据帧中的国家。对于不在 geopandas 数据框架 gdf 中的每个国家,它将被添加到名为 different_countries 的列表中。
这两份清单显示了 61 个共同的国家和 6 个在两个数据框架之间不同的国家。我们必须要么删除这些国家,要么重新命名。对于重命名,我们将使用 geopandas 数据框架中的国家名称作为正式名称。
我选择删除条目:“未知”、“加勒比”和“香港”。未知不能被合理地绘制出来,加勒比海不够精确,我选择不把香港和中国捆绑在一起,因为我希望看到 mainland China 单独的阻力分数。这些条目在 res 数据帧中标识,随后使用 pandas drop 方法删除。这可以在下面的结果数据帧中看到,特别是索引 61 和 62 处的行现在缺失。
现在需要更改国名,英国、坦桑尼亚和美国。这包括首先确认它们在 geopandas 数据帧 gdf 中的原始名称。我们可以在 res 数据帧中找到它们的原始名称,并使用 pandas at 方法轻松地更改它们。要使用这种方法,我们只需要与行相关的索引和列名。
4.合并数据帧
最后,我们只需要合并两个数据源,这样我们就有了一个包含每个国家的阻力分数和几何图形的数据框架。为此,我们从 res 数据框架中的国家中过滤 geopandas 数据框架。然后,我们可以将结果对象 data 与相似国家列上的 res 数据帧合并,现在我们有一个名为 res_df 的数据帧,其中包含阻力分数和几何信息。
我们可以在这里停下来,绘制 res_df 数据框架,但是最好包括所有国家,甚至那些没有记录监测数据的国家。
为此,我们使用波浪符号并过滤 geopandas 数据框架 gdf,以查找不在原始 res 数据框架中的国家。我们将这个新的数据帧标记为 others,并将其指定为 a 列,其中阻力分数列为 np.NaN。我们最后将 res_df 和 others 数据帧连接到公共对象 res_geo 中。下面的代码片段演示了这是如何实现的。
注意:可以画 np。在 Geopandas 对象上使用 plot 方法。
合并后的数据帧如下所示。然而,对象 res_geo 是一个 pandas 数据帧,需要转换为 geopandas 数据帧以便绘图。这可以通过实例化 GeoDataFrame 类的实例并将 res_geo 作为参数传递来实现。
5.测绘
我们可以绘制地图,指定图形大小、我们要用于绘制数据的列、颜色映射以及国家之间的边缘颜色和宽度。这产生了一个需要进一步优化的拼凑的情节。
我们已经做了艰苦的工作,创建了资源地理数据库作为数据框架。通过一些小的修改,我们可以极大地改善映射,使其更具吸引力和可解释性。为了改善这一点,我们可以添加一个图例,一个更生动配色方案,包括没有监测数据的国家,并给它们贴上这样的标签,并提供一个合理的标题。
这些变化显示为传递给方法图的参数。如果您对其他颜色映射选项感兴趣,Geopandas 构建所基于的库 matplotlib 有大量颜色字符串可供选择。
摘要
Geopandas 是支持地理绘图的有用工具。对于本教程,我创建了一个 conda 虚拟环境,并按照安装说明在这里通过 conda 安装 geopandas,并在 Jupyter 笔记本中进行在线绘图。如果你感兴趣,我已经创建了一个 Jupyter 笔记本,在我的 GitHub 页面上详细描述了所有这些步骤,在那里也可以找到这两个数据集。虽然这里给出的例子是专门针对抗生素耐药性的,但概述的过程可以作为支持任何其他地理空间绘图的指南。
如何在一个图表中预测和可视化数据
蒂姆·波格丹诺夫在 Unsplash 上的照片
教程-预测-R
如何使用 R 和 ggplot2 以及线性回归的分步教程
在我最近的一个项目中,我被要求执行一个简单的线性回归来预测可能的价格发展。为了比较实际的价格发展,我们使用消费者价格指数作为基线。本文将向您展示我如何尝试使用不同的数据集来实现这一点——使用 ggplot2 进行绘图,使用线性回归进行预测。
1.设置
我将简要解释我的设置,包括我正在使用的数据和 R 包。
包装
一般来说,我总是使用 Tidyverse 包。它包括像 ggplot2 这样的软件包,以非常直观的方式创建美丽的图形, dplyr 使数据操作如此简单,等等。
此外,我使用了 ggthemes 包,为你的剧情提供了更多开箱即用的主题。
作者图片
啤酒节啤酒价格和通货膨胀指数数据
作为 focus 中的领先价格指数,我使用了世界上最大的啤酒节啤酒节的可用数据。该数据不仅包含啤酒价格信息,还包含游客数量、鸡肉价格和啤酒销量。
作者创建的表(限于三行)
我将使用德国消费者价格指数的可用信息来比较啤酒价格的发展。
数据本身来自德国联邦统计局的数据库。请注意Verbraucherpreisindex(VPI)是德语的消费价格指数(CPI)。
以 1991 年为基准年的消费者价格指数与啤酒价格一致;作者创建的表(限于三行)
2.我预测和可视化价格发展的工作流程
加入啤酒价格和 VDI 数据
创建线性回归模型
啤酒价格预测;作者创建的表(限于三行)
消费价格预测;由作者创建的表(限于三行)
连接所有数据集
联合数据集(原始数据、预测数据);由作者创建的表(限于三行)
创建一个包括预测和置信水平的线形图
啤酒节啤酒价格的发展与预测:作者创造的形象
啤酒节啤酒价格的发展与预测:作者根据 ggplot2 结果创建的图像
结论
本文向您展示了我如何可视化价格发展,以及我如何使用线性回归模型整合价格预测。当我查看结果时,我看到了两个明显的局限性。
首先,我知道线性回归通常不是价格的最佳预测工具,尽管在这种情况下它可能是合理的(例如,预测每年啤酒节啤酒价格的变化)。尽管我在可视化中包括了误差幅度,但它并没有考虑未来每一年不确定性的增加。而这一点并没有在这个模型中体现出来。我认为有必要研究一下霍尔特-温特斯预测方法和时间序列来应对这个问题。霍尔特-温特斯也考虑到了季节性。
其次,通过包含文本注释来创建可再现的图表会使代码变得非常混乱,难以维护(甚至难以编写)。此外,我不确定情节本身是否不平衡,是否充斥着所有的文本注释。
你认为我可以做些什么来改进这个解决方案?
如有任何问题和意见,请随时联系我。谢谢你。在这里找到更多我的文章:
如何从你的网站日志中预测客户流失
实践教程
大规模音乐流媒体服务流失分析和预测实用指南(PySpark 和 Plotly)
简介
如何预测客户流失?
∘ 第一步:清理网站日志数据
∘ 第二步:将您的网站日志转换为用户日志数据集
∘ 第三步:探索两个用户群的数据(流失与停留)
∘ 第三步:使用 ML 算法预测客户流失
结论
介绍
许多在线公司从订阅模式中获得很大一部分收入,因此追踪有多少客户停止使用他们的产品或服务是非常重要的。客户流失定义为现有客户取消订阅。如果我们能建立一个模型来预测一个当前客户是否会流失(1)或者不会流失(0),那么公司就可以通过提供更多的促销或者改善服务来防止他们的用户流失。如果你想了解更多关于客户流失的信息,请查看这个博客。
在许多面向客户的企业中,Spotify 等音乐流媒体服务可以利用其网站和应用程序上的庞大用户交互数据来预测客户流失。由于网站日志通常是“大数据”,因此使用 Spark 等大数据库来分析它们并预测大规模流失是非常必要的。在本文中,我将从一个高层次的角度来指导您的流失预测项目,并分享一些可视化和预测结果。如果想跳转到实用教程,请查看我的 Kaggle 帖子(复制我的笔记本可以在线玩笔记本)或者 Github 资源库 (fork 或者下载代码到你的本地系统)
你想先看看我的代码吗?请检查我的 Kaggle 笔记本或 Github 库。
https://www.kaggle.com/suhong/a-tutorial-of-customer-churn-analysis-prediction https://github.com/suhongkim/Churn-Prediciton-At-Scale.git
如何预测客户流失?
为了展示如何在实践中建立预测模型,我们将使用从虚拟音乐流媒体公司收集的虚构网站日志数据,该公司名为“Sparkify”,来自 Udacity 的数据科学 Nanodegree。首先,我们需要将这些疯狂的网站日志转换成一个干净的、聚合的用户日志数据集。然后,我们将使用 Plotly 可视化库分析数据集中与客户流失相关的要素。最后,我们将提取有意义的特征,并选择适当的机器学习算法来预测客户流失。让我们开始吧!
第一步:清理网站日志数据
让我们看看网站日志数据集的模式,并检查描述,以了解从网站收集了哪些类型的信息。请注意,粗体列名与客户流失有关,其他列名与网站日志信息有关。
| Column | Type | Description
|---------------|--------|----------------------------------------
| **ts** | long | the timestamp of user log
| sessionId | long | an identifier for the current session
| auth | string | the authentification log
| itemInSession | long | the number of items in a single session
| method | string | HTTP request method (put/get)
| status | long | http status
| userAgent | string | the name of HTTP user agent
| **userId** | string | the user Id
| **gender** | string | the user gender (F/M)
| **location** | string | the user location in US
| firstName | string | the user first name
| lastName | string | the user last
| **registration** | long | the timestamp when user registered
| **level** | string | the subscription level (free, paid)
| **artist** | string | the name of the artist played by users
| **song** | string | the name of songs played by users
| length | double | the length of a song in seconds
| **page** | string | the page name visited by users** the categories of **page**: Home, Login, LogOut, Settings, Save Settings, about, NextSong, Thumbs Up, Thumbs Down, Add to Playlist, Add Friend, Roll Advert, Upgrade, Downgrade, help, Submit Downgrade, Cancel, **Cancellation Confrimation**
我删除了一些userId
为空的记录,然后添加了一个目标列(churn
)和三个额外的列,如下所示。
churn
(整数):使用Cancellation Confirmation
事件为付费和免费用户定义的流失状态(1:流失,0:停留)ds
(日期):时间戳数据转换成的日期戳ts
dsRestration
(日期):从时间戳数据转换的日期戳registration
locCity
(字符串):来自location
数据的城市名称
Below is the sample of new columns
+------+-----+----------+--------------+--------------+
|userId|**churn**| ds|dsRegistration| locCity|
+------+-----+----------+--------------+--------------+
|100010| 0|2018-10-08| 2018-09-27| Bridgeport|
|200002| 0|2018-10-01| 2018-09-06| Chicago|
| 125| 1|2018-10-12| 2018-08-01|Corpus Christi|
+------+-----+----------+--------------+--------------+
网站日志数据集
第二步:将你的网站日志转换成用户日志数据集
为了预测用户的流失状态,需要为每个用户转换网站日志数据。首先,我们需要丢弃一些与客户流失事件无关的列,比如会话日志和用户名。然后,我们可以基于userId
转换数据,有两种类型的数据:用户信息和用户活动。我们的数据中的用户信息列是churn
、gender
、level
和locCity
,对于每个用户必须是相同的。
+------+-----+------+-----+--------------+
|userId|churn|gender|level| locCity|
+------+-----+------+-----+--------------+
|100010| 0| F| free| Bridgeport|
|200002| 0| M| free| Chicago|
| 125| 1| M| free|Corpus Christi|
+------+-----+------+-----+--------------+
对于用户活动数据,我们需要聚集日志数据来创建一些有意义的特性。我在下面列出了添加到用户日志数据集中的新列。
lifeTime
(long):用户生存期是用户在网站上存在的时间,数字表示从注册日期到最后一次活动登录日期的天数playTime
(double):歌曲播放时间是指用户访问next song
页面时,总播放歌曲的平均时间(秒)numSongs
(long):每个用户的歌曲名称总数numArtists
(long):每个用户的艺术家姓名总数numPage_*
(long):每个页面、每个用户的页面访问总数。请注意,Cancellation
和Conform cancellation
页面不考虑用于特征组,因为它们用于生成churn
标签。另外,Login
和Register
在我们的数据集中对所有用户都没有计数,所以它们会被自动删除
+--------------+-----------------+--------+----------+-------------+
|lifeTime(days)| PlayTime(sec)|numSongs|numArtists| numPage_*|
+--------------+-----------------+--------+----------+-------------+
| 55|318224.4166666667| 269| 252| 1|
| 70|187044.0476190476| 378| 339| 3|
| 72| 1762.0| 8| 8| 0|
+--------------+-----------------+--------+----------+-------------+
用户日志数据集
在开始可视化之前,让我们用几个数字总结一下我们到目前为止所做的工作!
The shape of the raw data: (286500, 18)
The shape of the clean data: (278154, 18)
The shape of the website-log data: (278154, 22)
The shape of the User-Log data(df_user): (225, 26)The number of users (unique userId): 225
The count of churned users (1): 52
The count of Not-Churned users (0): 173The logging period: 2018-10-01 - 2018-12-03
第三步:探索两个用户群的数据(搅动与停留)
将与我们的目标价值相关的特征可视化非常重要,因为我们对客户流失事件背后的机制有更好的直觉。让我们从揭示每月被搅动的用户数量是如何变化的开始(这个小型数据集的记录周期是 2 个月长)
图片作者:苏红·金
总用户数从 10 月份的 213 人下降到 11 月份的 187 人。具体来说,停留用户数略微增加了 4 人,而流失用户数减少了一半以上(10 月份为 55 人,11 月份为 22 人),这表明 Sparkify 服务成功地留住了现有客户。如果我们有更多关于 Sparkify 业务和活动的数据,我们就可以从这一观察中分析什么样的因素会影响更少的客户流失。
图片作者:苏红·金
我们可以观察到男性用户倾向于搅拌更多。
免费订阅级别的用户在请求
Submit Downgrade
但未到达cancellation confirmation
页面时可能处于流失状态—请注意,我们仅在用户访问取消确认页面时定义流失状态。因此,这一类别中的那些过去的订户可以成为营销人员为该网站留住更多用户的主要目标。
图片作者:苏红·金
你可以从上面的散点图中看到的流失率是每个城市中流失用户与人口的比例。由于该数据集是合成的,城市的流失率显示出许多极值,如 0%或 100% ,这导致我们需要为我们的预测模型排除该特征的结论。
到目前为止,我们已经探索了分类特征,如性别、订阅级别和位置(第一个图表“时间分析”只是为了了解被搅动的用户的趋势)。正如您在步骤 2 部分看到的,我们生成了新的数字特征来描述网站上的用户活动。让我们把它们形象化!
图片作者:苏红·金
搅动的用户倾向于比停留的用户具有更短的寿命和歌曲播放时间。
兴奋组倾向于选择种类稍少的歌曲和艺术家(两张图看起来相似,可能有很高的相关性)
图片作者:苏红·金
当我们从原始数据集中的页面列中创建 17 个不同的特征时,我选择了一些重要的特征来在上面的图表中可视化。其中,我注意到页面
**SubmitDowngrade**
与其他页面相比似乎具有离散分布,因此我决定将该特征从预测模型的数值变量更改为分类变量。
第三步:使用 ML 算法预测客户流失
通过可视化,我们最终可以通过修改用户日志数据集来为预测模型选择我们的特征,如下所示。
LocCity
将从特征集中删除,因为它有许多极值numSongs
和numArts
高度相关(0.99),因此numSongs
将仅被选择用于特征集numPage_SubmitDowngrade
将被转换为只有两个值的分类特征page_SubmitDowngrade
:已访问或无- 与
page
栏相关的特征相互之间有很多关联,所以我只选择了 7 个特征:numPage_About
、numPage_Error
、numPage_RollAdvert
、numPage_SaveSettings
、numPage_SubmitDowngrade
、numPage_ThumbsDown
、numPage_Upgrade
图片作者:苏红·金
The schema of df_feat
|-- userId: string, User Identification Info (not used for feature)
|-- **label**: integer, the target(Churn) for the prediction model
<Categorical Features>
|-- gender: string ('F' or 'M')
|-- level: string ('paid' or 'free')
|-- page_SubmitDowngrade: string ('visited' or 'none')
<Numerical Features>
|-- lifeTime: integer
|-- playTime: double
|-- numSongs: long
|-- numPage_About: long
|-- numPage_Error: long
|-- numPage_RollAdvert: long
|-- numPage_SaveSettings: long
|-- numPage_SubmitUpgrade: long
|-- numPage_ThumbsDown: long
|-- numPage_Upgrade: long
让我们开始使用 Spark 中的 ML 库来构建预测模型的管道。为了更好的交叉验证,我将所有的特征转换和一个估计器合并到一个管道中,并将其送入CrossValidator
。管道有三个主要部分。
- 特征转换:类别变量将被
StringIndexer
和OneHotEncoder
转换成一个热点编码向量。然后,使用VectorAssembler.
将分类向量和数值变量组装成密集特征向量 - 特性重要性选择:我构建了一个定制的
FeatureSelector
类,使用一个基于树的评估器只提取重要的特性。这一步是可选的,所以我没有将它用于逻辑回归或 LinearSVC 模型。 - 估计器:最后一步是使用 ML 算法来估计每个用户的流失标签。
有了这个管道,我选择了五个不同的估值器来根据 F1 分数选择带有默认参数的最佳算法,因为我们的数据是不平衡的。作为下面的结果,我为我们的预测模型选择了RandomForestClassifier
,它显示了最高的验证分数(0.78)。
<The result of the model selection>
--------------------
**LogisticRegressionModel**: numClasses=2, numFeatures=16
train_f1: 0.8275, test_f1: 0.7112
--------------------
**LinearSVCModel**: numClasses=2, numFeatures=16
train_f1: 0.8618, test_f1: 0.7472
--------------------
**DecisionTreeClassificationModel**: depth=5, numNodes=31, numFeatures=7
idx name score
0 0 lifeTime 0.439549
1 1 numSongs 0.207649
2 2 numPage_ThumbsDown 0.137043
3 3 numPage_RollAdvert 0.096274
4 4 playTime 0.062585
5 5 numPage_Error 0.045681
6 6 numPage_About 0.011218train_f1: 0.9373, test_f1: 0.7667
--------------------
**RandomForestClassificationModel**:numTrees=20, numFeatures=12
idx name score
0 0 lifeTime 0.315996
1 1 playTime 0.174795
2 2 numPage_ThumbsDown 0.101804
5 5 numSongs 0.089395
3 3 numPage_RollAdvert 0.080125
6 6 numPage_Upgrade 0.053891
4 4 numPage_About 0.053557
7 7 numPage_Error 0.051073
8 8 numPage_SaveSettings 0.033237
9 9 numPage_SubmitUpgrade 0.024314
11 11 genderVec_M 0.012589
10 10 levelVec_paid 0.009225train_f1: 0.9086, test_f1: 0.7788
--------------------
**GBTClassificationModel**: numTrees=20, numFeatures=11
idx name score
0 0 numPage_ThumbsDown 0.276418
1 1 lifeTime 0.191477
2 2 numSongs 0.104416
4 4 numPage_RollAdvert 0.080323
5 6 numPage_About 0.074554
9 5 levelVec_free 0.068573
3 3 playTime 0.067631
6 7 numPage_Upgrade 0.050553
7 8 numPage_Error 0.042485
10 9 genderVec_M 0.029921
8 10 numPage_SubmitUpgrade 0.013649train_f1: 1.0, test_f1: 0.7615
最后,我运行了交叉验证来调整RandomForestClassifier
的超参数。由于我们的数据集非常小,您可以观察到几乎完美的训练分数,表明模型过度拟合。因此,我选择了一些交叉验证参数映射,以使该模型与我在上述模型选择中使用的默认模型(numTrees=20)相比不那么复杂。结果显示,具有 10 棵树和 16 个最大箱的模型具有稍好的性能,但是没有很好地克服过拟合问题。我假设这个问题可以通过增加更多的数据来解决。
**RandomForestClassificationModel**: numTrees=10, numFeatures=11
**Best parameters**:[('bootstrap', True), ('cacheNodeIds', False), ('checkpointInterval', 10), ('featureSubsetStrategy', 'auto'), **('impurity', 'gini'), ('maxBins', 16), ('maxDepth', 5), ('numTrees', 10)**, ('maxMemoryInMB', 256), ('minInfoGain', 0.0), ('minInstancesPerNode', 1), ('minWeightFractionPerNode', 0.0), ('seed', -5400988877677221036), ('subsamplingRate', 1.0)]
idx name score
0 0 lifeTime 0.346846
1 1 playTime 0.160187
2 2 numSongs 0.104921
5 5 numPage_ThumbsDown 0.102716
6 6 numPage_About 0.075681
4 4 numPage_Upgrade 0.075326
3 3 numPage_RollAdvert 0.048552
7 7 numPage_Error 0.044421
8 8 numPage_SaveSettings 0.028647
9 9 levelVec_free 0.009174
10 10 page_SubmitDowngradeVec_visited 0.003529**train_f1: 0.9287, valid_f1: 0.7608 test_f1: 0.7255**
结论
在本文中,我们解决了最具挑战性和最常见的业务问题之一——如何预测客户流失。从令人讨厌的巨大网站日志中,我们提取了每个用户的几个有意义的特征,并基于两个用户组(搅动与停留)将它们可视化,以进行更多分析。最后,我们建立了包括特征变换和估计器的 ML 流水线,它被馈送到交叉验证器用于模型选择和超参数调整。最终模型显示了相当高的测试分数(f1 分数:0.73),但由于小数据集大小(128MB)的限制,它也存在过拟合问题。由于 Udacity 在 AWS cloud 上提供了完整的数据集(12GB ),我有一个计划来部署这个 Spark 集群,以便很快处理过拟合问题。
当然,在不考虑数据大小的情况下,我们可以做很多事情来改进这个模型。首先,不管时间因素如何,大多数特征都是聚合的。日志收集时间为 2 个月,因此最好使用不同的方法(如加权总和)强调最近的日志。此外,我们可以应用一些策略来处理数据不平衡(这个博客将帮助你得到一些想法)。此外,我们可以将这个问题建模为时间序列模型,因为流失率应该定期报告给业务利益相关者。
我希望这个项目能够为您提供一个教程,教您如何使用数据科学和机器学习技能来处理大数据,以解决现实世界中的一个问题。另外,使用 Spark 和 Plotly 库也是很好的练习。感谢您的阅读,并希望通过我的 LinkedIn 随时与您联系!
如何预测 NBA 两双
实践教程
学习在 R 中建立一个逻辑回归模型,预测 NBA 全明星球员尼古拉·武切维奇是否会取得两双。
作者图片*。2018 年 3 月 2 日,奥兰多魔术队主场比赛大屏幕上的武切维奇。*
逻辑回归模型允许我们基于一个或多个称为预测变量的输入来估计分类响应变量的概率。传统上,响应是二进制真/假值,但也可以是其他组合,如通过/失败,甚至是分类小/中/大。
这篇文章将着重于创建一个模型来预测一个 NBA 球员尼古拉·武切维奇在一场 NBA 篮球赛中获得两双的概率。这将通过提供在 r 中构建逻辑回归模型的必要步骤来演示。
逻辑回归模型目标的一个例子是,在 95%的置信度下,我们可以根据预测变量 X、Y 和 z 在 80%的时间内预测响应变量的结果。百分比将根据测试规格和模型质量而变化。
尼古拉·武切维奇是奥兰多魔术队的全明星中锋。除了为我的家乡球队效力之外,他还是一名在同一支球队长期任职的稳定球员,这使得他的篮球统计非常适合数据科学项目。
在他 10 年的职业生涯中,武切维奇取得了超过 344 次两双。在 NBA,两双的定义是在得分、篮板、助攻、抢断或盖帽这两个类别中得到 10 分或更多。这通常是通过在一场比赛中得到 10 分或更多,10 次或更多的助攻,或者在一场比赛中得到 10 分或更多,10 个或更多的篮板来实现的。
导入数据
构建任何模型的第一步都是获取准确的数据集。Basketball-Reference 跟踪 NBA 球员的数据点,通常是建立预测模型的起点。从一个 玩家的页面获取游戏数据有两种方法。
- 使用像 rvest 这样的 R 包来抓取每个赛季的球员数据。
- 下载每个赛季的 CSV 文件然后上传到 r。
在 Vucevic 的例子中,你应该有 10 个数据集代表 2012 到 2021 赛季。
一旦游戏日志数据在 R 中,向每个数据集添加一个新列“Season ”,然后使用 rbind()将各个数据集合并成一个“Vucevic”数据集。
#Add Column to Indicate Season
Vucevic2021$Season <- 2021#Use rbind() to Combine Data Frames
Vucevic <- rbind(Vucevic2012, Vucevic2013, Vucevic2014, Vucevic2015, Vucevic2016,Vucevic2017, Vucevic2018, Vucevic2019, Vucevic2020, Vucevic2021)
清理数据
虽然高度准确,但是来自 Basketball-Reference 的数据需要进行一些清理,然后才能在我们的模型中使用它。特别是对于这个数据集,我们需要删除不代表所玩游戏的行,更新缺少的列名,并更新 Location 和 WinLoss 列中的数据值。
#Remove rows that do not correspond to a basketball game.
Vucevic <- Vucevic [!(Vucevic$GS == "Did Not Play" |
Vucevic$GS == "Did Not Dress" |
Vucevic$GS == "GS" |
Vucevic$GS == "Inactive" |
Vucevic$GS == “Not With Team”),]#Use the index method to add missing column names
colnames(Vucevic)[6] <-c("Location")
colnames(Vucevic)[8] <-c("WinLoss")
在位置栏中,一个“@”代表客场,空代表主场。稍后,通过将这些值转换为“Away”和“Home ”,我们可以将其转换为 factor 数据类型来测试我们的模型。
#Use an ifelse() to specify “Away” and “Home” games
Vucevic$Location <- ifelse(Vucevic$Location == "@", "Away", "Home")
类似地,WinLoss 列具有遵循“W (+6)”格式的字符值。虽然阅读统计行的人可以将“W (+6)”解释为游戏以 6 分获胜,但对于模型构建来说,WinLoss 列包含“W”或“L”更有用。
#Split the column using str_split_fixed()
Index <- str_split_fixed(Vucevic$WinLoss, " ", 2)#Add the new column to the Vucevic dataframe
Vucevic <- cbind(Vucevic, Index) #Add Matrix to DataFrame#Remove the previous WinLoss column
Vucevic <- Vucevic %>% select(-WinLoss)#Update the new WinLoss column
names(Vucevic)[names(Vucevic) == "1"] <- "WinLoss"#Remove the column containing (+6)
Vucevic <- Vucevic %>% select(-"2")
有些清洁步骤取决于个人喜好。这里我们将“Rk”和“G”变量改为更具描述性的“TeamGameSeason”和“PlayerGameSeason”。
#Update Column Names
names(Vucevic)[names(Vucevic) == "Rk"] <- "TeamGameSeason"
names(Vucevic)[names(Vucevic) == "G"] <- "PlayerGameSeason"
数据转换
与数据清理密切相关的是数据转换,即将数据从一种数据类型转换为另一种数据类型。对数据建模时,整数、数字和因子数据类型很有帮助。为了理解为什么记住逻辑回归是一个数学公式很重要,其中:
*响应变量=截距+(斜率效率 1 变量 1) +误差
求解数学公式需要使用数字、整数或因子输入。虽然诸如“Home”和“Away”等因子值显示为文本标签,但在 R 中,因子存储为整数。
目前,Vucevic 数据框中的大多数变量都存储为字符文本值。要同时转换多个变量的数据类型,请使用 hablar 库和 tidyverse。
#View the column names in your dataset
colnames(Vucevic)#View the current datatype of an individual column variable
datatype(Vucevic$TeamGameSeason) #Convert variable datatypes
Vucevic <- Vucevic %>% convert(
int("TeamGameSeason", "PlayerGameSeason", "FG",
"FGA", "3P", "3PA", "FT", "FTA", "ORB",
"DRB", "TRB", "AST", "STL", "BLK", "TOV",
"PF", "PTS", "+/-", "PlayerGameCareer"),
num("FG%", "3P%", "FT%", "FG%", "FT%", "3P%",
"GmSc"),
dte("Date"),
fct("Team", "Location", "Opponent", "WinLoss",
"GameStarted"))
创建 Double-Double 响应变量
要预测武切维奇未来是否会取得两双,我们需要计算他过去有哪些比赛取得了两双。
如前所述,两双的定义是在得分、篮板、助攻、抢断或盖帽这两个方面得到 10 分或更多。
一个嵌套的 ifelse()可以用来计算武切维奇在之前的哪些比赛中取得了两双。创建新变量后,我们可以使用 ggplot2 来可视化结果。
#Create a variable that calculates DoubleDoubles
Vucevic$DoubleDouble <-
ifelse(Vucevic$PTS>=10 & Vucevic$AST>=10,TRUE,
ifelse(Vucevic$PTS>=10 & Vucevic$TRB>=10,TRUE,
ifelse(Vucevic$PTS>=10 & Vucevic$BLK>=10,TRUE,
ifelse(Vucevic$PTS>=10 & Vucevic$STL>=10,TRUE,
ifelse(Vucevic$AST>=10 & Vucevic$TRB>=10,TRUE,
ifelse(Vucevic$AST>=10 & Vucevic$BLK>=10,TRUE,
ifelse(Vucevic$AST>=10 & Vucevic$STL>=10,TRUE,
ifelse(Vucevic$TRB>=10 & Vucevic$BLK>=10,TRUE,
ifelse(Vucevic$TRB>=10 & Vucevic$STL>=10,TRUE,
ifelse(Vucevic$BLK>=10 & Vucevic$STL>=10,TRUE,
FALSE))))))))))
(作者在 RStudio 中创建的图像)
将数据分成训练集和测试集
在运行我们的模型之前,我们需要将 Vucevic 数据集分成单独的训练和测试数据集。分割我们的数据允许我们使用一组数据来训练我们的模型,使用一组数据来测试模型的效果。
使用 rsample 包指定分层重新采样方法中使用的数据分割和变量。
这里的数据使用 70/30 分割成 VucevicTrain 和 VucevicTest 数据集。然后标识 DoubleDouble 以确保两个数据集中的真/假值比率相似。
#Identifying the split
set.seed(123)
VucevicSplit <- initial_split(Vucevic, prob = 0.7, strata = "DoubleDouble")#Creating training dataset
VucevicTrain <- training(VucevicSplit)#Creating testing dataset
VucevicTest <- testing(VucevicSplit)
准备多元逻辑回归
提高模型准确性的一种方法是在进行预测时合并多个变量。以下方法用于确定包括哪些变量:
- 确定左侧泄漏变量,并将其从 Vucevic 数据集中移除。
- 去掉赛后变量和其他意义不大的。
- 使用相关矩阵从 Vucevic 数据集中删除统计上相似的变量。
- 创造提供附加值的新变量。
左侧数据泄漏
在回归模型中,响应变量在左边,预测变量在右边。左侧泄漏是指输入到模型中的变量也用于计算响应变量的值。
当预测武切维奇是否会有两双时,我们需要确保预测不是基于任何用来计算两双的变量。
分,篮板,助攻,抢断,盖帽都和我们如何计算两双有直接关系,会被去掉。作为这 5 个变量组成部分的其他变量也需要删除。比如进攻篮板,罚球,罚球尝试。
#Removing left side leakage variables
Vucevic <- Vucevic %>% select(-FG, -FGA, -FT, -FTA, -ORB, -DRB,
-TRB, -AST, -STL, -BLK, -PTS, -GmSc)#Any variable names that start with a number, or include % will need "" to remove
Vucevic <- Vucevic %>% select(-'FG%', -'3P', -'3PA', -'3P%', -'FT%')
移除赛后变量
我们模型的目标是 预测 武切维奇是否会拿下两双。虽然我们可以在比赛后统计失误和犯规次数时这样做,但我们更有可能在比赛开始前使用这个模型。为了说明这一点,我们去掉了所有在游戏结束后才可用的变量。
#Remove post-game variables
Vucevic <- Vucevic %>% select(-TOV, -PF, -"+/-", -WinLoss)
移除任何其他不太可能影响模型的变量。在这里,分钟和秒非常类似于可变分钟,而年龄则类似于游戏玩家。球员变量从 Vucevic 数据集中删除,因为我们分析的唯一球员是 Vucevic。
#Remove additional variables
Vucevic <- Vucevic %>% select(-Age, -MinsPlayed, -Player, -Seconds)
确定统计相似变量的相关矩阵
通过创建剩余变量的相关矩阵,我们可以确定是否有任何变量在统计上彼此相似。
(作者在 RStudio 中塑造的形象)
上图显示 TeamGameSeason 和 PlayerGameSeason 之间有很强的相关性,这由两个变量相交的深绿色和 0.97 值表示。
PlayerGameSeason 是以武切维奇一个赛季的出场次数来计算的,TeamGameSeason 是以他的球队一个赛季的出场次数来计算的。如果武切维奇长期或频繁受伤,这些计算将显示更多的变化。既然他们没有,我们可以摆脱任何一个。这里删除了变量 TeamGameSeason。
TeamPHI 和 TeamORL 都会影响多个其他变量。这很可能是因为武切维奇在新秀年只为费城打过球。作为一名新秀,他不太可能首发(GameStarted1),参加过更少的比赛(PlayerGameCareer),也不太可能拿下两双。
我们可以放心地去掉团队变量,因为其他变量将是更好的预测因素。
创建附加变量
现在只剩下四个变量,PlayerGameSeason、Location、GameStarted 和 PlayerGameCareer 来建立多元逻辑回归模型。
虽然我们的模型可能会使用这四个变量,但其他变量可能会提供更好的见解。
- Back to Back: 使用 mutate()和 lag()创建,表示前一天晚上是否玩了游戏。
- Conference: 使用东方或西方会议的嵌套 ifelse()创建。
- ****时区:使用带有 or 运算符的嵌套 ifelse()创建。
#Create New Variable DaysSinceLastGame
Vucevic <- Vucevic %>%
arrange(Vucevic$Date) %>%
mutate(DaysSinceLastGame = Vucevic$Date - lag(Vucevic$Date))#Create New Variable BackToBack
Vucevic$BackToBack <- ifelse(Vucevic$DaysSinceLastGame == 1, TRUE, FALSE)#Delete DaysSinceLastGame
Vucevic <- Vucevic %>% select(-Date, -DaysSinceLastGame)
请注意,由于篇幅限制,创建会议和时区变量的代码被截断,仅显示亚特兰大和波士顿。
#Create New Variable Conference
Vucevic$Conference <- ifelse(Vucevic$Opponent == "ATL", "Eastern",
ifelse(Vucevic$Opponent == "BOS", "Eastern",#Create New Variable TimeZone
Vucevic$TimeZone <- ifelse(Vucevic$Location == "Home", "Eastern",
ifelse(Vucevic$Location == "Away" &
Vucevic$Opponent == "ATL", "Eastern",
ifelse(Vucevic$Location == "Away" &
Vucevic$Opponent == "BOS", "Eastern",
运行多元逻辑回归模型
在测试了逻辑回归模型中七个剩余独立变量的多种组合后,由于独立变量的 p 值较低,选择了以下两个模型进行进一步检验。
#Logistic Regression Model 1
LogisticRegMultiple1 <- glm(DoubleDouble ~ BackToBack +GameStarted
+PlayerGameSeason, family = "binomial",
data = VucevicTrain)#Logistic Regression Model 2
LogisticRegMultiple2 <- glm(DoubleDouble ~ +GameStarted +BackToBack
+PlayerGameSeason +PlayerGameCareer,
family = "binomial", data = VucevicTrain)
(图片由作者在 RStudio 中创建)
(图片由作者在 RStudio 中创建)
通过在评估阶段测试这些模型,我们可以进一步评估多个模型的准确性。
评估多元逻辑回归模型
由于我们的总数据集的样本大小只有 621 个游戏,基于测试数据集的 30%中的特定游戏,单个测试数据集的验证可能会有很大差异。
k 重交叉验证是一种重采样方法,将训练数据随机分为 k 组。它在 K-1 个折叠(也称为组)上拟合模型,然后被遗漏的组用于测试性能。这意味着它测试模型 K 次,平均 K 测试误差是交叉验证估计值。
#Convert response column to factor if necessary
Vucevic$DoubleDouble <- as.factor(Vucevic$DoubleDouble)
class(Vucevic$DoubleDouble)#Example of K-fold Cross Validation Model
set.seed(123)
cv_model3 <- train(
DoubleDouble ~ TeamGameSeason +PlayerGameSeason +GameStarted +PlayerGameCareer +BackToBack,
data = Vucevic,
method = "glm",
family = "binomial",
trControl = trainControl(method = "cv", number = 10),
na.action = na.exclude)#Compare 3 Models
summary(resamples(list(
model1 = LogisticRegMultiple1,
model2 = LogisticRegMultiple2,
model3 = cv_model3)))$statistics$Accuracy
(图片由作者在 RStudio 中创建)
虽然 59%、60%和 59%的平均模型分数表示弱模型,但是可以使用混淆矩阵进一步评估这些模型。
从下面的矩阵中我们可以看到,当武切维奇拿下两双(参考正确)时,该模型预测武切维奇不会拿下两双(预测错误)的可能性几乎与他会拿下两双(预测正确)的可能性一样大。
虽然这个模型在预测武切维奇不会得到两双时更加准确,但它仍然只有 68%的准确率。
# predict class
pred_class <- predict(cv_model3, Vucevic, )# create confusion matrix
confusionMatrix(
data = relevel(pred_class, ref = "TRUE"),
reference = relevel(Vucevic$DoubleDouble, ref = "TRUE"))
(作者在 RStudio 中创建的图片)
结论
在这里,最准确的逻辑回归模型只能预测武切维奇是否会在平均 61%的时间里拿下两双。
虽然这种模式并不是压倒性的,但统计数据仍然显示,与机会相比,它是成功的。在不使用任何信息的情况下,电脑猜对了武切维奇是否会有 54.74%的几率拿下两双。逻辑回归模型的准确率为 61.32%,比随机猜测的准确率提高了 6.5%。
虽然模型的准确性并不惊人,但通过观察 p 值,我们可以确定比这更极端的观察结果预计只会在 1000 万次试验中随机出现 5254 次。
因此,在 95%的信心下,我们可以预测尼古拉·武切维奇是否会在 61%的时间里获得两双,这是基于 TeamGameSeason,player gamesasonage,GameStarted,PlayerGameCareer 和 BackToBack 的预测变量。
未来分析
每位数据科学家将使用略有不同的变量和方法来创建模型。在这个例子中,我们创建了一个变量 BackToBack。如果您的数据集没有该变量,您的模型结果将会不同。
同样,每个 NBA 球员都有不同的比赛风格,受相同变量的影响也不同。有些人在主场或对阵前球队时表现明显更好。其他人在背靠背的第二个晚上或在特定时区表现不佳。这种变化意味着每个 NBA 球员都将有一个独特的逻辑回归模型来预测他们是否会得到两双。
为了提高准确性,我们可以从额外的数据集中整合其他变量,或者通过纳入其他参与者来扩大观察的数量。
扩大观察数量的一个例子是包括奥兰多魔术队任何现任成员参加的所有 4,555 场 NBA 常规赛。
然后在 95%的置信度下,我们可以根据预测变量 player、Season、PlayerGameSeason、GameStarted 和 PlayerGameCareer 来预测奥兰多魔术队的球员是否会在 90%的时间里获得两双。
如果你发现一个 NBA 球员或变量组合增加了逻辑回归模型的准确性,请在下面发表评论。
有关获取数据集的更多信息,请查看我的另一篇文章:
**https://medium.com/@ajpiter/web-scraping-nba-all-star-data-8788a7136727 **
如何预测没有数据的事物——还有盆景树
在日常生活中,我们经常不得不在没有数据的情况下做出预测。这里有一些更好的猜测方法。
托德·特拉帕尼在 Unsplash 上的照片
在生活中,你常常不得不用很少或没有数据来预测事情。或者只是你将知道人口的分布,仅此而已。例如,你在圣诞节收到的一棵盆景树出现在尴尬的家庭聚会上的概率有多大?
在本文中,我将简要讨论一些来自统计数据的深刻见解,这些见解将有助于您回答这些问题。我并不承诺预测未来,我只是要向你展示我们所拥有的最好的技术,尽管我们缺乏数据,但这些技术通常会产生令人惊讶的好结果。
以下灵感来自布莱恩·克里斯蒂安和汤姆·格里菲斯的《 算法靠 》中的一章。
预测盆景树的寿命——哥白尼原理
你的陌生叔叔送了你一棵盆景树,这显然是一份恐慌性购买的圣诞礼物。它甚至没有护理手册或说明书。他们显然对盆景树一无所知。你也不知道,但是你知道他们因为一件事而出名——死亡。
因此,就像一个优秀的(有点虐待狂的)数据科学家一样,你的思维会立即试图预测它的死亡。问题是,你只知道这棵树已经 4 岁了。你不知道盆景树能活多久,你也不知道它们决定放弃生存意志的原因。那么,你究竟是如何预测的呢?
在一个理想的大数据世界中,你将拥有数百万棵盆景树的海量数据集,你将拥有足够的盆景知识,能够从你自己的潜在自杀小朋友那里提取特征。然后,你可以运行一些机器学习模型,并很好地预测你的小家伙会活多久。但是,你没有丰富的数据。
那么你能做什么呢?
进入哥白尼和约翰·理查德·戈特三世。
天体物理学家理查德·戈特三世(Richard Gott III)在 1969 年站在那里凝视着柏林墙并思考它会持续多久时,第一次想到了他的“哥白尼方法”。戈特提出理论,认为哥白尼原理适用于一无所知的情况;除非他的访问有什么特别之处(他并不认为有),否则他有 50%的可能在生命的前半段之后看到长城,有 75%的可能在第一季度之后看到长城。
基于它在 1969 年的年龄(8 岁),Gott 离开长城时有 50%的信心认为它在 1993 年不会在那里(1969 + 8 (1.5/0.5))。
因此,我们可以将同样的逻辑应用于我们的盆景树。根据其年龄(2021 年为 4 岁),我们可以使用 Gott 逻辑得出类似的结果——(2021+4)*(1.5/0.5)。
因此,我们可以满怀信心地期待,我们的小朋友将会在 2033 年重返故土。
然而,50%置信区间不是很有用,是吗?那么,如果我们提高到 95%的标准置信度会发生什么呢?我们得到的结果表明,95%的人相信我们的盆景能够存活 0.1 至 36 年。
如何提高你的猜测能力
哥白尼原理实际上只是对 T4 贝叶斯法则的一种适应,即所谓的无信息先验(我们对盆景生命的潜在分布一无所知)。
显然,如果我们知道盆景预期寿命的潜在分布,我们可以做出更好的猜测。
盆景树遵循所谓的 幂律分布 。幂律分布是一种允许多尺度的分布。盆景可以活一个月、一年、十年、一个世纪甚至几千年。当将贝叶斯定律应用于幂律分布时,适当的预测策略是乘法规则,其中您将经过的时间乘以一个常数因子。在哥白尼原理的例子中,这个常数将是 2。因此,如果您之前没有任何信息,也不知道它的分布,那么您应该猜测您的盆景应该一直活下去。
当应用贝叶斯定理时,许多其他分布具有不同的最佳预测策略。例如,正态分布需要一个平均值规则,如果盆景低于平均值,您应该预测平均值,如果盆景超过平均值,您应该预测稍长一点的时间。
对日常生活的影响
那么,这对日常生活意味着什么呢?事实证明,一般来说,人类非常擅长使用正确的预测规则。格里菲斯和特南鲍姆在一项实验中强调了这一点。他们将人类直觉与应用贝叶斯法则的真实世界数据进行比较,发现结果非常接近。
因此,在万不得已的情况下相信自己的直觉是有意义的——如果真的没有数据的话。可能没有任何数据,但是你的大脑已经通过潜移默化发展了自己对分布的理解。
“小数据是伪装的大数据”。
—布莱恩·克里斯蒂安和汤姆·格里菲斯
然而,你固有的前科是提供给你的信息的函数。因此,要想做出更好的预测,你只需在对世界的理解上消息灵通且不带偏见。
在算法向你提供你想看的耸人听闻的新闻的现代,让你的新闻输入多样化是有意义的,正如克里斯蒂安和格里菲斯所说,关掉新闻甚至可能是一个好主意。
如果你在圣诞节收到了一个盆景,只要谷歌一下如何照料它就行了。
感谢阅读,我希望你喜欢它。我的一些其他文章的链接可以在下面找到。
If I’ve inspired you to join medium I would be really grateful if you did it through this [link](https://jamesasher4994.medium.com/membership) — it will help to support me to write better content in the future.If you want to learn more about data science, become a certified data scientist, or land a job in data science, then checkout [365 data science](https://365datascience.pxf.io/c/3458822/791349/11148) through my [affiliate link.](https://365datascience.pxf.io/c/3458822/791349/11148)
干杯,
詹姆斯。
Python 中的时间序列预测
基于 ARIMA 模型的端到端时间序列预测
林赛·亨伍德在 Unsplash 上的照片
自从 Covid 和封锁开始以来,自由行走对包括我自己在内的许多人来说都是一种奢侈。就我个人而言,我每天都试图离开我的笔记本电脑,出去呼吸一些新鲜空气。每周,我都会从手机上查看我的步数,看看我是否做了足够的锻炼。
如果我们能准确预测下一周的步数,那该多好啊!
在本文中,我将使用基本的时间序列分析来观察自己的步数趋势,并使用历史步数预测未来。本文的主要目的是展示时间序列预测的主要思想,并使用我自己的步数作为实际的编码示例。
我们使用的数据
我正在使用从我的 iPhone 苹果健康下载的步数数据。如果您也使用 iPhone,您可以从 Apple Health application 个人资料页面下载健康数据,如下所示
截图来自苹果网站
下载的数据将是一个 XML 文件,包含 Apple Health 的多个部分,包括步数、心率、睡眠分析等。我利用链接中的脚本将 XML 文件转换成 CSV 格式进行分析。文件的输出将是多个 CSV 文件,您可以使用 Python 直接连接到 CSV 文件。它也是 一个有趣的数据源,供您使用自己的健康数据探索其他数据分析或数据可视化方式。
数据探索
步数数据看起来像下面的截图,其中包含每次移动时的步数数值。它还包含开始日期、结束日期和创建日期。这里的创建日期是指该记录的创建日期和时间,因此我使用开始日期来记录时间。
步骤计数的原始数据
对于我的分析,我只需要“开始日期”和“值”两列。对我来说,第一步是将日期列转换成日期时间格式,然后将数据汇总成每周总和。这是因为许多 python 函数或时间序列包需要一个时间格式的列,如果我预测每天的数据,波动性会太高。
#read data from extracted csv
steps=pd.read_csv('apple_health_export/StepCount.csv')#convert start date into time format
steps['date']=pd.to_datetime(steps['startDate'].str[:19])#Aggregate data into weekly sum
sample=steps[['date','value']]
weekly=sample.resample('W', on='date').sum()#visualize weekly data
weekly.plot(figsize=(15, 6))
plt.show()
每周步数的可视化
从上面的可视化中,我们可以看到,即使是每周的步数数据也有很高的波动性。为了消除像每周 300k 步数或每周少于 2000 步这样的极值的影响,我使用 winsorization 使数据更正常。
Winsorization:通过将极值限制在某个界限内来消除异常值的影响,从而对数据进行转换。
我不直接在每周级别上 winsorize,而是限制在每天的步数级别上。例如,如果我一天走得太多,每天的步数将被降低到上限值,然后我将这些 winsorized 每天的步数再次汇总到每周的总数中。
我选择的边界限制是更高的 2%和更低的 2%(这个百分比值可以由我们根据数据的分布来确定)。我使用了‘winsorize’Python 包,在其中你可以直接指定百分比的上限和下限。
#remove the first part of data with no steps
sample=steps[steps['date']>'2015-09-01'][['date','value']]#aggregate data on daily level
daily=sample.resample('D',on='date').sum()#Winsorize daily data
daily['winsorized_value']=winsorize(daily['value'], limits=[0.02, 0.02])#Aggregate daily data into weekly data again
weekly=daily.resample('W').sum()
#visualize new weekly data
weekly.plot(figsize=(15, 6))
plt.show()
winsorized 步数的可视化
您可以从上面的可视化中看到,winsorized 数据具有较少的极值,因此为我们提供了一个更通用的部分。然而,有一点需要注意的是这个平滑步骤不是强制性的,因为大多数时间序列方法会有一些其他的平滑步骤。
您还可以通过使用 季节性 _ 分解 包来查看季节性模式和总体趋势。这里的趋势是由移动平均确定的,然后在从原始数据中去除趋势后提取季节性元素。
extract=train.set_index('date')
from pylab import rcParams
rcParams['figure.figsize'] = 18, 8
decomposition = sm.tsa.seasonal_decompose(extract, model='additive')
fig = decomposition.plot()
plt.show()
季节和趋势元素
从上图可以看出,步数中有一些轻微的季节性因素。总体趋势有一个强烈的变化,特别是从 covid 时期开始以来。
时间序列预测
研究完数据后,我们可以使用不同的时间序列预测方法开始预测。
**问题陈述:**根据历史步数数据预测下周步数有多准确?
数据准备:步骤与正常的机器学习训练-测试拆分略有不同。这是因为训练数据和测试数据是动态的取决于您预测的周(我们使用该周之前的所有历史数据作为训练数据)。我们使用 2021 年的步数作为基准来衡量我们模型的准确性。
#determine training and testing group
data=weekly.reset_index()
test=data[data['date']>'2021-01-01'][['date','value']]
train=data[['date','value']]
我们将使用平均误差(MAE)来衡量所有模型的准确性。您也可以选择“均方误差”、“均方根误差”或“平均误差百分比”进行测量。如果想了解更多关于度量回归或预测模型的内容,可以参考这里的。
方法 1:移动平均线
移动平均线仅仅意味着前 X 个周期的平均值,X 由你来决定。这是时间序列数据最常用的技术/概念之一。它可以帮助平滑数据趋势,从而给你一个更真实的结果近似值。
在我的例子中,我使用的是过去 10 个时间段的移动平均值,这意味着我认为步数主要受前 10 周的步数影响。您可以选择使用不同的号码。移动平均线中使用的常见时间段为 10、20、30、50、100 ,具体视场景而定。
#get rolling moving average for previous 10 weeks
data['SMA_10']=train['value'].rolling(window=10).mean().shift(1)#Measure the MAE for this measure
test=data[data['date']>'2020-12-31']
from sklearn.metrics import mean_absolute_error
print(mean_absolute_error(test['value'], test['SMA_10']))
#10415.972
方法 2:指数加权移动平均
方法 1 移动平均线是过去 10 周的简单平均值。你可能想说离预测日期越近的那一周应该有更大的权重,而不是简单的平均值。这时我们可以使用指数加权移动平均线。
指数加权移动平均给予较近的数据较大的权重,权重的分配遵循指数逻辑。让我们看看它与简单的移动平均线方法相比表现如何。
#Calculate ewm average value
data['ewma_10']=train['value'].ewm(span=10).mean().shift(1)test=data[data['date']>'2020-12-31']
from sklearn.metrics import mean_absolute_error
print(mean_absolute_error(test['value'], test['ewma_10']))
#9613.11
与简单移动平均相比,指数加权移动平均给出了更低平均误差的更好结果。
test_plot_data=test.set_index('date')[['SMA_10','ewma_10']]
train_plot=train[train['date']>'2020-01-01'].set_index('date')
plt.figure(figsize=(15,10))
plt.plot(train_plot,label='Actual Step')
plt.plot(test_plot_data['SMA_10'],label='sma_10')
plt.plot(test_plot_data['ewma_10'],label='ewma_10')
plt.legend(loc='Left corner')
plt.show()
简单移动平均线与指数加权移动平均线
如果绘制两个预测值与实际步数的关系图,可以看到两种移动平均法的预测值都比实际步数平滑得多。与简单移动平均线(红线)相比,指数加权移动平均线(黄线)更快地捕捉到趋势,并且更接近真实步数。
方法 3: SARIMA 模型—手动调谐
萨里玛模型是具有季节性趋势的 ARIMA 模型。ARIMA 模型的全称是自回归综合移动平均。在我开始介绍这个方法之前,让我们快速浏览一下 ARIMA 到底是什么,以及我们在建模时考虑了哪些因素。
快速总结:
自回归/AR: 输出预测依赖于先前的观测值/滞后观测值
Integrated/I: 数据不是平稳的,它需要一定阶的差分来实现平稳性
**移动平均/移动平均:**输出预测取决于之前的误差项/滞后误差
对于 SARIMA 模型,您需要指定 7 个不同的参数:
- p:AR 项的滞后数
- d :达到平稳所需的差分次数
- q:MA 期限的滞后数
- 季节性周期。指同一模式再次出现的时间周期数。
- P,D,Q :与 P,D,Q 相同,但为季节性参数
网上有文章介绍我们如何根据对数据的观察来确定不同的参数。对于这个方法,我使用的是来自 statsmodel 的包。
对于您运行的每个模型,您可以有一个结果摘要和一个 AIC 值来衡量模型的样本内适合度。我对所有参数使用不同值的迭代,找出最低的 AIC 值 e(样本内数据的最佳拟合模型)。我是从这里的链接学到这个方法的。
# Define the p, d and q parameters for value between 0-2 and iterate for all the value in the range
p = d = q = range(0, 2)
pdq = list(itertools.product(p, d, q))# Generate all different combinations of seasonal p, q and q
seasonal_pdq = [(x[0], x[1], x[2], 4) for x in list(itertools.product(p, d, q))]params=[]
seasonal=[]
aic=[]
for param in pdq:
for param_seasonal in seasonal_pdq:
mod = sm.tsa.statespace.SARIMAX(train_set,order=param, seasonal_order=param_seasonal,
enforce_stationarity=False, enforce_invertibility=False)#append all the parameters and result AIC value
results = mod.fit()
params.append(param)
seasonal.append(param_seasonal)
aic.append(results.aic)
parameter_options=pd.DataFrame({'params':params,'seasonal_params':seasonal,'AIC':aic})#sort the AIC value to find the best fitted model
parameter_options.sort_values(by='AIC')
ARIMA 模型参数和分类 AIC
从上面的结果中,我们可以看到性能最好的几个参数集。但是,这并不一定等于预测的最佳参数集,因为样本外精度可能与样本内精度有很大不同。你可以参考这个列表,试着找出最合适的型号。
data_updated=data.set_index('date')
train=data[data['date']<'2021-01-01']
prediction=[]
my_order = (0, 1, 1)
my_seasonal_order = (1, 0, 1, 4)
initial=len(train)initial_train=data_updated.iloc[:initial]
model = sm.tsa.statespace.SARIMAX(initial_train['value'], order=my_order, seasonal_order=my_seasonal_order)
results=model.fit()#Iteratively update the training data and predict following week
for i in range(initial,len(data)):
updated_data=data_updated.iloc[i:i+1]['value']
results=results.append(updated_data,refit=False)
prediction.append(results.forecast()[0])from sklearn.metrics import mean_absolute_error
print(mean_absolute_error(test['value'], prediction))#8469.6746
该模型的性能比两个移动平均结果好得多,平均误差值减少了 15%。
方法 4:自动 ARIMA(自动调整参数)
方法 4 使用相同的 ARIMA 模型,但是具有提供自动调谐功能的不同的封装。我使用的是 pm.auto_arima 包,你可以通过链接了解更多关于这个包的功能。
和前面的方法一样,你需要确定所有参数的取值范围。您也可以在您的步进参数中指定是使用步进还是网格搜索。如果没有设置 stepwise=True,默认情况下它会使用网格搜索,这可能会很慢。
train_index=train.set_index('date')#Spesify the value range for parameters
model = pm.auto_arima(train_index['value'],
start_p=0, start_q=0,d=1, max_p=5,
max_q=5, start_P=0, D=None, start_Q=0, max_P=5,
max_D=5, max_Q=5,stepwise=True,seasonal=True)prediction=[]#Recurrently predict following week and add the data into training model once we have predicted that week
for i in test['value']:
predict=model.predict(n_periods=1)[0]
prediction.append(predict)
model.update(i)
from sklearn.metrics import mean_absolute_error
print(mean_absolute_error(test['value'], prediction))
#8863.74
该模型有一个更新功能,允许我使用动态的历史数据循环计算下一周的数据。有趣的是,最终结果比手动调优方法的错误数略高,这可能是由于分步方法或不同软件包之间的算法略有不同。
SARIMA 手动调谐与自动调谐
当我绘制这两种 SARIMA 方法的预测图时,我可以看出这两种方法比简单或指数加权移动平均方法更接近实际步数趋势。然而,SARIMA 模型也不能非常准确地捕捉波动。误差率范围在 20–30%之间。
结论或建议
- 在本例中,我对以下一周的值进行递归计算。但是,您很可能需要使用历史数据来预测接下来 N(N>1)周的值。这实际上要简单得多,因为一旦得到模型,您可以将 n_periods 指定为您想要预测的时间段的数量(不需要迭代地更新模型)
- 网上有文章介绍如何确定数据是平稳的,或者我们如何使用统计方法(如“扩展的 Dickey Fuller 测试”)来确定 AR 和 MA 项的值。这可以更好地确定数据的分布并防止过度拟合。
- 萨里玛或 ARIMA 方法通常比简单移动平均或指数加权移动平均方法更好,因为它考虑了误差项
- 需要注意的一件非常重要的事情是,我们应该始终记住使用我们预测的日期之前的数据作为训练数据,这对我们来说很难使用交叉验证。
最后,最后的结论是:在高精度水平上预测步数真的很难!
参考或推荐阅读
- https://www . digital ocean . com/community/tutorials/a-guide-to-time-series-forecasting-with-arima-in-python-3(如何使用最低 AIC 选择 ARIMA 参数)
- https://www . machine learning plus . com/time-series/ARIMA-model-time-series-forecasting-python/(如何统计确定参数值)
- https://github . com/markwk/QS _ ledger/blob/master/apple _ health/apple _ health _ extractor . ipynb。(从 Apple Health 提取数据的代码)
- https://towards data science . com/what-the-best-metrics-to-evaluate-your-regression-model-418 ca 481755 b(如何评估你的回归模型)
- https://www . stats models . org/dev/generated/stats models . TSA . statespace . sarimax . sarimax . html(SARIMA 模型包,手动调优)
- https://alkaline-ml . com/pmdarima/modules/generated/pmdarima . ARIMA . auto _ ARIMA . html(SARIMA 模型包,自动调优)
感谢阅读!如果你有任何问题或任何你想了解更多的话题,请把它们放在评论框里!
如何为信用风险建模准备数据
介绍使用房地美单户贷款级别数据集的违约概率和转移矩阵分析
艾萨克·史密斯在 Unsplash 上拍摄的照片
信贷风险衡量借款人无法偿还债务从而违约的概率。信用风险建模在银行业中被广泛用于多种应用:从承销、账户管理(如扩大信用额度)、信用备抵(GAAP 下的 CECL 和 IFRS-9 )、压力测试( CCAR )和监管资本计算(巴塞尔 II )。
信用风险度量有两个关键组成部分:1)违约概率(PD),通常定义为一段时间内违约的可能性;2)违约损失(LGD),通常指借款人违约后无法收回的金额。这两个分量的乘积给出了预期损耗。
在本文中,我们将使用房地美单户贷款级别数据集作为示例,向您展示如何准备开发数据(包括目标变量和贷款级别特征)以应对任何信用风险建模练习。让我们开始吧。
数据下载
房地美提供公共访问(需要免费注册)该机构从 1999 年到 2020 年购买的单户抵押贷款的贷款级别数据集。数据集是按季度年份组织的。在每个年份中,它包括两个文件:
- 发起数据:包含发起时的贷款特征(如期限、利率、信用评分、贷款价值比、债务收入比等)。)
- 绩效数据:包含贷款级月度绩效(包括未偿余额、拖欠状态等。)从发起到最近一个季度。
由于数据集是一个“活的”文件,新的演奏会定期添加到每个 vintage 文件中,并且鉴于此数据集的庞大数量,您可能需要编写一个自动下载代码(如下例所示)来从网站检索数据:
#Specify login credentials
login = {
‘username’: ‘[y](mailto:xuzhangsusan@gmail.com)our login email’,
‘password’: ‘your password’
}#Define the vintage data to download (for this article, we will look into vintage from Q1 2014 to Q2 2019.
Period = ["Q12014","Q22014",...,"Q22019"]with requests.Session() as s:
p =s.post('[https://freddiemac.embs.com/FLoan/Data/download2.php'](https://freddiemac.embs.com/FLoan/Data/download2.php')) for Qtr in Period:
#File Names
zip_file = "historical_data1_" + Qtr + ".zip"
perf_file = "historical_data1_time_" + Qtr + ".txt"
orig_file = "historical_data1_" + Qtr + ".txt"
export_file = Qtr + ".csv"
r = s.get(os.path.join(Download, zip_file))
z = zipfile.ZipFile(io.BytesIO(r.content))
z.extractall(Input_Data_Path)
了解贷款特点
由于许多贷款级别特征是信用损失预测的主要驱动因素(例如,低信用评分或低收入群体通常更容易受到经济状况的影响,从而导致违约),在下载 vintage 文件后,第一步是使用帐号作为唯一关键字合并原始数据和绩效数据。合并之后,现在我们可以看看投资组合概况和特征分布。
作者图片—房地美抵押贷款发放量(计数)
LTV 始发配送
按作者分类的图片——贷款发放时的 LTV 分布(2014 至 2019 年份)
始发时的 FICO 分数分布
按作者分类的图片—贷款发放时的 FICO 得分分布(2014 年至 2019 年)
创建默认标志
如果你是第一次进行信用分析,你可能会惊讶于“违约”的定义并不像你想象的那么明显。在大多数情况下,“违约”是无法直接观察到的。对于初学者来说,当谈到信用风险建模中的违约定义时,有两个最常见的误解:
违约是否相当于到期前 零余额 ?
不,有许多原因可以导致贷款余额在到期日之前减少到零。自愿提前还款是最常见的一种,还有回购、REO 处置等。
默认是否等同于 销账 ?
不,当债务不太可能收回时,贷款人可以从资产负债表中冲销债务金额。但是,在贷款严重拖欠(如 6 个月没有付款)后,可能会在更晚的日期进行注销。因此,将冲销作为违约无法捕捉实际的“违约”时间。也就是说,如果一笔贷款在没有拖欠的情况下被冲销(在一些罕见的情况下),人们仍应将其视为违约事件。
信用风险建模中最广泛采用的定义是将违约事件定义为 1)贷款首次严重拖欠的较早日期;或 2)贷款损失被确认。根据这一定义,导致投资组合损失的任何贷款都将包括在违约群体中,违约日期将与贷款特征恶化的迹象同时标记。
违约=(第一次严重拖欠)U(损失事件)
作者图片—房地美拖欠状况(2014 年至 2019 年)
根据这一定义,我将房地美贷款数据的违约定义为贷款拖欠 180 天或贷款余额因 a)第三方出售、b)卖空或冲销而降至零的最早日期;或 c) REO 性格。上图显示了每种拖欠状态下的贷款分布。从上面的分析中可以提取出两个直接的观察结果。首先,2017 年 8 月突然的“当前”利率下降是由飓风哈维引起的,随后它导致了拖欠状态的飙升。其次,我们可以注意到,除了处于“当前”状态的贷款百分比之外,自 2014 年起,拖欠和违约概率保持单调增加。这是由于整个抵押贷款生命周期的违约曲线的形状,其中违约率通常在贷款发放后不久增加,并在贷款年龄约为 3-5 年时达到峰值(如下图所示)。
来源 : 债券市场协会
此外,这种违约定义也被称为“首次违约”。“违约”贷款可能再次成为“再融资/流动”贷款,即被“治愈”,这种情况并不少见。我们将在下面的治愈率分析中讨论这种行为。
违约预警指标
除了直接对 PD 建模之外,您经常会看到信贷风险建模侧重于预测转换矩阵,将拖欠状态作为“状态”,特别是违约作为“吸收状态”。然后开发单独的子模型来预测从一个状态到另一个状态的转移概率。
为什么 跃迁概率 很重要?
让我们看看下面两个转移概率的比较:
第一个图表显示了“当前到逾期 30 天(DPD)”的转换和 PD 率之间有很强的相关性。事实上,2017 年飓风哈维导致的峰值几乎在大约 6 个月时间间隔的两条曲线中保持完全相同的形状。
按作者分类的图片—当前至 30DPD 与 PD
下面的第二张图显示了从“30DPD 到 60DPD”的转移概率,并将其与从“60 DPD 到 90DPD”的转移概率进行了比较。人们可以看到,这两个转变概率在时间上基本持平,贷款进入下一个拖欠阶段的概率几乎是 30DPD 到 60DPD 的三倍。
作者提供的图片—30DPD 至 60DPD 与 60DPD 至 90DPD 的对比
上面这两个图表告诉我们的是,为了预测 PD,还可以关注预测从电流到-30DPD 的转换概率,作为预警指标。因为一旦一笔贷款无法偿还,它的违约之路就变得更加确定,随着贷款违约越严重,确定性就越高。
治愈率分析
因为“首次违约”的定义,你可能想知道贷款违约后会发生什么?有三种典型的途径:1) 冲销:贷款在资产负债表上保留很长一段时间,直到银行决定将其冲销;2) 重组:银行与借款人一起制定还款计划;3) 再融资:借款人开始再次还款,在某一点上,贷款甚至可以再次成为流动贷款,即治愈。
通常在信用风险建模中,治愈率由于其低概率而不被特别建模。如下图所示,随着贷款拖欠状况的恶化,其恢复到当前状态的几率从 50%急剧下降到 10%以下,预计“违约”后的治愈率会更低。
按作者分类的图像—所有过渡状态到当前状态
结论
总之,定义 PD(或转移矩阵)对于解决几乎所有信用风险建模问题都是至关重要的,对此没有固定的答案。与本文中介绍的过程类似,最佳实践是根据贷款级别特征、绩效数据分析以及银行的信贷政策来确定 PD 定义。
希望你喜欢这篇介绍违约概率和转移矩阵分析的文章。喜欢就在下面留下你的评论吧。以上分析的完整代码可以在 这里 找到。
脚注
[1] EAD:你可能也听说过违约时的第三个组成部分 EAD 敞口。对于定期贷款,如抵押贷款和汽车贷款,EAD 可与剩余余额互换使用,而对于分期贷款,如 HELOC 或信用卡,除了未偿余额外,EAD 还由借款人在违约时使用的未提取余额的百分比确定(也称为 LEQ-贷款等价风险)。本文不讨论 EAD 的细节。
物体检测如何准备数据?
为大型机器学习项目构建自定义对象检测模型的见解
构建可视化人工智能的图像标注。[ 来源
随着时间的推移,我们在 Ximilar 从事了许多具有挑战性的项目,其中包括对象检测。如今,仅模型的训练和部署就可以在几分钟内完成。您可以简单地上传您的数据并点击几个按钮来训练和部署您的模型作为一个 API。如今,检测模型训练越来越具有挑战性和难度的部分是数据,因为:
- 物体检测需要比普通图像分类器大得多的数据集。
- 所有你想让人工智能检测到的物品,首先需要被适当地标注,这意味着它们以某种方式被标记了标签和边界框。
- 数据注释是一个耗时且费力的过程,通常需要一个团队。
- 当注释你的数据时,你需要绝对一致,注释的人必须训练有素,协调一致。
数据监管和 MLOps 非常重要
选择架构类型只会使整体精度上下移动几个百分点。遗憾的是,大多数机器学习研究都是关于架构设计、新的激活函数和层的。此外,这项研究大多是在相同的庞大数据集上完成的(ImageNET, COCO ,Google Open Images)一遍又一遍。基本上,研究小组和大型科技公司在这部分研究上花费了数百万美元,但没有花费在数据监管过程上。
根据我们的经验,以数据为中心比谷歌开发的最新架构带来更好的结果。大多数机器学习项目都是从很少或没有数据开始的。在数据很少的情况下,最先进的模型往往会失败。
人工智能研究员 **Andrew NG 敦促人工智能社区更加以数据为中心,**我们完全同意。数据的增量改进和使数据集适当平衡是一个更好的方法。[ 来源如果你更注重数据而不是模型,你也可以节省很多培训时间。尝试不同的架构还需要调整许多超参数。
构建检测 MLOps 注释管道
在一个空白的机器学习项目中,我们从几个数据点开始。正如我们之前所说,更多的数据可能会带来更好的结果。然而,做注释(分配标签,创建边界框)的人应该重新检查其他人的数据。这样,我们可以交叉验证注释的正确性。
因此,如果我们希望更加以数据为中心,我们需要知道哪些数据已经被检查过。例如,我们正在开发一个能够分析时尚产品图像的时尚人工智能系统。这个项目的复杂性令人震惊。成千上万的图像,成千上万的类别,包括对象检测和分割。
每周,注释者都关注我们需要解决的不同类型的问题。解决一个问题最终会产生另一个问题,或者降低系统不同部分的准确性。这正是特斯拉 AI 开发者正在经历的问题。你需要非常小心正确的图像样本的适当平衡。
这就是为什么我们正在系统地改进我们的训练数据集。每周我们都会分析问题,并为注释者定义新的工作。他们的工作进度被保存下来,然后在下周进行分析。为时尚或自动驾驶等重大任务构建可靠的人工智能是一个永无止境的过程,因为世界也在变化。
注释作业及其进度。[ 来源
例如,在我们的注释工具中,您可以定义注释作业,并指定注释者应该查看图像的次数。然后,机器学习项目的项目经理可以看到工作的进展以及更多内容。
注记工具支持数据的验证和多种绘图工具,如矩形、多边形和经典标注。随着时间的推移,注释过程越来越快。这是因为您可以简单地在单击时训练对象检测模型,然后在不使用绘图工具的情况下做出所有预测。通过标注系统的 MLOps,您可以 A/B 测试在不同版本的数据集上训练的不同版本的模型。
如何让物体检测更准确?
在一些项目中,我们需要检测看起来非常相似的不同类型的项目。这对于模型来说非常难学。因为如果我们有视觉上非常相似的不同类,目标检测的目标函数的损失将最终停留在第一个时期。例如,检测数百种鸟类可能非常困难。这同样适用于微控制器(Raspberry PI,Arduino,…),时尚产品(衬衫与 t 恤),产品缺陷…
Arduino 的产品之一。所有的 Arduino 产品看起来都非常相似。由萨汉德·巴巴里在 Unsplash 上拍摄的照片
想象一下在图像上检测微控制器 (Arduino)的问题。对象检测模型将很容易学会检测&区分 Arduino 和 Raspberry。然而,对于所有不同的 Arduino 和 Raspberry 微控制器来说,做到这一点是非常困难的。它们有几百种。
那么,有什么选项可以让对象检测在许多视觉上相似的类上工作呢?
我们可以划分问题,简单地创建一个对象检测模型,只有一个标签,名称为“微控制器”。然后创建一个图像分类器模型,它将告诉我们有哪种特定的 Arduino 产品。**这种两步法将提高整个系统的整体精度。**我们的注释系统能够做到这一点,创建一个对象并分配一个标签或一个复杂的标签分类(层次结构)。只需点击几下鼠标,预测系统就可以部署到 API 端点,只需通过流连接对象检测和图像分类器。
检测大量对象类型的问题可以分为两个步骤。首先检测对象,然后只对边界框的内容进行分类。[ 来源
还记得我提到的时尚或特斯拉用例吗?检测类别越多,需要的数据就越多。将问题分成更少的类是一种更有效的方法。它也不会破坏系统的另一部分,因为每个神经网络只看到我们所说的那部分数据。如果你有一个大的模型,那么你所有的图像必须有所有的边界框和所有的标签,并且要平衡,所以这个类不是主要的。
用于目标检测的数据扩充
数据扩充是多种训练样本的常用方法。为同一个图像创建许多不同的变体可以帮助提升你的模型。然而,你需要非常小心选择哪个增强。有时图像的水平或垂直翻转会破坏模型的性能(例如,检测交通标志可能会出现这种情况)。理想情况下,您应该能够在不同的增强设置上测试您的模型的性能。然后,您可以选择一个在您的测试数据和生产设置中更加健壮的模型。
如何扩大图像的多种方法?改变颜色,饱和度,缩放,删除部分图像。【来源
使用在线注释工具的好处
总之,注释图像应该可以帮助您建立高质量的数据集,用于训练精确的机器学习模型。整个过程应该是有效的,并且应该导致迭代开发,然后在生产中部署。在处理具有复杂分类的大型项目时,您应该首先考虑您的数据,并将您的问题分成子问题。
如果您想使用或阅读更多关于注释平台和所有功能的信息,请访问 Ximilar 。
如何准备行为/软技能面试?
照片由 Maranda Vandergriff 在 Unsplash 上拍摄
行为面试是工作过程中的一个重要部分。在这篇文章中,我们将讨论在行为面试中会遇到什么,以及如何准备。最后,我们提供了一份准备和处理行为面试的备忘单。
行为面试评估候选人在组织中互动、生存和成长的能力。大多数公司都在寻找潜在的候选人,他们不仅擅长技术专业知识,而且能够很好地适应公司文化,在团队中运作良好,管理团队,并能够在需要时做出决定。大多数时候,一个在行为面试中表现不佳的候选人,不管他或她在技术面试中表现如何,都无法继续申请。
大多数候选人在技术面试中都表现得很好。编码、机器学习、数据科学、系统设计、案例研究,所有这些对他们来说似乎都很熟悉,而且都在他们的舒适区内。然而,行为面试要求他们坐下来准备。没有正确或错误的答案,面试只是在寻找你有条理的思维,以及你是否能够展示出对公司真正重要的某些特质。
我们将这篇文章分为三个部分。在第一部分,我们将彻底了解如何准备行为面试。然后,我们将了解如何在面试中处理和回答行为问题。最后,文章的最后一部分包含了一些关于这个主题的有用资源。
第 1 部分:为行为面试做准备
为行为面试做准备并不需要像技术面试那样多的时间。平均 3-4 天,每天 1-2 小时,应该足以适应面试过程、示例问题和个性化故事。
但是如何着手准备这样的面试呢?从哪里开始?涵盖哪些问题?这可能会让人不知所措。遵循下面的 5 个步骤,这个过程会变得更加简单和有条理。
第一步:[1-2 小时]收集并理解关键词
需要做的第一件事是研究面试会提问的话题。行为问题可以有广泛的话题。最常见的问题是关于
- 领导力
- 协力
- 解决问题
- 决策
- 沟通
- 人际交往技能
- 冲突解决
- 谈判技巧
- 创造力
- 个人的优点和缺点
- 师徒制
- 表明立场
- 有期限地工作
在网上寻找在行为面试中被问到的问题,熟悉这些话题并记下来。这大约需要 1-2 个小时。
第二步:[3-4 小时]收集你的故事
一旦你熟悉了常见的关键词并记下了它们,你需要从你的个人生活中找到一些故事来反映那些突出你个人技能的话题。我发现有用的是记下我过去参加过的所有组织,比如学术、工作、实习、社团和俱乐部。然后,对于每一个这样的例子,我试图回忆我必须运用我的技能来解决潜在问题的事件。这些故事不必是专业的,也可以来自个人生活。如果你在回忆生活中的事件时有困难,看看第一步中的主题,试着回忆解释这些特定主题的事件。
第三步:[0.5 小时]给你的故事指定关键词
现在,一旦你从你的个人生活中收集了故事,仔细地浏览它们并指定关键词。同一个故事可以有多个相关联的标签/关键词。给他们指定关键词将有助于你在面试中更好地回答问题。
步骤 4: [0.5 小时]创建一个汇总表
我喜欢在每次行为面试前准备一份汇总表。这个个性化的表格记录了我的个人故事和相关的关键词。这有助于我为行为面试做准备。下面是这种表格的一个例子。
行为访谈汇总表——作者图片
模糊的文字是我的故事的标识符。
第五步:[2-3 小时]以星形形式解释故事
回答一个行为问题最重要的部分是它的组织和结构。每个行为问题的答案都必须遵循星形格式。使用以下四个步骤来回答这个问题。我们将使用下面的例子,并尝试应用星形格式。
示例问题:“告诉我们一次你不得不说服高管的经历”
1。情况:
当开始回答一个行为问题时,解释情况,并为你的故事提供必要的背景
**举例:“**2019 年夏天在 XYZ 公司实习。提供给我的项目细节是精心制作的。经过一些最初的头脑风暴和研究,我意识到可以修改项目方法,使其在底层 KPI 方面更有效。我决定和我的经理谈谈这件事。”
2.任务:
一旦你经历了这种情况,解释任务和你在这种情况下的责任。
示例:“我和我的经理通了一个小时的电话,向他详细解释了提议的方法以及它如何改进 KPI。我说服了他。他问我是否能够将我提议的方法提交给上级主管批准。我同意了。我在 ABC(城市)办公室工作,高管们需要从 XYZ(城市)办公室飞过来。”
3.行动:
下一步是回顾你为解决手头的问题而采取的一系列行动
例子:“我对高管们做了一个快速的背景调查,以更好地了解他们的专业领域,这样我就可以相应地说服他们。我准备了一份精心制作的 15 页幻灯片演示文稿,从解释他们的方法开始,接着介绍我提出的方法,最后比较他们的初步结果。”
4.结果:
最后,陈述你所采取的行动的结果,以及这些行动如何影响手头的问题
示例:“经过一番积极的讨论,我们发现提议的方法比最初的方法更好。高管们对我的方法提出了一些小的改变,并非常欣赏我的立场。实习结束时,我从 68 名实习生中脱颖而出,与公司的高级副总裁共进午餐。”
使用星形格式,你将能够有效地组织你的答案。
准备行为面试的五步流程总结如下。
为行为面试做准备——作者图片
第二部分:回答一个行为问题
行为问题通常是开放式的。他们可以涵盖非常广泛的范围,这是不可能的准备每一个问题都可以问。然而,有帮助的是将问题与你已经准备好的常见问题联系起来,并做出相应的回答。以下 5 个步骤将帮助你在面试中回答一个行为问题。
我们将使用下面的例子
示例问题:“告诉我们一次你不得不说服高管的经历”
1.明白;理解
当你面对一个行为问题时,首先要做的是仔细倾听并理解它。一个好的做法是用你自己的话重复这个问题,问面试官这是不是他或她的意思。如果有任何困惑,通过提出后续问题来澄清。一旦你理解了这个问题,用更简单的话问自己同样的问题
好的,他们想让我分享一个我说服我的前辈的故事。也许他们有什么想法,我有一个更好的方法,我试图说服他们。
2.提取
下一步是从问题中提取有用的关键词,帮助你筛选出你的故事。
举例:【令人信服】、【创意】、【领导力】
3.地图
一旦你有了你的关键词,列出你的摘要表中属于这些关键词的所有故事
**示例:**故事 1、故事 3、故事 6
4.挑选
从入围的故事中,挑选一个最能描述这个问题,并且迄今为止还没有在面试中使用过的故事。
**举例:**故事 3
5.应用
将 STAR 方法应用于入围的故事
**例如:**上一节的第 5 步
下面的备忘单总结了这些步骤。
第 3 部分:有用的资源
一些最常见的行为问题和示例答案可以在下面的链接中看到
- https://www . indeed . com/career-advice/interview/most-common-behavioral-interview-question-and-answers
- https://www . the balances careers . com/top-behavioral-interview-questions-2059618
- https://www . themartec . com/inside look/behavioral-interview-questions
总结:
行为面试有时会很棘手。在本文中,我们经历了一个有组织的、易于遵循的准备和回答行为问题的过程。
如果这篇文章对你有帮助,欢迎鼓掌、分享和回复。如果你想了解更多关于机器学习和数据科学的知识,请关注我@Aqeel an war或者在LinkedIn上与我联系。
作为数据科学家,如何准备业务案例面试问题
办公时间
提高你的商业敏锐度和回答面试问题的指南
为什么商业案例面试问题如此重要?
仅仅擅长统计测试、机器学习或编码是不够的。当然,这些技术技能对于擅长数据科学是必不可少的。但是有可能知道所有技术方面的东西,仍然被认为是一个糟糕的数据科学家。一个人还需要软技能和业务知识,以便能够跨职能地与他人有效合作,交流结果,并真正理解你试图解决的问题。拥有一些商业头脑会让你成为一名更有效的数据科学家。
你知道你的工作是如何与更大范围的业务联系在一起的吗?你了解公司的总体目标以及数据如何支持这些目标吗?你能在大大小小的问题上为公司做出切实可行的改变吗?这些是企业在向你提出业务案例面试问题时试图评估的东西。
既然你已经确信了为什么商业知识很重要,那我们就来谈谈如何获得这样的知识,以及如何准备面试的问题。知道如何学习这些类型的问题可能会感到困惑,因为它们非常开放,没有像概率问题那样的“正确”答案。如果你想更好地编码问题,你练习你的编码。但是如何实践“商业”呢?
1.建立基础
照片由 Arnold Dogelis 在 Unsplash 拍摄
从了解一些商业基础开始。以下是一些需要研究的东西:
- 项目管理方法论:公司如何组织项目的完成?了解瀑布和 Scrum 等模型。不同方法的优缺点是什么?对于不同类型的项目,公司什么时候可以使用一种模型而不是另一种模型?
- 组织角色:了解公司的不同角色将有助于你更好地理解工作是如何完成的。从高管级别的职位开始做起。然后向下移动到公司的其他典型角色,特别是数据科学家可能跨职能工作的角色,如软件工程师、产品设计师、产品经理等。对于特定的公司来说,这可能是一个特别有价值的练习。如果你已经安排好了面试,花点时间试着了解他们的组织是如何构建的,不同的团队是如何合作的——尤其是你的职位。参加面试时了解公司如何整合不同团队之间的工作将对你有很大帮助。
- 商业案例:了解一个商业案例以及它是如何写的,将有助于你进入一个企业的思维框架。你可能永远也不会把写商业案例作为你工作的一部分,但是如果你不能用某种有意义的方式来组织数据,让企业明白它会有什么好处,那么有一个好的数据想法是不够的。熟悉商业案例是如何撰写的,将有助于你理解企业是如何做出决策的。
- 度量和其他术语:记下你遇到的所有你不知道的缩写或术语。这些最常发生在度量上。像 ROI、KPI、CTR、转换率和客户流失率这样的东西非常常见,并且总是出现,所以要知道它们的含义和使用方法。如果你正在某个行业或利基市场找工作,那么花时间查找与该行业相关的不同指标或术语。例如,像 MAU(每月活跃用户)这样的东西对于社交媒体领域的公司来说是一个重要的指标,敏感性和特异性对于进行医学测试的公司来说是很重要的,等等。
- 工具和技术:研究公司如何完成工作的常用工具。对于公司如何管理项目、版本代码或协作,有哪些选择?我发现查看特定的工具有助于理解实际的工作流程。在面试前研究一家公司是一件很棒的事情。
所有这些主题都可以进行一般性的研究,以更好地掌握商业知识和词汇,也可以针对特定的公司进行研究。任何时候你有一个面试,你都应该为那个公司仔细检查这些项目,作为你准备的一部分。或者,如果你的目标只是获得更多商业思维的基础,你也可以更广泛地研究这些。
2.公司细节
现在你已经有了一些基本的知识,是时候深入了解更多的细节了。从现在开始,最好有一个明确的公司。如果你没有特别安排面试,只是想练习一下,那就想一个你想去工作的理想公司,假装你在为面试做准备。
以下是需要研究的内容:
- 公司愿景和目标:花些时间了解这家公司。他们是怎么赚钱的?他们的客户是谁?他们的高层次目标是什么?他们是如何实现这些目标的?你认为数据如何符合这个等式?
- 公司产品:有时识别公司产品会很奇怪,因为最明显的产品都是实物。但是产品可以是软件、服务、应用等。这些产品是如何组合在一起的?每个产品的客户是谁?每个产品试图解决什么问题?
有很多建议是在面试前调查一家公司,我认为大多数(好的)候选人都会照着做。但是,我到目前为止所概述的这一点,往往是人们止步不前,没有想到继续走下去的地方。
3.产品,产品,产品
这是你将自己与普通候选人区分开来的地方。这一部分将会更深入地为你准备那些商业案例面试问题。流程是这样的:
- 从一个公司的产品开始:上一节对产品进行了一些研究,但是要深入了解每个具体的产品。对于每种产品,提醒自己它是如何工作的,客户是谁,以及它正在解决的问题是什么。现在想想它有什么特点,它可能有什么缺点或问题,你认为公司收集了什么样的与产品相关的数据。
- 想象你在开发这个产品的团队中:把你自己放在这个产品出现之前的工作人员的位置上。你认为他们面临什么样的问题?他们收集了什么样的数据?他们如何衡量成功?你认为他们认为护栏是什么样的指标?你觉得他们用的是什么样的统计实验?
- 假设你是改进该产品的团队成员:随着时间的推移,该产品得到了哪些改进?想一想你将如何使用数据来确定需求。你会收集什么样的数据?你衡量成功的关键标准是什么?如果您认为该产品未来有什么改进,会是什么?你会设计什么样的实验来测试它?
对每种不同的产品重复这一过程。你对公司的产品和指标了解得越多,回答商业案例问题的准备就越充分。在精神上把自己放在公司数据科学家的角色将推动你真正想象业务的需求和挑战,以及你的工作将如何解决它们。
4.组织你的答案
组织你的答案可能是回答好这些问题最棘手的部分。要做的最重要的事情是放弃有一个“正确的”方法来做这件事的想法。你应该把商业案例问题看得更像是一次谈话,这会让你很难保持一个固定的结构。在这种情况下,它们更类似于人力资源类型的问题,它们是开放式的,实际上只是取决于情况、问题、公司和你的经验。但就像 HR 类型的问题一样,你练习得越多,就越容易以逻辑的方式连贯地讨论答案。
我喜欢借用商业案例的思路来帮助我思考我的答案的各个部分。我建议寻找一些典型的问题,对着镜子自己回答,或者找一个朋友做你的面试官。这里有一个总体结构,我用它来帮助我开始更线性地思考这些问题。我希望这能帮助你开始以一种对你有意义的方式组织你的答案:
- 澄清问题:像任何数据项目一样,你应该总是从一个清晰的目标或要解决的问题开始。假设你被问到这样的问题,“XYZ 的产品销量下降了 20%,你会怎么做?”一个重要的起点是澄清“首付 20%”是什么意思。这是指与去年同期相比的销售额吗?从上个月开始?下降是通过原始金额还是通过销售数量来衡量的?这种澄清将有助于您准确地确定问题是什么,以及要讨论什么指标/数据。请记住,您应该已经熟悉该公司使用的通用指标以及他们的产品。你想表现出你能逻辑地处理问题,并定义什么是需要解决的。在现实生活中,这是最重要的一步,因为如果你没有在正确的页面上,这将导致最大的痛苦。
- 确定可能的原因和解决方案:现在你知道了问题是什么,目标是什么指标,你可以考虑一些可能的原因。公司通常希望看到你能提出多种想法,所以我建议你瞄准 2-3 个想法,这样你就能展示出你解决问题的能力,同时保持你的回答有条理。再一次,想想公司在你的工作方式中寻找什么——他们想要一个能带来想法的人。
- 谈论实验:你会如何设计一个实验来测试你可能的原因/解决方案?你会如何取样?如果您看到指标增加或减少,您会提出什么样的假设?什么时候增加或减少指标可能具有欺骗性?有时,你可能会有面试官希望你在面试中获得更多信息或保持高水平,这是你必须从谈话中评估的事情。但总的来说,该公司正试图了解你将如何采取行动,将你的数据科学知识应用于现实世界的问题。
- 确定利弊:一些指标会如何相互影响?解决方案会有多昂贵和复杂?不同解决方案的风险和好处是什么?在这个假设场景中,你会提出什么样的建议?面试官想判断你如何传达结果,评估缺点,并给出建议。
真正利用你的面试官进行讨论。如果他们没有给你很多关于你是否在正确的轨道上的反馈,那么你完全可以问你是否在正确的轨道上。如果你担心自己漫无边际,那么问问他们是否希望你继续沿着某条轨道走下去或者继续前进。记住,就像所有其他的面试问题一样,公司是想看看和你一起工作会是什么样子。回答问题时,请始终牢记展示你将如何增加价值的指导原则。
结论
希望这份指南能给你一些好的基础知识来学习和扩展。记住,商业案例问题没有正确的答案,而是双方都想看看你是否适合这份工作。出于这个原因,你应该一直努力寻找你的答案,尽你最大的努力展示你的想法以及如何与你共事。
祝你面试顺利。你会做得很好的!
如何准备您的开发环境以便在 Kaggle 上排名
插图照片由 Pexels 的 Mateusz Dach 拍摄。
这篇文章介绍了为 Kaggle 影像分类挑战配置定制开发环境的最佳实践。
在这个故事中,我将介绍如何为参加 Kaggle 挑战赛设置开发环境:
1)选择一个最近有趣的比赛,
2)在云中启动一个 JupyterLab 环境,
3)下载完整的数据集,
4)执行初始图像预处理。
初步选择:竞赛、深度学习框架、云平台
显示每个串联类别组合的样本图像和计数。
我们将使用最近的 Kaggle 植物病理学 2021 — FGVC8 来展示完整的数据科学周期。这场比赛的一个好的方面是,它非常简单,代表了 CIFAR 和 MNIST 以外的真实世界图像分类任务所面临的挑战。
我为这些比赛选择的框架是 PyTorch Lightning ,它允许我专注于迭代我的数据处理和模型架构,而不用担心训练循环和设备管理的繁重工程。关于为什么你应该查看下面的 PyTorch 闪电贴的更多信息。
https://devblog.pytorchlightning.ai/why-should-i-use-pytorch-lightning-488760847b8b ,它可以让我精确地指定我想要使用的机器,里面预装了 JupiterLab。作为奖励,Grid 使我能够用 Github 同步我所有的 Kaggle 代码。稍后,我将使用它来运行超参数搜索,为我的模型找到最佳配置。
完全公开——我目前在 Grid.ai
担任高级研究工程师。注意,还有其他替代方案可以用来利用这些最佳实践,例如 Kaggle 内核或 Colab,但 Grid 是我的首选平台,因为它使我能够使用云轻松地扩展训练我的模型。
本教程中包含的所有代码和可视化都可以在本报告中获得,您可以免费使用和贡献。
准备 Kaggle 开发环境
我选择 Grid.ai 作为我的开发环境,因为它提供了三个主要的构建模块:
- 数据存储(使我能够一次上传数据,并在任何地方使用;他们确保我们所有的原型和实验使用相同的数据,并且是可重复的)
- 会话(这使我能够专注于机器学习本身。我发现网格实例的 CPU/GPU/RAM 性能优于 Kaggle 和 Colab 内核)
- 运行(这使我能够扩大实验规模;我可以实时密切监控多个实验,及早停止次优配置,比较结果,并在一个地方为 Kaggle 导出最佳模型。
启动网格会话
在网格会话中启动 Jupyter 实验室。
首先用 GitHub 或者 Google 账号登录 Grid.ai 。然后您可以创建一个会话——配置您的实例类型并设置所需的存储大小(当您想要处理大型数据集时会很方便)。新的交互式会话实例带有一个内置的 JupyterLab。
为完整旅程创建网格会话的步骤点击此处
我可以轻松地启动 JupyterLab,并使用 cli 工具glasses来监控实时资源使用情况,这让我知道是否存在任何资源瓶颈,如预处理期间的 CPU 利用率或训练期间的 GPU 利用率,从而导致训练批量增加。
https://docs.grid.ai/products/sessions
设置 Kaggle CLI 并下载数据集
为了在我们的会话中获得植物病理学 2021 — FGVC8 数据集,我们使用由 Kaggle 直接提供的 Kaggle CLI,并在 PyPI 上进行索引。
pip install kaggle
对于任何使用 Kaggle CLI 的用户,您需要设置您的凭证——登录 Kaggle web 并创建您的个人密钥,该密钥将作为kaggle.json
自动下载。
从个人 Kaggle 帐户下载凭证文件的步骤如下:(1)选择帐户,(2)向下滚动并“创建新的 API 令牌”。
当我们有了kaggle.json
密钥后,我们可以使用 JupyterLab 将其上传到我们的会话(简单的拖放)并将其移动到 Kaggle CLI 的正确目的地,如下所示:
逐步如何设置 Kaggle CLI: (1)安装kaggle
包,(2)拖放带有凭证的文件,(3)将其移动到预期的系统文件夹。
mv kaggle.json /home/jovyan/.kaggle/kaggle.json
现在,我们将数据集下载到我们的会话中。要下载的特定竞赛名称与 URL 名称相同。此外,每场比赛的数据部分都提供了确切的下载命令。大多数数据集以压缩的形式分发,我们需要将它解压缩到一个目的地文件夹(我通常将该文件夹命名为与竞争对手相同的文件夹)。因此,在我们的竞争中,我们调用以下命令:
# doanload dataset via Kaggle CLI
kaggle competitions download plant-pathology-2021-fgvc8
# unzip the dataset to a folder
unzip plant-pathology-2021-fgvc8.zip -d plant-pathology
数据集预处理
提取之后,我们可以对数据集进行预处理。原始数据集以 4K 分辨率分布,这对于大多数应用程序来说太大了,所以我们将图像缩小到大约 640px。在如何在排行榜上排名中描述了这种观察和推理。我们使用一个简单的 CLI 工具 ImageMagick 。
apt install imagemagick
# apply to all JPEG images in given folder
mogrify -resize 640 plant-pathology/train_images/*.jpg
最终,您可以编写自己的小脚本来探索 python 多处理并加速这种转换…
用于多处理图像缩放的简单脚本。
这就是你需要知道的准备 Kaggle 开发环境和 Grid.ai 的一切。概括地说,我们选择了一个有趣的 Kaggle 竞赛,展示了如何开始交互式会话,以及如何为任何(本地或云)环境配置 Kaggle 凭证。
我将在未来的博客文章中继续探索这个下载的数据集,并准备一个基线计算机视觉模型来解决这个任务。我还将回顾一些帮助我在排行榜上排名的技巧,敬请关注。稍后,我们还将分享如何轻松地从离线内核提交内容。
敬请关注,并跟随我了解更多!
关于作者
Jirka boro vec已经在几家不同的 IT 公司从事机器学习和数据科学工作好几年了。特别是,他喜欢探索有趣的世界问题,并用最先进的技术解决它们。此外,他开发了几个开源 python 包,并积极参与其他知名项目。在 Grid.ai 工作,担任研究工程师,是pytorchlightning . ai的主要撰稿人。
如何向非技术人员展示机器学习结果
展示利益相关者能够理解的模型结果
作为一名数据科学家,很难向非技术利益相关者解释机器学习的结果。经过反复试验,我想出了一种将模型结果转换成利益相关者能够理解的格式的方法。今天,我想和大家分享我的方法,我用它取得了巨大的成功。
方法 1
这种方法可以应用于生成 0 到 1 之间的概率分值的任何模型。
- 首先将你的模型分数从高到低排序,并对其进行十分制。十分位数 1 将包含最高分,十分位数 10 将包含最低分。
- 接下来计算每个十分位数的最小值、中值和最大值。
- 通过十分位数计算真阳性的数量,然后将真阳性的数量除以您的评分人群中的真阳性总数。
下面是在购买倾向模型得分样本集上使用此方法的输出示例。总购买量百分比栏中的百分比是用十分位数的购买量除以总购买量 31,197 计算出来的。
按十分位数购买——按作者分类的表格
这些是这张表上的关键要点。
- 第一和第二个十分位数分别预测了 33%和 32%,合计购买量的 65%。这表明该模型能够预测出购买了的大多数顾客位于前两个十分位数。
- 与上面的十分位数相比,每个十分位数在总购买量中所占的百分比较低。这是我们对一个好模型的预期趋势,因为大部分购买发生在最高的十分之一,而最低的十分之一包含很少的购买。请注意,十分位数 10 只包含 2%的购买量,而十分位数 1 包含 33%的购买量。
- 十分位数 3 的分数在 0.239 到 0.555 之间。十分位数 3 是模型变得不太可能准确预测客户购买的时候。
我见过数据科学演示,其模型结果超出了非技术人员的理解范围。
然而,如果你用一个表格来展示模型结果,显示前 20%的顾客获得了 65%的购买量,那么你的利益相关者就很容易理解了。
方法 2
第二种方法类似于第一种方法,也是一种让数据科学家更容易评估模型结果的视图。
- bin 模型在 0 到 1 之间以十分之一为增量进行评分,而不是十分之一。
- 计算每个条柱的最小值、中值和最大值。
- 计算每个箱子中真阳性的数量,然后将真阳性的数量除以真阳性的总数。
下面是使用同一组购买倾向得分样本的输出示例。
按分数范围列出的购买情况—按作者列出的表格
这些是使用此输出按分值分类的要点。
- 使用 0.5 作为映射到 true 的阈值,如果我们将突出显示的“总购买量的百分比”列中的百分比相加,该模型能够预测总购买量的 67%。
- 但是,得分在 0.1 到 0.19 之间的客户占总购买量的 20%。这表明可能有其他特征可以改进模型,并保证进一步的分析。如果我们没有看到 20%,而是看到了 2%,那么您可以更有信心该模型捕捉到了所有相关特征,以准确预测购买。
该输出向利益相关者显示,您的模型准确地捕获了 67%的购买。如果模型没有预测到真正的阳性结果,它还可以帮助您识别问题,并显示您可以进一步研究的领域,例如得分在 0.1 到 0.19 之间的客户。
结论
作为数据科学家,冲动是显示原始模型结果,但通常我们需要将输出转换成利益相关者可以理解的形式。现在你已经看到了我的方法,我希望你能更容易地表达你的模型结果,让每个人都能理解。
如何漂亮地打印熊猫数据帧和系列
如何在同一行显示熊猫数据框的所有列
当我们必须处理可能有多列和多行的大熊猫数据帧时,能够以可读的格式显示数据帧是很重要的。这在调试代码时可能也很有用。
默认情况下,当数据帧被打印出来并且具有相当多的列时,只有一部分列被显示到标准输出中。显示的列甚至可以打印成多行。
在今天的文章中,我们将探讨如何配置所需的 pandas 选项,这将允许我们“漂亮地打印”pandas 数据帧。
问题是
假设我们有以下数据帧:
现在,如果列数超过显示选项display.max_rows
的值,则输出数据帧可能不完整,如下所示。仅显示列的子集(column4
和column5
缺失),而剩余的列以多行方式打印。
来源:作者
虽然输出仍然具有一定的可读性,但是忽略列或多行打印肯定是不理想的。
如何漂亮地打印熊猫数据帧
如果您的显示器足够宽,能够容纳更多的列,您可能需要调整一些显示选项。我将在下面使用的值可能不适合您的设置,因此请确保对它们进行相应的调整。就我个人而言,我使用超宽显示器,必要时可以打印出相当多的栏目。
如何在同一行打印所有列和
现在,为了显示所有的列(如果你的显示器能够容纳它们的话),并且在一行中,你所要做的就是将显示选项expand_frame_repr
设置为False
:
pd.set_option('expand_frame_repr', False)
来源:作者
[display.expand_frame_repr](https://pandas.pydata.org/pandas-docs/stable/user_guide/options.html)
默认:
True
是否打印多行宽数据帧的完整数据帧报告,
max_columns
仍受关注,但如果其宽度超过display.width
,输出将跨越多个“页面”
或者,您可以更改display.max_rows
的值,而不是将expand_frame_repr
设置为False
:
pd.set_option(‘display.max_rows’, False)
注意,如果各栏仍打印在多页中,那么您可能也需要调整 **display.width**
。
如何打印所有行
现在,如果您的数据帧包含超过一定数量的行,将只显示少数记录(来自 df 的头部和尾部):
如果您想要显示更大范围(甚至所有)的行,您需要将display.max_rows
设置为您想要输出的行数。如果要显示所有行,将其设置为None
:
pd.set_option('display.max_rows', None)
使用上下文管理器
更好的方法是使用[option_context()](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.option_context.html)
,它是一个上下文管理器,可以用来临时设置with
语句上下文中的特定选项。
其他有用的显示选项
有更多的显示选项,你可以调整和改变熊猫数据帧的显示方式。
display.max_colwidth
: 这是为列名显示的最大字符数。如果某个列名溢出,将添加一个占位符(…
)来代替。
pd.set_option('display.max_colwidth', None)
display.precision
:这是将用于浮点的精度。它指定了小数点后的位数。display.width
:这是显示器的总字符数。如果您想显示更多的列,有时您可能还需要调整display.width
。
您可以使用describe_option()
找到显示的完整列表:
pd.describe_option(‘display’) .
Jupyter 用户注意事项
如果您正在使用 Jupyter 笔记本,只需使用[display(df)](https://ipython.readthedocs.io/en/stable/api/generated/IPython.display.html#IPython.display.display)
而不是print(df)
,宽度将会相应调整。
结论
在今天的文章中,我们讨论了熊猫的几个显示选项,让你可以根据你想要显示的内容以及你使用的显示器来漂亮地打印数据帧。
熊猫配备了一个options
系统,让用户调整和定制显示功能。我们只讨论了可用显示选项的一小部分。确保阅读官方文件的选项和设置部分。
如何确定分析工作的优先级—第 1 部分
行业笔记
一般来说,分析工作分为四个阶段
作者图片
我将写一系列关于数据科学(或可互换分析)最佳实践的短文。我坚信,在大大小小的组织中拥有一个好的数据科学部门的主要挑战是拥有正确的流程;这在很多方面比数据或算法更重要。你可以拥有世界上最聪明的数据科学家,拥有最复杂的算法,但如果你用错了方法,那就没关系了。
学习如何很好地确定分析工作的优先级是创建一个运转良好的数据科学部门所需的第一件基本事情。太多时候,优先排序是基于“谁问得最多?”或者“谁最后问?”当你以这种方式进行优先排序时,你就结束了“随机漫步”,经常变成“绕圈行走”,在解决基本问题或获得真正有价值的洞察力方面没有取得真正的进展。当你陷入随机漫步时,你会注意到一些症状:
- 根本性的挑战没有解决;您在一次又一次地解决相同的问题(例如,数据难以访问,报告不能按时运行,指标经常失败,数据质量低且没有随着时间的推移而提高)
- 即使是最琐碎的请求,您也必须与数据科学家或数据工程师互动,因为自动化程度很低,而且没有自助服务解决方案
- 你有很多 1/2 完成的项目,但没有一个真正运作良好
- 每个人都永远不快乐(讽刺的是,一旦你学会了分清主次,你就会有快乐的人和不快乐的人……稍后会有更多)
- 永远不清楚数据科学家或数据工程师在做什么;优先级每隔一周甚至每周都会改变,这是一个主要的危险信号,因为在一个管理良好的组织中,大多数分析项目需要 2-4 周的时间,该组织具有创建文档并对分析工作应用适当的 QA 的文化
为了很好地对你的项目进行优先排序,你首先需要把它们放到一个小的桶里:
- 战略项目
- 临时/战术项目
- 维护
- 研究和实验
在本文中,我们将讨论每一个桶,并向您展示一个推荐的分配,我发现通过反复试验,这个分配很有效。在随后的文章中,我们将深入探讨如何在第一(即,战略项目)和第二(即,特别/战术项目)桶中对行项目进行优先级排序和执行。我们还将讨论使您能够避免线性扩展维护所需带宽的策略,以及如何有选择地选择“高价值”的研究和实验项目。后续文章将讨论进一步的支持机制,使您能够成功地对分析项目进行优先级排序,从而为您的业务释放价值。
战略项目
这些项目支持新功能、自动化流程和/或构建自助服务解决方案。这些是组织真正的“商业增值”项目。“新功能”的一个例子是为新产品构建报告基础设施(例如,在您的网站上推出新功能,新的零售产品)。“自动化”的一个例子是将所有正式的手动报告转移到 Tableau 中,这样从数据到报告都是完全自动化的。“自助式”解决方案的一个例子是使用 Tableau 创建应用程序,使业务用户能够灵活地探索自己的数据,而无需编写 SQL 查询或与分析师合作来获取新数据。这需要创建具有非常特殊的后端数据结构和经过仔细考虑的 UI/UX 的 Tableau 应用程序;还需要非常了解业务,以及可能会被问到哪些业务问题。“自助式”解决方案的另一个例子是创建一个工具,使业务用户能够自己将数据直接加载到您的数据库中(通过适当的控制),以消除让数据工程师为他们手动加载的需要。
临时/战术项目
这些都是小要求,你通常可以在 1-3 天内完成。例如,向数据库模式中添加一个新的数据表。或者向现有数据表添加新列。关键是它们是小请求,通常在整个组织中没有太多价值;它们不支持新功能或自动化任何东西,也不支持自助服务解决方案。通常,这些会分散团队的注意力,因为它们是单个人的宠物项目。您必须积极主动,不允许临时请求伪装成战略项目,但您确实需要为您的客户提供一条途径,让他们在小问题上获得帮助,从而阻止他们继续前进。
维护
你建造的东西,你必须维护。这是不言自明的。这是您必须投入的工作,以保持您构建的东西正常工作。这是一段不容讨价还价的时间,也是最高优先级;你首先要为此留出适当的时间,剩下的时间你可以分配给其他三(3)个桶。
研究和实验
这些是内部项目,目的是让你构建的东西比现在做得更好。它不涉及对你已经建立的东西的大规模改变或修改;相反,它通常是改变小部分,看看整个事情是否得到改善。这方面的一个例子是使用红移频谱,它使红移能够查询存储在 S3 的平面文件,就像它们是红移中的一个表一样,以将不太常用但较大的数据表移动到 S3,而不是将它们作为本地副本存储在红移中。以这种方式使用红移光谱可以在不影响性能的情况下显著降低总成本,但这取决于数据的模式和查询方式。因为性能很难提前预测,所以在完全投入使用之前,您应该先尝试一下这个解决方案。
推荐分配
没有客观的正确的时间来投资每一个桶,但我几乎总是使用下面的分布,这是我通过多年的试错经验得出的:
- 战略项目— 50%
- 临时/战术项目— 20%
- 维护— 20%
- 研究和实验——10%
根据您在分析过程中所处的阶段以及您的业务需求,适合您组织的分配可能会有所不同。然而,我的经验表明,有两条经验法则你应该遵循:1)超过战略项目的指数,因为那些应该是真正为你的组织增加价值的项目(即,给这个桶最大的分配);2)维护很可能至少占您团队带宽的 20%,因为少于 20%的维护通常会造成这样一种情况,即您团队创建的分析产品或解决方案会崩溃和/或不被业务部门完全采用。如果你对自己创造的分析产品没有足够的重视来支持它们,为什么企业中的其他人会采用它们呢?
作者图片
顺便说一下,这四个桶并不是相互独立的。在一个成熟的、运行良好的数据科学(或分析)团队中,他们将以分层的方式相互支持,作为任何分析职能部门的领导者,您的目标是确定如何利用分层结构来提供更大的商业价值。具体而言,维护对于鼓励组织采用分析产品至关重要。但是随着您生产越来越多的分析产品,您的维护负担将会增加,除非您采用良好的开发过程(我们将在单独的文章中讨论这一点)。确保您遵循的方法不会造成维护费用的线性增长是至关重要的,因为这将很快变得不可持续。但是你也不能“归零”或减少你在维护上的投资,因为没有什么比一个几乎不起作用的分析产品更快地扼杀采用。此外,研究和实验应该始终面向两个目标:1)改进您的战略项目(即,您的分析产品),以及 2)最小化执行特定/战术项目所需的复杂性、工作量和带宽,因为特定项目很少为组织带来“业务增值”。因此,你越能降低战术项目的成本,你就越能为战略项目分配更多的带宽。
因为时间是有限而有价值的商品,你必须明智地投资它。做到这一点的关键是要有纪律,不要偏离你想要的四个投资区间的投资分布(平均来说,你可以每周都有变化,但在很长一段时间内,要确保你平均分配)。你必须时刻保持警惕,而且说实话,有点难对付。原因是每个人都认为他们的项目是世界上最重要的事情。但是我很喜欢一句谚语:每件事对某人来说都很重要,但这并不意味着每件事都同样重要。
一旦您将您的工作映射到每个时段,并决定对您的业务有意义的分配,您可以使用多种支持机制来确定每个时段内的优先顺序,并确保您能够成功地坚持您的分配投资策略和优先顺序,而不会被随机化。我将在单独的文章中更深入地讨论这些机制,但作为预览,它们包括以下内容:
- 业务需求文档
- 2x2 矩阵
- 路线图
- 待命流程
- 通信(横向和纵向)
- 文件是不可协商的
- 需求——设计——实现——文档循环(以及分阶段或迭代敏捷方法的使用)
与此同时,您可以了解商业中三个最重要的统计测试、 A/B 测试实际测量什么、良好分析数据仓库的基础知识、成功数据科学团队的支柱或关于自动化的四个重要工具的想法以最大限度地发挥您的数据科学的价值。
如何确定分析工作的优先级—第 2 部分
撰写良好的业务需求文档
作者图片
在之前的一篇文章中,我讨论了将你团队的分析(或可互换的数据科学)工作分成四(4)个部分的重要性,以帮助你有效地确定的优先级。在那篇文章的最后,我提到了成功坚持你的分配投资策略和优先顺序而不被随机化的七(7)个关键机制。其中一个机制是坚持所有的战略项目都从一份写得很好的业务需求文档开始(BRD)。在这篇文章中,我将提供一个简短的例子来说明怎样才能写好 BRD。我坚持认为战略项目的 brd 只有三个基本问题:
- 你想要什么?
- 你问的商业价值是什么?
- 完成您的提问需要哪些高级步骤?
典型的 BRD 只有 3-4 页长;它们必须用散文来写,以使作者能够清楚地表达需求,并且它们应该在必要或可能的地方包括视觉效果来清楚地表达需求。
你想要什么?
一封写得好的 BRD 会以简单的英语开始解释你的要求。这个请求应该既经济又全面,清楚地展示出你所需要的大愿景。任何人都应该容易理解,并尽可能避免行话。我们来看一个(虚构的)例子,看看你在提出问题时应该写些什么。
【2019 年 4 月,我们将启动“胡迪尼计划”,让我们的客户能够在附近便利的实体零售店订购定制服装,这将补充我们的在线订购渠道。胡迪尼计划将会看到分布在华盛顿 DC 地区的 10 家商店的揭幕;该项目的目标是衡量顾客在实体零售环境中订购定制服装的需求,而不是传统的在线渠道。在接下来的六(6)个月里,胡迪尼项目需要回答以下业务问题:
1。有多少顾客光顾我们的零售店?有多少是全新客户?有多少人在去零售店之前曾在网上订购过?有多少人在逛完零售店后会在网上订购?有多少订单仅通过单一渠道(即网上、零售店)订购?
2。按渠道(即在线、零售店)下的订单数量和金额分布情况如何?对于只通过单一渠道订购的客户,分销渠道会发生变化吗?那些通过这两种渠道订购的人呢?
3。购买频率如何随渠道变化?
4。客户群(例如,小企业、婚礼、姐妹会等)的分布如何随着渠道而变化?
5。顾客要走多远才能在零售店购物?
6。根据渠道的不同,对定制设计的帮助需求会有怎样的变化?与在线订购的客户相比,光顾零售店的客户与我们的平面设计师接触的频率更高还是更低?
7。客户选择的毛坯(即预先定制的服装)类型如何随渠道变化?在零售店订购的顾客会转向质量更好的坯料吗?我们是否可以推断出“触摸和感受”坯料可以更好地向顾客传达好的、更好的和最好的坯料之间的区别?
8。开零售店是否会蚕食店铺周边的网上订单?或者开一家零售店会增加该地区的总需求吗?
这些业务问题应该可以使用一个专门为支持胡迪尼项目而构建的 Tableau 应用程序来回答。应用程序应提供数据的高级视图,以支持每周和每月的业务回顾;同样的应用程序还应该支持对业务问题的“深入”分析。业务用户应该能够选择每日、每周、每月和每年级别的数据聚合。Tableau 应用程序应该从单个零售店扩展到聚合在一起的多个零售店,并允许比较在线和零售订单以及客户行为。只要有可能,数据应该在地图上可见,以使业务用户能够从地理上理解客户行为。
这是一个写得很好的“你想要什么?”使数据工程师和商业智能工程师能够用简单的英语理解您需要回答的关键业务问题。当我们了解这些业务问题时,我们可以帮助您设计和计算正确的业务指标,并选择正确的可视化方式,使数据易于消化。请注意,对于这个问题,一个写得很好的答案缺少了什么:
- 它不是一个指标列表(例如,在零售店订购的客户百分比)
- 它不是一组图表(例如,基于 Excel 的示例说“在 Tableau 中精确构建此图表”)
- 这不是 10 页的需求
你问的商业价值是什么?
在解释了你的要求之后,一篇写得很好的 BRD 解释了投资建设你所要求的东西的商业价值是什么。商业价值应该是清楚的,精确的,诚实的,相对于假设的。它也应该集中在无聊的“螺母和螺栓”,为什么你的要求应该优先考虑和投资。
胡迪尼项目是在零售店将补充而不是蚕食网上订单的假设下获得批准和启动的;该项目假设零售店将吸引新客户,这些客户永远不会(或几乎永远不会)在网上订购定制服装,因为他们更喜欢在下单前与我们的产品“接触、感受和互动”。我们进一步假设,更喜欢在零售店(而不是网上)订购的顾客更喜欢亲临商店并与我们的商店员工互动的个人接触;我们相信,这些顾客在订购定制服装时,需要与人面对面交流,从而获得安全感。我们的估计是,项目 Houdini 将在零售店 15 英里范围内产生 10%的订单增长(具有相似的平均订单价值)(即,在零售店 15 英里范围内,每 100 个在线订单将产生 10 个零售订单)。如果我们的假设是正确的,零售商店网络将产生 3500 万美元的年增量收入(每家商店 350 万美元),并且假设投入 100 万美元的资本支出来开办一家普通的零售商店,则回收期为 3.5 个月。
我们所要求的 Tableau 应用程序将使我们能够很容易地理解胡迪尼项目的表现,并验证该项目的假设是正确的。如果我们不投资构建应用程序,将需要两(2)个人每周工作 40 小时来使用 Excel 手动构建报告。手动创建这些报告会降低数据的质量,并延迟我们对胡迪尼项目绩效的报告。使用 Tableau 应用程序,我们希望每周一下午与高级业务领导会面,回顾前一周的业绩;如果没有申请,我们至少要等到周四才能回顾前一周的表现。此外,Tableau 应用程序将使我们能够在周一下午的每周回顾中快速“深入”数据,回答回顾中提出的任何问题,而用 Excel 手动报告将迫使我们在每周业务回顾后再花一周时间提取数据,并返回前一周提出的问题的答案。
总之,使用 Excel 进行手动报告将导致理解 Houdini 项目绩效延迟 1-2 周,降低数据质量,并且需要两(2)人每周投入 40 小时的人工工作来准备数据和基于 Excel 的报告。对于一家年收入为 3.5 亿美元的公司来说,在 Houdini 项目上投资 1000 万美元并不是一笔小数目,因此最大限度地提高数据质量并最大限度地减少衡量和理解绩效的延迟非常重要,这样我们就可以迅速采取行动,使 Houdini 项目取得成功。
注意,这个例子用简单的英语清楚地表达了为什么这个项目应该被优先考虑和投资的所有假设和原因。它没有简单地说“这个项目将产生 3500 万美元的年收入”,而是解释了未能满足要求的“螺母和螺栓”的负面后果:1)测量性能的重大延迟;2)数据质量下降;以及 3)每周安排两(2)个人来构建基于 Excel 的可疑质量报告。它还描述了胡迪尼是一个多大的投资项目的业务,以及如何使其成功将影响整个业务。
完成您的提问需要哪些高级步骤?
这往往是 BRD 的作家最难回答的问题;在这一部分,数据工程师和/或分析师经常需要帮助作者。但是我非常谨慎地使用“帮助”这个词,因为写 BRD 自我是请求者的责任。数据工程师和/或分析师可以向作者解释需要做什么,但作者有责任接受足够的教育,以便他们可以在高层次上写下需要做什么。有时候有人问我“为什么不自己写,而不是强迫商业用户向你学习,然后写下来?”这有一个很好的理由:它迫使数据工程师和/或分析师与寻求帮助的业务用户之间进行对话。这种对话对双方都有价值:
- 对于数据工程师和/或分析师来说,这有助于他们理解 ask 的业务需求和业务价值;他们有机会提出澄清性的问题,这些问题可能是撰写 BRD 的人没有考虑到的
- 对于编写 BRD 的业务用户来说,这有助于他们了解他们所提问题的技术细节;数据工程师和/或分析师有机会解释需要做些什么来向业务用户提供他们所要求的东西
双向对话有助于双方更好地了解对方试图做什么,最重要的是,为什么。
要构建 Houdini 项目所需的 Tableau 应用程序,需要完成以下高级步骤:
1。将在线订购系统的交易数据库纳入我们的商业智能(BI)数据仓库
2。将零售订购系统的交易数据库导入我们的 BI 数据仓库
3。设计并构建一个数据模型,将两个事务数据库合并成一组标准化的、干净的数据对象(即星型架构),使我们能够回答业务问题
4。为数据模型和数据模型上的性能质量保证(QA)编写文档,以验证数据的正确性
5。定义回答胡迪尼项目业务问题的指标
6。设计并构建 Tableau 应用程序的后端数据结构
7。设计和构建 Tableau 应用程序 UI/UX
8。与业务用户利益相关方一起审查 Tableau 应用程序草案
9。整合来自业务用户利益相关方的反馈
10。编写 Tableau 应用程序的文档
11。启动 Tableau 应用程序
根据我的经验,几乎每个 BRD 都会有 8-12 个要点,列出满足要求需要执行的高级步骤。请注意,这个列表中有两个项目被明确提到,但几乎总是被遗忘:1)文档,和 2) QA。这些必须明确提及,在文档准备就绪之前,任何项目都不能被视为完成;事实上,在完成文档之前,我们从不“启动”任何战略项目,以避免直接进入下一个项目和偷工减料的诱惑。
所以,上面你有一个 BRD 的好例子。你会注意到它简洁,清晰,易于理解。对于一个分析项目来说,一个好的 BRD 并不需要大量的文字;我很少看到任何分析项目需要写超过 3-4 页的内容。
激烈辩论的话题
上面的示例 BRD 1)避免了提供度量列表,但是 2)它假设了问题的正确解决方案(例如,Tableau 应用程序)。这有道理吗?根据我的经验,这是一个激烈辩论的话题。我将解释为什么我坚持 BRD 避免列出所有的指标,以及为什么我同意 BRD 的作者假设一个解决方案。首先让我们讨论“度量”,然后讨论“解决方案的假设”。
根据定义,分析师和/或数据科学家是分析(和数据科学)方面的专家,不一定是编写 BRD 的业务用户。通过要求业务用户描述他们试图回答的业务问题,它使分析团队能够更好地了解业务以及业务领导者如何看待业务,并且它鼓励分析团队深入思考业务以及什么类型的分析可以回答业务问题。当 BRD 是一个指标列表时,这个过程就被缩短了,因为分析师或数据科学家倾向于简单地计算所要求的任何指标,即使这些指标不是回答业务问题的“最佳”指标。BRD 是一种迫使分析团队和业务团队之间进行对话的机制。这种对话使业务团队更有可能获得最佳的分析解决方案,也使分析团队的解决方案更有可能真正增加业务价值(即,较少以学术为导向)。
如果您的业务“抱怨您的分析或数据科学组织与业务脱节”,这种脱节的主要原因(以我的经验来看)是没有机制来强制分析和业务团队之间的对话(例如,像 BRD 那样避免列出要计算的指标)。您总是希望制定一些流程,鼓励业务用户向分析和/或数据科学团队解释业务(例如,关键业务问题)。这确保了分析团队紧密地整合到业务中,并以具体的方式思考业务。另一方面,您希望确保您的分析和/或数据科学团队充分利用他们的专业知识和技能来使业务受益。最大的商业价值将而不是来自于让昂贵的分析师或数据科学家计算由商业用户选择的指标;最大的商业价值将来自于让这些分析师部署他们花了 10 多年时间学习的全套数学思维和技术。这只有在他们持续接触业务的具体条款时才会发生。避免在 BRD 中列出度量标准是确保这一点的一种方法(我们将在未来讨论其他机制)。
在我的职业生涯中,有些人不同意 brd 对业务问题的“解决方案”做出任何假设。从哲学上来说,他们不同意 BRD 的说法,即“*这些商业问题应该使用专门为支持胡迪尼项目而构建的 Tableau 应用程序来回答。”*相反,他们更喜欢只讨论业务问题(以及他们希望在任何可能的解决方案中包含的功能),而将所有关于任何可能的解决方案的讨论都放在 BRD 之外。我有时同意那个观点,有时不同意。我犹豫不决,因为严格排除对解决方案的任何讨论(即使是概念上的)有时会让作者和读者难以理解,因为这会导致非常抽象的 brd。另一方面,对解决方案非常规范的 BRD 可能会产生我们讨论过的相同问题,当时我坚持认为 BRD 不(仅仅)包括要计算的指标列表:分析和/或数据科学团队“关闭他们的大脑”,简单地构建所要求的东西。如果所要求的解决方案不是“正确”或“最佳”的,这就会成为一个问题。
到目前为止,我的经验促使我采取一种比较中庸的方法来解决在 BRD 中假设解决方案的问题。我相信,允许业务用户在编写 BRD 时假设一个概念性的解决方案,对于让他们能够清楚地描述他们的业务问题和他们在寻找什么非常重要。另一方面,业务用户必须清楚,假设的解决方案是概念性的,实现的解决方案将来自 BRD 的评审(以及评审期间的来回对话)。分析团队将设计满足 BRD 中描述的要求的解决方案;并且该解决方案最终可能与假设的不同。
想了解更多?
为了提醒自己成功安排分析工作优先级的七(7)个关键机制,请看我的第一部分文章。如果你今天对统计学更感兴趣,试试这篇关于 A/B 测试的文章或者这篇关于三(3)个最重要的统计测试的文章。最后,如果你想在 1-2 分钟内快速阅读,请尝试这篇文章中的八(8)个技巧来改善数据科学和业务用户之间的交流。
如何在几秒钟内处理数百万行的数据帧
您应该知道的另一个用于数据分析的 Python 库——不,我不是在说 Spark 或 Dask
克里斯蒂安·恩格梅尔在 Unsplash 上拍摄的照片
Python 中的 ig 数据分析正在复兴。这一切都始于 NumPy,它也是我在本文中介绍的工具背后的构建块之一。
2006 年,大数据是一个慢慢受到关注的话题,尤其是随着 Hadoop 的发布。熊猫随后推出了它的数据框架。2014 年是大数据成为主流的一年,Apache Spark 也是在这一年发布的。2018 年,Dask 和其他用于 Python 数据分析的库问世。
每个月我都会发现一个新的数据分析工具,我渴望学习它。花一两个小时在教程上是值得的投资,因为从长远来看可以节省你很多时间。了解最新的技术也很重要。
虽然你可能认为这篇文章是关于 Dask 的,但你错了。我发现了另一个用于数据分析的 Python 库,您应该知道。
和 Python 一样,精通 SQL 也同样重要。如果你不熟悉它,并且你有一些闲钱,可以参加这个课程:掌握 SQL,大数据分析的核心语言。
Python 中的大数据分析正在复兴
这里有几个你可能会感兴趣的链接:
- [Complete your Python analyses 10x faster with Mito](https://trymito.io/) [Product]- [Free skill tests for Data Scientists & ML Engineers](https://aigents.co/skills) [Test]- [All New Self-Driving Car Engineer Nanodegree](https://imp.i115008.net/c/2402645/1116216/11298)[Course]
你愿意多看一些这样的文章吗?如果是这样,你可以点击上面的任何链接来支持我。其中一些是附属链接,但你不需要购买任何东西。
认识 Vaex
Vaex 是一个高性能的 Python 库,用于懒惰的核外数据帧(类似于 Pandas),以可视化和探索大型表格数据集。
它每秒可以计算超过 10 亿行的基本统计数据。它支持多种可视化,允许对大数据进行交互式探索。
Vaex 和 Dask 有什么区别?
Vaex 与 Dask 不相似,但与 Dask 数据框架相似,后者建立在顶级熊猫数据框架之上。这意味着 Dask 继承了熊猫的问题,比如高内存使用率。这不是 Vaex 的情况。
Vaex 不复制数据帧,因此它可以在主存较少的机器上处理更大的数据帧。
Vaex 和 Dask 都使用延迟处理。唯一的区别是 Vaex 在需要时计算字段,而 Dask 需要显式地使用 compute 函数。
数据需要采用 HDF5 或 Apache Arrow 格式,以便充分利用 Vaex。
如何安装 Vaex?
安装 Vaex 就像安装任何其他 Python 包一样简单:
pip install vaex
我们带 Vaex 去试驾吧
尤金·希斯蒂科夫在 Unsplash 上的照片
让我们创建一个具有 100 万行和 1000 列的 pandas 数据帧,以创建一个大数据文件。
import vaex
import pandas as pd
import numpy as npn_rows = 1000000
n_cols = 1000
df = pd.DataFrame(np.random.randint(0, 100, size=(n_rows, n_cols)), columns=['col%d' % i for i in range(n_cols)])df.head()
熊猫数据帧的前几行(图片由作者制作)
这个数据帧使用多少主存?
df.info(memory_usage='deep')
我们把它保存到磁盘上,这样以后就可以用 Vaex 读取了。
file_path = 'big_file.csv'
df.to_csv(file_path, index=False)
用 Vaex 直接读取整个 CSV 不会有太大的收获,因为速度和熊猫差不多。在我的笔记本电脑上,两者都需要大约 85 秒。
我们需要将 CSV 转换为 HDF5(分层数据格式版本 5 ),以了解 Vaex 的优势。Vaex 有一个用于转换的功能,它甚至通过转换较小的块来支持比主存大的文件。
如果由于内存限制,你不能用 pandas 打开一个大文件,你可以把它转换到 HDF5 并用 Vaex 处理它。
dv = vaex.from_csv(file_path, convert=True, chunk_size=5_000_000)
该函数创建一个 HDF5 文件,并将其保存到磁盘上。
dv 的数据类型是什么?
type(dv)# output
vaex.hdf5.dataset.Hdf5MemoryMapped
现在,让我们用 Vaex 读取 7.5 GB 数据集—我们不需要再次读取它,因为我们已经在 dv 变量中有它了。这只是为了测试速度。
dv = vaex.open('big_file.csv.hdf5')
Vaex 执行上面的命令不到 1 秒钟。但是 Vaex 实际上并没有读取文件,因为懒加载,对吧?
让我们通过计算 col1 的和来强制读取它。
suma = dv.col1.sum()
suma# Output
# array(49486599)
这个真的让我很惊讶。Vaex 计算总和的时间不到 1 秒。这怎么可能呢?
无论磁盘上的文件大小如何,打开这样的数据都是即时的。Vaex 将只是对数据进行内存映射,而不是在内存中读取数据。这是处理大于可用 RAM 的大型数据集的最佳方式。
测绘
Vaex 在绘制数据时也很快。它有特殊的绘图功能 plot1d,plot2d 和 plot2d_contour。
dv.plot1d(dv.col2, figsize=(14, 7))
用 Vaex 绘图(图片由作者制作)
虚拟列
Vaex 在添加新列时会创建一个虚拟列,这是一个不占用主内存的列,因为它是动态计算的。
dv['col1_plus_col2'] = dv.col1 + dv.col2
dv['col1_plus_col2']
Vaex 中的虚拟列(图片由作者制作)
高效过滤
Vaex 在过滤数据时不会创建数据帧副本,这样内存效率更高。
dvv = dv[dv.col1 > 90]
聚集
聚合的工作方式与熊猫略有不同,但更重要的是,它们非常快。
让我们添加一个二进制虚拟列,其中 col1 ≥ 50。
dv['col1_50'] = dv.col1 >= 50
Vaex 在一个命令中结合了 group by 和 aggregation。下面的命令按“col1_50”列对数据进行分组,并计算 col3 列的总和。
dv_group = dv.groupby(dv['col1_50'], agg=vaex.agg.sum(dv['col3']))
dv_group
Vaex 中的聚合(图片由作者制作)
连接
Vaex 无需进行内存复制即可连接数据,从而节省了主内存。熊猫用户将熟悉加入功能:
dv_join = dv.join(dv_group, on=’col1_50')
结论
最后,你可能会问:我们应该简单地从熊猫转向 Vaex 吗?答案是一个大大的否定。
Pandas 仍然是 Python 中数据分析的最佳工具。它为最常见的数据分析任务提供了支持良好的功能。
谈到更大的文件,熊猫可能不是最快的工具。这是 Vaex 的绝佳切入点。
Vaex 是您应该添加到数据分析工具箱中的工具。
当处理 pandas 速度太慢或崩溃的分析任务时,从工具箱中取出 Vaex,过滤掉最重要的条目,然后继续对 pandas 进行分析。
在你走之前
在 Twitter 上关注我,在那里我定期发布关于数据科学和机器学习的。
如何在几秒钟内处理一个数百万行的数据帧?
TLDR;在云中使用新的 Python 数据处理引擎处理它。
杰森·黑眼在 Unsplash 上的照片
数据科学正在迎来它的复兴时刻。很难跟踪所有新的数据科学工具,这些工具有可能改变数据科学的工作方式。
我最近才在与一位同事的交谈中了解到这个新的数据处理引擎,他也是一名数据科学家。我们讨论了大数据处理,这是该领域创新的前沿,这个新工具突然出现了。
虽然 pandas 是 Python 中事实上的数据处理工具,但它不能很好地处理大数据。对于更大的数据集,您迟早会遇到内存不足的异常。
研究人员很久以前就面临这个问题,这促使了像 Dask 和 Spark 这样的工具的开发,这些工具试图通过将处理分配给多台机器来克服“单台机器”的限制。
这一活跃的创新领域也为我们带来了像 Vaex 这样的工具,它们试图通过提高单台机器的内存效率来解决这个问题。
这还没有结束。您应该了解另一种大数据处理工具…
遇见真理
弗兰克·麦肯纳在 Unsplash 上拍摄的照片
Terality 是一个无服务器的数据处理引擎,在云端处理数据。无需管理基础架构,因为 Terality 会负责扩展计算资源。它的目标受众是工程师和数据科学家。
我与 Terality 的团队交换了几封电子邮件,因为我对他们开发的工具感兴趣。他们迅速回答。这些是我向团队提出的问题:
我给 the Terality 团队的第 n 封邮件(作者截图)
用 Terality 处理数据的主要步骤是什么?
- Terality 附带了一个 Python 客户端,您可以将其导入到 Jupyter 笔记本中。
- 然后,您在**“熊猫之路”**中编写代码,Terality 安全地上传您的数据,并负责分布式处理(和扩展)以计算您的分析。
- 处理完成后,您可以将数据转换回常规的 pandas 数据框架,并继续进行本地分析。
幕后发生了什么?
Terality 团队开发了一个专有的数据处理引擎——它不是 Spark 或 Dask 的分支。
目标是避免 Dask 的不完美,它没有和 pandas 一样的语法,它是异步的,没有 pandas 的所有功能,也不支持自动缩放。
Terality 的数据处理引擎解决了这些问题。
Terality 可以免费使用吗?
Terality 有一个免费计划,你可以每月处理高达 500 GB 的数据。它还为有更高要求的公司和个人提供付费计划。
在本文中,我们将关注免费计划,因为它适用于许多数据科学家。
Terality 如何计算数据使用量?(来自 Terality 的文档)
考虑一个内存总大小为 15GB 的数据集,它将由操作 df.memory_usage(deep=True)返回。sum() 。
对该数据集运行一(1)个操作,如*。总和或一个。sort_values* 总共会消耗 15GB 的已处理数据。仅当任务运行进入成功状态时,才会记录可计费使用量。
数据隐私呢?
当用户执行读取操作时,Terality 客户端会将数据集复制到亚马逊 S3 上 Terality 的安全云存储中。
Terality 对数据隐私和保护有严格的政策。他们保证不会安全地使用和处理这些数据。
Terality 不是存储解决方案。他们最多会在 Terality 的客户端会话关闭后 3 天内删除您的数据。
Terality 处理目前在法兰克福地区的 AWS 上进行。
数据需要公开吗?
不要!
用户需要在他的本地机器上访问数据集,Terality 将在后台处理上传过程。
上传操作也是并行的,因此速度更快。
Terality 能处理大数据吗?
此刻,2021 年 11 月, Terality 还在测试中。它针对高达 100–200 GB 的数据集进行了优化。
我问团队他们是否计划增加这一数量,他们计划很快开始针对 TB 进行优化。
让我们试驾一下吧
尤金·希斯蒂科夫在 Unsplash 上拍摄的照片
我很惊讶你可以简单地用 Terality 的包替换 pandas import 语句并重新运行你的分析。
注意,一旦导入了 Terality 的 python 客户端,数据处理就不再在本地机器上执行,而是通过 Terality 的数据处理引擎在云中执行。
现在,让我们安装 Terality 并在实践中试用它…
设置
您只需运行以下命令即可安装 Terality:
pip install --upgrade terality
然后你在 Terality 上创建一个免费账户,并生成一个 API 密匙:
在 Terality 上生成新的 API 密钥(作者截图)
最后一步是输入您的 API 密钥(也用您的电子邮件替换电子邮件):
terality account configure --email your@email.com
让我们从小处着手…
现在,我们已经安装了 Terality,我们可以运行一个小例子来熟悉它。
实践表明,在使用 Terality 和 pandas 时,您可以两全其美——一个用来聚集数据,另一个用来本地分析聚集数据
下面的命令创建了一个 terality。通过导入熊猫的数据帧。数据帧:
**import** **pandas** **as** **pd**
**import** **terality** **as** **te**df_pd = pd.DataFrame({"col1": [1, 2, 2], "col2": [4, 5, 6]})
df_te = te.DataFrame.from_pandas(df_pd)
现在,数据在 Terality 的云中,我们可以继续进行分析:
df_te.col1.value_counts()
运行过滤操作和其他熟悉的 pandas 操作:
df_te[(df_te["col1"] >= 2)]
一旦我们完成了分析,我们可以用以下方法将其转换回熊猫数据框架:
df_pd_roundtrip = df_te.to_pandas()
我们可以验证数据帧是否相等:
pd.testing.assert_frame_equal(df_pd, df_pd_roundtrip)
让我们去大…
我建议你查看一下 Terality 的快速入门 Jupyter 笔记本,它会带你分析 40 GB 的 Reddit 评论数据集。他们也有一个较小的 5 GB 数据集的教程。
我点击了 Terality 的 Jupyter 笔记本,处理了 40 GB 的数据集。它在 45 秒内读取数据,需要 35 秒进行排序。与另一个表的合并花费了 1 分 17 秒。感觉就像我在笔记本电脑上处理一个小得多的数据集。
然后,我尝试在我的笔记本电脑上加载同样的 40GB 数据集,其中有熊猫,内存为 16gb——它返回了一个内存不足的异常。
官方 Terality 教程带你分析一个带有 Reddit 注释的 5GB 文件。
结论
斯文·舍尔梅尔在 Unsplash 上的照片
我玩了相当多的 Terality,我的经验是没有大问题。这让我很惊讶,因为他们正式仍在测试中。一个很好的迹象是,他们的支持团队非常积极。
当您有一个无法在本地机器上处理的大数据集时,我看到了一个很好的 Terality 用例——可能是因为内存限制或处理速度。
使用 Dask(或 Spark)将需要启动一个集群,这比使用 Terality 来完成分析的成本要高得多。
此外,配置这样一个集群是一个繁琐的过程,而使用 Terality,您只需要更改 import 语句。
我喜欢的另一件事是,我可以在我的本地 JupyterLab 中使用它,因为我有许多扩展、配置、黑暗模式等。
我期待着团队在未来几个月里在 Terality 方面取得的进展。
如何使用 Python 在 Plotly 中制作动画柱状图
让您的原始数据集产生一个动画条形图
图片由作者斯蒂芬·福特汉姆提供
绘制美国各县的抗生素处方率
本教程详细介绍了如何使用 Python 中的 Plotly 库将原始数据转换成动画条形图。本教程中使用的数据集标题为:
从 2010 年开始,提供者所在县的儿童医疗补助参保者的潜在可避免抗生素处方观察率和风险调整率。
数据集可以通过数据世界找到。具体来说,我们的目标是绘制 2010 年至 2016 年美国各县抗生素处方率/100 次就诊的动画柱状图。
准备数据
首先,我们首先导入 pandas 库和 plotly express。此外,在处理数据集时,查看所有行和列有时会很有用。为此,我们可以将“显示最大行数”和“显示最大列数”都设置为 None,如下所示。但是,重要的是要考虑到应用此设置时,较大的数据集将需要加载器来加载。最后,我们可以在我标记为“潜在可避免抗生素处方率. csv ”的数据集中阅读。
图 1:GitHub Gist;初始设置
每年的条目
我们可以首先确定数据集中县的数量。这将使我们能够破译每个县存在了多少年的信息。这里有 63 个不同的县,dataframe 总共有 441 行,这意味着每个县有 7 年的可用数据。
图 2:无序的数据格式
将数据放入动画条形图的正确形状中
为了绘制动画条形图,我们需要将数据配置为不同于当前的格式。我们需要在单个数据框架中按照年份顺序排列每个县。为了说明这一点,下面的 dataframe 图像片段显示了所需的格式。
简单明了的数据争论可以将格式从上面的图 2 变成下面的图 3。
图 3:正确格式化的数据。在单个数据框架中按年份顺序排列的县
数据争论
为了重新组织数据,我们首先使用 list comprehension 创建一个从 0 到 63 的键列表。然后,我们可以实例化一个空字典,遍历键列表和唯一的县列表。通过每次循环,我们为每个县创建一个新的数据框架,首先按最早年份排序。最后,我们可以将新的数据帧添加到 all_dataframes 字典中,该字典在每个循环中都被分配了一个唯一的键值。
然后,我们可以使用唯一键遍历所有数据帧,并添加到所有数据帧的列表中,称为 master_df。
使用 pandas 的 pd.concat 函数,所有这些数据帧最终可以连接成一个数据帧。这个函数调用的输出数据帧被命名为 df_all。
实现这些步骤的简明代码如下所示
绘制县的子选择
我们可以绘制所有 63 个县的数据,或者选择一个子选项进行绘制。在这里,我们将选取 10 个独特的县进行演示。
为此,我们选择包含县的列,并调用 sample 方法,将参数 replace 设置为布尔值 True。然后我们调用 values 属性,该属性在使用 tolist()方法转换为列表之前返回一个数组。我们现在可以看到 10 个独特的选定县的列表。
我们使用这 10 个县,通过熊猫 isin 方法过滤数据框架。这将返回 plot_df 数据帧。最后的步骤包括知道我们打算在 y 轴上绘制的列的最小值和最大值,在我们的例子中,是“每 100 次就诊的观察处方率”,我们将在我们的 figure 对象上使用它作为 range_y 参数。
动画条形图
格式正确的数据,加上我们的 10 个县,现在可以绘制出来了。我们首先将 dataframe 和 x、y 轴的列以及提供者县传递给 color 参数。我们将 animation_frame 设置为 year 列,将 animation_group 设置为 Provider County 列。然后,我们使用上面为 y 轴确定的范围来设置 y 轴的合理界限,并给该图一个信息性的标题。
现在我们有了 10 个县的动画情节!