TowardsDataScience-博客中文翻译-2021-八十九-
TowardsDataScience 博客中文翻译 2021(八十九)
时间表
行业笔记
一个通用的时间轴视图帮助我们理解用户与系统的各种交互。
这是我的书《Azure 上的数据工程》的摘录。本文中的代码示例使用 Azure Data Explorer。如果你想运行它们,创建一个 Azure Data Explorer 集群和数据库。一旦设置完成,您就可以使用 Data Explorer web UI 连接到您的集群和数据库并运行代码示例。Azure Data Explorer 使用 KQL,Kusto 查询语言。如果不熟悉,可以查看快速参考。这本书更深入地介绍了 Azure Data Explorer,但是这篇文章是独立的。
时间表
在我的上一篇文章身份密匙环中,我们看到了身份密匙环如何帮助我们连接整个企业的数据集。另一个有用的视图是显示我们系统中发生的所有事件的视图——时间线。
一个通用的时间轴视图帮助我们理解用户与系统的各种交互。比方说,我们正试图了解客户支持问题与用户保持率之间的关系。为此,我们需要查看支持票证何时打开和关闭,以及用户何时取消订阅。这些数据点同样来自不同的团队:客户成功团队处理支持票据,支付团队知道用户何时取消订阅。图 1 显示了如何在时间线上绘制。
图 1:多个事件的时间线视图:支持票证何时打开和关闭以及订阅何时取消。
构建时间线视图
我们可以为这些事件定义一个公共模式,用一个Timestamp
列来捕获事件发生的时间,用KeyType
和KeyValue
列来捕获与事件相关联的身份的类型和值,用一个EventType
列和一个动态EventProperties
列来捕获特定于事件的属性。我们将利用半结构化数据来封装不同类型的属性,因为各种事件类型都有自己的关联属性。下一个清单创建了这个表。
.create table Timeline (Timestamp: datetime,
KeyType: string, KeyValue: string,
EventType: string, EvenProperties: dynamic)
现在让我们假设我们想要从客户成功团队获取一个SupportTickets
表,从我们的支付团队获取一个SubscriptionOrders
表,用于捕获新的和取消的订阅。下面的清单用一些示例数据填充了这些表:
.set SupportTickets <|
datatable (Timestamp: datetime, SupportCustomerId: int,
TicketId: int, Status: string, Message: string) [
datetime(2020–07–01), 21, 5001, 'Opened', '...',
datetime(2020–07–03), 21, 5002, 'Opened', '...',
datetime(2020–07–04), 21, 5001, 'Updated', '...',
datetime(2020–07–05), 21, 5001, 'Closed', '...',
datetime(2020–07–19), 21, 5002, 'Closed', '...',
].set SubscriptionOrders <|
datatable (Timestamp: datetime, CustomerId: int,
SubscriptionId: guid, Order: string) [
datetime(2020–06–01), 1001,
'fd10b613–8378–4d37-b8e7-bb665999d122', 'Create',
datetime(2020–07–19), 1001,
'fd10b613–8378–4d37-b8e7-bb665999d122', 'Cancel'
]
下面的清单显示了我们如何将这些表格纳入我们的时间表:
.append Timeline <| SupportTickets
| where Status == 'Opened'
| project Timestamp, KeyType='SupportCustomerId',
KeyValue=tostring(SupportCustomerId),
EventType='SupportTicketOpened',
EventProperties=pack("Message", Message).append Timeline <| SupportTickets
| where Status == 'Closed'
| project Timestamp, KeyType='SupportCustomerId',
KeyValue=tostring(SupportCustomerId),
EventType='SupportTicketClosed',
EventProperties=pack("Message", Message).append Timeline <| SubscriptionOrders
| where Order == 'Create'
| project Timestamp, KeyType='CustomerId',
KeyValue=tostring(CustomerId),
EventType='SubscriptionCreate',
EventProperties=pack("SubscriptionId", SubscriptionId).append Timeline <| SubscriptionOrders
| where Order == 'Cancel'
| project Timestamp, KeyType='CustomerId',
KeyValue=tostring(CustomerId),
EventType='SubscriptionClose',
EventProperties=pack("SubscriptionId", SubscriptionId)
pack()
从一组属性名和值中创建一个动态值,这使我们能够在EventProperties
列中存储不同形式的数据。
使用时间线
如果我们查询时间表,我们会得到如下结果:
时间表
我们有时间线上的各种事件,它们的特定属性在EventProperties
列中捕获。将这一点与钥匙圈结合起来,我们就可以更好地了解我们的系统是如何被使用的。
对于下一个查询,您将需要在上一篇文章中构建的密匙环表:
钥匙圈表
让我们回到我们的示例,我们希望将支持票证与订阅取消相关联。以下清单中的查询检索订阅被取消后 30 天内打开的所有支持票证。
Timeline
| where EventType == 'SubscriptionClose' // #1
| join kind=inner (Keyring
| where KeyType == 'CustomerId') on KeyValue // #2
| join kind=inner (Keyring
| where KeyType == 'SupportCustomerId') on GroupId // #3
| join kind=inner (Timeline
| where EventType == 'SupportTicketOpened') on
$left.KeyValue2 == $right.KeyValue // #4
| project Delta=(Timestamp — Timestamp1), CustomerId=KeyValue,
SupportCustomerId=KeyValue2 // #5
| where Delta < timespan(30d) // #6
我们首先获取所有的SubscriptionClose
事件(#1)。然后我们用CustomerId
上的钥匙圈表连接得到GroupId
(#2)。然后,我们再次连接GroupId
上的密匙环表,以获得关联的SupportCustomerId
(#3)。最后,我们再次加入SupportCustomerId
( KeyValue
)上的时间表,寻找SupportTicketOpened
事件(#4)。
我们现在已经有了所有需要的数据——我们将SubscriptionClose
和SupportTicketOpened
之间的时间差计算为Delta
。我们有CustomerId
和SupportCustomerId
(#5)。最后,我们通过小于 30 天的时间差进行筛选(#6)。
这里的关键要点是,这些数据点(打开/关闭的支持票证、取消的订阅)来自我们企业的不同系统,并使用不同的 id 进行标识。使用身份密匙环和时间线,我们将它们聚合到一个公共模式中,从这个模式中我们可以生成我们的业务报告。
概括地说,钥匙圈和时间线都是通用的数据模型,我们可以在系统中可用的原始数据的基础上构建。这些有助于将这些点连接起来,并将原本分散的数据集整合到一个统一的视图中,以了解用户如何与我们的系统进行交互。建立和维护这样的模型是数据工程师的责任。
Timetk:时间序列分析的 R 库
您可以使用它来分析、操作和检测时序数据的异常。
尼古拉斯·卡佩罗在 Unsplash 上拍摄的照片
介绍
你见过像天气温度、股票价格或销售数字这样随时间变化的数据吗?我很确定你已经在现实生活中至少见过一次这些数据了。这些是时间序列数据。时间序列是随着时间变化的数据,无论是由其他因素还是时间本身引起的。
分析时间序列数据可能是一项具有挑战性的任务。例如,检测异常情况,甚至希望看到几个月或几周的季节性趋势。如果你想做到这一点,你需要做脚本和使用这么多的库。
现在谢天谢地,有一个 R 编程语言库可以帮助我们。它叫 timetk。Timetk 是由 Matt Dancho 和 Davis Vaughan 创建的库,用于分析和可视化时间序列数据。Timetk 很容易使用,如果你曾经和 tidyverse 一起玩,它会更容易。
在本文中,我将向您展示如何在 r 中使用 timetk。
没有进一步,让我们开始吧!
实施
安装并导入库
我们需要做的第一件事是安装库。在这种情况下,我们将安装 timetk 和 tidyverse。之后,我们可以导入库。下面是命令的样子,
install.packages("timetk")
install.packages("tidyverse")library(tidyverse)
library(lubridate)
library(timetk)
导入数据
导入库之后,现在让我们导入数据。在这种情况下,我们将使用来自 UCI 机器学习知识库(名为自行车共享数据集)的数据。该数据包含从 2011 年到 2012 年单日自行车用户数量的信息。
幸运的是,timetk 包含了数据,所以你不需要下载它。如果你还想使用原始数据,你可以在这里访问数据集。
要查看数据,您可以使用这里的命令,
View(bike_sharing_daily)
这是数据的预览,
正如您在上面看到的,数据中有几列。有关于时间、温度、湿度和骑自行车的人数的信息。在这种情况下,我们只使用 dteday 和 cnt 列,其中每一列都表示日期和自行车用户的数量。下面是检索数据的代码,
**# Get the data**
bike_sharing <- bike_sharing_daily %>%
**# Get the columns**
select(dteday, cnt) %>%
**# Change the columns name**
set_names(c("date", "value"))bike_sharing
这是数据的预览,
时间序列可视化
在我们得到数据后,现在让我们进入可视化。为了可视化时间序列,我们可以使用 timetk 库中的 plot_time_series 函数。下面是命令的样子,
bike_sharing %>%
plot_time_series(date, value)
以下是该命令的结果,
正如您在上面看到的,该函数返回一个交互式可视化。这种可视化是基于一个名为 Plotly 的库。因此,您可以悬停以获取数据点,并缩放以查看可视化的详细信息。
还可以添加一个滑块来过滤数据观察值。plotly_slider 参数为 true。下面是命令的样子,
bike_sharing %>%
plot_time_series(date, value, .interactive=TRUE, .plotly_slider=TRUE)
这是结果,
如果只需要静态可视化,可以将。交互式参数设置为 false。该函数将返回一个基于 ggplot 库的静态可视化。命令看起来像这样,
bike_sharing %>%
plot_time_series(date, value, .interactive=FALSE)
这是结果,
就像其他可视化一样,您可以使用 timetk 库进行分组可视化。如你所见,数据范围从 2011 年到 2012 年。在这种情况下,我们将根据可视化发生的年份对其进行分组。下面是命令的样子,
bike_sharing %>%
group_by(year(date)) %>%
plot_time_series(date, value, .facet_scales="free")
结果看起来像这样,
为了使可视化更加引人注目,我们可以添加。color_var 参数根据数据发生的月份对数据进行着色。此外,我们将通过设置。将参数平滑为假。下面是命令的样子,
bike_sharing %>%
group_by(year(date)) %>%
plot_time_series(date, value, .facet_scales="free", .smooth=FALSE .color_var=month(date), .interactive=FALSE)
这是结果,
除此之外,我们还可以通过季节性来可视化时间序列,无论是以小时、天、周,甚至是月为单位。您可以通过使用 plot_seasonal_diagnostics 函数获得所有信息。下面是命令的样子,
bike_sharing %>%
group_by(year(date)) %>%
plot_seasonal_diagnostics(date, value, .x_lab='Date', .y_lab='# of users', .title='Bike Sharing Users')
这是结果,
异常检测
最后,我想向您展示这个库的一个主要特性。您可以只使用一个函数来检测异常。
异常检测是一项任务,旨在发现具有异常价值的数据。换句话说,数据是不同的。
在 timetk 中,我们可以为异常检测做两件事。你能做的第一件事是将数据中的异常可视化。在这种情况下,我们将可视化时间序列和异常。还有,我们按年份分。
我们可以使用 plot_anomaly_diagnostics 函数来可视化时间序列和异常,并按年份进行拆分。命令看起来像这样,
**# Get the data**
bike_sharing %>%
**# Group the data by year**
group_by(year(date)) %>%
**# Visualize the result**
plot_anomaly_diagnostics(date, value)
这是可视化的样子,
你能做的第二件事是收集有异常的数据。我们按年份对数据进行分组。此外,我们过滤数据,只包含有异常的数据。我们可以使用 tk_anomaly_diagnostics 函数来收集异常。下面是命令的样子,
anomaly_data <- bike_sharing %>%
group_by(year(date)) %>%
tk_anomaly_diagnostics(date, value) %>%
filter(anomaly == 'Yes')View(anomaly_data)
这是数据的预览,
结束语
恭喜你!现在你已经学会了如何在 R 中使用 timetk 进行时间序列分析。有了 timetk,我们可以比以前更容易地分析时间序列数据。
我希望这篇文章对你有用。如果你想看更多这样的文章,可以关注我的媒介。如果你有任何问题或者想进行对话,你可以在 LinkedIn 上联系我。
谢谢你看我的文章!
强化学习中蒙特卡罗方法的改进
用特殊情况和实例推动 MC 方法的极限。
蒙特卡罗和动态规划、时间差分是强化学习中对初学者的主要方法。
蒙特卡洛
首先,让我们简单提醒一下什么是蒙特卡罗方法。
蒙特卡罗(Monte Carlo)是一种基于当前策略生成路径(构成一集)的算法,当前策略通常在探索和开发之间分裂,就像 greedy 一样,直到路径到达终端状态。一旦达到这种状态,算法会再次返回该路径,并影响每个状态,即在情节中遇到的折扣奖励。
这些值(折扣和奖励)与那些州中碰巧包含的任何其他值进行平均。
环境
在接下来的示例中,我们将 GridWorld 作为环境,它具有以下设置:
有墙和隧道的 GridWorld 示例。(图片作者)
上面的 GridWorld 包含 100 个州,其中一些州有不可到达的墙,其他州有类似 C8(入口)和 H3(出口)中的单向隧道,因此当代理到达入口时,有一个概率(在这些示例中为 90%)会自动传输到 H3。然而,反过来是不可能的。
因此,在 A10 的代理的目的是在 J1 达到目标(终端)状态。
假设
在下面的例子中,我们假设我们不能无限期地等待一集结束,因为这不是一个现实的方法。特别是因为我们允许在同一集中多次访问相同的状态,这增加了循环和无限循环的风险。
为此,我们设置了一个名为‘剧集失败后’的参数,并赋予其 1k 步的值。这很公平,因为网格世界包含 100 个状态。因此,如果在 1000 步之后,代理找不到终端状态,该片段将被中止,并且对计算没有贡献。另一个开始了。
标准案例
在标准示例中,我们表明由于生成剧集的事实,无法保证我们可以探索 GridWorld 中的所有状态。
我们设置的参数是ε(勘探/开采比率)到 0.3,这意味着勘探是 30%的时间,而开采是 70%,我们将衰减添加到该比率(“N 集后的ε减少”和“ε减少因子”参数)。我们可以说,随着迭代的进行,没有必要保持高的探索率,并且代理对其环境了解得更多。
在下图中,您可以清楚地看到许多状态没有被浏览或访问,因为算法假设它已经找到了获胜的状态,并且随着时间的推移,越来越不需要任何进一步的浏览。
蒙特卡罗方法不能保证计算出所有的状态。该图显示了许多从未被访问过的国家。(图片作者)
您还可以看到,很少访问的状态不会显示有用的或逻辑的行为,例如,单元格 F5 和 G5 相互指向对方。
状态 F5 和 G5 被访问了 17 和 18 次,这使得计算不够精确,因此结果不符合逻辑。他们进入了一个无限循环。(图片作者)
这种无限循环的原因是,因为他们没有被访问足够的次数,以计算足够的 Q 和 V 值来代表现实。
如果我们增加迭代次数呢?
实际上,我们仍然不能保证每个状态都将被访问,甚至不能保证每个状态都将被充分访问,以使计算具有代表性。
在这个例子中,迭代次数是 100K,ε是 0.5,没有衰减率。但是,您可以注意到 A1 和 F1 州从未被访问过。其他如 B1、C1、D1、E1 的访问次数都不到 50 次,而 C8、H3 的访问次数为 10 万次。
这是因为一半的时间代理人在探索,去各个方向,而另一半时间代理人表现贪婪,直接去得分最高的州。
状态 A1 和 F1 从未被访问过,尽管迭代次数很高并且ε没有衰减。(图片作者)
ε效应
改变 epsilon 的值对算法是否更喜欢利用的探索有很大的影响,反之亦然。这一点的影响可以清楚地看到,特别是像零和一这样的极端值。
ε等于零
当 epsilon 为 0 时,代理根本不探索,而是开始利用。
然而,这种说法并不十分准确,因为,在开始时,没有什么可利用的。所以所有的行为都是平等的,代理会在其中随机选择,这相当于探索一段时间。
因为这种情况,没有真正的预测知道算法能做什么,所以我们最多可以描述为不稳定。
有些时候,由于纯粹的机会和风险,源于开始时的事实上的探索,代理可以到达终端状态,建立一个策略并不断地利用它,如下图所示。
Epsilon 等于 0,开始时成功的事实上的探索让代理利用这种成功,但是没有任何进一步的探索。(作者图片)
但也有其他时候,由于算法在ε= 0 时的不稳定性,事情变得模糊,结果变得不确定或不清楚,如下图所示。
有时当ε等于零时,在开始时仍会进行一些探索,但结果仍然是不确定的。(图片作者)
ε等于 1
当ε为 1,并且没有衰减因子(ε缩减因子= 1)时,代理将继续探索,不管正在计算的策略是什么。这样做的副作用是所有的状态都被探索,类似于动态编程方法。
然而,这是非常重要的,代理正在做的事情和计算的策略之间是有区别的。当代理移动并最终到达终端时,算法将折回其路径,并以奖励的贴现值影响每个状态(PS 并将其与现有值平均…)。这本身就创造了这种指向最终状态的梯度,这就是下图所描绘的。
当ε为 1 时的行为。(图片作者)
正如你在下面看到的,在其他例子中,一个通常不太被探索的州的访问量非常高,超过了 10K。这可以通过以下事实来解释,即尽管处于非感兴趣状态,但算法并不将其排除在访问之外,如当ε小于 1 时。
E1 州立大学的房产,那里的访问量非常高。(图片作者)
伽玛的重要性
Gamma 是当代理人离开奖励状态时降低奖励效果的折扣因子。它的价值决定了这种影响降低的速度。奖励效应的减少产生了一个指向奖励状态的梯度,因此其他状态指向它的方向。
Gamma 的值可以在 0,1 之间(不含 0,1。
但是如果 Gamma 取这两个极值会怎么样呢?
伽玛等于一
当 Gamma 为 1 时,对于来自奖励州的州,奖励没有折扣。这意味着所有的州都有相同的 V!
正如您在下图中看到的,所有状态都是平等的,因为每个状态都被其他具有相同值的状态所包围,所以该状态下的所有操作都是等概率的。这会把我们引向一个陈腐的;代理将不能确定性地向终止状态移动。它所做的是随机行走,不能保证它会到达目的地。
伽玛为 1 时的行为。(作者图片)
伽玛等于零
当 Gamma 为 0 时,也会出现同样的现象。奖励效应的价值几乎立刻下降到零。所有状态都将具有相同的零值,结果是每个状态中的所有动作都是等概率的。所以智能体会在环境中随机游走。
伽玛为零时的行为。(图片作者)
注意
本文中的所有例子都可以在 RL-Lab 的蒙特卡洛重复
结论
最后,微调算法的参数,以及对算法的深入了解对于体验的成功至关重要。
相关文章
修补移动应用数据集
单一模型的 EDA
詹姆斯·亚雷马在 Unsplash 上的照片
介绍
我的主要工作是与移动广告相关的,有时我必须处理移动应用数据集。
我决定公开一些数据,供那些想练习构建模型或了解一些可以从公开来源收集的数据的人使用。我相信开源数据集总是有用的,因为它们可以让你学习和成长。收集数据通常是一项困难而枯燥的工作,并不是每个人都有能力去做。
在这个故事中,我将介绍一个数据集,并使用它的数据建立一个模型。除非另有说明,所有图片均为作者所有。
数据
数据集发布在 Kaggle 网站。
DOI: 10.34740/KAGGLE/DSV/2107675.
已经为 293392 个应用程序(最流行的)收集了词干描述令牌和应用程序数据。数据集中没有应用程序名称;唯一的 id 可以识别他们。在标记化之前,大部分描述都被翻译成了英文。
数据集由四个文件组成:
- bundles_desc.csv — 仅包含描述;
- bundles _ desc _ 令牌. csv — 包含令牌和流派;
- bundles_prop.csv,bundles_summary.csv —包含其他应用程序特征和更新日期。
电子设计自动化(Electronic Design Automation)
首先,让我们看看数据是如何跨操作系统分布的。
Android 应用在数据方面占据主导地位。最有可能的是,这是因为越来越多的 Android 应用程序正在被创建。
考虑到数据集只包含最流行的应用程序,了解发布日期是如何分布的是很有趣的。
histnorm='probability' # type of normalization
大多数应用程序都会定期更新,因为最近一次更新的日期就在不久之前。
基本数据是在一月份的短时间内收集的。
让我们添加一个新特性——发布日期和最后一次更新之间的月数。
df['bundle_update_period'] = \
(pd.to_datetime(
df['bundle_updated_at'], utc=True).dt.tz_convert(None).dt.to_period('M').astype('int') -
df['bundle_released_at'].dt.to_period('M').astype('int'))
看看这些流派是如何分布的是很有趣的。考虑到操作系统的不平衡,我将归一化直方图的数据。
我们可以看到流派并没有完全重叠。这一点在游戏中尤其明显。我们能做些什么吗?最明显的是减少 Android 的流派数量,使其与 iOS 的形式相同。但是我认为这不是最好的选择,因为会有信息的丢失。让我们试着解决这个逆问题。为此,我需要建立一个可以预测 iOS 应用程序流派的模型。
模型
我使用描述长度和令牌数量创建了一些额外的特性。
def get_lengths(df, columns=['tokens', 'description']):
lengths_df = pd.DataFrame()
for i, c in enumerate(columns):
lengths_df[f"{c}_len"] = df[c].apply(len)
if i > 0:
lengths_df[f"{c}_div"] = \
lengths_df.iloc[:, i-1] / lengths_df.iloc[:, i]
lengths_df[f"{c}_diff"] = \
lengths_df.iloc[:, i-1] - lengths_df.iloc[:, i]
return lengths_dfdf = pd.concat([df, get_lengths(df)], axis=1, sort=False, copy=False)
作为另一个特性,我记录了自应用程序发布以来已经过去的月数。这个想法是,市场上可能存在对游戏类型的偏好。
我使用 Android 应用程序的数据进行训练。
android_df = df[df['store_os']=='android']
ios_df = df[df['store_os']=='ios']
该模型的最终功能列表如下:
columns = [
'genre', 'tokens', 'bundle_update_period', 'tokens_len',
'description_len', 'description_div', 'description_diff',
'description', 'rating', 'reviews', 'score',
'released_at_month'
]
我将 android 应用的数据集分为两部分——训练和验证。请注意,将数据集分割成折叠应该是分层的。
train_df, test_df = train_test_split(
android_df[columns], train_size=0.7, random_state=0, stratify=android_df['genre'])y_train, X_train = train_df['genre'], train_df.drop(['genre'], axis=1)
y_test, X_test = test_df['genre'], test_df.drop(['genre'], axis=1)
我选择了 CatBoost 作为模型的免费库。CatBoost 是一个高性能的开源库,用于决策树的梯度提升。从版本 0.19.1 开始,它支持在 GPU 上开箱即用的分类文本功能。主要优点是 CatBoost 可以在数据中包含分类函数和文本函数,而无需额外的预处理。
在非常规情感分析:BERT vs. Catboost 中,我给出了一个 Catboost 如何处理文本的例子,并将其与 BERT 进行了比较。
!pip install catboost
当使用 CatBoost 时,我推荐使用池。它是一个方便的包装器,结合了特性、标签和进一步的元数据,如分类和文本特性。
train_pool = Pool(
data=X_train,
label=y_train,
text_features=['tokens', 'description']
)test_pool = Pool(
data=X_test,
label=y_test,
text_features=['tokens', 'description']
)
让我们写一个函数来初始化和训练模型。我没有选择最佳参数;让那成为你的另一个家庭作业。
def fit_model(train_pool, test_pool, **kwargs):
model = CatBoostClassifier(
random_seed=0,
task_type='GPU',
iterations=10000,
learning_rate=0.1,
eval_metric='Accuracy',
od_type='Iter',
od_wait=500,
**kwargs
)return model.fit(
train_pool,
eval_set=test_pool,
verbose=1000,
plot=True,
use_best_model=True
)
文本要素用于构建新的数字要素。但对于这一点,有必要向 CatBoost 解释一下,我们到底想从中获得什么。
CatBoostClassifier 有几个参数可用于参数化:
- 记号赋予器— 记号赋予器,用于在创建字典之前预处理文本类型特征列;
- 字典— 用于预处理文本类型特征列的字典;
- feature_calcers — 用于基于预处理文本类型特征列计算新特征的特征计算器;
- text _ processing—**标记器、字典和特征计算器的 JSON 规范,它决定了如何将文本特征转换成浮点特征列表。
第四个参数取代了前三个参数,在我看来是最方便的,因为在一个地方,它清楚地指示了如何处理文本。
*tpo = {
'tokenizers': [
{
'tokenizer_id': 'Sense',
'separator_type': 'BySense',
}
],
'dictionaries': [
{
'dictionary_id': 'Word',
'token_level_type': 'Word',
'occurrence_lower_bound': '10'
},
{
'dictionary_id': 'Bigram',
'token_level_type': 'Word',
'gram_order': '2',
'occurrence_lower_bound': '10'
},
{
'dictionary_id': 'Trigram',
'token_level_type': 'Word',
'gram_order': '3',
'occurrence_lower_bound': '10'
},
],
'feature_processing': {
'0': [
{
'tokenizers_names': ['Sense'],
'dictionaries_names': ['Word'],
'feature_calcers': ['BoW']
},
{
'tokenizers_names': ['Sense'],
'dictionaries_names': ['Bigram', 'Trigram'],
'feature_calcers': ['BoW']
},
],
'1': [
{
'tokenizers_names': ['Sense'],
'dictionaries_names': ['Word'],
'feature_calcers': ['BoW', 'BM25']
},
{
'tokenizers_names': ['Sense'],
'dictionaries_names': ['Bigram', 'Trigram'],
'feature_calcers': ['BoW']
},
]
}
}*
让我们训练模型:
*model_catboost = fit_model(
train_pool, test_pool,
text_processing = tpo
)*
准确(性)
失败
*bestTest = 0.6454657601*
只有两个特征对模型有重大影响。最有可能的是,由于摘要功能,质量可以得到提高,但由于它在 iOS 应用程序中不可用,因此将无法快速应用它。如果你有一个能从描述中获取一小段文字的模型,那会很有帮助。我会把这个任务作为你的家庭作业。
从数字来看,质量不是很高。主要原因是应用程序通常很难归属于一个特定的类型,当指定类型时,开发人员会有偏见。需要一个更客观的特征来反映每个应用的几个最合适的类型。这种特征可以是概率向量,其中向量的每个元素对应于归属于一个或另一个流派的概率。
为了得到这样一个向量,我们需要使用 OOF (Out-of-Fold)预测来使这个过程复杂化。我们不会使用第三方库;让我们试着写一个简单的函数。
*def get_oof(n_folds, x_train, y, x_test, text_features, seeds):
ntrain = x_train.shape[0]
ntest = x_test.shape[0]
oof_train = np.zeros((len(seeds), ntrain, 48))
oof_test = np.zeros((ntest, 48))
oof_test_skf = np.empty((len(seeds), n_folds, ntest, 48))
test_pool = Pool(data=x_test, text_features=text_features)
models = {}
for iseed, seed in enumerate(seeds):
kf = StratifiedKFold(
n_splits=n_folds,
shuffle=True,
random_state=seed)
for i, (tr_i, t_i) in enumerate(kf.split(x_train, y)):
print(f'\nSeed {seed}, Fold {i}')
x_tr = x_train.iloc[tr_i, :]
y_tr = y[tr_i]
x_te = x_train.iloc[t_i, :]
y_te = y[t_i]
train_pool = Pool(
data=x_tr, label=y_tr, text_features=text_features)
valid_pool = Pool(
data=x_te, label=y_te, text_features=text_features)
model = fit_model(
train_pool, valid_pool,
random_seed=seed,
text_processing = tpo
)
x_te_pool = Pool(
data=x_te, text_features=text_features)
oof_train[iseed, t_i, :] = \
model.predict_proba(x_te_pool)
oof_test_skf[iseed, i, :, :] = \
model.predict_proba(test_pool)
models[(seed, i)] = model
oof_test[:, :] = oof_test_skf.mean(axis=1).mean(axis=0)
oof_train = oof_train.mean(axis=0)
return oof_train, oof_test, models*
这些计算非常耗时,但结果是,我得到了:
- Android 应用的预测
- **OOF _ test—OOF-iOS 应用的预测
- 模型 —褶皱和随机种子的所有 OOF 模型
*from sklearn.metrics import accuracy_scoreaccuracy_score(
android_df['genre'].values,
np.take(models[(0,0)].classes_, oof_train.argmax(axis=1)))*
由于折叠和平均几个随机种子,质量有所改善。
*OOF accuracy: 0.6560790777135628*
我创建了一个新特性, android_genre_vec,,我将 android 应用程序的 oof_train 和 iOS 应用程序的 oof_test 中的值复制到这个特性中。
*idx = df[df['store_os']=='ios'].index
df.loc[df['store_os']=='ios', 'android_genre_vec'] = \
pd.Series(list(oof_test), index=idx)
idx = df[df['store_os']=='android'].index
df.loc[df['store_os']=='android', 'android_genre_vec'] = \
pd.Series(list(oof_train), index=idx)*
另外, android_genre 也加了,我在里面放了概率最大的流派。
*df.loc[df['store_os']=='ios', 'android_genre'] = \
np.take(models[(0,0)].classes_, oof_test.argmax(axis=1))
df.loc[df['store_os']=='android', 'android_genre'] = \
np.take(models[(0,0)].classes_, oof_train.argmax(axis=1))*
摘要
在这个故事中,我:
- 引入了新的免费数据集;
- 做了探索性数据分析;
- 创造了几个新功能;
- 创建了一个模型,根据应用程序的描述来预测其类型。
我希望这个数据集对社区有用,并在模型和研究中使用。
文章中的代码可以在这里查看。
TinyML:嵌入式机器学习的未来是让生活变得更好
一些见解和现实世界的应用,可以改善有身体限制或残疾的人的生活
Vishnu Mohanan 在 Unsplash 上的照片
“一个对我们生活产生巨大影响的小设备”
这句话可以恢复微型机器学习(TinyML),这是人工智能的一个新兴领域。TinyML 是一个前沿领域,它为嵌入式系统的性能和功耗受限领域带来了机器学习(ML)的变革力量。【01
这一概念已经存在了一段时间,大约在 2 到 3 年前,但直到最近随着更高效算法的普及,例如 TensorFlow Lite ,我们才能够看到更多直接影响每个人生活的应用。
在这篇文章中,我对这个主题做了一个简短的回顾,并深入到对许多身体有缺陷或残疾的人的生活产生了巨大影响的 TinyML 的实际应用和最新科学文章中。
最后,我将向您展示在哪里可以了解更多关于 TinyML 的信息,并开始创建您自己的设备,加入许多其他专业人士和公司的行列,他们正在更加努力地为每个人的生活带来更多积极影响的设备。
介绍
安 ABI 研究 表示,到 2030 年,TinyML 设备的全球出货量将达到 25 亿台,经济价值可能超过 700 亿美元。目前,有几家公司正在开发用于构建更高效 TinyML 设备的芯片和框架:
- Arduino 带着新的 TinyML 套件
- 谷歌用 微控制器用 tensor flow Lite
- 微软 Azure Sphere ,开发更快更安全物联网设备的集成安全平台。
这样的例子不胜枚举。
我们都知道人工智能正在通过技术改变世界,从我们如何相互交流到医学进步。在南加州大学的博客上有一篇关于这个主题的优秀文章:
【usc.edu 2050 年前人工智能将改变世界的 5 种方式特洛伊家庭杂志
但是 TinyML 如何在这种转变中发挥作用呢?这种转变如何让我们的生活变得更好?
通过将人工智能引入小型微控制器,我们可以在不依赖额外昂贵设备的情况下,使用我们生活中已经使用的数十亿个小工具的能量。我们可以制造更便宜的设备,适应我们的日常生活,并对我们如何处理周围的环境产生重大影响。
我选择了过去两年中一些最好的科学出版物(在我看来),其中包含一些见解和真实世界的 TinyML 应用,可以改善疾病或残疾人士的生活:
- 一种用于非接触式呼吸频率监测的智能床传感器系统
- TinyLSTMs:助听器的高效神经语音增强
- GesturePod:为有视觉障碍的人设计的基于手势的交互手杖
- 一种用于资源受限端点的医学面罩检测的微型 CNN 架构
- 针对内存占用极低的边缘设备,重新思考美国手语预测中的泛化
还有一个很棒的视频,他解释了列表最后一条的想法和算法:重新思考边缘设备美国手语预测的一般化
选择是无限的,只是受到我们想象力的限制。
以及在哪里可以了解更多关于 TinyML 的信息?
如果你对这个话题感兴趣,想了解更多并开发你的 TinyML 设备,网上有几个免费的课程和教程,比如这个动手Google Codelabs。
如果你想全面专业化,哈佛大学和 Edx 合作提供一系列免费课程,从基础到高级不等:
1。TinyML 基础
- 机器学习基础
- 深度学习的基础
- 如何为 ML 收集数据
- 如何训练和部署 ML 模型
- 了解嵌入式 ML
2。TinyML 的应用
- TinyML 的一些最广泛使用的应用程序背后的代码
- TinyML 的真实行业应用
- 关键词识别的原则
- 视觉唤醒词的原则
- 异常检测的概念
- 数据集工程原理
3。部署 TinyML
- 了解基于微控制器的设备的硬件
- 基于微控制器的设备背后的软件综述
- 如何对 TinyML 设备进行编程
- 如何为基于微控制器的设备编写代码
- 如何将您的代码部署到基于微控制器的设备
- 如何训练基于微控制器的设备
结论
随着互联网革命的到来,有史以来第一次,改变世界的力量掌握在每个人手中。我们可以选择利用技术不断改善人们的生活。
希望这篇 微小的 文章(bazinga!)将成为开发能够改变人们生活的其他设备的基础和灵感。
未来微小而光明。
感谢您阅读这篇文章,请随时提问或在评论区提供反馈。
建立二手车价格评估模型的技巧和诀窍
创建稳健的汽车价格机器学习预测模型的挑战和解决方案
最近,我发表了一篇短篇 Medium story ,其中我介绍了促使 ELCA 数据科学团队开发机器学习(ML)模型以准确估计瑞士市场上二手车价格的动机、目标和挑战。价格预测任务一直受到机器学习社区的极大关注,各种二手物品在线市场的兴起增加了对自动化工具的需求,以准确预测合理的价格标签。
在本笔记中,我将简要介绍我们模型的架构,以及我们用来应对以下关键挑战的一些策略:
- 如何处理和编码分类变量在这个设置中,
- 如何弥补汽车模型数据样本数量不足
- 如何实现一种异常值检测方法来保护我们的训练过程免受噪声数据的影响。
特别是,我们的跨市场实体嵌入解决方案是一种转移学习方法,它将我们模型的预测精度提高了大约 4.3% 。
数据集和任务形式化
我们使用了三个不同的汽车数据集,这些数据集由来自不同的瑞士和欧洲数字市场的汽车销售公告组成。
- autoscout 24-CH数据集包含 119’414 个公告,用于训练和验证目的。
- AutoScout24-DE 是一套 558'295 德国销售公告(摘自欧洲网站版本)。这个更大的数据集用于我们的迁移学习方法。
- 第三个瑞士数据集( Comparis-CH ,111972 个样本)用作测试集,以评估模型的泛化能力
我们将自己限制在一组小而简单的汽车特征上,这些特征为普通大众所知,并且易于为大多数二手车收集。
我们作为汽车建模方法采用的一组特征。图片作者。
目标是使用这个特性集执行标准的回归任务,其中目标数量是汽车 x_n 的销售价格 y_n 以瑞士法郎(CHF)表示,除以训练集中相应汽车模型的平均价格。
这个简单的操作使目标成为一个相对量,并稳定了优化过程。以瑞士法郎计算的估计价格是通过简单地缩减预测得出的。均方根误差 r ( RMSE )是选择的损失函数。出于可解释性的原因,我们报告了 CHF 中的原始目标。
模型架构
我们确定并验证了一个 XGBoost 回归器作为我们预测管道的最佳模型。 XGBoost 是一个流行且强大的框架,它实现了梯度增强技术。其核心是一种集成方法,它结合了弱决策树。所有的模型搜索和优化实验都是按照标准的机器学习程序进行的,在 AutoScout24-CH 数据集上使用 10 重分层交叉验证。下图显示了最终的预测管道。
我们的价格预测渠道。图片作者。
编码分类变量
制造商(制造商)和汽车型号(型号)特征编码了关于新车价格等级的大部分可用信息。数据集包含 37 个不同的汽车制造商和 211 个汽车型号。由于这些是分类特征(与连续特征相反),我们需要对它们进行编码,然后才能将它们与其余特征连接起来,并使用它们来训练模型。最简单的编码方法是标准的 one-hot scheme ,其中我们创建的二进制变量与每个字段中的类一样多。这种方法几乎相当于为每个类训练一个不同的回归模型。鉴于许多汽车模型的数据都很少,这种编码方案是不够的。将变量映射到单个连续空间的方法是更好的,因为它允许模型利用类之间的相似性。
实现这一目标的一个简单的表示选择是用两个连续值来表示分类变量:训练数据中类的平均价格及其标准差。直观地说,这种编码方法用关于起始价格和折旧范围的近似信息丰富了汽车表示向量。然而,它不提供了解每种汽车类别折旧模式的更精细细节的可能性。
实体嵌入 (EE)方法由 C. Guo 和 F. Berkhan 于 2016 年提出,并显示在下面的模式中,这是一种更复杂的方法,它使用一个小的神经网络来学习从每个变量的一个热点表示到一个潜在表示的映射。这种映射由每个变量的编码 EE 层表示,其权重与价格预测任务相关的模型的其余部分一起训练。
实体嵌入层(EE)的图示,对应于每个独热编码输入之上的额外层。图像由 C .郭和f . Berkahn 组成。
这三种编码方法提供了以下平均验证性能。具有平均分类价格和标准偏差的变量替代略优于 EE 方法。
数据稀缺:知识转移拯救世界
一些汽车模型缺乏足够的数据样本可能解释了 EE 方法令人失望的结果。有些模型在 AutoScout24-CH 中出现不到 100 次,这不允许学习足够精确的映射。因此,我们在更大的 AutoScout24-DE 数据集上训练 EE 网络,因为德国汽车市场呈现出与瑞士相似的分布。因此,潜在 EE 空间中轿厢等级的相对距离应该是可转移的。
我们的跨市场实体嵌入方法克服了数据稀缺问题。EE 编码层在德国数据上训练,然后转移到我们的瑞士模型。图片作者。
这种跨市场迁移学习方法在瑞士 RMSE 上提供了大约 4.3% 的性能提升,使得 EE 方法优于其他编码方案:
可能的定价趋势培训:异常值检测
对数据集的进一步分析让我们认识到,销售公告可能并不总是价格的可靠依据。对标价的不准确性没有控制或限制,甚至更是如此,因为我们不考虑汽车配件和许多其他重要的汽车功能。很明显,我们需要“看穿噪音”,只根据符合每个汽车制造商/车型的一般定价趋势的样本来训练模型。
我们的解决方案是对每款车型分别应用一个相当激进的异常值剔除程序。我们在特征-目标空间的三个独立的二维子空间中执行基于密度的异常值检测:价格-里程、价格-年龄、和价格-功率。里程和车龄是我们的两个磨损水平指标,也是折旧的两个主要原因。我们还发现了一组不可忽略的样品,其价格相对于列出的功率等级异常高。如果样本在三个平面中的任何一个被检测为异常值,则将其从数据集中移除。我们使用局部异常值因子(LOF) 算法,通过测量异常数据点相对于邻居的局部密度偏差来发现异常数据点。以下模式阐明了这种方法:
所提出的离群点检测方法,基于局部离群因子(LOF)方法,适用于三个不同的特征目标子空间。图片作者。
我们移除了大约 12.5%的训练数据,并在新数据集上训练整个模型(包括德国 EE 层)。这极大地提高了性能:
成果和业绩
我们报告了在所有汽车模型上计算的 ML 模型的最终验证/测试 RMSE 和平均绝对误差。对于绝大多数汽车,平均估计误差小于训练数据中特定汽车型号价格可变性的 20%。鉴于我们的汽车建模方法相对简单,我们的方法的性能非常令人满意。
通过这个演示界面可以查询我们的型号。用户可以插入汽车的特征,并从预测器获得价格估计,以及置信区间和关于模型在训练期间已经看到的相同模型汽车的数量的信息。我们希望这份关于我们在这项任务上的实验的快速概述以及我们采用的成功解决方案对于任何打算从机器学习角度解决类似问题的人来说都是一份有用的读物。
参考
- 【1】c .签名人:价格合适吗? (2016)
- [2] N. Pal 等人,我的车值多少钱?使用 Random forcet(2017)预测二手车价格的方法
- [3] K. Noor and S. Jan,基于机器学习技术的车辆价格预测系统 (2017)
- [4] S. Pudaruth,利用机器学习技术预测二手车价格 (2014)
- [5]郭,伯克翰,分类变量的实体嵌入 (2016)
- [6] M. Breunig, LOF:识别基于密度的局部异常值,(2000)
- [7] T. Albergoni,瑞士市场二手车价格预测,演示界面 (2020)
高性能计算的提示和技巧
jplenio 在 Unsplash 上拍摄的照片
充分利用您的计算能力。
无论您使用的是 Matlab 和 R 之类的脚本语言,还是 Python、Java 或 C++之类的高级语言,性能优化都是必须的。我们回顾了每个程序员都应该知道的加速程序的技巧。
1.并行化
并行化是增加程序吞吐量的最常见但经常被遗忘的方法之一。根据您的计算机拥有的内核或逻辑处理器的数量,并行化您的代码可以带来切实的计算节省。在 MATLAB 中,安装并行计算工具箱,用于访问 GPU 阵列、池管理和并行 for 循环(parfor loops ),它们会自动充分利用您的内核。
2.预分配
预分配不仅提高了程序性能,还提高了程序的可读性。在 Python 和 MATLAB 这样的语言中,改变数组大小通常不利于获得良好的性能——事实上,当您的数组在每个循环中改变大小时,MATLAB 会发出警告。相反,应该为矩阵和数组这样的数据结构预先分配空间,因为它们会占用内存中连续的空间块。如果没有为数组预先分配空间,当数组变得太大时,您的程序可能会分配不足,并被迫寻找更大的空间。
3.…向量化…
当使用 NumPy 或 MATLAB 时,如果可能的话,在进行数组操作时避免 for 循环!由于底层线性代数的实现方式,矢量化有可能更快。事实上,许多 NumPy 运算都是用 C 实现的,它依靠基本线性代数子程序 ( BLAS )来执行它的矩阵向量乘法。
4.稀疏内存分配
密集矩阵是笨重的对象。对它们的操作是昂贵的,所以只在必要时使用。当您事先知道您的矩阵将有许多零条目时,让您的程序知道您正在使用一个稀疏矩阵,要么通过实例化一个这样的矩阵,要么将矩阵转换为稀疏格式。稀疏矩阵运算的典型时间复杂度是 O(NNZ)的倍数,或者与矩阵中非零元素的数量成比例。如果 NNZ 为 N,那么你将会节省很多钱。
5.操作顺序
矩阵和向量的序列相乘?不要犯这种初学者的错误!回想一下,一个方阵乘以一个向量有二次成本,而一个矩阵乘以一个矩阵有三次成本。类似的推理适用于求解线性系统。在 Python 和 MATLAB 中,乘法是左关联的,因此经常需要在适当的位置插入括号,以实现所需的运行时。
6.压型
如果有疑问,请使用分析工具来确定哪些代码部分占用了所有的计算时间。考虑使用 Python 的 profile 模块、MATLAB tic 和 toc 命令,或者 Julia 的 ProfileView.jl 包来计时代码,甚至生成调用图的可视化。
Julia 程序的调用堆栈。图片作者。
结论
调整代码通常会带来惊人的计算节省。第一次调优系统可以产生 10%到 300%的加速。如果你还没有,试试这些技巧,看看你的代码是否能得到健康的速度提升。无论是重新思考你的操作顺序还是让你的内核全力以赴,追求更高的性能水平都是对更有效代码的投资。
神经网络的提示和技巧
从增强到超参数选择
训练神经网络是一个复杂的过程。许多变量相互作用,通常不清楚什么起作用。
以下精选的建议旨在让你的事情变得更简单。这不是必做清单,但应该被视为一种激励。您知道手头的任务,因此可以从以下技术中进行最佳选择。它们涵盖了广泛的领域:从增强到选择超参数;许多话题都涉及到了。将这一选择作为未来研究的起点。
技术概述。该列表可在此处点击查看。图片由作者提供。
一批装得过多
使用这种技术来测试网络的容量。首先,取一个数据批次,并确保它被正确标记(如果使用了标签)。然后,反复拟合这单批,直到损耗收敛。如果你没有达到完美的准确性(或类似的指标),你应该看看你的数据。简单地使用更大的网络通常不是解决方案。
以一个显著的因子增加历元的数量
通常,您会从运行更多步骤的算法中受益。如果你能负担得起更长时间的训练,可以将周期数从 100 个增加到 500 个。如果你观察到较长训练时间的好处,你可以开始选择更明智的价值观。
播种
为了确保再现性,请设置任何随机数生成操作的种子。例如,如果您使用 TensorFlow,您可以利用以下代码片段:
重新平衡数据集
不平衡的数据集有一个或多个主要类,它们构成了数据集的很大一部分。反之,一个或多个辅修班只贡献几个样本。如果您正在处理具有相似特征的数据,请考虑重新平衡数据集。推荐的技术是对少数类进行过采样,对主要类进行下采样,采集额外的样本(如果可能),以及生成具有增强功能的人工数据。
使用中性类
考虑以下情况:您有两个类的数据集,“生病”和“没生病”。这些样本由领域专家手工标记。如果他们中的一个不确定合适的标签,他可能不分配或分配很少的信心。在这种情况下,引入第三个中立的类是个好主意。这个额外的类代表了“我不确定”的标签。在培训过程中,您可以排除这些数据。之后,您可以让网络预先标记这些模糊的样本,并将它们展示给领域专家。
设置输出层的偏置
对于不平衡的数据集,网络的初始猜测不可避免地会失败。尽管网络学会了解释这一点,但在模型创建时设置更好的偏差可以减少训练时间。对于 sigmoid 层,偏差可以计算为(对于两类):
偏差=对数(正/负)
创建模型时,将该值设置为初始偏差。
为物理模拟过度拟合
为了模拟流体的运动,人们经常使用特殊的软件。在复杂的交互中(例如,水在不平的地面上流动),可能需要很长时间才能看到结果。神经网络在这里可以有所帮助。因为模拟遵循物理定律,所以不可思议的事情发生的可能性为零——只需要努力计算结果。网络可以学习这种物理模拟。因为法律是明确定义的,我们“只”要求网络过度适应。我们不期待任何看不见的测试样本,因为它们必须遵循相同的规则。在这种情况下,过度拟合训练数据是有帮助的;通常,甚至不需要测试数据。一旦网络被训练,我们就用它来代替缓慢的模拟器。
调整学习率
如果您寻找任何要优化的超参数,那么主要关注学习率。下图显示了学习率设置过高的影响:
学习率设置得太高,模型不会收敛。图片由作者提供。
相比之下,使用不同的、较小的学习速率,发展是所期望的:
有了更合适的学习率,训练收敛。图片由作者提供。
使用快速数据管道
对于小项目,我经常使用定制的生成器。当我从事较大的项目时,我通常用专用的数据集机制来替换它们。对于 TensorFlow,这是 tf.data API。它包括所有必需的方法,如混洗、批处理和预取。依靠许多专家编写的代码,而不是定制的解决方案,让我有时间完成实际任务。
使用数据扩充
扩充您的训练数据以创建一个强大的网络、增加数据集大小或对小类进行过采样。这些好处是以增加训练时间为代价的,特别是如果增强是在 CPU 上完成的话。如果你能把它移到 GPU 上,你会更快地看到结果。
使用自动编码器提取嵌入
如果您的标注数据集相对较小,您仍然可以使用一些技巧。其中一个正在训练 sep 自动编码器。背景是收集未标记的数据比标记它们更容易。然后,使用具有足够大的潜在空间(例如,300 到 600 个条目)的自动编码器来实现合理的低重建损失。要获得实际数据的嵌入,您需要放弃解码器网络。然后,您可以使用剩余的编码器网络来生成嵌入。这是你的决定,如果你把这个解码器添加到你的主要网络或只使用它来提取嵌入。
使用来自其他模型的嵌入
您可以使用其他模型学习的嵌入,而不是从头开始学习数据的嵌入。这种方法与上面提出的技术相关。对于文本数据,通常下载预先训练好的嵌入。对于图像,您可以使用在 ImageNet 上训练的大型网络。选择一个足够的层,然后剪切所有的东西,并使用输出作为嵌入。
使用嵌入来缩小数据
让我们假设我们的数据点都有一个分类特征。开始时,它可以取两个可能的值,所以一个独热编码有两个索引。但是一旦这个值增加到 1000 或更多,稀疏的一个热点编码就不再有效了。因为它们可以在低维空间中表示这样的数据,所以嵌入在这里很有用。嵌入层获取分类值(在我们的例子中从 0 到 1000 ),并输出浮点向量,即嵌入。这种表示是在训练期间学习的,并作为后续网络层的输入。
使用检查点
没有什么比运行一个昂贵的训练算法无数个小时,然后看到它崩溃更令人沮丧的了。有时,这可能是硬件故障,但通常是代码问题——只有在培训结束时才能看到。虽然你永远不能期待完美的运行,但你仍然可以通过保存检查点来做准备。在它们的基本形式中,这些检查点存储模型每 k 步的权重。您还可以扩展它们来保存优化器状态、当前时期和任何其他重要信息。然后,在训练开始时,你检查任何失败的运行人工制品,并恢复所有必要的设置。这与定制的训练循环结合得非常好。
编写定制的训练循环
在大多数情况下,使用默认的训练例程,如 TensorFlow 中的 model.fit(…)就足够了。然而,我经常注意到的是有限的灵活性。一些小的改变可能很容易合并,但是大的修改很难实现。这也是我一般建议编写自定义算法的原因。
起初,这可能听起来令人生畏,但是大量的教程可以帮助您开始。最初几次你遵循这种方法,你可能会暂时慢下来。但是一旦你有了经验,你会得到更大的灵活性和理解。此外,这些知识允许你快速修改你的算法,整合你最新的想法。
有关定制训练循环的更多信息和代码,您可以在这里查看我的模板:
适当设置超参数
现代 GPU 擅长矩阵运算,这也是它们被广泛用于训练大型网络的原因。通过适当地选择超参数,可以进一步提高算法的效率。对于 Nvidia GPUs(目前使用的主要加速器),您可以使用以下准则:
- 选择可被 4 或 2 的更大倍数整除的批量
- 对于密集图层,将输入(来自前一图层)和输出设置为可被 64 整除或更大
- 对于卷积层,将输入和输出通道设置为可被 4 或 2 的更大倍数整除
- 为了 conv。图层,选择可被 64 及以上整除的输入和输出
- 从 3 (RGB)到 4 通道的 pad 图像输入
- 使用批量尺寸 x 高度 x 宽度 x 通道布局
- 对于重复出现的图层,将批次和隐藏大小设置为至少能被 4 整除,最好能被 64、128 或 256 整除
- 对于重复层,选择大批量
这些建议遵循了使数据分布更加均匀的思想。主要通过选择 2 的倍数来实现。这个数字设置得越大,硬件运行的效率就越高。你可以在这里找到更多信息,在这里找到,在这里找到。
使用提前停止
“我何时停止培训”这个问题很难回答。一个可能发生的现象是 深度双下降 :你的指标在稳步改善后开始恶化。然后,经过一些更新,分数再次提高,甚至比以前更好。为了不停止中间的运行,可以使用验证数据集。这个单独的数据集用于测量您的算法在新的、看不见的数据上的性能。如果在耐心步数内成绩没有提高,训练将自动停止。如果你选择好耐心参数,你可以克服暂时的停滞。一个好的起始值是 5 到 20 个历元。
使用迁移学习
迁移学习背后的想法是利用从业者在大规模数据集上训练的模型,并将它们应用于你的问题。理想情况下,你所使用的网络已经接受了相同数据类型(图像、文本、音频)的训练,并执行与你相似的任务(分类、翻译、检测)。有两种相关的方法:
微调
微调的任务是采用一个已经训练好的模型,并针对您的具体问题更新权重。通常,你冻结前几层,因为它们被训练来识别基本特征。剩下的图层会在你的数据集上进行微调。
特征提取
与微调相反,特征提取描述了一种方法,其中您使用经过训练的网络来提取 特征。在预先训练好的模型之上,你添加自己的分类器,只有这部分网络被更新;基层被冻结了。您采用这种方法是因为最初的 top 是针对特定问题进行训练的,但是您的任务可能会有所不同。通过从头开始学习自定义顶部,您可以确保专注于数据集,同时保持大型基础模型的优势。
使用数据并行多 GPU 训练
如果您可以访问多个加速器,您可以通过在多个 GPU 上运行算法来加快训练速度。通常,这是以数据并行的方式完成的:网络在不同的设备上被复制,并且批处理被拆分和分发。然后对梯度进行平均并应用于每个网络副本。在 TensorFlow 中,关于分布式培训,您有多种选择。最简单的选择是使用 MirroredStrategy,但是还有更多策略。例如,如果你编写定制的训练循环,你可以遵循这些 教程(正如我在上面某处提议的)。我注意到从一个 GPU 增加到两个 GPU 以及从两个 GPU 增加到三个 GPU 时速度提升最大。对于大型数据集,这是一种快速减少训练时间的方法。
使用 sigmoid 进行多标签设置
如果样品可能有多个标签,您可以使用 sigmoid 激活功能。与 softmax 函数不同,sigmoid 单独应用于每个神经元,这意味着多个神经元可以触发。输出值限制在 0 和 1 之间,使解释变得容易。该特性有助于例如将样本分类为多个类别或检测各种对象。
对分类数据使用一次性编码
因为我们需要一个数字表示,分类数据必须被编码成数字。例如,我们不能直接输入“bank”,而必须使用另一种表示法。一个诱人的选择是枚举所有可能的值。然而,这种方法意味着编码为 1 的“bank”和编码为 2 的“tree”之间的排序。这种排序很少出现,这就是为什么我们依赖于一个热点向量来编码数据。这种方法确保变量是独立的。
对索引使用一键编码
假设您正在尝试预测天气并对日期进行索引:1 代表星期一,2 代表星期二,等等。但是,因为它只是一个任意的索引,我们可以更好地使用一键编码。与前一个技巧类似,这个表示在索引之间没有建立任何关系。
(重新)缩放数值
通过更新权重来训练网络,而优化器对此负责。通常,如果值在[-1,1]之间,它们会被调整到最佳性能。这是为什么呢?让我们考虑一个丘陵地貌,我们寻找最低点。区域越多,我们就要花越多的时间来寻找全局最小值。然而,如果我们可以改变景观的形状呢?这样我们就能更快地找到解决办法?
这就是我们通过重新调整数值所做的。当我们将值缩放到[-1,1]时,我们使曲率更加球形(更圆,更均匀)。如果我们用这个范围的数据训练我们的模型,我们会收敛得更快。
这是为什么呢?特征的大小(即值)会影响渐变的大小。并且较大的特征产生较大的梯度,这导致较大的权重更新。这些更新需要更多的步骤来融合,这减慢了训练。
更多信息,请看 TensorFlow 的教程这里。
运用知识——提炼
你肯定听说过伯特模型,是吗?这个转换器有几亿个参数,但我们可能无法在我们的 GPU 上训练它。这就是提炼知识的过程变得有用的地方。我们训练第二个模型来产生较大模型的输出。输入仍然是原始数据集,但标签是参考模型的输出,称为软输出。这项技术的目标是在小模型的帮助下复制大模型。
问题是:为什么不直接训练小模型?首先,训练较小的模型,尤其是在 NLP 领域,比训练较大的模型更复杂。其次,大模型对我们的问题来说可能是多余的:它足够强大,可以学习我们需要的东西,但它可以学习更多。另一方面,较小的模型很难训练,但足以存储所需的知识。因此,我们将广泛的参考模型的知识提炼到我们的小型次级模型中。然后,我们受益于降低的复杂性,同时仍然接近原始质量。
如果你想了解更多,可以看看 Hugginface 更详细的描述这里。
基于 BERT 的应用的技巧和诀窍
等一下,我们将学习使用 BERT 来完成 NLP 任务,稍后通过应用一些技巧来增加它的趣味,这些技巧可以显著提高整体性能。
苏珊·Q·尹在 Unsplash 上的照片
本文使用的代码可以在这里找到。更多此类文章,请访问我的网站或查看我最新的关于数据科学的书。也可以在 LinkedIn 上联系我。
介绍
《变形金刚》席卷了 NLP 世界。最近的研究表明,变压器和基于它的其他架构(如 BERT、RoBERTa、XLNET)已被用于解决大量应用——无论是情感分类、欺诈检测、神经语言翻译还是问答系统。虽然所有这些都是真的,但仍有许多谜团和困惑围绕着它。一些最常见的问题是——(1)我应该只使用CLS
token 还是所有 token 的输出来表示句子?(2)事先微调模型会增加精度吗?。如果你已经问过自己这些问题,或者刚刚开始使用 BERT,那么这篇文章正适合你。请跟随我们,首先介绍 BERT 模型,然后尝试通过实验解决这些问题。
伯特
BERT 代表 B 方向En 编码器 R 代表来自 T 变压器。基本上,它是变形金刚的一个改型,我们只保留了编码器部分,而丢弃了解码器部分。在发布时,它在 11 个自然语言处理任务上获得了最先进的结果。BERT 背后的主要动机是处理现有语言模型的局限性,这些模型本质上是单向的。这意味着他们只考虑从左到右进行句子级推理的文本。另一方面,BERT 允许令牌在自我关注层兼顾双方。这是其高性能的主要原因之一。BERT 最吸引人的特点是,对于大量的 NLP 任务,它超级容易使用。其想法是采用预先训练的 BERT 模型,然后针对特定任务对其进行微调。预训练模型以无监督的方式在大型语料库上训练,因此该模型从大型文本语料库中学习表征的一般表示。这使得以后为任何其他 NLP 任务进行微调变得容易,因为该模型预先训练有关于语言、语法和语义表示的大上下文。
不同任务上微调 BERT 的插图。来源[1]
训练伯特本身就是一个有趣的范例。原始论文提出了两种无监督的训练方法,
- 屏蔽 LM (MLM) :随机屏蔽一定百分比(15%)的输入标记,然后模型尝试预测这些屏蔽标记。他们为此创造了一个特殊的令牌
[MASK]
。 - 下一个句子预测(NSP) :选择两个句子 A 和 B,使得 50%的时间 B 是跟随 A 的实际下一个句子(标记为
IsNext
),而 50%的时间 B 是来自语料库的随机句子(标记为NotNext
)。该模型被训练来预测第二个句子是否跟随第一个句子。
最后,我们应该知道的关于 BERT 的最后一件事是模型的输入和输出。因此,和通常的 NLP 模型一样,BERT 将句子(当然是在标记化之后)作为输入。因为它只使用转换器的编码器部分,所以它产生两个有趣的输出,
pooler_output
是[CLS]
特殊令牌的嵌入。在许多情况下,它被认为是完整句子的有效表示。last_hidden_state
包含来自最后一个隐藏状态的句子中所有标记的最终嵌入。我们可以应用排列不变的方法(如——最大值、平均值或总和)来将嵌入聚合成单个句子表示。
要了解更多的细节,我强烈推荐阅读最初的 BERT 论文[1]和变形金刚(注意)论文[2]。
实验设置
理论到此为止,现在让我们从有趣的部分开始,即代码。为了回答介绍部分提出的问题,我们将训练 4 个基于 BERT 的模型,并比较准确性,以确定您可以开始使用的最佳品种。对于两党公正的分析,我们将选择一个应用程序——情感识别,并对所有模型使用相同的数据集甚至相同的训练方法。我们的实验列表如下:
- 实验 1:无微调+带 Pooler 输出的 BERT 模型
- 实验 2:没有微调+具有最后隐藏输出的 BERT 模型
- 实验 3:微调+带 Pooler 输出的 BERT 模型
- 实验 4:微调+具有最后隐藏输出的 BERT 模型
至于这个任务,在情感识别中,我们给了一个文本,它的情感是要被推断的。通常,这是通过创建句子的潜在表示并将其用于分类来完成的。在我们的例子中,我们将在整个过程中使用 BERT 模型。
至于数据集,我们使用的是 IMDB 50k 数据集,因此文本是电影评论,情感要么是正面的,要么是负面的。为了更快地执行,我们随机抽样了 10k 条评论(每种情感类型约 5k 条),并执行了其余的分析。
先决条件代码
现在,在我们开始每个实验之前,让我们讨论一下将在所有实验中使用的公共代码。所以让我们从每个项目开始的地方开始——加载数据并将其分成测试和训练。
接下来,我们将创建一个 Pytorch Dataset
类实例来加载和预处理数据。这包括创建继承了Dataset
类的IMDBDataset
类。这包括 3 个模块:
__init__
:我们基本上是在这里存储数据和加载标记器。__len__
:返回整个数据集的长度。这是每个时期内步长计算所需要的。__getitem__
:我们获取一个数据,对其进行标记,然后将其返回。
现在,如果你注意到,我们的IMDBDataset
类是非常通用的,因此我们可以用它来准备测试和训练数据集。这正是我们接下来要做的。最后,我们通过参数batch_size
和shuffle
将Dataset
传递给Dataloader
,以创建一个可用于训练的生成器。
现在我们将编码伯特模型的框架。我们将使用 Pytorch lightning,它充当 Pytorch 之上的包装器,并提供许多高效的附加组件,最重要的是,它使编写 NN 代码变得超级容易:)我们从创建继承pl.LightningModule
的模型类开始。现在,这个类包含以下子模块,
__init__
:构造器,我们在其中定义层、损失、度量、激活函数并加载 BERT 模型。请注意,我们使用的是bert-base-uncased
预训练的 BERT 模型(~ 1.25 亿个参数!)和 huggingface 加载这个模型的transformer
包。- 这是我们定义定制模型逻辑的地方。首先,我们将标记化的输入句子传递给 BERT 模型。然后,我们希望使用 BERT 模型的输出(在下一节中会有更多的介绍),来执行二进制分类。因此,我们最终应用只有 2 个节点的简单 MLP。
training_step
:我们在这里定义培训是如何进行的。所以我们批量加载数据,并将其传递给forward
模块。我们希望在forward
步骤的输出上计算CrossEntropyLoss
。我们还定义了一些我们想要计算的额外指标。请注意,这些指标仅用于记录,因为它们仅在self.log
语句中捕获。培训仅针对loss
指标进行。validation_step
:与training_step
基本相同,只是修改了self.log
的名称。configure_optimizers
:这里我们定义了我们想要用于模型训练的优化器。我们正在使用Adam
优化器。另外一点是,我们可能不想训练 BERT 模型的全部庞大的 1.25 亿个参数。因此,我们将冻结所有的 BERT 模型层,只训练我们作为 BERT 输出头添加的额外分类器层。
最后,既然我们已经定义了一切,训练模型就像,
哎呦,搞定了!让我们开始实验吧!
实验 1:无微调+带 Pooler 输出的 BERT 模型
为了使用 BERT 模型的 pooler 输出,我们可以从模型生成和返回的输出中提取相关的值。这可以通过在上面共享的训练代码的第 20 行使用下面的代码来完成。
是啊,就这么简单!在训练模型时,我们在验证数据集上获得了 64.6%的 F1 宏分数和 68.4%的准确度。对于基线(第一个实验)来说还不错,对吗?让我们去下一个。
实验 2:没有微调+具有最后隐藏输出的 BERT 模型
BERT 模型也返回最后的隐藏状态输出,但有一个问题是它的形状等于(batch, no of tokens, token dimension)
。我们想要减少它,使得一批中的每个数据点只有一个向量表示,以便形状转换为(batch, token dimension)
。一个简单的答案是取所有代币的平均值。如果不是因为我们在标记化期间添加的填充(用于处理较小的句子),这将是一个很好的解决方案,因此简单的平均会给小句的句子嵌入添加很多噪声。因此,我们需要对标记进行某种形式的加权平均,这是通过使用 attention_mask 来执行的,attention _ mask 是一个向量,用于表示哪些标记是填充(0),哪些不是(1)。这可以通过在第 20 行添加以下脚本来完成,
在训练模型时,我们在验证数据集上获得了 86.7%的 F1 宏分数和 87.5%的准确度。哇,仅仅改变一行代码,准确性就提高了 20%!!
先决条件(2):微调 BERT
现在剩下的实验大部分和以前一样,但是有一个主要的变化——我们将使用微调的模型。这意味着,我们将使用我们拥有的数据集,即 10k 电影评论数据,并使用它来使用原始的无监督训练方法之一调整基本 BERT 模型。然后,我们将使用这个修改后的模型进行剩余的一组实验。我强烈推荐观看 James Briggs 的视频,他精彩地解释了微调过程。代码可以在这里找到。
但是为了简单地讨论代码逻辑,它由以下部分组成,
- 加载模型:我们加载最基本的 BERT 模型,即
bert-base-uncased
,我们将对该模型进行微调。 - 准备数据:我们将加载 10k 数据集并解析文本,以所需的格式准备它。为此,我们将首先对其进行标记化,然后随机屏蔽一定比例的标记(通过用特殊的
[MASK]
标记替换其标记值)。在这种情况下,我用 30%的口罩进行了测试。平时也可以玩玩这个数字,效果更好!(我会建议把搜索限制在 10%到 40%。如果你做了,让我知道!).接下来是通常的dataset
和dataloader
部分。 - 训练:最后,我们对模型进行一定次数(这里是 20 次)的训练,并保存微调后的模型。
微调 BERT 模型的代码
实验 3:带有 Pooler 输出的微调+ BERT 模型,实验 4:带有最后隐藏输出的微调+ BERT 模型
最后两个实验的代码保持与之前相同,即实验 1 和 2。唯一的区别是,现在我们将使用微调模型,而不是使用基本的 BERT 模型。这可以通过将文件夹路径传递给前面实验代码中的BertModel.from_pretrained(model_path)
脚本来实现。
对于实验 3,我们得到了 87.5%的 F1 分数和 88.1%的准确率。另一方面,对于实验 4,我们得到了 79.8%的 F1 分数和 81.3%的准确率。
结果
综合每个实验的结果,我们有
BERT 预训练(实验 1 和 2)和微调模型(实验 3 和 4)的综合实验结果
现在让我们试着回答我们在引言部分提出的问题,
- 句子表示应该只使用
**CLS**
token 还是所有 token 的输出?嗯,这要看情况。从实验来看,似乎如果你正在微调模型,使用 pooler 输出会更好。但是如果没有微调的话,最后的隐藏状态输出要好得多。就我个人而言,我更喜欢最后一个隐藏状态输出,因为它提供了比较结果,而无需任何额外的昂贵的计算微调。 - 预先微调模型会增加准确性吗?一个明确的肯定!实验 3 和实验 4 报告了比实验 1 更高的分数。另一方面,Exp 2 的例子非常有趣,暗示了在进行微调之前尝试所有的东西。也就是说,如果你在寻找最好的结果(即使只有 1%的差距),微调是最好的方法。因此,如果你有时间和资源(讽刺的是,通常情况下不是这样),去微调!
参考
- 雅各布·德夫林、张明蔚、肯顿·李和克里斯蒂娜·图塔诺娃。Bert:用于语言理解的深度双向转换器的预训练。2019. arXiv:1810.04805 。
- Ashish Vaswani、Noam Shazeer、Niki Parmar、Jakob Uszkoreit、Llion Jones、Aidan N. Gomez、Lukasz Kaiser 和 Illia Polosukhin。你需要的只是关注。2017. arXiv:1706.03762 。
- 詹姆斯·布里格斯的视频使用 MLM 微调伯特模型
干杯。
提示和技巧:如何在 SQL 中填充空值
SQL 提示和技巧
如何利用嵌套表和窗口函数来填充空值
格伦·卡斯滕斯-彼得斯在 Unsplash 上的照片
当谈到数据分析时,你常常意识不到你错过了什么,直到你把它可视化。可视化中的巨大差距或向下的尖峰会向您显示数据缺失的确切位置,但这不是您想要向利益相关者传达的故事。
虽然一些可视化工具可以轻松地解决这些问题,但通常最好在数据源处处理,如果您需要在工具之外做进一步的分析,依靠 viz 工具来完成这项工作将不会派上用场。那么,我们如何在源代码中填充空值或缺失值呢?
向下填充:简要说明和示例
假设我们有一个类似于下面的表,名为inventory_log
,它记录了贵公司在每个年末的库存中有多少小部件:
因为你的商店周末不营业,所以从周五到周一不会有库存变化,但这也意味着没有人计算库存并将该值输入到表中。
假设从周五到周一库存数量没有变化是安全的,因此周六和周日的正确值应该是周五的值。为了做到这一点,我们应用一个叫做 的工具向下填充 。向下填充就像它听起来的那样:只要有空值,我们就从它上面抓取最近的非空值来替换空值。
Python 中有许多特性(包括pandas.DataFrame.ffill()
函数)可以实现这一点,但是它们几乎总是比直接在数据库服务器上执行操作要慢。
既然我们已经全面研究了这个问题,让我们来理解如何在 SQL 中实现它。
在 SQL 中向下填充
使用上面的表作为样本数据,我们可以利用嵌套查询和窗口函数来替换空值。
我们要做的第一件事是将具有 null 值的行分组,第一个非 null 值在它上面。我们可以利用一个窗口函数来计算日期中的inventory
列:
select date,
day_of_week,
inventory,
count(inventory) over (order by date) as _grp
from inventory_log
该查询将返回如下所示的表格:
好吧!这为我们提供了一个新的列,允许我们将 null 值与它们前面的第一个非 null 值组合在一起。现在下一步是为共享一个分组的每一行返回第一个值。幸运的是,first_value
窗口函数允许我们这样做。
将这个函数应用到我们已经拥有的数据中,我们得到了这个查询:
with grouped_table as (
select date,
day_of_week,
inventory,
count(inventory) over (order by date) as _grp
from inventory_log
)
select date,
day_of_week,
inventory,
_grp,
first_value() over (partition by _grp order by date) as filled_inventory
from grouped_table
如果你想深入研究first_value
函数,你可以查看这里的文档,但是这个函数只是根据顺序返回分区的第一个值。
上面的查询给出了下表:
就是这样!我们现在有一个空值被前面的值替换的列。
因此,让我们将我们的查询放在一起:
with grouped_table as (
select date,
day_of_week,
inventory,
count(inventory) over (order by date) as _grp
from inventory_log
), final_table as(
select date,
day_of_week,
inventory,
_grp,
first_value() over (partition by _grp order by date) as
new_inventory
from grouped_table
)
select date,
day_of_week,
new_inventory
from final_table
输出:
注意:如果您有一个需要考虑多个维度/列的查询(在本例中可能是不同的商店位置),只需将它们添加到grouped_table
子查询的count()
窗口函数的 partition 子句中。
编码快乐!
如果你想看其他数据科学的技巧和诀窍,请查看我的文章如何将你的熊猫数据帧加载到你的数据库快 10 倍。请在下面的评论中让我知道你在做什么!
使用 Python 处理文本文件的技巧和诀窍(第 1 部分)
谢尔盖·莱昂特耶夫在 Unsplash 上拍摄的照片
使用文本文件并熟悉 Python 中令人惊叹的技术
计算机程序使我们的生活变得容易。在几行指令的帮助下,我们可以在一眨眼的时间内完成一项复杂的任务。在许多复杂的任务中,处理和操作文本是计算机完成的最重要的任务之一。今天,热门话题之一是自然语言处理(NLP),其中文本处理是必须的。在这篇文章中,我们将讨论一些基本的和超级简单的语法来格式化和处理文本和文本文件。可以认为是用 python 学习自然语言处理(NLP)的第一步。在接下来的文章中,我们将逐步讨论 NLP。
是时候进入文章的主要议程了。我们将使用一些基本的编码示例,这些示例可能对我们有实际帮助。让我们开始吧……
【文末给出 jupyter 笔记本完整链接】
A.格式化字符串文字(f 字符串)
i. f-strings 比旧的.format()
string 方法有几个好处。
首先,你可以直接将外部变量带入字符串,而不是将它们作为关键字参数传递:
name = 'Zubair'# Using the old .format() method:
print('My name is {var}.'.format(var=name))# Using f-strings:
print(f'My name is {name}.')
代码生成以下输出
上述代码的输出
如果你想用字符串表示变量,只需在{}.
中插入!r
print(f'My name is {name!r}')
输出将是— My name is ‘Zubair’
二世。使用 f-string 和字典。
d = {'a':123,'b':456}
print(f"Address: {d['a']} Main Street")
它将根据字典键‘a’
显示字典元素。代码的输出是— Address: 123 Main Street
。
【注意:】 注意不要让替换字段中的引号与外层字符串中使用的引号冲突。
如果只使用“”
或‘’
,会导致如上错误。
iii。f 弦的最小宽度、对齐和填充
您可以在一组嵌套的花括号内传递参数,以设置字段的最小宽度、对齐方式甚至填充字符。考虑以下代码
*library = [('Author', 'Topic', 'Pages'), ('Twain', 'Rafting', 601), ('Feynman', 'Physics', 95), ('Hamilton', 'Mythology', 144)]for book in library:
print(f'{book[0]:{10}} {book[1]:{8}} {book[2]:{7}}')*
输出:
*Author Topic Pages
Twain Rafting 601
Feynman Physics 95
Hamilton Mythology 144*
这里前三行对齐,除了Pages
遵循默认的左对齐,而数字是右对齐的。同样,当Mythology
超过8
的最小字段宽度时,第四行的页码被推到右边。设置最小字段宽度时,请确保考虑最长的项目。
要设置对齐,使用字符<
向左对齐,^
居中,>
向右对齐。
要设置填充,在对齐字符前加上填充字符(-
和.
是常用选项)。
我们来做一些调整:
*for book in library:
print(f'{book[0]:{10}} {book[1]:{10}} {book[2]:>{7}}')
# here > was added*
输出
*Author Topic Pages
Twain Rafting 601
Feynman Physics 95
Hamilton Mythology 144*
居中第三列
*for book in library:
print(f'{book[0]:{10}} {book[1]:{10}} {book[2]:^{7}}')
# here ^ was added*
输出
*Author Topic Pages
Twain Rafting 601
Feynman Physics 95
Hamilton Mythology 144*
**增加一些和*....*
*for book in library:
print(f'{book[0]:{10}} {book[1]:{10}} {book[2]:.>{7}}')
# here .> was added*
输出
*Author Topic ..Pages
Twain Rafting ....601
Feynman Physics .....95
Hamilton Mythology ....144*
四。使用 f 字符串进行日期格式化
您可以使用 f 字符串进行各种格式化。下面是一个例子。
*from datetime import datetimetoday = datetime(year=2018, month=1, day=27)print(f'{today:%B %d, %Y}')*
有关格式化字符串文字的更多信息,请访问https://docs . python . org/3/reference/lexical _ analysis . html # f-strings
B.使用文本文件
一、用 IPython 创建文件
这个功能是 jupyter 笔记本特有的!或者,快速创建一个简单的。txt 文件与崇高的文本编辑器。
*%%writefile test.txt
Hello, this is a quick test file.
This is the second line of the file.*
上面的代码将创建一个与 Jupyter 笔记本名称test.txt
目录相同的txt
文件
二。Python 打开一个文件
*# Open the text.txt file we created earlier
my_file = open('test.txt')*
如果键入错误的文件名或提供错误的目录,您可能会收到一条错误消息。所以要小心。现在,阅读文件。
*# We can now read the file
my_file.read()*
输出
*'Hello, this is a quick test file.\nThis is the second line of the file.'*
但是如果你再次运行my_file.read()
代码,它只会输出‘’
。但是为什么呢?
发生这种情况是因为你可以想象在读完文件后,阅读“光标”在文件的末尾。所以没什么可看的了。我们可以这样重置“光标”:
*# Seek to the start of file (index 0)
my_file.seek(0)*
现在,光标被重置到文本文件的开头。如果我们再次运行my_file.read()
代码,我们将得到输出‘Hello, this is a quick test file.\nThis is the second line of the file.’
。
iii。逐行读取
您可以使用.readlines()
方法逐行读取文件。使用大文件时要小心,因为所有内容都将保存在内存中。
*# Readlines returns a list of the lines in the file
my_file.seek(0)
my_file.readlines()*
输出
*['Hello, this is a quick test file.\n', 'This is the second line of the file.'*
四。写入文件
默认情况下,open()
函数只允许我们读取文件。我们需要传递参数'w'
来覆盖文件。例如:
*# Add a second argument to the function, 'w' which stands for write.
# Passing 'w+' lets us read and write to the file
my_file = open('test.txt','w+')*
打开带有“w”或“w+”的文件会截断原始文件,这意味着原始文件中的任何内容都将被删除* !*
*# Write to the file
my_file.write('This is a new first line')*
上面的命令写‘This is a new first line’
创建的文件。
v .追加到文件
传递参数'a'
会打开文件并将指针放在末尾,因此写入的任何内容都会被追加。像'w+'
,'a+'
让我们读写一个文件。如果文件不存在,将创建一个。
*my_file = open('test.txt','a+')
my_file.write('\nThis line is being appended to test.txt')
my_file.write('\nAnd another line here.')*
上面的代码将文本追加到test.txt
文件中现有文本的末尾。
六。别名和上下文管理器
您可以将临时变量名指定为别名,并使用上下文管理器自动管理文件的打开和关闭:
*with open('test.txt','r') as txt:
first_line = txt.readlines()[0]
print(first_line)*
这段代码将打印 test.txt 文件的第一句话。此时输出为This is a new first line
[注意:在将第一行文本分配给 first_line 之后,with ... as ...:
上下文管理器自动关闭了【T9:】
如果我们试图读取 test.txt,它会显示一条错误消息,因为该文件已被自动关闭
七。遍历文件
*with open('test.txt','r') as txt:
for line in txt:
print(line, end='') # the end='' argument removes extra linebreaks*
输出
*This is a new first line
This line is being appended to test.txt
And another line here.
This is more text being appended to test.txt
And another line here.*
在 Unsplash 上 Saksham Gangwar 拍摄的照片
结论
语法很简单,但是非常有用。我们总是跳到复杂的学习材料上,但是有太多的小事可以让我们的生活变得简单。上面的文章解释了一些处理文本的有用技术,这些技术可能对文本格式化有帮助。但是,这些技术对自然语言处理会很有帮助。这些报道将继续,并朝着基本的 NLP 前进。
本文的完整 jupyter 笔记本可从这里获得。
一些精选的有趣文章供你进一步阅读
*
祖贝尔·侯赛因
选择和资助数据科学训练营的技巧
资源和我的经验与自学,新兵训练营和财政援助
阿诺·弗朗西斯卡在 Unsplash 上的照片
新兵训练营或职业加速器项目是旨在帮助你学习新技能和找工作的短期教育项目。我向那些从不同领域转入科技行业的有经验的人推荐训练营。新兵训练营的真正价值是他们提供的职业安置帮助。但是新兵训练营并不适合每个人,所以我建议在考虑参加之前做大量的研究。
我将分享一些在美国寻找新兵训练营的技巧,我如何选择参加德克萨斯州圣安东尼奥 Codeup 的故事,以及我如何获得参加的资金。我选择参加数据科学训练营,但我相信我的建议也适用于其他学科,如 UX/UI、web 开发和其他技术领域。
免责声明: 我为新兵训练营寻找资助的经历并不典型。我非常幸运。我不想植入一个错误的想法,以为为新兵训练营找到全额或 100%的经济资助是容易或可能的。大多数人不得不为新兵训练营贷款。然而,我相信至少找到一些资金是可能的。
我的第一个建议是至少花几个月到一年的时间研究你想学习的主题和现有的训练营。网上有大量学习编程的资源。我将在下面提供一个我参加的课程的详细列表,其中大部分是免费的。在你学习基础知识的时候,开始了解教授这门课程的训练营,通读训练营的课程,记下学费和开学日期,并注意他们是否提供奖学金。这第一步对于弄清楚这个话题是否是你真正感兴趣的至关重要。
其次,当你开始研究训练营时,你会发现学费可能会很高。最好的策略是同时寻找资金和训练营。首先在当地寻找,根据就业不足、失业或在该领域代表性不足(少数民族)的情况,寻求当地和联邦政府的资助。我只能找到资金,因为我遇到了当地的职业培训计划,使我能够获得当地和劳工部的资金。如果你不符合就业不足、失业或在该领域代表性不足的标准,那么不要担心!还有其他的奖学金和贷款。
警告!只有当你对自己的编程基本技能(或任何你想学的东西)感到满意,并且你决心参加的时候,才开始接触新兵训练营。新兵训练营的招生人员会积极地寻找你。他们想让你参加他们的节目。你要有明确的意图,你想做什么,你想花多少钱,你有多擅长编程。只要对你交谈的人诚实说出你的情况。这是一个过程,慢慢来。如果你被新兵训练营拒绝,你仍然可以在以后重新申请。
最后,总有贷款公司专门为训练营贷款。如果学费仍然令人望而却步,你可以考虑贷款作为你的最后选择。在大多数情况下,这些贷款可以很容易地用你毕业后得到的工作来偿还。如果你没有找到工作,一些训练营会提供退款(有条件的),还有一些训练营提供延期学费,在你找到第一份工作之前不用支付任何费用。
虽然我没有为新兵训练营贷款,但我是这样考虑贷款的:如果你申请了一笔贷款,并需要在找到第一份工作后偿还,你唯一真正做出的牺牲可能是每月几百美元。所以,在你职业生涯的最初几年,也许你不会得到一套豪华公寓,而是一些更便宜的东西。如果你真的致力于科技行业,这并不是什么牺牲。
根据我的经验,我在网上了解了数据科学,并花了 10 个月的时间研究这个主题和训练营。我在网上上了一堆课程学习基础,下面分享一下。然后我开始申请训练营。最终,我在家乡找到了 Codeup。我参观了他们的校园,并与他们的招生代表讨论了资金问题。我喜欢这所学校在我的家乡,所以它是一个全日制项目的实际选择。我也喜欢我遇到的老师和招生人员。招生人员告诉我他们的资助选项,并让我参加当地的职业培训计划,这让我了解到在网上不容易获得的地方和联邦拨款。参与这个本地项目是漫长、乏味和不确定的(他们非常没有组织性),但我坚持了下来。我能够通过他们获得资助的真正原因是,我多年来一直处于失业状态,我已经用完了我所有的积蓄,我和家人住在家里,而且在我申请资助时我是失业的。我选择 Codeup 是因为我能够找到资金,它在我的家乡,我真心喜欢我在那里遇到的人。
我将分享一张我在下面得到的确切资助金额的表格。这可能不会成为常态,因为我在资金方面非常幸运。每个人的情况、背景、经济状况都会有很大的差异。我尽可能透明地分享我的经历,来说明参加新兵训练营的一条途径。肯定会有很多不同的路径!所以,如果你的情况看起来很糟糕或者与我的不同,不要气馁。
总而言之,这整个过程是危险的,可怕的,艰难的。你应该给自己足够的时间去研究和了解训练营和你想学习的科目。编码训练营不是快速致富的方法!如果你需要任何建议,请直接联系我。如果这有帮助,请把它发给你认为会从中受益的人。
最后,如果您正在考虑参加 Codeup 或任何其他训练营,如果您有其他问题,请随时联系我,如果您参加 Codeup,请用我的名字作为推荐人。我总是和别人分享我的推荐奖金。祝你好运和最美好的祝愿!
以下是我个人在参加训练营之前用来自学数据科学的所有资源。
研究新兵训练营资源列表
https://www.coursereport.com/best-coding-bootcamps
我带笔记的课程清单(自学,按我上课的顺序)
1。数据科学&分析职业道路&认证:Jungwoo Ryoo 的第一步
注意:* *需要登录。通过使用本地图书馆访问权限或您所在大学的访问权限来绕过,即“使用您组织的门户网站登录”
困难/我的评论和经验:容易
课程链接:Lynda.com(登录后搜索标题)
2。埃迪·达维拉 统计学基础
注:同上
难度/我的评论和经验:简单/中等
课程链接:Lynda.com(登录后搜索标题)
3。Excel 2016 必备培训用 丹尼斯泰勒
注:同上
难度/我的评论和体验:简单,以 2 倍的速度浏览视频
课程链接:Lynda.com(登录后搜索标题)
4。使用 Python 编程的简明介绍
注:利用了 Python 2。需要在计算机上设置 Python 环境。
难度/我的评论和经验:中等,节奏非常快。学习 Python 2 不是一个好主意。中途停止航向
链接到课程:麻省理工学院 6.189 开放式课程
5。学习路径:成为用户体验设计师
注意:这是一组旨在教授 UX 的课程。* *需要登录。通过使用本地图书馆访问权限或您所在大学的访问权限,即“登录您组织的门户”
难度/我的评论和经验:中等。主要是讲座。
课程链接:Lynda.com(登录后搜索标题)
6。Python 教程
备注:花了几天时间完成。免费报名;不需要在您的计算机上设置环境
困难/我的评论和经验:最简单的简短练习。
课程链接:模式分析
7。学习 Python 2
注:免费报名;大量的练习;不需要在您的计算机上设置环境。
难度/我的评论&经验:容易/中等;花了大约一周的时间完成
课程链接: Codecademy Python
8。数据结构基础
注意:在 EdX 上免费注册,自定进度
难度/我的评论&经验:中/难;大部分都没看懂;中途停了。
课程链接: EdX UCSD 数据结构基础
9。算法介绍 MITX
注:免费报名。视频讲座和硬件作业
困难/我的评论和经验:困难。5 节课下来就停了。
链接到课程:麻省理工学院 6.006 开放式课程
10。统计与概率汗学院
注意:免费加入。非常强大的网站,有测验和视频讲座。
难度/我的评论&经验:容易/中等;花了大约 4 个星期,慢慢地。我的最爱之一。网站。
链接到课程:可汗学院统计和概率
11。线性代数汗学院
注意:免费加入。非常强大的网站,有测验和视频讲座。
难度/我的评论&经验:容易/中等;花了大约两个星期,慢慢地。
课程链接:可汗学院线性代数
12。JavaScript 简介:绘图与动画
注意:免费加入。非常强大的网站,有测验和视频讲座。
难度/我的评论&经验:容易/中等;花了大约两个星期,慢慢地。
课程链接:可汗学院 JS 简介
13。杜克大学数据科学数学技能
注意:免费加入。免费的审计课程。有时,当他们要求你付费以提交测验时,你可能会被卡住。如果这种情况发生在你身上,只需跳过测验或注册“免费试用”并在收费前取消。
困难/我的评论和经验:容易,慢慢做练习。花了大约一周的时间。
课程链接: Coursera,数据科学数学技能,杜克大学
14。用于机器学习的线性代数,伦敦帝国学院
注:同上
难度/我的评论&经验:容易/中等;花了大约两个星期。因为付费墙,没有学会页面排名赋值。
课程链接: Coursera,用于机器学习的线性代数,伦敦帝国学院
15。阿姆斯特丹大学基础统计
注:同上
难度/我的评论&经验:容易/中等;花了大约两个星期。创建了一个新帐户,这样我就可以获得“免费试用”来提交测验。慢慢地做了所有的工作。
我涉猎的其他课程及其他资源:
基本的 HTML 和 HTML5 和 CSS,FreeCodeCamp.org
这位开源数据科学大师,由克莱尔·科特希尔、http://datasciencemasters.org/创立
5 天数据挑战列表,Kaggle,https://www.kaggle.com/rtatman/list-of-5-day-challenges/
Siraj Raval,Github 和 Youtube 上的 How-To 视频和课程,https://Github . com/llSourcell/Learn _ Data _ Science _ in _ 3 _ Months
助学金汇总:
更新: 截至 2019 年 10 月,我了解到 Project Quest 不再有来自劳工部的资金,而这是我的大部分资金。请直接联系 Project Quest 了解他们目前提供的资源的更多信息。
创建数据文化的提示
我的公司有数据文化吗?
这篇文章旨在通过提供一些关于如何到达那里的提示来帮助你回答这个问题。
在我们谈到数据文化之前,我们必须先看看系统。为了创造数据文化,系统是绝对必要的。系统使世界运转,一个好的系统可以使一个组织发生巨大的变化。但是我们不仅仅想要一个 IT 系统,我们还想要一个信息系统。
信息系统是所有员工都可以访问的数据的集中。
一个组织可能从 IT 系统开始,但最终目标是实现一个信息系统,使组织中的每个人都能够访问他们的相关信息。
所以,我们先来回答一个重要的问题。
我的系统是 IT 系统还是信息系统?
我假设你有一个 IT 系统。但它是一个信息系统吗?这并不容易定义,问自己这些问题:
你是否每天都有问题,而你却不容易找到答案?
你必须亲自打电话、发邮件或拜访另一位员工才能得到答案吗?
如果是,那么很可能你没有信息系统。别担心,信息系统并不像你想象的那么普通。让我们更深入地分析一下信息系统,以便有所帮助。这将直接导致创建或改进您的数据文化。
信息系统的组成
信息系统有 4 个主要组成部分;数据输入、数据存储、数据处理和数据可视化。让我们给这些标上颜色:
作者图片
谁与系统交互?
这是一个关键问题。让我们看看下面的公司结构:
完美的公司结构。作者图片
希望你的公司类似于上述情况,只是省略了与你公司相关的部门。澄清一下,橙色的人是数据可视化专家,蓝色的人是数据处理专家。
如果你想说你的公司有数据文化,上面的结构是最基本的。这基本上就是说,你的研究团队中的一个人创建报告,然后 IT 部门的一个人管理数据捕获,另一个人管理存储,另一个人管理处理。公司里的其他人只是依靠这四个人来获得他们的洞察力。如果这是你的结构,拍拍自己的背,这是一个完美的信息系统,给自己一个坚实的 C 级。为了获得 B 甚至 A 的成绩,我们需要回答以下问题:
我的系统能自给自足吗?
首先,我们要问什么是自给自足?评估自给自足最简单的方法是通过运行几个场景。
让我们看看下面:
作者图片
这是一个常见的场景。在这种情况下,市场部的 Mike 得到了一个文件,这是他经常收到的文件。从 Mike 的角度来看,他希望将其包含在报告中,他对集中式数据库一无所知,也不想知道,他只是希望对其进行分类。IT 部门的伊莎贝尔像往常一样,拿走了文件,并确保它被输入中央数据库。对许多人来说,这是一个显而易见的问题,但毕竟是个小问题,只需要几分钟就能解决。然而,解决这个问题鼓励了营销是数据驱动的观念。让这一过程只发生在营销部门传达了一个信息,即数据并不可怕,应该被接受。Mike 自己应该有一个放文件的地方,之后它会自动出现在他的报告中。
让我们看另一个场景:
作者图片
这个场景听起来熟悉吗?如果是这样,那么你可能无法自给自足。从直觉上来说,研究部门的 Rachel 为销售部门的 Steve 可视化一份报告是有意义的,毕竟她是可视化专家,而 Steve 是销售专家。但是这种“坚持自己的路线”的观念通常会适得其反。瑞秋对销售知之甚少,史蒂夫甚至不知道他想看什么。让我们看一个更好的场景。
作者图片
现在好多了。史蒂夫自己能够知道他想看什么。他可能会在构建报告的探索阶段有所发现,而这是瑞秋永远不会发现的。他会做出与最佳实践相反的设计决策,但能让他更快地得到答案。如果他分享这种观想,几乎肯定会比瑞秋更华丽但不太实用的观想用得更多。
虽然它看起来真的很糟糕,但通过这次尝试,史蒂夫已经表明他显然想尝试色彩和设计。此外,Rachel 了解到,Steve 最关心的是逐年单独查看宿舍。作者图片
史蒂夫是如何从要求瑞秋为他写一份报告变成简单地要求她帮助他写自己的报告的?Mike 是如何从要求 Isabel 将一个文件放入一个集中的数据库到自己做这件事的?这是两个不同的问题;我们将首先向迈克提问。
自动化系统
然而,这对于许多人来说应该是显而易见的,有时(经常!)人都懒。这里真正的目的是赶走这种懒惰。如果有一种(相对)简单的方法来自动化一个过程,那么就需要完成它。将责任推给 Mike,让他对自己的数据负责,并立即让营销走上数据驱动的道路。我应该提到的是,虽然营销部门将拥有他们数据存储的部分所有权,但围绕存储的大部分繁重工作可能将由 IT 部门来完成。
一般来说,任何角色与公司核心职能直接相关的员工都应该能够轻松地捕捉数据。
而将文件移动到合适的位置属于数据存储的范畴。它很好地适应了数据输入。我的意思是,营销人员应该以一种易于分析和处理的方式获取他们自己的数据。有许多方法可以做到这一点,包括将信息放入一个共享的 Excel 文件中(尽管如果可能的话,我会避免这种方法)。这样做的目的是为了避免营销人员通过电子邮件将信息添加到系统中。有许多工具可以做到这一点,根据公司的情况,可能有一个完全内置的系统来允许每个员工都应该能够访问的数据捕获。一般来说,任何角色与公司核心职能直接相关的员工都应该能够轻松地捕捉数据。一些示例可能包括电话应用*、共享列表(类似于 excel 文件,但比 excel 文件更强大)或在线表单。在一个拥有良好数据文化的公司中,这种数据采集方法将会很常见。
*手机应用可能是由第三方构建的公司专用应用,也可能是使用微软 PowerApp 等工具在内部开发的应用
脚注: 在这种情况下,我指的是数据捕捉是一个人自己捕捉数据,这与我对数据可视化的定义并不一致,我把它描述为一个人创造可视化。虽然人们很有可能创建自己的数据采集方法/系统,但这通常不是必需的,因为通常只需要少量的数据采集方法。
让员工自己进行数据存储和数据输入看起来令人望而生畏,但实际上是相对简单的,如果高级管理层参与其中,那么他们可以强制他们的部门正确存储/捕获他们的数据。建立一个良好的数据采集系统可能意味着高级管理层别无选择,只能参与其中。当我们试图让员工做自己的数据可视化时,真正的挑战就来了。我们怎么做呢?
培训
需要明确的是,培训并不一定意味着派员工去参加研讨会或让外部人员参加。这种方法可以是一个很好的开端,让员工很好地了解数据世界和/或研究团队正在使用的工具,但我们需要更可持续的东西。在这种情况下,我们指的是史蒂夫和他的可视化,所以我说的工具可能是 PowerBI,Tableau,Qlik 等之一。如果这些单词对你来说听起来像 jibberish,那么我强烈建议你去查一下。
谁是培训师?
第一步是确定谁将培训其他员工。这几乎肯定是研究部门的 Rachel,但另一个部门可能有数据专家。是时候介绍数据系统的另一个关键能力了:
作者图片
为了真正有效,我们需要改变 Rachel 的角色。
Rachel 的角色需要包括培训方面。作者图片
培训应该占 Rachel 适当培训 Steve 和其他人的时间的大约 10-20%。这种培训是整个数据文化的基础,在这方面缺乏承诺将会看到任何进行中的数据文化倒退到旧的方式。20%可能听起来很多;那是瑞秋一周的 8 小时!我应该说,我使用培训有点松散。
最好的培训对象是那些最愿意学习的人
正式的培训应该每周进行一次,在史蒂夫学习的时候,雷切尔每周抽出一两个小时陪他。其他 6 或 7 个小时可能会分配给其他人进行正式培训,但大部分时间只是“Rachel 的可用时间”。我的意思是瑞秋应该每周花几个小时帮助人们(不仅仅是史蒂夫)解决数据问题。为了说明在给定的一周内,Rachel 的训练应该这样展开:
销售人员 Steve 的正式培训:1 小时
来自 HR 的 Harry 的正式培训:1 小时
数据小时:1 小时
其他问题可用时间:5 小时
受训者是谁?
这可能是你需要问自己的最重要的问题。根据经验,每个团队至少有一个“数据人”是个好主意。你如何识别这些人?查看你现在的员工以前的经历和现在的工作可能是一个开始,但实际上最好的培训对象是那些最愿意学习的人。如果你有一个计算机技能一般,但对挖掘他们的数据有浓厚兴趣的人,那么他们可能会比一个不感兴趣的计算机高手更进一步推动你的数据文化。
社交是一种屡试不爽的方法,尽管对一些人来说很难,但它是数据文化机器中必要的一环。
诚然,这很难做到。从雷切尔的角度来看,如果她不得不确定要训练的人,最好的方法是尽可能多地认识人。社交是一种屡试不爽的方法,尽管对一些人来说很难,但它是数据文化机器中必要的一环。这件事的责任不应该只落在雷切尔身上。在这种情况下,高级管理层可以参与进来,鼓励 Rachel 和其他员工会面。外部培训是让人们一开始就参与进来的有效方式。一封全公司范围的电子邮件,内容如下
“PowerBI/Tableau/Qlik 是一款可视化工具……* yadda yadda yadda *……[外部公司]将在下周提供培训,如果您有兴趣参加,请告诉我。”
当然,获得外部培训可能会有成本,但通常相对便宜(有时甚至是免费的!)而且永远物有所值。我建议让员工的培训尽可能简单(在大楼里或网上)。不出差或下班后等)。对与会人员的跟进会议将很快让你知道谁对学习数据可视化感兴趣。选择培训最终不感兴趣的人可能会感觉非常耗时,因此谨慎选择培训对象非常重要,但同样,如果有人感兴趣,即使看起来他们没有技能或你怀疑他们可能会放弃,也要鼓励他们。时间投资总是值得的,数据人员越多越好
然后呢?
确定教员和学员后,培训开始。不同的人总是处于不同的阶段,一些人会很快学会一种工具,另一些人会挣扎,这很好。如果 Rachel 分配了足够的时间给学员,那么只要他们保持兴趣,他们最终都会到达那里。最终我们会有一个这样的公司:
稳固的 B 级公司结构。作者图片
如果 HR 需要一个问题的答案,他们会去找他们的数据人员 Harry,他会把他们的问题翻译成可视化,如果他需要一些建议,那么 Rachel 可以提供帮助。不仅瑞秋可以帮忙,销售部的史蒂夫也可以帮忙。事实上,我们现在有 5 个人可以帮助哈利。我们如何确保哈利得到他想要的帮助?数据小时。
数据小时
这个想法基于敏捷开发周期。这是 It 公司常用的开发方法,通过这种方法,一个团队将在每天早上召开几分钟的“scrum”会议,这样每个成员都可以更新他们昨天的工作进展和今天的计划。此外,他们将在更长的时间内每周会面一次,通常约一小时,这就像一份进度报告,它允许并鼓励想法分享。这是一种非常有效的工作方式,你几乎可以保证在会议的某个时刻,用“我以前做过那个”或“你试过这个吗?”。这种方法是数据文化的关键。
数据团队
这是我们已经确定并训练出来的 6 个橙色个体。其中包括研究部的瑞秋、销售部的史蒂夫、人力资源部的哈里、市场部的梅、It 部的伊恩和财务部的弗兰克。这些都是不同层次的数据可视化能力,但没关系,他们仍然可以互相学习。一天见一次面可能太多了,毕竟他们的日常工作可能根本没有重叠。但是一周一小时就够了。在这一小时里,哈利可以利用其他 5 名成员的广泛技能来获得灵感。几个月后,弗兰克将在一份报告中处理一些复杂的事情,他会记得哈利已经实现了他想要的,这样就节省了他自己解决所有问题的时间。拥有一个数据小时的唯一真正的负面影响是,它占用了每个人一周的一个小时的时间,并且通常看起来好像什么都没学到,但这很少是真的,从长远来看,你的数据团队(以及每个成员各自的团队)将节省时间。当团队成员积极构建报告时,数据小时工作得最好,当然也可能发生没有人构建任何东西的情况。在这些情况下,仍然值得讨论该工具的发展,或者观看网上研讨会。至少这是保持不同团队联系的好方法。
你可能会注意到,尽管提到了信息系统的更多组件,我还是倾向于关注数据可视化。原因是可视化是让人们对数据感兴趣的最容易接近的途径。没有人会对这种说法感到兴奋:
“让我们创造一种数据文化,这样我们就可以自己填充中央数据系统!”
然而你可能会因为以下原因而兴奋:
“让我们创造一种数据文化,这样我们就可以可视化我们的数据!”
(记住兴奋是相对的)
关于数据处理的简要说明
数据处理在这篇文章中有明显的缺失,这是有原因的。为了澄清(和过于简化),数据处理是数据捕获和数据可视化之间的中间位。这是最难在整个公司传播的技能。它通常涉及大量的编码工作,这是大多数人在大学四年中学习的技能。然而,让“数据人”负责他们自己的数据处理是绝对可能的,但这将涉及公司中实现的某种形式的低代码或无代码解决方案。这将有助于加速因以下情况而出现的路障。
作者图片
如果市场部的 May 或 Mike 能够自己处理数据,那么他们可以完全独立地从数据采集到可视化。这是一个相当大的对话,有点超出了本文的范围,所以让我们相信我的话,实现这种公司结构是非常可能的。
A+公司结构。作者图片
如果你有上述结构,那么给自己一个金星,这就是数据文化。
使用 Pandas 和 NumPy 进行数据映射和替换的技巧
转换数据有助于您处理数据集、理解数据集并收集尽可能多的见解。
雄心勃勃的创意公司 Rick Barrett 在 Unsplash 上的照片
介绍
为了总结主要特征、发现异常并可视化信息,您应该知道如何重新排列和转换数据集。换句话说,转换数据有助于您处理数据集,理解数据集,并收集尽可能多的见解。在本文中,我将向您展示一些我常用的处理数据的方法,希望这对您有所帮助。
资料组
我将创建一个简单的分数数据集,其中包含不同班级的分数信息。
***Input:*** info = {'Class':['A1', 'A2', 'A3', 'A4','A5'],
'AverageScore':[3.2, 3.3, 2.1, 2.9, 'three']}data = pd.DataFrame(info)
输出:
图 1:数据帧
替换列中的值
由于我们数据中 A5 类的平均分数是一个字符串对象,我想用一个相应的数字来替换它,以便于数据操作。将“三”替换为“3”的步骤如下:
***Input:*** data['AverageScore'] = data['AverageScore'].replace(['three'],'3')
data['AverageScore'] = data['AverageScore'].astype('float')
图 2:替换后的数据
上面是在特定列中用另一个值替换一个值的简单例子。更多参考,下面是一些更多的例子:
- 如果要用多个新值替换特定列的多个值,请使用:
data['column name'] = data['column name'].replace(['1st old value','2nd old value',...],['1st new value','2nd new value',...])
- 如果要用新值替换特定列的多个值:
data['column name'] = data['column name'].replace(['1st old value','2nd old value',...],'new value')
映射数据列
假设我想添加一个评估分数好坏的列,我将写下每个分数到相应评估意见的映射。这可以通过使用bins
、熊猫cut()
功能、np.digitize()
功能、np.select()
或您自己的if
功能以 4 种不同的方式完成。让我们看看我是如何处理每种方法的。
熊猫. cut()
您只需要定义您的限制和类别名称,然后使用pandas.cut()
将它们应用到数字列。在这种情况下,我将定义三个区间,对应于四个 bin 限制,以评估每个类的分数。详细来说:
- 0 < AverageScore ≤2: Below average
- 2 < AverageScore ≤ 3.1: Average
- 3.1 < AverageScore ≤5: Good
***Input:*** bins = [0, 2, 3.1, 5]
comment = ['Below Average', 'Average', 'Good']
data['Evaluation'] = pd.cut(data['AverageScore'], bins, labels=comment)
输出:
图 3:使用 panda.cut()映射数据
Numpy.digitize()
Numpy.digitize()
的想法是获得每个值所属的仓的索引。类似地,在这种情况下,您也可以像使用pd.cut()
一样定义您的 bin 边界和类别名称。区别在于创建一个额外的字典,并使用该字典来映射类别名称。
***Input:*** bins = [0, 2, 3.1, 5]
comment = ['Below Average', 'Average', 'Good']dictionary = dict(enumerate(comment, 1))data['Evaluation2'] = np.vectorize(dictionary.get)(np.digitize(data['AverageScore'], bins))
输出:
图 4:使用 Numpy.digitize()
Numpy.select()
Numpy.select(condition list, choice list)
方法根据列表中的条件,返回从选择列表中的元素中提取的数组。因此,我们可以很容易地通过陈述评估条件来获得所需的值,评估条件是三个有限制的区间,以及相应的选择列表值。参见下面的代码以供参考。
***Input:*** evaluate = [data['AverageScore'].between(0,2), data['AverageScore'].between(2,3.1), data['AverageScore'].between(3.1,5)]values = ['Below Average', 'Average', 'Good']data['Evaluate3'] = np.select(evaluate, values, 0)
输出 :
图 5:使用 Numpy.select()进行映射
Writing your function
你甚至可以编写自己的函数来应用。逻辑其实很简单,正如你所见:
***Input:*** def evaluate(values):
if values >=0 and values <=2:
return 'Below Average'
elif values >2 and values <= 3.1:
return 'Average'
else:
return 'Good'#Applying function
data['Evaluation4'] = data['AverageScore'].apply(lambda x: evaluate(x))
输出:
图 6:编写自己的函数
如您所见,所有四种解决方案都产生了相同的结果。我只想为您提供解决这个问题的不同方法,以便将来您可以在不同的场景中灵活地应用这些数据操作。
结论
以上是我的一些映射和替换数据的技巧。我想在这里传达的是,在某些情况下,当你做探索性数据分析时,你可能必须处理多种意想不到的情况,因此用多种方法解决问题是有用的。希望有一天我的文章能帮到你。祝你好运!
获得第一份数据科学实习的技巧。
如果我能,你也能!帮助你打入这个行业的 6 个要点。
马丁·比约克在 Unsplash 上的照片
如果你是一名有抱负的数据科学家,你的目标是获得你的第一份数据科学实习,那么我鼓励你继续阅读。本文将讨论是什么帮助我获得了我的第一份数据科学实习,以及进入该行业真正需要什么。我目前是一名数据科学实习生,将于夏季结束时毕业并获得硕士学位。在我决定攻读硕士学位之前,我在体育分析领域工作了 4 年。首先,我们都来自不同的背景,所以没有完美的公式。无论是参加训练营,完成在线课程,还是完成正式的研究生学位。然而,在参加了许多网络活动和与数据科学专业人士的咖啡聊天后,我注意到了一个人必须具备的一些共同特征,以及你应该采取的步骤,以给你一个更好的机会迈出第一步。每个话题我都会一一过一遍,如果你具备了那些性格特质,并且按部就班,那么你就真的离闯入这个行业不远了。
1。)值得培养的性格特质:
说到性格特征,动力、坚持和强大的沟通技巧可能是成为一名成功的数据科学家所需的三个最重要的个人特征。我个人认为,如果你没有这些,那么你在这个行业生存的机会不会很大。然而,你可以不断努力,提高自己!所以不要回避,努力克服你的弱点。
驱动:无论是什么驱动你,无论是学习新的数据科学技能的持续快乐,解决问题的快乐,甚至是赚大钱的纯粹快乐。如果你没有激情,那将会很艰难。每天努力改变你的心态,让最终目标摆在你面前。制定短期、中期和长期目标,并采取小步骤实现中期目标,这样你就能实现最终目标。请记住,您不会在一夜之间成为数据科学家。这是一场马拉松,不是短跑。
坚持:你真的需要享受你正在做的事情,并愿意不断学习,因为新技术层出不穷。在我的旅程中,我很早就接受了这样一个事实:如果我想在这个行业取得成功,我需要在余生中不断学习新的技能。为了跟上当今就业市场对新技能的需求,你需要大幅提升自己的技能。
沟通:不言而喻,善于沟通对任何工作都是一大优势。当涉及到我们的领域时,在一天结束时,你需要舒适地向客户或利益相关者展示你的发现,并善于简单明了地向非技术人员解释技术概念。
我确信如果你读到现在,你已经有了一些坚持和动力;).你可以培养更多的品质,但是我真的认为上面提到的三种技能是至关重要的。
2.)创建辅助项目:
我相信你已经读过很多遍了,但是如果你没有任何与数据相关的工作经验,副业是展示你技能的好方法。它向雇主展示了你的创造能力,除此之外,它还展示了你的热情。当我看到我的一些同行仍然没有像样的 GitHub 个人资料,并期望立即获得一份六位数的工作时,我有时仍然会感到惊讶。你需要明白,如今仅仅完成在线课程、训练营或研究生学位是不够的。外面有很多竞争,通过创建有趣的副业项目,你有能力在其他候选人中脱颖而出。查看我的 GitHub 简介和个人项目及其自述文件,亲自了解是什么帮助我获得了数据科学实习机会。
3.营销自己——发展你的个人品牌:
发展我的个人品牌和在校外积极活动确实帮助我参与了数据科学社区并受到了关注。作为学生大使,我总是鼓励新生在校外积极活动。写关于新概念的博客,展示项目,在社交网络上分享想法都是很好的参与方式。我个人就这样领了两次奖。一篇来自 Streamlit 的数据可视化项目,另一篇是我作为 Streamlit 新用户的总体贡献。您可以在此处查看该项目:
https://share . streamlit . io/navido 89/covid 19-dashboard-dataviz/app . py
如果你不相信我,下面是我获奖的链接:
https://discuse . streamlit . io/badges/44/每月新用户
第二个奖项是我从 KDNuggets 获得的,是关于我写的博客“数据科学初学者投资组合指南”。参见下面的奖励:
【https://www.kdnuggets.com/2021/04/top-stories-2021-mar.htm
这些认可是通过活跃在社交媒体、写博客和向世界展示我的作品来实现的。我非常鼓励你也这样做,因为这会让你在申请实习或入门级工作时脱颖而出。除此之外,优化的 LinkedIn 个人资料也非常有用。列出你的项目,更新你的技能,向你以前共事过的同事甚至你的导师索要推荐信。查看下面我的 LinkedIn 个人资料以获得更好的想法。
https://www.linkedin.com/in/navidmashinchi/
最后但同样重要的是,拥有一个投资组合网站真的有助于雇主更多地了解你。这是你个人品牌的一大部分。如果你想更多地了解投资组合应该包括什么,可以看看我写的获奖博客:
总而言之,对任何行业来说,打造自己的品牌都是一个重要的方面。如果你们有些人羞于在网上展示自己的作品,不喜欢向全世界展示自己的作品,我完全理解。你需要走出你的舒适区,开始向雇主展示你的全部。这真的帮助我向雇主展示了我能创造什么,我有多大的热情。
4.)网络——拓展您的网络:
我再怎么强调这有多重要都不为过,但是从长远来看,你会看到好处的。我个人从在数据科学领域工作的专业人士那里学到了很多东西。了解他们的道路以及是什么让他们走到了职业生涯的这一步是非常有价值的。甚至从业内专业人士那里获得简历提示也会对你产生很大的影响。无论是简单的咖啡聊天还是参加招聘会活动。如果你在学校,联系职业中心,参加招聘会。对于那些不在大学的人来说,可以去 meetup.com 的看看,或者试着做一些冷漠的延伸,邀请那个人一起喝咖啡。尽可能的增加你的人脉。
5.)运用策略:
不言而喻,这个阶段可能会很累,但如果你聪明的话,你会惊讶地发现你能多快地获得面试机会。
推荐:这是获得面试机会的最快方法。我收到了一些通过人际关系网认识的人的推荐。这就是为什么网络是一个重要的方面。一旦你和在这个领域工作的人建立了联系,他/她看到你充满激情并且是一个好人,他们会尽力帮助你。不要期望他们都为你这样做,但如果他们这样做了,对你来说很好。
冷外联:一旦你通过 LinkedIn 或公司网站申请工作,试着找到你申请的公司的数据科学团队成员。给他们发一条信息,解释为什么你是这个职位的理想人选。有时候,他们会把你和招聘经理联系起来,或者把你和公司里的其他人联系起来。你不一定总能得到回音,但获得面试机会的几率比仅仅在网上申请要高得多。
如果你只是在网上申请,这将成为一个数字游戏,但如果你聪明的话,你会惊讶于回复率增长的速度。艾玛·丁的一篇很棒的文章帮助我更好地理解了如何增加获得面试的机会。请查看以下内容:
6.)面试——熟能生巧:
https://www.youtube.com/watch?v=OD1Ajq3ULTk
练习练习练习再练习。这是没有办法的。我不会在这方面做太多,因为这里有太多的资源。无论是说到 leetcode 、 algoexpert 、 stratascratch 等。,如果你投入工作,相信我,你会得到结果的。就像生活中的其他事情一样。作为一名职业足球运动员,我的经历教会了我一件事,那就是如果你努力工作,遵守纪律,并愿意每天学习,你将会达到你的目标。在结束之前,我想分享一下艾玛·丁的视频,她给了你一些面试前应该做的事情。它确实帮助了我。
最后的话:
我希望这篇文章对那些希望进入数据科学领域的人有所帮助。正如我之前提到的,没有完美的公式,但有几个步骤可以增加你获得理想工作的机会,让你在竞争中脱颖而出。对我起作用的可能对其他人不起作用,但是我确信我所说的一些要点会增加你的机会。
- 提高你的软技能。
- 做你的副业。
- 推销自己。
- 尽可能多地建立关系网。
- 为你的面试练习练习再练习。
如果你对这个话题有任何问题,请告诉我。如果你喜欢这篇文章,如果你能在任何社交媒体平台上分享它,我将非常感激。谢谢你,祝你好运!✌
️
重启(或开始)数据科学之旅的提示
最大的收获:制定一个计划,组织你的学习
Gabriel Beaudry 在 Unsplash 上拍摄的照片
TL;DR: 1。制定一个能回答两个问题的计划。你有多少时间/资源用于学习?你学习数据科学的原因是什么?2.创建一个学习知识库(最好在云中)来存储有用的代码块和分析,您可以复制或迭代它们。
在过去的 9 个月里,我一直在和 Endolytix 一起解决人类面临的最大挑战之一——抗生素耐药性。此外,除了这项重要的工作之外,我第一个孩子的出生使得我没有时间继续学习数据科学的新技术。我们终于适应了父母的角色,睡眠训练提供了一些私人时间,是一种受欢迎的解脱。有时间的话,我想我应该浏览一下 Medium,做一些我长期以来最感兴趣的数据科学项目。自从我开始做项目以来,有这么多新的工具和技术,我感到有点不知所措。
学习焦虑和内容的诅咒
JESHOOTS.COM在 Unsplash 上的照片
每天都有大量的公开信息、免费信息(中等)和更多的编码训练营/数据科学学位涌现出来。数据科学领域的剪切量是惊人的。使用数据科学的任务数量正在扩展到经济的每个部门。这种日益专业化的数据科学创造了利基分析和可视化,只有当你在这些领域时才应该探索。诚实地反思自己目前的技能水平对开始或重新开始学习至关重要。我觉得在长时间离开后,我对关键功能和标准数据解析命令的记忆受到了影响。我必须查找如何退出 vim 。我在某种程度上处于高级水平(扎实的数据结构和工作流知识),有足够的差距, StackOverflow 可以回答。
你的数据科学“为什么?”
对于任何希望继续学习数据科学的人来说,第一个大问题总是:我需要一个学位,训练营认证,或者我可以继续自学吗?我有一个计算学科的高级学位,并且有一个健康的数据科学项目组合。鉴于我的知识水平和就业目标,自我导向学习是我的选择。您学习数据科学的目标对于制定个性化计划也很重要。
马库斯·温克勒在 Unsplash 上拍摄的照片
是什么促使你学习数据科学?是对探索性分析的兴趣,对职业多样化的兴趣,还是对金融的兴趣?如果你对数据科学家的职位感兴趣,训练营或学位可能比自学更受欢迎(在许多情况下,但不是所有情况下)。对于那些处于职业生涯中期的人来说,寻求在某个领域的发展也许从一些自我指导的学习开始,首先完成基础(学习编码)可能是正确的途径。如果你还处于初级阶段,如果你有时间和资源,学位或训练营会提供一个帮助你成功的框架。这个选择是非常个人化的。
逐步学习
我发现了一个学习复杂任务的好方法,那就是循序渐进地学习。也许你想把监督学习作为一项技能。将宽泛的概念分解成更小的步骤可能如下所示:
学习监督学习
- 了解数据类型(连续或离散)
- 学习正确的数据格式(如何选择预测变量)
- 缺失对分析的影响(发现插补,和/或随机缺失对可怕的非随机缺失的影响)
- 了解如何分割数据(留一法、80 训练/20 测试、交叉验证)
- 监督学习中的分类器类型(基于树、集成、基于核)
- 实现这些分类器的包(很多情况下是 scikit-learn 或 caret)
- 学习一些监督学习工作流程(参见其他人在应用环境中的工作,如泰坦尼克号数据集
- 了解特征重要性、特征选择和特征工程。
- 监督学习中的可视化性能(ROC、真值表、维度比例图)
理解一个概念不仅仅是看(复制)某人的工作流程。学习新概念的挑战在于意识到你所不知道的。在训练营或学位这样的环境中,你的知识缺口会通过一个结构来解决。作为一个自我导向的学习者,你是你的旅程的船长,将你的“未知的未知”转化为“已知的未知”,然后是“已知的已知”。试着搜索“在 X 中需要注意的事情”或“初学者在 Y 中会犯的错误”来学习你不知道你需要知道的东西。
照片由 raffaele brivio 在 Unsplash 拍摄
记录你的学习
我怎么强调都不为过!构建存储库(最好是基于云的)来编目您的进展,并用于将来的参考或迭代。拥有多个存储库对于不同类型的学习可能是理想的。我在 GitHub 上存储我的自我导向学习项目。我还使用 iCloud 和 Notes 来跟踪有用的代码块和终端命令。
如果你像我一样,已经储存了有用的数据,那么回来或者复制项目要比从头开始构建东西容易得多(记得 过度评论)。在我的命令存储库之前,我经常访问 Biostars 来查找我工作中的一些简单的东西,比如如何解析 FASTA 文件。现在,我使用快速查找功能在基于云的存储库中调出这个命令。在我的个人机器上有一个我的存储库的本地副本允许命令查找,即使不能访问互联网。此外,基于云的存储库允许存储库在不同的机器之间转移。一杯洒了的咖啡不会妨碍你保留知识的能力。
最终想法
重新开始或开始你的数据科学之旅制定一个计划和记录你的进展/在基于云的存储库中有用的代码块。学习大的主题更容易分解成比特大小的比特。祝您在数据科学之旅中好运!我期待着探索新的工作流程和可视化。我的名字是科迪·格利克曼,可以在 LinkedIn 上找到我。一定要看看我下面的其他文章:
</10-to-dos-to-transition-into-data-science-e84b7eb1f3fa>
运行高保真深度强化学习实验的技巧
理解大数据
尽管最近在该领域取得了令人难以置信的算法进步,深度强化学习(DRL)仍然因计算昂贵、容易出现“沉默的错误”、难以调整超参数而臭名昭著。这些现象使得运行高保真、科学严谨的强化学习实验至关重要。
在这篇文章中,我将讨论我在 DRL 学到的一些技巧和教训,以减轻这些困难的影响——这些技巧是我在强化学习课上永远学不到的。谢天谢地,我有机会与一些了不起的研究导师一起工作,他们向我展示了如何,更重要的是为什么,以下是进行 RL 实验的真正重要的技术:
- 设定(所有)你的种子
- 运行你的种子
- 消融和基线
- 想象一切
- 开始解析,然后开始简单
- 当你有疑问时,看看(GitHub)的星星
我敢肯定还有很多来自经验丰富的强化学习实践者的技巧和诀窍,所以上面的列表绝不是详尽的。事实上,如果你有自己的建议和窍门想分享,请在下面评论它们!
我们开始吧!
1.播种(所有的)种子
能够重现您的实验对于发布您的工作、验证原型、部署您的框架以及保持您的理智是至关重要的。许多强化学习算法都内置了某种程度的随机性/随机性,例如:
- 你的神经网络是如何初始化的。这会影响您的价值神经网络的初始值估计和您的策略神经网络选择的动作。
- 您的代理的初始状态。这会影响代理经历的转换和展开。
- 如果你的策略是随机的,那么你的代理选择行动。这会影响您采样的过渡,甚至整个展开!
- 如果您的代理所处的环境也是随机的,这也会影响您的代理采样的转换和展开。
从以上几点你可能已经猜到,确保可重复性的一个方法是控制你实验的随机性。这并不意味着让你的环境具有确定性并且完全没有随机性,而是为你的随机数生成器(RNG)设置种子。对于您使用的所有使用概率函数的包都应该这样做——例如,如果我们使用 Python 包torch
、gpytorch
、numpy
和random
中的随机函数,我们可以使用以下函数为所有这些包设置随机种子:
def set_seeds(seed):torch.manual_seed(seed) # Sets seed for PyTorch RNG
torch.cuda.manual_seed_all(seed) # Sets seeds of GPU RNG
np.random.seed(seed=seed) # Set seed for NumPy RNG
random.seed(seed) # Set seed for random RNG
自己尝试一下——如果您设置了所有向 RL 实验添加随机成分的种子,您应该会看到来自同一种子的结果是相同的!这是设置 RL 实验的良好开端。
2.运行(一些)你的种子
在验证您的 RL 框架时,在多个种子上测试您的代理和算法是至关重要的。一些种子会产生比其他种子更好的结果,如果只靠一颗种子运行,你可能只是运气好或者运气不好。特别是在 RL 文献中,在一个实验中运行 4-10 个随机种子是很常见的。
我们如何解释这些多种子结果?您可以通过计算指标的均值和置信区间来实现,例如奖励或网络损失,如下图所示。这让你对两者都有一个概念:
I .您的代理在 seeds 中的平均表现(通过平均值)。
二。您的代理在不同种子中的表现变化(通过置信区间)。
显示不同组随机种子的平均值性能(实线)和置信区间(彩条)的示例图(在这种情况下,对应于不同的实验)。图片来源:作者。
3.消融和基线
安妮·尼加德在 Unsplash 上拍摄的照片
消融是指移除系统组件。如何最好地测试强化学习系统中某个组件的效果?嗯,一种方法是尝试运行没有这个组件的强化学习算法,使用消融研究。这里,为了比较结果,使用相同的种子运行这些不同的配置至关重要。带着相同的种子运行,这让我们能够在框架之间进行“苹果对苹果”的比较。
一种类似但不一定等同的思考你的 RL 实验过程的方式是使用基线——你的算法所基于的可验证正确的算法或例程。运行一个基线测试来回答这个问题:“我的算法在已经完成的基础上改进了多少?”
不同实验的消融研究示例。图片来源:作者。
4。可视化一切
强化学习可能很难调试,因为有时错误不仅仅表现为错误——您的算法可能会运行,但代理的性能可能不是最佳的,因为一些量没有正确计算,网络的权重没有更新,等等。为了有效地调试,一个策略是做人类擅长的事情: 可视化 !考虑可视化的一些有用的可视化工具和数量包括:
a.
来自 Tensorboard 的一些图的例子。图片来源:作者。
你不仅仅局限于使用 Tensorboard 生成图!查看附录中的代码,您可以使用这些代码从图像数据中生成 gif!图片来源【3】。
b .奖励面:如果您的状态和动作空间是低维的,或者如果您想要可视化您的状态和动作空间中的维度子集,并且您有一个封闭形式的函数来计算奖励,您可以可视化由动作和状态参数化的奖励面。
OpenAI Gym Pendulum 环境中参数化状态和动作的奖励表面示例。有关如何生成该图的代码,请参见附录。
c .参数的分布/直方图:如果您的参数随时间变化,或者如果您在多个实验中重新运行您的参数集,可视化您的参数分布以了解您的 RL 模型的性能也可能是有帮助的。以下是高斯过程回归的超参数可视化示例。
高斯过程回归的参数/超参数分布示例。图片来源:作者。
5.开始分析,然后开始简单
5a。开始分析
在你在动态环境中评估你的算法之前,问问你自己:有没有一个分析函数可以让我评估它?这对于那些没有给你提供基本事实值的任务来说尤其有价值。有许多可以使用的测试函数,其复杂程度从简单的元素级正弦函数到用于优化的测试函数【4】。
下面是一个可用于优化的 Rastrigin 测试函数的例子:
一个光栅测试函数的例子。图片来源:作者。
一旦你确信你的模型可以适合复杂的分析形式,比如上面的 Rastrigin 测试函数,你就可以开始在真实的强化学习环境中测试它了。运行这些分析测试可以确保您的模型能够逼近复杂的函数。
5b。从简单开始
您现在已经准备好将您的 RL 模型转换到一个环境中了!但是在你评估复杂环境下的模型之前,例如,一个 17 维的状态空间[1],也许在一个只有 4 维的环境中开始你的评估过程会更好?
这是本技巧的第二个建议:从评估模型的简单环境开始,原因如下:
(I)它们将(通常)运行得更快,并且需要更少的计算资源。
(ii)他们(通常)不太容易受到“维数灾难”的影响[2]。
OpenAI Gym CartPole-v1 环境就是一个好的启动环境的例子,因为它的状态空间只有 4 维,它的动作空间只有 1 维。图片来源:作者。
6。当你有疑问时,看看(GitHub)星星
照片由 Astrid Lingnau 在 Unsplash 上拍摄
我们都经历过。我们的 RL 代码不工作,我们不清楚为什么,尽管无数小时的调试和评估。一个可能的原因是超参数设置不当,这可能会对代理性能产生深远的影响——有时是以非常微妙的方式。
当有疑问时,看看以前的工作,看看你的 RL 配置,特别是超参数配置,如何与你的 RL 同事发现的经过试验和测试的配置进行比较。以下是一些可能有助于完成此任务的基准资源:
此外,如果你正在使用强化学习包,比如 RLlib 或 TensorFlow-Agents ,你的 RL 类中的许多默认参数都是有原因的!除非您有很强的理由更改默认参数,否则选择这些默认参数可能有助于您构建一个只需少量修改的成功模型:)
摘要
恭喜你,你成功了,非常感谢你的阅读!在这篇文章中,我们谈到了在深度强化学习中运行高保真、科学严谨的实验的重要性,以及我们可以实现这一点的一些方法。为运行更高保真、更可重复、更可解释的 RL 实验干杯!
同样,如果你有自己的建议和窍门想分享,请在下面评论!
感谢
特别感谢我在麻省理工学院分布式机器人实验室的导师们教给我这些技巧。学习这些技术真的非常有价值,让我成为了一名更好的研究者。
感谢阅读:)请关注我,获取更多关于强化学习、计算机视觉、编程和优化的文章!
参考
[1]布罗克曼,格雷格,等。“开放的健身房。” arXiv 预印本 arXiv:1606.01540 (2016)。
[2]基奥·e .,穆恩·a .(2017)维度的诅咒。在:萨姆特 c,韦伯 G.I .(编辑)机器学习和数据挖掘百科全书。马萨诸塞州波士顿斯普林格。https://doi.org/10.1007/978-1-4899-7687-1_192。
[3] Wilko Schwarting、Tim Seyde、Igor Gilitschenski、Lucas Liebenwein、Ryan Sander、Sertac Karaman 和 Daniela Rus。深层潜在竞争:学习在潜在空间使用视觉控制策略进行竞赛。11 2020.
[4]测试函数优化,https://en . Wikipedia . org/wiki/Test _ Functions _ for _ Optimization。
附录
生成分析奖励函数
Python 中字符串操作的技巧
马库斯·斯皮斯克在 Unsplash 上的照片
介绍
在我以前的工作中,我不得不处理与清理大量移动数据相关的任务。不幸的是,由于一些技术原因,移动数据没有正确格式化,结果一切都变得一团糟。有不同种类的符号(例如:+、/等。,)和数据中包含的怪异排列。我的职责是分析这些乱七八糟的东西,并将所有的手机号码转换成统一的格式。
起初,当我做清洁时,我发现很难按照我想要的方式操纵绳子。原因之一是我不熟悉处理文本的方法和语法。我不得不一遍又一遍地在 Google 和 StackOverFlow 上搜索我需要的东西,这浪费了我很多时间。所以在今天这篇文章里,我会和大家分享一些我常用的方法,包括 Python 内置的 string 方法和正则表达式,来处理字符串问题。我希望他们能以某种方式支持你的工作。
Python 内置的字符串方法
这一部分有很多功能,但是我会指出一些我经常使用的命令供你参考。
替换
用另一个短语替换出现的内容。
语法:
string.replace(old, new, count)
- 旧:要替换的值
- new:替换旧值的新值
- count(可选):要替换的值的个数。如果不指定任何内容,所有出现的内容都将被替换
举例:
图 1:将“超市”替换为“学校”
剥夺
修剪字符串开头和结尾的字符。
语法:
string.strip(characters)
举例:
图 2:去除开头和结尾的空格和其他字符
同样,我们也有 lstrip() 来删除字符串开头的字符,还有 rstrip() 来修剪末尾不需要的值。
裂开
split() 函数从识别出的分隔符中分离出字符串,并返回一个列表中所有的碎片。
语法:
string.split(separator, maxsplit)
- 分隔符:字符串在指定的分隔符处拆分
- maxsplit(可选):指示要执行多少次拆分。
例如:
图 3:所有的字符串在默认的空白字符处分开
现在,让我们看看图 4 中的例子,看看是如何工作的。
图 4:不同 maxsplit 值的结果
加入
使用字符串作为分隔符连接一系列字符串元素。
语法:
*string.join(seq)*
- seq:要连接的字符串元素序列
举例:
图 5:使用 Join() 的例子
还有许多其他 Python 的字符串方法,但是在本文的范围内,我将只提到一些常用的方法。作为进一步的参考,您可以查看下面的必备功能列表:
大写():将第一个字符转换成大写
Casefold()/Lower(): 将字符串转换成小写
Count(): 统计一个值在字符串中出现的次数
Endswith(): 如果字符串以特定值结尾,则返回 TRUE
Startswith(): 如果字符串以特定值开头,则返回 TRUE
Index(): 返回一个值的位置
正则表达式
想象一下,你有一个电子邮件列表,包括一些格式错误的电子邮件。你想找到所有格式正确的邮件,这些邮件以特定的方式存储,包含一些特定的字符。这时正则表达式就来拯救了。
正则表达式( regex )是一种用于搜索字符串模式的常用方法。在 Python 中,我们有一个内置的包叫做 re, 里面包含了很多处理正则表达式的函数。在研究一些必要的函数之前,让我们先了解一下元字符,元字符是正则表达式引擎的控制字符,以一种特殊的方式解释。
^:检查字符串是否以特定值开始**
$: 检查字符串是否以特定值结束
。: 句点匹配任何单个字符,除了新行
*:
[…]: 一个括号匹配括号中的任意一个字符。
【^…]:匹配任何不在括号内的单个字符**
{…}: 精确匹配出现次数
(…): 用于分组子模式
+: 加号匹配一个或多个事件
|: 匹配任一值
: 转义特殊字符。在你不确定是否有特殊含义的字符前划一条斜线
在我们了解了一些基本的正则表达式之后,让我们来看看 re 模块,它包含了很多使用正则表达式的有用函数。为了使用它,我们需要首先导入模块:
**import re**
总体而言,该模块可以分为 3 类,即模式匹配,替代和分裂。
重新搜索()
扫描匹配模式的字符串,然后返回模式匹配的位置。
举例:
图 6:使用 re.search()的示例
图 7:示例 2
在示例 2 中(图 7)返回 match = "123 ",因为我们阐明了表达式[0-9][0-9][0-9]
匹配任何三个十进制数字字符的序列。
re.findall()
返回包含所有匹配的列表。
举例:
图 8
图 8 中的例子返回从具有特殊模式 /d 和 findall()的字符串中找到的所有十进制数字。
重新拆分()
将字符串分成出现模式的部分,并返回字符串列表。
举例:
图 9
图 9 显示了 “至” 及其余部分的划分列表。
re()
返回一个字符串,其中匹配的字符被替换为新的指定值。
举例:
图 10
图 10 显示了我们如何将字符串中的 "替换为【mon】。
结论
关于字符串操作的话题,尤其是正则表达式,实际上是一个很难的话题。如果你有兴趣,想更深入的挖掘,建议你看看下面的参考:
希望我的文章和一些常用的命令可以帮助你了解字符串操作是如何工作的。祝你深造顺利!
数据科学求职技巧
找工作很难。这里有一些小技巧可以让它变得简单一点。
在 Unsplash 上 Marten Newhall 拍摄的照片
找一份数据科学的工作可能会很难。在初级阶段,由于数据科学作为一个领域的受欢迎程度迅速上升,竞争非常激烈。
几年来,我一直在指导和教授有抱负的数据科学家。以下是我对如何帮助求职的一些最佳建议。
1.努力获得经验
好吧,这可能不是你想听到的——但事实是,找工作可能需要很长时间。我认识很多有抱负的数据科学家,他们有很强的技术和沟通能力,花了一年多时间才找到一个职位。
所以当你开始寻找的时候,你应该同时寻找获得经验的方法。这可能不会马上有所帮助,但是几个月后,当你还在申请的时候,如果你在一个项目上取得了一些进展,会让你的申请变得更强大,你会感觉好很多。不过,要确保你的项目是好的——很多项目并不是好的,原因我在本文中概述了:
[## 为什么大多数数据科学组合项目没有得到招聘经理的认可
towardsdatascience.com](/why-your-data-science-portfolio-project-sucks-208ee830ad1b)
要获得有助于改善你简历的经验,请看这篇文章:
2.做一份好的简历
我看过很多简历。因此,我见过很多糟糕的简历。
简历上有些东西是你无能为力的——如果一个职位需要一定的工作经验或一定的教育水平,你对此无能为力。
但是大部分简历都是可以改进的。你会经常用到这份文件,所以在很多应用中,一个小小的改进会大大提高你被录用的可能性。
花些时间确保你的简历看起来不错。清晰简洁地解释你过去的项目。这并不容易——一份好的简历应该非常简短,但这并不意味着不需要花费时间和精力。
想获得更多关于如何让你的简历脱颖而出的指导,请看这篇文章:
[## 让你的数据科学简历脱颖而出
towardsdatascience.com](/making-your-data-science-resume-stand-out-119d2eb37d8c)
3.发出更多的申请
申请是一个数字游戏。预计会发布大量应用程序。我指的是很多。
制作一封好的“默认”求职信来讲述你的故事。如果你没有什么特别要说的,就把每份申请的求职信中的公司/职位名称去掉。如果这是一个你真正感兴趣的职位,花 15 分钟(不超过 15 分钟)在你的求职信中添加一段表达这种热情的话。
然后开始大量生产应用程序。每提交一份申请就多了一条钓鱼线。
不要害怕申请。有些人害怕申请他们觉得不符合条件的工作。只要符合大部分条件,提交即可。让他们决定你是否合格,不要替他们做工作。
对于任何一份工作,有一百万个理由让你可能得不到面试机会。也许他们已经有了一个内部候选人。也许是他们忘了拿下来的陈旧的招聘启事。也许他们在你投简历的前一天找到了喜欢的候选人。也许招聘经理因为完全特殊的原因不喜欢你简历上的某些东西。
关键是,最好的策略是提交并忘记。不要为任何一份申请而伤感。提交,继续下一个。
也就是说,如果你已经投了 100 份简历,但还没有进入面试的电话筛选阶段,这是一个重要的信号,表明是时候进行评估了。你申请的工作是否超出了你的能力范围?需要更多经验吗?你的简历需要润色吗?找出缺少的东西并解决它。
4。网络,但有意图
作为一名经理,我收到了大量来自陌生人的 LinkedIn 请求和信息,看起来像这样:
我对作为一名“数据科学家”在 Klaviyo 工作非常感兴趣,这是我的简历。
问题来了:我已经有了一个接收那份工作的简历、申请和求职信的方法。它被称为工作申请页面。
如果一个我尊敬的前同事在 LinkedIn 上给我发信息询问职位,我绝对会帮忙。但是如果我不认识你,我不会因为你也通过 LinkedIn 信息“申请”而区别对待你的工作申请。
所以,在你询问职位之前,先建立关系。如果你不知道如何建立关系,问问自己是否真的在建立关系网。
参加聚会和会议。尽可能展示你的作品。在 Twitter 上与人们联系,参与关于工作的有意义的对话,展示你的项目。先和人联系。在你们建立了关系,他们了解了一些你的技能和兴趣之后,谈论工作情况。
5.记住这对每个人来说都很难
不管你是谁,找工作都很难。我很幸运有过几次相对“容易”的求职经历,但即使是这些经历也充满了更多的拒绝和失败,而不是成功。这在情感上是困难的。
处理求职过程中的情绪并没有什么秘诀。但是请记住这对每个人来说都很难。把每一份申请都看作是求职路上的一步。把每一次面试都当成一次学习和实践的机会。对自己好一点。
GitHub copilot 能为数据科学家做些什么?
生产力
没有废话指南使用副驾驶今天
除非你生活在岩石下,否则传说你会从你的新闻订阅中看到 Github copilot 的一篇文章。这不是另一个解释什么是副驾驶员的帖子,或者讨论副驾驶员的法律问题,或者它如何可能是编码员的末日。这是一个实用的指南,告诉你如何开始使用 copilot 进行 python 编程。
此时,副驾驶仅可通过关闭的 beta 使用,并可使用 VSCode 扩展访问。
Github 副驾驶 ✈️ 是一个与 AI tech 爱恨交加的绝佳例子。
它之所以受人喜爱,是因为它可以提供出色的建议,但令人讨厌的是,它使用了整个开源代码库来实现这一点。综上所述,典型的 AI 工具。
技巧 1:让你的代码可读📙
使用不言自明的函数和参数名称。适当的命名提高了代码的可读性,对人和机器都是如此。这种方法单独影响所提供建议的质量。
功能与自我解释的名称和参数,帮助副驾驶。作者 GIF。
技巧二:语境,💡语境,语境
使用类型提示。这为作用域中的所有变量、函数和返回类型提供了额外的上下文,其副作用是帮助您捕捉林挺的错误。
基于返回类型提示自动完成复杂的数据结构。作者 GIF。
技巧 3:回顾过去🍔向前看
Copilot 是双向上下文感知的。如果您的代码被夹在两个函数之间,copilot 仍然可以使用完成前后的上下文自动完成。
根据作者当前作用域 GIF 前后的函数自动完成。
技巧四:如果不喜欢,试试接下来的⏭️
在 VS 代码中,一旦你启用了 copilot,当你输入的时候,建议会以灰色显示。如果您不喜欢该建议,您可以使用alt + [
循环查看建议,获得下一个建议。
使用 Alt+[快捷键在建议中循环。作者 GIF
技巧 5:避免使用注释来自动完成函数。这不实际,🧪
几乎所有你在网上看到的例子,包括来自 Github 的例子,注释都被用来生成代码。虽然这很有效, 使用注释来自动完成你的功能是使用 copilot 最糟糕的方式。开发人员不会用简单的英语写出他们希望他们的功能做什么。AI 应该为我们工作,而不是相反。
基于注释的 Copilot 自动完成代码。摘自 Github 的示例。作者 GIF。
技巧 6:外部📚图书馆
Python 的多功能性来自于它的库。你可以期望副驾驶知道对象方法和最常用的参数。
Copilot 在像 sklearn 和 pandas 这样的 DS 库上提供了完整的。作者 GIF。
技巧 7:模式匹配
copilot 可以匹配涉及多个参数和数据类型的复杂模式。
Copilot 通过使用数据类型和上下文自动填充模式匹配类参数。作者 GIF。
更多提示
这不是一个详尽的列表,而是一个不断增长的列表。如果你觉得更多的技巧可以添加到这个列表中,请在下面留下评论,我可以把它添加到文章中。
将来的
考虑到模型的灵活性和性能,下一个合乎逻辑的问题是“未来会有付费服务吗?”。根据 Github 的说法,
如果技术预览成功,我们的计划是在未来建立一个商业版本的 GitHub Copilot。我们希望通过预览来了解人们如何使用 GitHub Copilot,以及如何大规模操作它。
如果你对 gif 上的字体设置感兴趣,可以看看我下面的文章,看看如何设置类似的样式。
https://python.plainenglish.io/make-your-python-code-look-pretty-c65dc2ff2bfa
2021 年获得数据科学职位的提示
遵循这个指南
丹·史沫特莱在 Unsplash 上的照片
当谈到获得数据科学职位时,有大量关于一般面试流程、可能会问的非技术问题类型以及技术问题的建议,因此离开该部门是有意义的。
当我准备去实习的时候,我知道我的简历没有吸引力,因为我没有以前的经验,也没有令人信服的学术背景。
因此,我不得不想出一些有创意的方法,以一种可能绕过一般面试过程的方式进入职场,在面试过程中,我将与更好的潜在客户竞争,或者至少让我的名字出现在这些人中,这样我就可以作为候选人与他们竞争。不管怎样,都没关系。我的理论是,如果我能有更多的机会,那么我得到一个角色的机会就更大。
话虽如此,以下是我以前尝试过的一些事情和我长期以来的一些想法。
网络
我必须从这个开始,因为这是我最后找到工作的原因。面试过程的很大一部分是雇主试图判断你是否适合这家公司(以及你是否觉得这家公司适合你),因此,如果你能够在决定申请某个职位之前与招聘人员或人力资源部门建立真正的关系,这个阶段几乎可以完全被忽略。
想想看,一旦一个数据科学职位被分享给其他人申请,招聘人员每周可能会收到 300 多份申请!我的简历被翻出的可能性非常小,如果被翻出,我只有不到 60 秒的时间来打动那个已经有 300 多份申请要看以及其他职责的人。
相反,在 LinkedIn 上找到一些招聘人员或招聘经理会好得多(显然 Twitter 在这方面也很好),并在接触他们之前就开始关注他们的帖子——是的!你不必马上开始谈话。
这样,当他们发布一个职位,而你决定在 DMs 中联系他们时,你就不是陌生人了,因此,当你给他们发消息考虑你申请这个职位时,他们更有可能回复你。
建立投资组合
我给你讲个小故事。我刚刚在 Coursera 上完成了吴恩达的机器学习课程,我真的很想要一份工作,所以我做了一个项目,并将其添加到我的 Github 帐户中。我得到了一个名为“Meetup”的应用程序的提示,并被告知在那里寻找机器学习事件,所以我这样做了,并最终参加了一个实际的 IBM meetup,在那里我们使用深度学习技术来做艺术品——非常酷的东西。
我可以感觉到自己需要使用洗手间——为了你好奇的头脑——当我回来的时候,有人已经占了我在后面占的座位,所以我不得不坐在前面,旁边是一个留着大胡子的家伙。
为了这个任务,我们不得不从 Github 分一些工作,所以我去了我的 Github 文件夹,那个神秘的长胡子的家伙嘲笑道:“嘿,伙计,你的那个怎么满了?”,“哦,我已经有账户了。那里的文件来自我做过的一些机器学习项目”我回答道。从那以后,我真的不太注意他了,但偶尔他会要求帮忙做些事情,我也会帮忙。
活动结束时,他问我是否可以快速向他介绍一下这些项目,于是我就这样做了。他非常喜欢它,所以我们交换了联系方式。两个月后,他给我回了电话,让我向他的一些导演介绍我的作品。我最终在那里找到了一份工作,那个留着胡子的神秘家伙成了我的直线经理。
现在。我并不是说如果你完成了一个项目,你会得到什么样的回报,但有一些有形的东西来展示你给公司带来的东西,对获得一个数据科学博客大有帮助。
开始写博客
在我实习几个月后,这个留着胡子的家伙,现在是我的直线经理,建议我开一个博客,帮助我提高与非技术人员打交道时的沟通技巧。我听从了这个建议,我很高兴我这么做了。
由于我的博客,我的关系网大大扩展了,我不断地被做一些很酷的数据相关工作的机会轰炸。事实上,我开始从事自由职业是因为我的博客,在我提高技能的时候,博客给了我经济上的支持。
注意:然而,我想对任何开始自己的数据科学博客的人说的一个主要建议是,你应该努力确保你的目标不是成为超级名人或赚很多钱。相反,因为你真诚地关心他人,所以你分享你所学到的。
如果这是你的核心,那么你会对你的工作更加谨慎,因为你不想误导别人,如果你对自己的质量很勤奋,并与你的职位保持一致,随着时间的推移,名声和财务将成为副产品。
练习面试和作业
我知道我说过我们最好跳过这一步,但是我们不首先练习这一步是无知的。不管你是否安排了工作面试,如果你知道你正在找工作,那么你应该练习你的面试技巧(技术性和非技术性的),并做一些带回家的练习来保持你的技能。
正如我在这篇文章开始时提到的,网上已经有很多关于这方面的资源。仅举几个例子:
这些只是其中的几个,但是你绝对可以做更深入的搜索,找到与你感兴趣的角色更相关的问题。
包裹
除了这些建议,还有求职时应该采取的一般心态,如坚持不懈和从失败中吸取教训。我没有很多关于简历的建议,但我想说的是,与你希望提供简历的人建立关系总是更好,因为他们更有可能花时间看一看简历,并将你视为候选人,而不是冷冰冰的申请。
告诉我你对这些建议的看法。
如果你觉得这个故事有用,你可能也会喜欢:
https://medium.com/analytics-vidhya/courses-to-learn-data-science-in-2021-a52e64344e5c
交易的技巧、诀窍和工具:你应该阅读的 7 个热门帖子
我们最近的一些阅读量最大的文章关注如何让您的数据科学之旅更加轻松顺畅。
罗曼·海因克斯在 Unsplash 上拍摄的照片
八月应该是一个缓慢、懒散的月份——夏天的三伏天等等——但你不会仅仅通过查看上个月 TDS 读者最有共鸣的帖子就知道这一点。有抱负和经验丰富的数据科学家似乎都专注于实用性和效率,并希望提高他们的技能,因此他们找到了提供可行想法和见解的文章。从 Python 包和可视化工具到有用的实践数据集,让我们深入了解一些阅读量最大的最新帖子。
《如何在 6 个月内从非程序员成长为数据科学家》
莎兰·库马尔·拉文德兰提供的这份全面而简洁的指南在 8 月份获得了巨大的成功,他将自己给早期职业数据科学家的建议提炼为一个循序渐进的蓝图,帮助你获得成功。成为一名数据科学家还需要付出很多努力吗?当然可以。但是莎兰的指南可能会帮助你做出更明智的选择,并节省时间。
“Python 中的可视化和交互式仪表板”
口碑往往是发现新餐馆和秘密徒步旅行路线的最佳方式,可视化工具也是如此——在 Sophia Yang 关于 HoloViz 的帖子中,她解释了这个鲜为人知的 Python 生态系统(包含七个库)如何一次又一次地帮助她简化了工作流程。
“一天可以学完的 5 门在线数据科学课程”
对于许多进入数据科学的人来说,时间是一种宝贵的商品——他们可能会在一份全职工作、一堆副业、家庭责任或者只是 2021 年生活的普遍压力中疲于奔命。Sara A. Metwalli 专门为那些没有空闲时间的人收集了几门在线课程,包括几个你可以在几个小时内完成的选项。
</5-online-data-science-courses-you-can-finish-in-1-day-5b60f353fa8e>
“我希望在读机器学习博士之前掌握的九个工具”
另一个人的后见之明可以成为你节省时间的路线图——当然,前提是前者与你分享他们的见解。幸运的是, Aliaksei Mikhailiuk 非常慷慨地讨论了几种工具和方法,这些工具和方法可能会让他作为机器学习博士生的生活变得更容易——而且仍然可以让你的生活更容易,无论你是在学术界还是在工业界。
“如果我必须重新开始,我将如何学习数据科学的 Python”
就像在 Aliaksei 的帖子中一样,回溯智慧也是尼古拉斯为即将开始学习 Python 的人收集的技巧中的游戏名称。他涵盖了几个关键领域,从理解 CRUD 的概念到在项目工作中取得领先。
“练习数据科学技能和制作优秀作品集所需的所有数据集”
如果你偶尔陷入困境,不知道在哪里找到合适的练习数据集来磨练某项技能或解决一个棘手的概念, Rashida Nasrin Sucky 会帮你解决。她的收藏深刻、广泛,涵盖了各种各样的主题和问题。
“7 个很酷的 Python 包,卡格勒正在瞒着你使用”
谁不喜欢发现一个秘密的(或者,好吧,不常用的)Python 包,它可能正好解决您在工作中一直在努力解决的棘手问题呢? Bex T. 从 Lazypredict 到 Rapids cuDF,为你整理了不少于 7 个这样的网站。
</7-cool-python-packages-kagglers-are-using-without-telling-you-e83298781cf4>
你是否读过(或写过)一篇可能对其他数据科学家的工作有所帮助的文章?分享到评论里吧!
提示和技巧:为 NLP 任务增加数据
自然语言处理笔记
扩大 NLP 数据集的方法
一般机器学习或自然语言处理管道的开始——在业务问题被确定之后很久——由数据获取阶段组成。在数据采集阶段,从业人员面临的挑战是识别测量现实世界物理条件的采样信号,以便将这些数据转换为计算机可以使用的数字数值。
如果数据随时可用,那么可以跳过这一步——现实世界中很少出现这种情况。如果我们要执行一个 NLP 项目,我们必须知道一套技术来改进我们的数据集,以满足我们的期望要求。技术的全部范围超出了本文的范围,但是感兴趣的读者可以钻研一下 永远记住数据先于科学 。
数据扩充简介
深度学习模型的预测精度与训练模型所需的数据量有关系。可以肯定地说,对于无监督的深度学习任务,预测精度主要受两个因素的影响;
- 可用于训练模型的数据量
- 训练数据的多样性
如果我们希望在解决复杂的 NLP 任务时达到高性能水平,深度学习通常是首选解决方案。然而,要学习一个可以准确地将输入映射到输出的函数,通常需要我们建立一个具有大量隐藏神经元的非常强大的网络。
随着我们增加隐藏神经元的数量,我们也增加了可训练参数的数量,因此,如果我们希望我们的模型有效地学习,那么我们拥有大量数据是很重要的。
注意:我们可以说模型中可学习参数的数量与训练模型所需的数据量成正比。
如果我们没有足够的数据怎么办?
问得好。数据扩充是我们可以用来增加数据集的众多解决方案之一。从本质上讲,数据扩充由各种技术组成,可用于增加我们数据集中的数据量,方法是添加我们已经拥有的数据的稍微修改的副本,或者通过从我们现有的数据创建新的合成数据-我们使用我们的数据来生成更多的数据。
这些小技巧听起来可能很疯狂,但它们在实践中往往非常有效。数据扩充技术的一些优点是:
- 实现速度比允许我们增加数据集的其他技术快得多
- 作为一种正则化形式,帮助我们在训练模型时减少过度拟合
对于希望探索更多实践方法的好奇读者,您可能希望深入了解以下资源;
同义词替换
为了执行同义词替换,我们在句子中随机选择非停用词的单词,例如,所有以“s”开头的单词。然后,我们利用这些单词和工具,比如 Wordnet 中的 Sysnets,用它的同义词替换这个单词。
回译
想象我们有一个用英语写的句子。这个想法是把这个句子传递给一个翻译系统,这样这个系统就可以把它翻译成另一种语言,比如法语。通过我们的法语翻译,我们用它将句子翻译回英语——下面的 GIF 展示了一个使用谷歌翻译的很好的演示。
作者 Gif
你可能会注意到,开头的句子写的是“我没有时间给你”,翻译成法语就是“我没有时间为你准备”。当我们把法语翻译成英语时,返回的英语句子写着“我没有时间给你”。虽然这些句子具有完全相同的意思,但所用单词的细微差异使我们能够以一种非常有创意的方式添加到我们的数据集。
二元翻转
要做二元模型翻转,我们首先要把句子分成二元模型。然后,我们随机选择一些二元模型,然后翻转它们——例如,如果一个二元模型是“我有”,我们将翻转它,使它变成“我有”。
替换实体
这个技巧类似于同义词替换,也很有趣;为了扩大我们的数据集,我们可以简单地用同一实体类别中的另一个实体替换现有的实体。例如,我们可以把一个地方的名字替换成另一个地方的名字——“我住在伦敦”将变成“我住在纽约”。
添加噪声
根据数据的来源,我们的数据集中可能会有一些拼写错误。例如,Twitter 上的人们在创建推文时倾向于使用更加非正式的语气。在这种情况下,我们可以向我们的数据中添加噪声,以便通过在句子中随机选择一个单词,并用另一个更接近实际单词的实际拼写的单词来替换它,来训练一个更健壮的模型。
包裹
数据扩充是一种快速有效的增加训练数据集大小的技术。在本文中,我们介绍了可以用于自然语言处理任务的各种类型的数据扩充技术。同样重要的是要注意,为了使这些技术有效地工作,我们需要有一个初始的干净数据集来开始,不管它有多大。
感谢您的阅读!
在 LinkedIn 和 T2 Twitter 上与我保持联系,了解我关于数据科学、人工智能和自由职业的最新消息。
相关文章
厌倦了 AI?再说说 CI。
人工智能无处不在。它已经慢慢偏离了它最初的定义,并成为大多数自动化算法的流行语。在这篇文章中,我不会争论人工智能是什么或者不是什么——在这一点上,这是一个非常主观的争论。然而,我想强调计算智能——一个定义明确的主题。
动机
什么是人工智能?谁知道呢。定义什么是或不是人工智能是一个不断变化的目标。所以,我想深入一门更具体的科学——计算智能 (CI)。竞争情报是一个三分支的理论集及其设计和应用。它们在数学上更加严谨,可以通过添加到您的数据科学工具箱中来将您与众不同。你可能熟悉这些分支— — 神经网络、进化计算和模糊系统。深入到 CI,我们可以讨论解决更复杂问题的复杂算法。
CI 内部存在一个大型社区。具体来说,在 IEEE 内部,有一个庞大的 CI 社区,每个分支都有一个年度会议。在过去的几年里,我在 FUZZ-IEEE 会议上发表过论文/做志愿者,这总是一个学习新兴数学和算法的绝佳机会。每个社区都推动竞争情报领域的创新,这种创新从学术界渗透到工业界。许多 CI 方法始于学术界,并演变成现实世界的应用。
在谈论 CI 时,我收到的最常见的问题之一是,“每个分支都解决什么问题?”虽然我能理解这个问题,但是这些分支并不是按照它们解决的问题来划分的。
理论的灵感分割树枝。所以,不可能细分成他们的应用。"但是布莱斯,什么是竞争情报理论?"简而言之,每一个理论都是从一个数学表达式开始,然后实现成一个算法(计算机可以做的事情)。就其本身而言,每个分支都值得许多文章。在这篇文章中,我给出了一个高层次的概述和每个分支合作解决问题的例子。当你读到这里的时候,请记住,对于每个分支中包含的方法,除了浅尝辄止是不可能的。我将会写一些关于这些分支的具体实例的更深入的文章,但是我想在高层次上描述每一个分支,这样你就能体会到什么是可能的。****
神经网络
乔希·里默尔在 Unsplash 上的照片
灵感:“使用人脑作为灵感的来源,人工神经网络(NNs)是大规模并行分布式网络,具有从示例中学习和归纳的能力。”[1]
每个 NN 由神经元组成,它们的组织定义了它们的架构。NNs 的宽度和深度决定了它们的架构;这就是“深度学习”的起源——通过深度神经网络。在自然语言处理(NLP)领域,GPT-4 体系结构备受关注。对于计算机视觉(CV),我一直是 GoogleNet 架构的粉丝。没有一种架构适合所有情况,这就是为什么有这么多不同的架构。
神经元是神经网络的组成部分,所以首先要了解神经元。神经元的可视化如下:
单个神经元的例子。我创建的图像:)
计算每个神经元的数学需要两个基本步骤。
- 点积——乘法和加法(圆圈内)
- 预定义的数学函数(“f(y)”)
乘法是简单的;在重量(w)上点上输入值(x)。一旦你有了答案,你就把它输入到数学函数 f(y)中。每一步都是从数据中学习的巧妙技巧。乘法是线性方程,所以只能学习线性关系。大多数时候,数据不是线性的。因此,我们需要给神经网络学习更复杂模式的自由。预定义的非线性函数(激活函数)允许 NN 学习非线性关系。
在之前的图像中,我们观察了单个神经元,但为了创建更深的网络,我们可能会有类似这样的东西。
全连接网络的示例。图片由我:)
每个神经元的结构都变得越来越复杂。我建议调查一下 GPT-4 有多少参数;).现在,您可以想象一下,在无限多的配置中,您可以拥有多少种不同的架构。当然,硬件限制了我们的架构规模,但 NVIDIA(和其他公司)正在以令人印象深刻的速度扩展硬件。
到目前为止,我们只检查了在网络内部发生的具有既定权重的计算。找到合适的权重是一项艰巨的任务,但幸运的是,有数学技巧可以优化它们。如果你对细节感兴趣,我鼓励你去看看反向传播。反向传播利用链式法则(来自微积分)来优化权重。对于这篇文章来说,理解权重是如何学习的并不重要,但是知道反向传播做得很好是必要的。但是,它也不是没有警告。随着神经网络的学习,它们相对于数据优化所有的权重。然而,必须首先定义权重——它们必须有一定的值。这就引出了一个问题,我们从哪里开始?我们通常给权重分配随机值。不幸的是,糟糕的初始化可能导致次优的解决方案。因此,通常的做法依赖于用不同的初始化多次训练神经网络,希望找到最好的。这个问题是使用反向传播的直接结果——找到局部最优解并不意味着我们有最佳解。这一段中有大量的关键词可以去谷歌进行更深入的搜索。
重点是,神经网络是一个数学框架,代表受大脑神经结构启发的复杂功能。神经网络学习许多函数,但最常见的是回归(分类在技术上是回归的一种——想想看)。在以后的文章中,我将更深入地研究复杂的架构及其用例。但是,考虑一个例子,一个网络将葡萄酒分为好坏。葡萄酒的示例特征(输入)是它的甜度、酸度和酒精浓度(有更多可能的输入,但让我们将其限制为三个)。我们也把这个问题限制在单个神经元上。给定足够的好酒和坏酒的数据样本(相对于这些输入),神经网络可以从这些特征中学习将酒分类为好酒或坏酒。
葡萄酒特征输入和输出的例子。背景由阿波罗摄影师
还记得我们的问题是什么吗?随机初始化。幸运的是,进化计算提供了一个解决方案(注意:我正在关注这个问题,以便我可以将所有三个分支联系在一起)。为了更深入地了解 NNs,我推荐这篇文章。
进化计算
灵感:“使用生物进化作为灵感的来源,进化计算(EC)通过生成、评估和修改一群可能的解决方案来解决优化问题。”[1]
遗传算法(GAs)可能是最流行的算法。粒子群优化、蚁群优化、遗传规划(等等)也属于进化计算,但我们将把范围限制到气体。
- 进化过程激发了气体的产生。气体模拟许多代的问题,以找到最佳解决方案。像神经网络一样,遗传算法试图优化一个成本函数,但在遗传算法中,它被称为适应度函数。适应度函数可以灵活地建模,但它们都有相同的组成部分——染色体和基因。每条染色体的组成部分是基因。类似于神经网络,基因是遗传算法优化的权重。该算法的步骤如下,
- 生成 N 条染色体(随机)
- 评估每个染色体的适应度(适应度函数)
- 为下一代选择亲代染色体(选择)
- 从最适合的父代创建子代染色体(交叉)
- 改变基因吗?(突变)
- 从第 2 步开始重复,直到满意为止(收敛)
更深入的解释,请查看这篇文章。遗传算法有能力找到比神经网络更好的解决方案,但这并不保证他们会。其中一个参数可能接近完美解,但它无法识别。不存在完美的优化算法,这就是为什么有这么多。然而,如果使用得当,GAs 可以找到很好的答案。考虑我们之前的葡萄酒例子。我们可以同时使用遗传算法和神经网络。在这种情况下,GA 可以首先识别初始权重集(每个集合将是一个染色体),然后 NN 可以使用反向传播进行优化。没有必要一起使用这些算法(因为我们可以用其中任何一个找到一个好的解决方案),但是我想强调我们如何一起使用这些算法来解决同一个问题。
GA 中整个群体的葡萄酒特征输入和输出示例。背景由阿波罗摄影师
模糊系统
灵感:“使用人类语言作为灵感的来源,模糊系统(FS)对语言的不精确性进行建模,并基于传统逻辑的概括来解决不确定的问题,这使我们能够进行近似推理。”[1]
完全公开——我偏向于模糊系统,所以我会尽量坚持事实。有很多方法可以解释这个话题,但我喜欢从模糊集开始。传统集合论强迫元素属于一个集合或另一个集合。例如,一匹马属于哺乳动物,一只青蛙属于两栖动物。这个框架(又名清晰集合理论)适用于精确分割的情况;然而,世界并没有这么精确。考虑用灰色来表示。什么时候属于白集?什么时候属于黑集?在清晰集合理论中,我们必须决定哪一个。但是,在模糊集理论中,它可以属于两者,隶属度为。隶属函数(或特征函数)计算隶属度。隶属度的大小就是一个元素属于一个集合的多少。下面的例子显示了当我们绘制完整范围的值时,隶属函数可能是什么样子。我们可以看看下面的图,估计原始值 50 的隶属度为 1;但是,随着原始值接近 100,隶属度很快接近 0。
许多不同的函数可以表示隶属函数;我刚刚展示了一个例子。这些函数构成了理论的基础,因为我们开始用它们来描述世界。一旦定义了这些,我们就开始开发更复杂的表示,比如模糊规则。
模糊规则类似于传统的逻辑规则;然而,它们是模糊的。让我们考虑以下关于葡萄酒中酒精含量的规则(我知道这种语言并不完美,但请坚持使用我的语言):
如果是酸性的,那么我们会喜欢它。
利用清晰的逻辑,我们定义了一个阈值。这一界限划定了我们认为是酒精还是非酒精的界限。如果我们在酸度水平为 4 时画这条线,低于 4 的所有东西都变得不是酸性的(包括 3.99)。我们知道这说不通。如果是 3.99 美元,我们可能会喜欢。
进入模糊逻辑。将模糊逻辑应用于这个规则,我们使用一个隶属函数来捕捉“酸性”和我们喜欢它的程度。没有硬门槛,我们能够用更像人类的直觉来解释这种说法。数学输出可能如下所示:
模糊规则的例子。背景由阿波罗摄影师
在这个例子中,我们假设只有一个特征很重要——酸度。但是,随着我们添加其他条件,规则变得复杂,我们必须聚合成员值。例如,如果我们只喜欢甜的、酸的葡萄酒呢?然后,我们必须创建一个规则来模拟两个特性,而不是一个。为了更深入地了解模糊逻辑系统,请查看这篇文章。
结论
AI 无处不在。这个词充斥了我们的生活,已经失去了它的味道。但是,作为一名数据科学家/ ML 工程师/ AI 工程师(无论你如何称呼自己),我们可以让社区达到更高的标准。我们可以对我们的算法进行具体说明,因此展示我们的工作不仅仅是一系列预定义的 if-then 语句。当然,我知道在这个框架之外还有智能算法,但这是一种讨论我们的工作并突出我们方法的独特性的现实方式(如果你正在使用这些的话)。如果你是 CI 的新手,我鼓励你寻找应用程序,扩展理论,并成为 CI 社区的一员(我会第一个欢迎你;) ).
参考资料:【https://cis.ieee.org/about/what-is-ci】
ryce Murray 博士是 Two Story 的一名应用人工智能科学家,他在那里构建算法来实现新兴技术和规模人员分析。他在可解释的人工智能数据融合方面的工作已经发表在 IEEE 计算智能新兴主题汇刊和其他地方。布莱斯的专业领域包括数据融合、深度学习、机器学习和模糊逻辑。他在密苏里大学获得了电子和计算机工程博士学位。
厌倦了气流?试试这个。
一个新的工具,做气流做的,但更好
Daria Nepriakhina 在 Unsplash 上拍摄的照片
当我第一次加入目前的公司时,我的第一个主要项目是决定我们要用于分析的数据堆栈。我研究了摄取、仓储、转换和编排的最佳解决方案。所有其他的都相当简单,但编排部分难倒了我。
当然,如果你有一整个团队致力于气流,气流可能会很棒。然而,对于一个小的创业公司,你有一个工程师负责数据堆栈的所有方面。那个工程师就是我。
我不想花时间去监控和维护一个复杂的气流数据管道,而这并不是我们所需要的。我们想要一种既能完成工作又尽可能少维护的东西。毕竟,我还有其他问题要解决!
就在那时,我发现了一个更新的编排解决方案,叫做提督。
提督的哲学围绕着负面工程的思想,意思是当出现问题时它是有帮助的。它认为自己是一个风险管理工具。您不应该担心它,除非您的管道没有按预期工作,那么它是非常有用的。
什么是提督?
提督认为自己是一个工作流引擎。它帮助您构建、运行和监控您的数据管道。或者,如果您从数据堆栈的角度考虑,它是堆栈中的最后一个工具——编排工具。
完美的管道是使用任务和流用 Python 编写的。如果你知道如何编写一个 Python 函数,你可以很容易地使用 Prefect 构建一个数据管道。
任务是完成一个工作单元的单个作业。在我的数据管道中,这通常是同步 Fivetran 数据或运行 dbt 模型的步骤。
流程是由一堆相互依赖的更小的任务或工作单元组成的功能。在我的例子中,我的数据管道是一个由运行 Fivetran syncs 和 dbt 模型的任务组成的流。
然后,这些流由您选择设置的任何类型的代理进行调度和运行。一些选项包括 local、Docker 或 Kubernetes。代理将获取流量,并根据您制定的时间表运行它们。
为什么提督超过气流?
就我个人而言,我只是认为 Prefect 在用户界面方面更容易使用,也更复杂。是只有我,还是气流难看,只是在讲述你的管道的故事没有那么有用?
作为一个有数据工程背景但没有使用 Airflow 经验的人,我在尝试设置它时感到非常困惑。我想用天文学家来设置它,但即使这样也很复杂。每次我试图启动应用程序时,都有太多的屏幕弹出来,但没有一个给我需要的信息。
更不用说天文学家的支持团队几乎不存在,而 Prefect 有一个松散的社区,你可以在几分钟内得到所有问题的答案。Slack 社区是我最喜欢的关于 dbt 的部分之一,所以这对我来说是一个巨大的加分。
总的来说,设置气流 vs 提督的时间对我来说是一个巨大的因素。作为一家斗志昂扬的初创企业,我希望通过改进我们的数据模型来迅速起步。我不想花几个月的时间让气流工作。提督花了我大约两个星期的时间来得到它的全部工作,从那以后我没有遇到任何问题。
我做出决定的另一个重要因素是用户界面。有了气流,我不得不真正挖掘出为什么会出错的问题的答案。用户界面很难阅读,也没有很好地传达失败/成功。我是说,你自己看看。
图片来自气流文件
这对你来说简单吗?对我来说,不是。我如何知道哪个任务失败了,何时失败的?追溯红色小故障盒并不容易。
图片来自提督文档
现在来看看提督的 UI。您可以很容易地看到较大流程中的每个任务,以及它是成功、失败还是仍在队列中。我可以很容易地扫描它,点击失败的镜头,阅读日志,然后重新运行它。一些需要我几分钟才能完成的事情可能需要我一个小时才能完成。一个小时是宝贵的时间。
结论
如果您正在为您的分析数据堆栈决定一个编排解决方案,我强烈建议考虑 Prefect。虽然每个人的用例不同,但对于希望尽可能少维护的分析工程师来说,Prefect 是完美的自主调度程序。
我简单地设置了一个 Slack webhook,每当任务失败时通知我,这是我唯一需要检查的时候。我知道如果我没有收到失败消息,我的数据是可靠的。这种感觉棒极了!开始一天的工作时,又少了一件需要担心的事情。
让我知道你的想法,如果你有兴趣听到更多关于我如何使用和我如何设置它。文档有时会有点混乱,但对我来说,这比使用气流要简单得多。低维护和可靠性绝对值得设置。
通过订阅我的电子邮件列表,了解更多关于其他流行的现代数据堆栈工具的信息。
厌倦了 JupyterLab?试试 DataSpell——一个全新的数据科学集成开发环境
如果朱皮特拉和皮查姆有了孩子
维多利亚诺·伊斯基耶多在 Unsplash 上的照片
免责声明 :这不是一篇赞助文章。我和 DataSpell 或者它的创造者没有任何关系。本文对 IDE 进行了公正的概述,旨在使数据科学工具能够为更多的人所使用。
数据科学 IDE 市场并没有完全饱和。一方面,Jupyter 提供了最大的交互性,另一方面,PyCharm 提供了专业的环境。你也可以使用文本编辑器,比如 VSCode,但是我觉得这有点烦人。
有一个新的产品上市了— Dataspell —一个专门为数据科学家开发的 IDE。这是一个预览版本,但是你可以在这里注册。我等了几个星期,直到他们发给我链接。希望你的等待时间会短一些。
今天,您将看到这个 IDE 提供了什么。我们将回顾基本介绍,创建您的第一个笔记本,智能代码辅助,数据库支持,降价,等等。
剧透预警:太棒了。
什么是 Dataspell?
Dataspell 是专门为数据科学家打造的 IDE(集成开发环境)。它是由 IntelliJ Idea 和 PyCharm 背后的公司 Jetbrains 开发的,所以不需要进一步介绍。
IDE 还没有正式发布。你必须注册的预览版,然后等着获得下载链接。支持所有主流操作系统平台,包括 ARM(M1)MAC。
下面是 IDE 提供的功能( source ):
- 原生笔记本体验 —如果和 Jupyter 合作过,会有宾至如归的感觉。
- 智能编码辅助 —有点像 Jupyter 和 PyCharm 生了个宝宝。
- Markdown 和 JavaScript —随心所欲地设计笔记本,并嵌入数据可视化。
- 交互外壳 — REPL 控制台+语法检查。
- SQL 数据库支持 —连接数据库、可视化检查数据、导入/导出数据等。
而且这个东西还在积极开发中!
但是废话说够了。让我们看看这个东西是什么样子的:
图片 1 — Dataspell IDE(图片由作者提供)
如果您在 PyCharm 中做过任何事情,它看起来和感觉起来都很熟悉。
综上所述,这东西在纸面上真的很有能力,看起来很神奇。接下来让我们看看如何开始使用笔记本。
创建您的第一个笔记本
这一过程几乎与任何其他 Jetbrains 产品相同。点击根目录,进入新— Jupyter 笔记本:
图 2 —创建 Jupyter 笔记本
我给我的取名为first_notebook.ipynb
。你不必写扩展。
它看起来是这样的:
图 Dataspell 中的 Jupyter 笔记本(图片由作者提供)
风格是个人喜好的事情,但你不能说设计不是一流的。
在创建笔记本时,您可能已经看到了创建 R 脚本和 markdown 文件的选项。一旦 Python 工作顺利,Dataspell 将同时支持 R 和 Julia。
现在让我们探索一下基本的 Python 和数据科学库是如何工作的。下图显示了 Numpy 数组和 Pandas 数据帧:
图 4——Numpy 和熊猫与 Dataspell(图片由作者提供)
果然不出所料。我喜欢 Numpy 数组被打印成熊猫系列的样子,但这只是个人喜好。
【Matplotlib 呢?这里有一个真正简单的散点图:
图 5 —带有 Dataspell 的 Matplotlib(图片由作者提供)
这就是 JupyterLab 和黑暗主题总是困扰我的事情。可视化效果保持白色。明确地说,我更喜欢出版物可视化的白色背景,但在晚上工作时无法忍受它们。干得好,Dataspell。
接下来,让我们探索一个每个 IDE 都必须具备的特性——智能编码辅助。
智能编码辅助
我不喜欢 JupyterLab 的地方是缺少编码辅助。当然,也有插件,但它们的帮助远不及专业的 ide。我不喜欢 ide 的地方是缺乏交互性。希望 Dataspell 能两全其美。
让我们尝试导入 Numpy,看看会发生什么:
图片 6—Dataspell(1)的编码帮助(图片由作者提供)
这是第一点——自动完成——它工作得非常完美。下一位是代码写得不正确时的警告/错误。
这里有一个例子——add_integers
函数应该返回一个整数,但是它故意返回一个浮点数:
图 Dataspell 的编码帮助(2)(图片由作者提供)
像宣传的那样工作!
接下来,让我们来探索 markdown——一种让你的笔记本更容易被人阅读的方法。
降价支持
Dataspell 没有忘记 Markdown。首先,将鼠标悬停在单元格上方,点击添加降价单元格:
图 8 —使用 Dataspell (1)进行降价(图片由作者提供)
另一种方法是点击代码下拉菜单,将单元格类型切换为降价。
这里有一些 Markdown 代码供您尝试:
图 9 —使用 Dataspell (2)进行降价(图片由作者提供)
这是你运行细胞时的样子:
图 10 —使用 Dataspell (3)进行降价(图片由作者提供)
总结一下——大多数事情都像预期的那样工作。然而,我写数学方程有困难,因为它们的工作方式和 JupyterLab 不一样。如果你知道解决方案,请随时发表评论。
最后,让我们探索数据科学的另一个重要功能—数据库。
数据库支持
作为一名数据科学家,您几乎每天都要建立和管理数据库连接。当 SQL 被写成字符串时,调试长的 SQL 行并不容易。Dataspell 有一个解决方案。
以下是如何使用sqlite3
包建立连接、创建数据库和表的方法:
图 Dataspell 的数据库支持(1)(图片由作者提供)
现在,您可以像往常一样插入数据:
图 Dataspell 的数据库支持(2)(图片由作者提供)
Dataspell 的特别之处在于,它可以在不离开 IDE 或编写不必要的查询的情况下探索数据库。只需双击数据库,就会打开一个新的侧窗口。
从那里,您可以轻松地单击任何感兴趣的表,在单独的选项卡中浏览它:
图 Dataspell 的数据库支持(3)(图片由作者提供)
牛逼吧?这个特性在专业版的 PyCharm 中是默认的,所以它可能不会让很多人感到惊讶。
问题依然存在— 你应该使用 Dataspell 吗?这个 IDE 的缺点是什么?继续阅读了解。
判决
Dataspell 是一个即将推出的非常棒的 IDE,适合任何数据科学领域的人。但是它是适合你的工具吗?看情况。
数据科学职位因公司而异。如果你做的更多的是编码而不是数据科学,那么 PyCharm 可能是更好的选择。另一方面,如果你所做的大部分是纯粹的数据科学,那就不要再看 Dataspell 了。
我认为 Dataspell 的唯一缺点是定价。不会,不会是免费产品。您可以期待与 Jetbrains 其他产品类似的报价——€按年计费 89.00 英镑,€按月计费 8.90 英镑。
这又是一份没人要的订阅。我不明白为什么没有一次性购买选项,因为我更喜欢它而不是基于订阅的模式。
你对 Dataspell IDE 有什么想法?它会取代你的 JupyterLab 吗,还是订阅会成为一个障碍?请在下面的评论区告诉我。
以下是一些有用的链接,可以帮助您了解更多关于 Dataspell 的信息:
喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果您使用以下链接,我将收取您的部分会员费,无需您支付额外费用:
https://medium.com/@radecicdario/membership
保持联系
厌倦了关于代码格式的无意义讨论?有一个简单的解决方案
我喜欢我的咖啡,就像我喜欢我的 Python 代码格式化程序——黑色一样。
马特·霍夫曼在 Unsplash 上的照片
您的旅程概述
- 设置舞台
- 你信任的朋友 PEP8 呢?
- 真正重要的是什么
- 黑色——不妥协的代码格式化程序
- 看看使用黑色有多简单!
- 黑色是所有代码质量问题的解决方案吗?
- 包装
搭建舞台
我们都经历过。当你的大学提出代码格式化的时候。小心!你将要进入一个耗费时间的讨论。
事实证明,许多 Python 开发人员对代码格式有强烈的看法。我也是。为了解决代码格式的问题,我想给你以下三个问题的答案:
- pep 8 不是规定了 Python 中的代码格式吗?
- 代码格式化最重要的是什么?
- 如何在项目中快速实现代码格式化?
以上问题将带我们来到Black——不妥协的代码格式化程序。我将向你展示如何在项目中使用黑色可以节省大量的时间。因此,你可以把时间花在实际编写令人敬畏的 Python 代码上😀
如果你不相信我的话,那么 SQLAcademy 的作者对黑色有如下看法:
“在我的整个编程生涯中,我想不出有哪一个工具的引入给了我更大的生产力提升。我现在可以用大约 1%的击键次数进行重构,而这在以前我们无法让代码自行格式化时是不可能的。”— 迈克·拜尔
你信任的朋友 PEP8 呢?
每个 Python 开发者都应该或多或少地熟记pep 8——它是 Python 的官方风格指南。
例如,PEP8 喜欢在变量赋值中等号=
的两边都有空格。所以不要写以下任何内容:
# Ahh! My eyes!
my_variable=5
my_variable =5
my_variable= 5
相反,你应该写:
my_variable = 5
简单吧?PEP8 对对称情有独钟。
然而,PEP8 中的指导方针不足以解决所有的决策。作为一个例子,考虑口袋妖怪的列表:
pokemon = ["Bulbasaur", "Charmander", "Squirtle", "Pikachu"]
上面我写单子pokemon
的方式是 PEP8-approved。然而,以下两种方式也是如此:
# Another acceptible way
pokemon = [
"Bulbasaur", "Charmander",
"Squirtle", "Pikachu"
]# Yet another one
pokemon = [
"Bulbasaur",
"Charmander",
"Squirtle",
"Pikachu"
]
小心!主观性进入了聊天。
事实是,PEP8 允许一些灵活性。正是这种灵活性引发了如此多耗费时间的讨论。
想象一下,向其他开发人员展示上面的代码并询问:
上面的
pokemon
列表中哪一个是最好的?哪一个最 Pythonic?
下图代表了你接下来 30 分钟的生活😅
约翰·施诺布里奇在 Unsplash 上的照片
真正重要的是
归根结底,格式化代码最重要的是一致性。让代码看起来在整个代码库中都是一样的,会让代码更容易阅读。
前面的pokemon
列表的精确格式选择并不那么重要。我提出的所有三个 PEP8 批准的选项都非常可读。重要的是项目中的每个人都坚持相同的格式!
与其在这个选择上引发一场办公室大战,为什么不让第三方来决定呢?这就是黑色进入画面的地方。
黑色——不妥协的代码格式化程序
黑色的官方标志——不妥协的代码格式器
Black 是不折不扣的 Python 代码格式化程序。通过使用它,您同意放弃对手写格式的细节的控制。你将节省时间和精力用于更重要的事情。”—黑色的文档
黑色是一个 Python 模块,眨眼之间就能格式化你的代码。不再有无意义的格式化讨论。黑色让你专注于重要的事情。达斯丁·菲利普斯说得好:
"布莱克固执己见,所以你不必如此。"—达斯丁·菲利普斯
如果你想在承诺之前测试一下黑色,那么你可以在黑色游乐场玩一玩。你也可以查看黑色代码风格来查看黑色代码将在你的代码中强制执行的代码风格。
要开始使用 Black,需要先下载。注意,Black 的默认版本需要 Python 3.6.2 或更高版本。在终端中运行以下命令来安装 Black:
*pip install black*
就是这样!您现在已经安装了 Black👊
有趣的事实:黑人的座右铭是“任何你喜欢的颜色”这是对亨利·福特名言的发挥:
任何顾客都可以把车漆成他想要的任何颜色,只要是黑色的。”—亨利·福特
Black 的座右铭暗示了这样一个事实,即 Black 在其代码格式中不具有兼容性。这也解释了(至少对我来说)为什么 Black 的 logo 看起来像车标。
看看使用黑色有多简单!
由 Kasya Shahovskaya 在 Unsplash 上拍摄的照片
你希望我开始漫谈你需要设置的各种配置吗?再想想!黑色附带电池😃
简单的例子
以下代码片段是错误代码格式的一个示例:
呸!您应该让 Black 来完成这项工作,而不是手动修改格式。如果您在文件bad_code_formatting.py
所在的文件夹中,那么您可以运行命令:
*python -m black bad_code_formatting.py*
通过这样做,布莱克应该给你传达这样的信息:
***All done! ✨ 🍰 ✨
1 file left unchanged.***
可爱。现在bad_code_formatting.py
中的代码如下所示:
文件名bad_code_formatting.py
不再合适:代码已经被自动转换成 PEP8 格式。PEP8 是灵活的,Black 选择了如何格式化代码。你不需要做任何决定!
修改线长度
默认行长为 88 个黑色字符。如果你有一个雇主为你写的行数付钱,那么你总是可以运行这个命令:
*python -m black --line-length=70 bad_code_formatting.py*
文件bad_code_formatting.py
现在看起来如下:
除此之外,没有什么理由去改变 Black 给出的默认行长度。
在文件夹上使用黑色
假设你在一个名为multiple_python_files
的文件夹中有很多 Python 文件。您不需要对每个文件单独运行 Black。相反,您可以使用以下命令对整个文件夹运行 Black:
*python -m black multiple_python_files*
Black 现在已经格式化了文件夹中的所有 Python 文件😍
黑色是所有代码质量问题的解决方案吗?
我希望…但是不行。
认为 Black 将修复所有代码质量问题的想法是错误的。例如,黑色不会给你的变量起描述性的名字。这也不会让写得很差的文档变得更好。布莱克不会将类型的提示引入你的代码库。也不会实施有效的设计原则。
正确格式化糟糕的代码就像给汽车残骸喷漆一样!
当考虑代码质量时,黑色应该只是你工具箱中的一个工具。
包扎
在这篇博文中,我宣传 Black 是一种方便的代码格式化程序。黑色的伟大之处在于它不妥协的本性。不幸的是,没有更多的话要说了:黑色既简单又有用💜
另一种提高代码质量的方法是编写类型提示。类型提示是一个伟大的 Python 特性,许多项目都可以从中受益。如果你是输入提示的新手,那么我已经写了一篇关于这个主题的博文:
*
如果你对数据科学、编程或任何介于两者之间的东西感兴趣,那么请随意在 LinkedIn 上加我,并向✋问好*
Python 中的特征工程和建模
如何预测泰坦尼克号乘客中的生存状态?
马克西米利安·魏斯贝克尔在 Unsplash 上的照片
在本文中,我将介绍如何用 Python 构建模型来预测泰坦尼克号乘客的生存状态。这里使用的方法也可以应用于其他类似的用例。
要了解更多内容,您可以参考上一篇文章,Python 中的探索性数据分析&可视化,阅读更多关于 Python 中的大量数据探索和可视化的内容。
泰坦尼克号的数据可以从 Kaggle 网站下载。
- 处理缺失数据
有 4 个包含缺失数据的预测因子——年龄、票价、客舱和登机。
缺失值计数
年龄
对于年龄中缺失的数据,我们可以(1)用平均值或中值重新填充 n/a 值,或者(2)将 n/a 值归类为单独的类别。我选择了第二个选项,因为“不适用”类别可能有预测生存状态的有用信息。
在上一篇文章中分析过
年龄中缺失的数据被归为一类。对于剩余的非缺失值,对它们进行分类的一种方法是手动定义年龄区间的数量和区间大小。
按年龄分类的存活率
在上图中,非缺失年龄值被分为 9 个年龄组。很容易在 categorize _ age 函数中更改 age_bin_size 输入,以测试不同数量的年龄箱,并查看哪一个有意义。这种方法有点武断。我更喜欢用另一种方法来选择年龄区间——使用 K-Means 聚类方法。
对非缺失年龄数据应用 K 均值聚类。
由 k 均值定义的每个年龄层的年龄范围
按年龄段分列的存活率
如输出表所示,与其他年龄组相比,儿童(年龄范围为 0 至 13 岁的 1 号年龄组)的存活率最高。
基于上面的年龄区间和区间大小,我创建了一个名为“年龄区间”的新变量。
按年龄分类的存活率
票价
只有一名乘客没有票价数据。
没有票价数据的乘客
这位乘客有一张三等票。我用三等票的平均票价重新填写了票价数据。
接下来,使用 K-Means 聚类方法创建票价箱。在上一篇文章中,我发现有补票的乘客存活率非常低。所以我把$0 票价编码成一个单独的类别。
按费用箱列出的存活率
船舱
客舱中缺少太多值。我决定放弃这个专栏。
登船
两名乘客没有登机数据,他们都有头等舱机票。
没有登机数据的乘客
我们可以通过 Pclass 检查已装船的中间值。
按装载度量分类
Pclass = 1 中的装载数据的中值为 s。用 s 重新填充缺失的装载数据。
2。工程新特性
旅游团队规模
按票号分组会很有趣。
按旅行规模分列的存活率
注意,除了 5 人以上的旅行组,存活率随着旅行规模的增加而增加。
接下来,使用 SibSp 和 Parch 再次检查行程大小变量是否定义正确。
一起旅行的人数(旅行团体规模)应≥船上兄弟姐妹/配偶人数(SibSp) + 1。这里我们可以看到,对于少数乘客来说,情况并非如此。这表明一些乘客作为一个家庭一起旅行,但他们没有购买相同的机票号码。
根据 SibSp 更新行程大小。
我用同样的方法更新了基于 Parch 的行程尺寸。
旅游团体类型
我创建了一个新变量来指定乘客是独自旅行,还是与家人或朋友一起旅行。
按旅行类型分列的存活率
标题
名称变量中可能有一些信息。我从 Name 中提取了标题,并创建了一个名为“title”的新变量。
按标题划分的乘客人数
将除前 4 名之外的所有其他标题归入“其他”类别。
按职称组分列的存活率
标题组变量可能与性别和年龄高度相关。
3。一键编码
一键编码用于将包含标签值(如男性、女性)的分类变量转换为数值(0 或 1)。
首先,让我们删除建模中不会用到的列。我放弃了 SibSp 和 Parch,因为它们可能与旅行规模高度相关。
df_model 中的示例数据
数据类型
接下来,对具有对象类型的列应用独热编码。
我删除了一些列,以防止数据中的高度相关性。以性别为例,只保留性别为女性就足够了——如果性别为女性= 0,则表明性别为男性。
data_dummies 中的示例数据
4。相关性
我使用了克莱姆的 V 相关性,因为变量要么是名义变量,要么是序数变量。
相关热图
毫不奇怪,旅行类型和旅行规模变量高度相关。我决定放弃旅行类型变量。
5。建模
最后,数据为建模做好了准备!
用于训练和测试数据的数据形状
为选定的模型列表拟合定型数据。使用交叉验证来计算准确度分数。
模型准确度分数
随机森林给出了最高的准确度分数——大约 84%。
使用逻辑回归模型可视化特征系数,以了解模型的工作原理。
逻辑回归模型中的特征系数
预测生存状态的特征系数
至于特征系数,与男性乘客相比,女性乘客更有可能幸存,与其他年龄组相比,儿童更有可能幸存。另一方面,与其他乘客相比,机票等级较低的乘客生还的可能性较小。这验证了从探索性分析中形成的假设。
感谢阅读!欢迎发表评论,让我知道你的想法。
泰坦尼克号生存分析 Tableau 介绍
根据乘客的级别、票价、年龄等,识别指示乘客是否能够幸存的属性。
对于数据科学,学习任何新技术的关键总是在项目中直接实践。为了学习 Tableau,我对泰坦尼克号的存活率进行了分析。完整的项目可以在这里找到,在 Tableau 公共上主持。
数据来源
任何熟悉数据科学和机器学习数据集资源 Kaggle 的人,可能都已经认出了 泰坦尼克号数据集 。该数据集提供了对泰坦尼克号上每位乘客及其生存结果的观察。出于本项目的目的,仅使用了来自训练集的 871 个观察值。最终,船上 2435 名乘客中,只有 38%的人在沉船事故中幸存。这种分析的目的是查明能够表明乘客是否能够幸存的属性,给出他们的等级、性别、票价、年龄、船上兄弟姐妹或配偶的数量、船上父母或子女的数量以及其他因素。
什么是 Tableau?
Tableau 是一个可视化分析平台,允许甚至非技术用户在几分钟内创建交互式的实时可视化。只需几次点击,任何人都可以组合数据源,添加过滤器,并深入到特定的信息。
将数据导入 Tableau
有几十个 Tableau 教程,所以我不打算深入细节。但是我将简要介绍一下,这样我们就可以对这个平台的工作原理有一个大致的了解。
当您在 Tableau 上打开一个新工作簿并加载到您的数据集中时,您将在左侧看到一个窗格,其中包含您的数据的所有列。这被称为数据面板。将卡片拖放到架子中是整个画面的起点。从那里开始,可能性是无限的。接下来,我们来看一个例子。
按阶层分列的存活率
在这里,您可以看到我简单地将类卡拖到列架中,并在训练集中创建了一个总乘客数的聚合,以拖到行架中。从那里,我只是定制了带有生存分类颜色协调的可视化,并将计数和百分比添加到每个条形的部分。
这是我们可以在 Tableau 中实现的可视化类型的一个基本例子。从这里开始,我不会展示我创建每个可视化的方式。我只是在回顾我的发现。从这个图像中,我们可以清楚地看到,大多数遇难者属于第三类。让我们更深入地看看每个阶层的人口统计数据。
班级的性别分类
在此之前,让我们快速浏览一下整个训练集的性别分类。
在三等舱中,大多数乘客是男性。这给了我们一个线索,关于那些幸存或死亡的人可能的性别分类。
然而,我们在这里看不到存活率。为了更多地了解生存课程中的人口统计数据,我们可以看看按性别和年龄划分的存活率。
按性别分列的存活率&年龄
为了使这一形象化,我以 10 年为间隔对年龄进行分类。这让我们对年龄的划分有了更好的理解。如果我们看两列Perished
和Survived
,我们可以清楚地看到大多数遇难者是年轻人。尤其是 20 多岁的年轻男性。此外,大多数幸存者是 30 岁以下的女性。
我仍然对这些人口统计数据的阶层划分很好奇。接下来,让我们翻转这个可视化的轴,并为三个类中的每一个创建列。
死亡人数最多的是哪个阶层?
Tableau 的仪表盘提供的一个很棒的功能是能够在视觉上隔离不同的滤镜。让我们来看看男性的阶层划分。
我们可以清楚地看到,在死去的人当中,大多数是三等兵。这让我们对泰坦尼克号上的社会经济差异有了进一步的了解。
幸存下来的大多数人属于哪个阶层?
对于那些幸存者来说,这个图像显示出大多数幸存者是一年级和二年级的女性。这与那些在先前的视觉化中死去的人正好相反。在死亡的女性中,大多数也属于第三阶级。
最后,我们可以看一看基于船上可能有多少家庭成员的存活率分类。
船上家庭生存
大多数遇难者都没有家人在船上。即使有,也大多只有一两个人。这可能并没有增加他们生存的机会。我们可能只是在看他们是否有能力让其他人加入。最后,我们再来看一下针对这个的班级细分。
遇难者家属在船上
不出所料,大多数没有家人的乘客都在三等舱。这可能是因为他们买不起额外的票。因此,我们并不能真的得出结论,三等孤独的人更容易灭亡。
幸存者的家人在船上
此外,大多数一等舱和二等舱的幸存者也没有家人在船上。所以这些特征对一个人是否能活下来并没有太大的影响。
经验教训
总的来说,一个人的生存机会取决于他们的性别、年龄和阶级。阶级的影响表明了 1912 年间不平衡的社会经济等级。此外,人们在船上的家庭成员数量与他们的生存机会没有直接关系。
这个项目的工作远未结束。你可能已经注意到,我创建的所有可视化都是条形图。我们可以尝试之外的其他可视化类型,以从该数据集中获得其他见解。当然,紧接着的下一步将是检查其他特征,如票价和装载港,以供进一步分析。****
Tableau 的乐趣才刚刚开始,我鼓励每一个有抱负的数据科学家注册免费试用,导入一个数据集并开始试用这个软件。
处理大型数据集:目前的难题
随机梯度下降和数据并行性导论。
随着今天机器学习算法的能力不断增长,不可否认的是,与时间相关的一些东西促成了这一革命性的变化。这是因为随着时间的推移,有更多的数据可供学习算法学习。
这很好。越多越开心。换句话说,拥有大型数据集减少了做出不准确预测的机会,而这些预测可能仅仅基于发现数据中的弱模式。
然而,存储和处理大量数据的想法给这些智能算法的世界带来了挑战。
在今天的文章中,我们将讨论如何做到这一点:
处理大型数据集。
复杂,但可以简单理解。—来源:因陀罗·乌塔马在 Unsplash 上拍摄的照片
涵盖的主题:
- 创意【简介】
1.1 为什么要大数据集?
1.2 问题 - 随机梯度下降
2.1 代价函数更新
2.2 算法
2.3 小批量梯度下降
2.4 收敛
2.5 在线学习 - 贴图减少
3.1 定义
3.2 工作原理
1.介绍:想法
1.1 为什么选择大型数据集?
假设我们拥有的数据是相关的并且质量很好,拥有大量的数据可能是一个好主意。尤其是涉及到高方差问题的时候。
有了更多的数据供算法学习,我们的模型就不太可能仅仅为了在考试中取得好成绩而简单地记住答案。就像学校一样,对于学生来说,通过理解和发现他们学习中的某些模式来真正学习会更有效。这样,他们就能在考试中回答以前从未见过的问题。
打个比方,当算法简单地使用模型精确地将训练数据拟合到看不见的数据上时,它将不再被称为“学习”。*这叫 过拟合 。*
在这种情况下,添加更多的数据可能会非常有帮助。
1.2 问题
关于数据收集的问题超出了本文的范围。
让我们先来看看典型的梯度下降算法如何处理大型数据集——用于最小化成本函数的😗*
也称为“批量梯度下降”。
假设训练集大小为 100,000,000。你需要对一亿多项求和来计算它的导数,所有这些都是在梯度下降的一个步骤中完成的。这样做了之后,你需要为下一次迭代重复整个过程,等等——毕竟这是一个“批量”梯度下降。
这可能计算量大且耗时。
在本文中,我们将通过两个著名的数学解决方案来更有效地计算这些导数,从而更好地处理处理大量数据时出现的问题:
随机梯度下降和地图简化。
2.随机梯度下降
2.1 成本函数更新
与在单次迭代中查看所有训练示例相反,我们希望每个时期只查看一个训练示例。这样迭代的次数就等于批次的次数。
为此,我们将从修改现有的批次梯度下降公式开始。回想一下,成本函数由下式定义:
复制粘贴:Jtrain(θ)= 1/m**mσI= 1(hθ(x(I)–y(I))
其中 m 为训练样本数。为了一次只迭代一个训练示例,我们需要去掉以前允许它在每个时期训练整个训练数据的 m 求和:
复制粘贴:成本* ( θ, ( x ( i ),y(I)= 1/2(hθ(x(I)–y(I)*
通过简单地将成本定义为误差平方的一半,我们能够测量假设在一个训练示例上的准确性。然后,我们可以将该度量应用于原始的 J 列车方程式:
复制粘贴:Jtrain(θ)= 1/mmσI= 1成本* ( θ, ( x ( i ), y ( i ))*
其计算关于该特定训练示例的假设的平均成本。有了这个更新版本的成本函数,我们现在可以研究随机梯度下降是如何工作的。
2.2 算法
在我们开始将成本函数应用到算法中之前,重要的是随机打乱数据集中所有的 m 训练示例,以避免陷入局部最优的危险——毕竟 it 是 【随机】,意思是“随机”。
之后,我们可以修改批量梯度下降规则,如下所示:
复制-粘贴:θj:=θjα(hθ(x(I))-y(I))x(I)j
其中(hθ(x(I)—y(I)x(I)j等价于成本函数 cost ( θ, ( x ()
随机梯度下降算法通过为每个训练示例 i 直接更新 theta θ 参数来工作,而不是在进行梯度下降的下一步之前必须等待整个求和完成。
整个过程可以总结如下:
- 随机打乱训练示例的顺序
- 重复{
for i = 1,…,m{
θj:=θj-α(hθ(x(I)-y**
— 注意:如果训练集的规模足够大,可以找到一个好的假设,那么就没有必要重复重复循环。通常,您会发现对于包含数百万个训练示例的数据集来说,只需经历一次这个过程就足够了。
尽管这个过程可能看起来不像原始梯度下降算法那样准确,特别是考虑到它不会精确地达到全局最小值的事实,它的参数仍然收敛得足够接近,可以被认为是一个相当好的假设。
此外,与批量梯度下降相反,随机梯度下降也有助于加速收敛过程。
这解决了前一节中提到的“计算量大且耗时”的问题。因此,通过实现这种算法,我们能够更好地将学习算法扩展到大型数据集。
2.3 小批量梯度下降
现在,考虑一下:如果有随机初始化的数据点,允许参数在许多不同的方向上,或远或远,避开可能落在局部最小值上的可能性,那就太好了。更不用说有趣的是,整个数据集需要无数的循环,保护自己不被再次感染,停留在局部收缩的最小值上。
但是,值得等待吗?
这就是小批量梯度下降的用武之地。
顾名思义,这种类型的梯度下降在每次梯度更新时只考虑几个训练样本(来自整个批次),作为批次和随机梯度下降之间的权衡。
加入一些小符号,我们将有 b 作为这个小批量梯度下降求和的训练样本的数量。因此,我们可以将原始梯度下降公式修改如下:
复制粘贴:θj:=θjα1/b I+(b-1)∑k = I(hθ(x(k))—y(k))x(k)j
为了更好地理解算法,下面是我们如何应用这个表达式:
比如说 b = 10,m = 1000 的训练例子。
对于 i = 1,11,21,31,41,…,991 {,重复{
复制粘贴:θj:=θjα1/10 I+9∑k = I(hθ(x(k))—y(k))x(k)j
(对于每一个 j = 0,…, n )
}
}
这样,我们可以通过在每个步骤中查看 10 个例子来开始更新我们的参数,而不是一次只查看 1 个或所有例子。
如果我们把它画出来,你可以看到,与随机梯度下降相比,我们最终会有更少的振荡。
来源:https://www . I2 tutorials . com/explain-brief-about-mini-batch-gradient-descent/
此外,它允许在计算梯度项时使用矢量化实现,否则使用随机梯度下降算法将无法有效地实现这一点。换句话说,这有助于在数量为 b 的示例上并行化梯度计算。
简而言之,我们会满足于小批量梯度下降,因为它比随机和批量梯度下降收敛得快得多。
2.4 趋同性:学习率(α)
说到快速收敛,难道没有其他的数学公式来帮助实现这一点吗,比如说,随机梯度下降?随着时间的推移,数学公式也在发展。当然,我们有。
首先,我们先从衔接的思路说起。
通过绘制迭代次数的成本函数,我们可以看到我们的算法是否确实收敛。简单。
然而,这如何应用于在每个随机初始化的数据点之后更新其参数的算法?
假设m= 300000000。在这种情况下,我们将只绘制平均成本,比如说,每 1000 次迭代中的最后 1000 个示例— 这不要与前一千个训练示例混淆。**
这使我们能够获得我们算法的整体性能的近似值,从它是否真的收敛良好来看,特别是在最后 1000 个训练样本上。
接下来,收敛的速度。
如果你回头看看当前的随机梯度下降公式,你会发现术语 α 用于“调整”我们算法的学习速率,或其所谓的“步骤”。通过研究这个术语,我们通常可以改变参数收敛的快慢。
为了更好地优化这一过程,我们尝试了 α 的小值和大值,有一种方法可以逐渐改变它的值,使它最终收敛到全局最小值。
与像大多数梯度下降算法实现那样保持学习速率 α 不变相反,在每次迭代之后逐渐减小 α 可能实际上更好。这可以通过以下方式实现:
复制-粘贴:α =常数 1 /(迭代次数+常数 2)
虽然主要是快速的,但缓慢但肯定的是,该算法很高兴地为达到全局最优铺平了道路。
2.5 在线学习[设置]
回到处理大规模项目的想法,实现梯度下降算法还有一个方面,特别有利于在线相关系统。
问题是,随着越来越多的用户进来说,你的网站,大量的训练数据不断产生,没有必要实际存储所有这些数据供算法学习。
如果你实现了一个在线学习系统。
这是如何工作的?
像任何其他普及的系统一样,我们将从一个我们已经知道的算法开始:随机梯度下降。
该算法只需从每个用户的一个训练示例中学习,而不是扫描固定的训练集,即集中存储的数据集(如前几节所述)。
因此,如果我们修改算法的原始实现,
- (不需要随机洗牌训练例子)
- 重复永远** {
Get ( x , y )每个用户
更新θ使用( x ,y){
θj:=θj-α(hθ(
—变化在 加粗 。删除了固定数据集(x(i),y(i))的符号。
可以看到,在线学习系统仅基于一个训练示例 x 来更新其参数,去除它,并继续前进。
因此,由于其从最新数据集学习的能力,它能够适应用户偏好的新变化。
最后,处理大型数据集的第二项技术:
3.地图缩小
3.1 定义
简单地说,这种方法实现了将给定的数据集分成不同的子集,并让多台机器同时处理每一个子集的思想。然后,结果被送到一个集中的主服务器,并结合起来形成总成本。
换句话说,我们称之为对训练集进行了“并行化”。
3.2 其工作原理
每台机器将只计算数据集的一定数量的训练样本。
因此,我们首先需要将数据集 m 分成不同的子集 n 。比如将训练集分成对应于要使用的系统数量的多个组。
例如,如果 m = 100,000,000,将数据集分成 5 个子集将允许每台计算机对超过 20,000,000 个训练示例进行求和( n ) — ,而不是在每次迭代中对超过 1 亿个示例进行求和。
接下来,给定批量梯度下降公式,
我们可以创建计算成本的临时变量,nσI= 1(hθ(x-y)x—注意,我们不再对 m 个 示例求和,而是对 n 示例求和有了这些临时变量,每个计算机系统可以同时计算数据集的一部分。
最后,所有这些从变量将由它们的主编译,添加回原始公式。因此,允许算法计算整体偏导数并更新其θ参数。
通过这种方式,我们不仅可以将它们扩展到大型数据集,还可以将算法的速度提高到 n 倍(给定 n 个系统)。但是,这不适用于网络延迟过高的情况。相反,使用多个处理核心在单个计算机上执行并行性实际上可以抵消这个问题,因为与前一种实现方式相比,所有通信工作都是在单个机器上完成的。
这一切都由所谓的 数据并行 实现。
正如吴恩达在 CourseraCoursera上的机器学习课程中所解释的,这是关于处理大型数据集的,同时使用了随机梯度下降和 Map Reduce。
再见。
使用 Python 处理日常任务
从 Scopus 数据库检索元数据的示例
应用一般的编程和分析可以帮助我们解决日常生活中的许多问题,但这仍然是一项被低估的技能。
摄影:迈克尔·康斯坦丁 P 在 Unsplash
出于我们都熟悉的几个原因,编程语言知识已经成为许多数据科学相关任务的基本要求。然而,我发现许多人仍然认为编码/编程/数据分析是一个神秘的领域,最好留给专家去解决。虽然我们需要专家来开发复杂的人工智能算法,但同样重要的是,我们必须专注于应用发现的知识来解决个人或社会问题。
回顾现有的研究是任何研究工作的基本步骤。年前开始读博的时候,我一点编程知识都没有。于是,我不仅在网上搜索了使用相关关键词的重要研究文章,还手动下载或解析了数据文件(pdf/excel)。这个过程既乏味又耗时,我希望我当时就知道 Python。我花了几个月的时间来搜索所有的文章并获取数据,这是一个编程脚本现在可以在几分钟内完成的任务。
这篇博客展示了如何使用常见的 Python 技巧从 Scopus 收集研究文章的元数据,Scopus 是研究学者中最受欢迎的数据库之一,用于搜索某个专业的已发表研究[1]。研究人员经常使用这些信息来进行文献计量,以报告其利基领域的研究状态。
问题是
假设我们想要搜索所有使用 Python 进行数据分析或机器学习的研究文章,并且这些文章是在过去 30 年中发表的。例如,我们想知道学习 Python 进行机器学习是否值得,以及哪些国家/地区在领导这项研究。
存储数据
有几种方法可以存储收集到的信息。在只有少量迭代和小数据集的情况下,将所有信息保存在内存中直到循环完成。然而,在脚本运行时将所有数据保存在 Jupyter notebook 的内存中有一个很大的缺点。每当脚本遇到任何错误,您可能会丢失进度,并将不得不重新开始工作。因此,我建议将每次迭代后的细节保存到 SQL 数据库中,以确保在出现任何错误的情况下不会重复工作(我使用了 sqlite3 包)。
个案研究
根据 Scopus 网站[2],我为 request 制定了如下所述的适当查询(请注意,您需要注册才能获得 API)。该脚本只显示了重要的步骤,而不是整个代码。
base_url = '[http://api.elsevier.com/content/search/scopus?'](http://api.elsevier.com/content/search/scopus?')# search in title, abstract, and key
scope = 'TITLE-ABS-KEY'# formulating the query structure
terms1 = '({python})'
terms2 = '({machine learning} OR {big data} OR {artificial intelligence})'
terms = '({} AND {})'.format(terms1, terms2)# insert your personal key (it is free and available on [https://dev.elsevier.com/)](https://dev.elsevier.com/)apiKey = '&apiKey=INSERT YOUR KEY'
date = '&date=1990-2020'# it is the maximum number of results per query for a free account
count = '&count=25'
sort = '&sort=citedby-count'
view = '&view=standard'
搜索参数包括所有主题代码,以检查所有可能在我们感兴趣的主题上发表了一些文章的字段。代码遍历所有主题区域,并相应地定制查询。对于每个查询,免费版每页只显示 25 个结果,这意味着如果一个查询返回超过 25 个搜索结果。因此,我在主循环中使用了另一个循环来逐步收集同一主题的后续页面的结果。该练习返回了 2524 个已发表的研究(包括研究文章、会议记录等)。),其中 25%是开放存取文章。在实践中,这些论文中的许多可能不包含与我们相关的信息,因此,需要人工干预来进一步过滤掉不相关的信息。虽然这是标准的研究过程,我们可以考虑目前任务的所有初步调查结果。下面的代码块是遍历所有主题的主循环:
# this function sends a request and returns the total articles, the #starting position of the first article, and the metadata of each #article.def search_scopus(url):
res = requests.get(url)
if res.status_code ==200:
content = json.loads(res.content)['search-results']
total = content['opensearch:totalResults']
start = content['opensearch:startIndex']
metadata = content['entry']
return int(total), int(start), metadata
else:
error = json.loads(res.content)['service-error']['status']
print(res.status_code, error['statusText'])# list of all subjects in Scopus database
subjects = ['AGRI', 'ARTS', 'BIOC', 'BUSI', 'CENG', 'CHEM', 'COMP', 'DECI', 'DENT', 'EART', 'ECON', 'ENER', 'ENGI', 'ENVI', 'HEAL', 'IMMU', 'MATE', 'MATH', 'MEDI', 'NEUR', 'NURS', 'PHAR', 'PHYS', 'PSYC', 'SOCI', 'VETE', 'MULT']for sub in subjects: while True:
# starting index of the results for display
# starting index refers to number position of not pages
start_index = 0
start = '&start={}'.format(start_index)
subj = '&subj={}'.format(sub)
query = 'query=' + scope + terms + date + start + count +
sort + subj + apiKey + view url = base_url + query # total results per subject, starting index of first result in
#each query and data
total, start_index, metadata = search_scopus(url) # save metadata now in SQL (not shown here) # check how many results need to be retrieved
remain = total - start_index - len(metadata) if remain>0:
start_index+=25 # to search next 25 results
else:
break # breaking from while loop
免责声明:在展示结果之前,我想明确指出,这只是一个“自己动手”的学习博客,而不是一篇同行评审的研究文章。因此,调查结果应被解释为指示性的,而非权威性的。
图 1 显示了自 20 世纪 90 年代以来每年发表的研究总数,显示了自 2012 年以来的指数增长趋势,这并不奇怪。因为我们限制了将“python”作为强制词的研究,所以研究工作的数量很少,尽管该领域在过去十年中受到了极大的关注。第二个子图显示了同一时期所有研究的总引用次数和质量(每项研究的引用次数)。虽然研究数量有所增加,但总引用量和出版物质量并没有明显的趋势。低质量的原因之一可能是研究的新近性。随着未来更多研究的进行,最近的论文将会被更多的引用。
图 Scopus 数据库中的年度学术出版物和引文。注意:图表仅显示了与使用 Python 的数据科学相关的文章的摘要、标题或关键词,还应该提到的是,结果对选择的数据库很敏感,因为不是所有的研究都由不同的研究目录统一表示[1]。
各国的记录如图 2 所示。正如预期的那样,美国在累积研究产出方面领先,印度似乎超过了所有人,在年度出版物中占据了首位。中国不是最大的生产国,这是违反直觉的,也许是因为许多中国出版物被列入 Scopus 数据库。
根据 Scopus 数据库,基于第一作者隶属关系的学术出版物。注:仅显示排名前十的国家;该图仅显示了在摘要、标题或关键词中使用 Python 的与数据科学相关的文章;免费帐户只返回第一作者的名字,所以我假设 Scopus 显示第一作者的从属关系。
尽管印度和中国在论文数量上明显领先于世界研究中心,但在研究质量上却没有明显的这种模式。图 3 显示了前十个国家在总出版物方面的研究质量。前十篇高被引论文被视为异常值,被排除在外。
根据 Scopus 数据库,基于第一作者隶属关系的学术出版物。注意:该图仅显示了在摘要、标题或关键词中使用 Python 的与数据科学相关的文章;免费帐户只返回第一作者的名字,所以我假设 Scopus 显示第一作者的从属关系。
图 4 描述了研究生产率的城市级图形分布。印度和中国的城市占据了报纸的相当大一部分,钦奈是第一大城市,其次是北京。
根据 Scopus 数据库,基于第一作者隶属关系的学术出版物。注:只显示前十名城市;该图仅显示了在摘要、标题或关键词中使用 Python 的与数据科学相关的文章;免费帐户只返回第一作者的名字,所以我假设 Scopus 显示第一作者的从属关系。
图 5 是一个有趣的图表,显示了该领域中发表的前十篇最受欢迎的论文。许多声誉很高的论文介绍了 Python 包或机器学习算法。Scikit-learn 论文是迄今为止发表的最受欢迎的论文,其次是提出卷积学习的论文。
Scopus 中被引用最多的十种出版物。注意:该图仅显示了在摘要、标题或关键词中使用 Python 的与数据科学相关的文章。Scopus 引文基本上不同于你在谷歌学术[1]上看到的。
出版物的主题分布非常不均衡。可以理解的是,计算机科学领域占了研究的绝大部分(> 75%),其次是工程和生物化学领域(见图 6)。此外,大多数文章仍然是付费的,只有 30%的文章属于开放获取类,不需要读者订阅或支付信息(见图 7)。
根据 Scopus 数据库,基于第一作者的隶属关系,按主题对出版物进行分类。注意:仅显示排名前五的主题,以及在摘要、标题或关键词中使用 Python 的与数据科学相关的文章。
图 7 每个 Scopus 数据库的开放存取文章数量。注意:在摘要、标题或关键词中只显示与使用 Python 的数据科学相关的文章。
结论
近年来,Python 及其在机器学习中的应用在全球范围内呈指数级增长,没有一个国家在该领域占据主导地位。美国附属研究人员的贡献最大,但印度和中国正在迅速赶上,如果不是在质量上,至少在数量上。
这篇博客文章还表明,编码的基本知识可能足以解决我们日常大学或工作生活中的许多问题。虽然大部分数据科学讨论继续关注管理和“拟合”大规模数据集的复杂而有吸引力的领域,但编程和机器学习知识的应用不一定仅限于解决复杂的问题。我们还必须不断探索如何部署这些简单、直接的编程技能来解决我们日常生活中遇到的“微观”问题。
我相信,对于在这个领域工作的大多数人来说,数据科学和编程知识的优势不在于知道所有的事情,而在于应用你所知道的一切来解决你所热衷的领域的问题。“足够好”的知识可能没有直接的商业价值,但定期应用这些基本技能最终会让你长期受益,也会给你带来巨大的个人满足感。
参考文献
[1] A. Martín-Martín、E. Orduna-Malea、M. Thelwall 和 E. Delgado López-Cózar,“谷歌学术、科学网和 Scopus:252 个学科类别中引文的系统比较”, J. Informetr。,第 12 卷第 4 期,第 1160–1177 页,2018 年。
[2]爱思唯尔,“Scopus 搜索 API”,2020 年。【在线】。可用:https://dev . Elsevier . com/documentation/scopussearch API . wadl .【访问时间:2021 年 1 月 28 日】。
为了实现负责任的人工智能,消除“可信度差距”
在 2019 年和 2020 年,我们对人工智能伦理领域的兴趣不断涌现,这导致许多人分享了见解、最佳实践、技巧和诀窍等。可以帮助我们实现负责任的人工智能。
但是,当我们走向 2021 年时,似乎在人工智能伦理如何操作化方面仍然存在巨大差距。其中一部分源于我所说的可信度差距,在我们实现广泛采用这些实践的目标之前,需要弥合这一差距,从而真正创造积极的变化。
该领域的碎片化以及人工智能的广泛影响意味着我们经常在我们对其来龙去脉知之甚少的领域和领域中挣扎。
通常由于业务和其他考虑因素,时间限制迫使我们使用有时有缺陷的试探法(如快速浏览证书)来寻找专业知识,以选择谁加入对话来弥合我们的知识差距,这进一步加剧了这种情况。
但是,这带来了几个问题,特别是当我们没有考虑到人的可信度,因此遇到了导致负责任的人工智能领域发生表面变化的问题,或者更糟糕的是,由于不明智的想法而造成的伤害。
可信度的概念对于在 2021 年成功实现负责任的人工智能系统至关重要。
让我们深入了解这些想法的细节吧!
你说可信是什么意思?
雷伊·达里奥在他的书 原则 中阐述了对于一个人来说,可信意味着什么的关键概念。这是对可信度这一基本概念的一种强化。它基本上要求我们也考虑来自个人经历的经验证据,这样我们就可以对来自某个特定领域的人的想法和建议赋予正确的权重。
这并不是对一个人的能力进行全面的评价:我们只是通过查看他们在某个领域的记录来考虑他们在该领域的想法,这样我们就可以更好地了解我们应该如何评估他们的想法并将其纳入我们的决策中。
这让人想起内特·西尔弗在他的书《信号与噪音》https://g.co/kgs/EZddZF中提出的一些观点,他在书中指出,我们并没有真正关注那些做出预测的人的记录;我们依赖他们的凭证,相信他们的话,但从不回头检查他们所说的事情是否真的实现了(当然,除非他们在某些事情上是对的,但大多忽略了他们不正确的地方)。这导致了一个生态系统,在这个系统中,我们继续高度重视人们的评论,而忽略了那些对自己的工作不太大声和公开,但却非常正确的人。
因此,当谈到人工智能伦理时,我认为在评估可信度时考虑以下因素是非常重要的,作为一种“验证”人们的跟踪记录的方式,以给他们的想法和见解分配适当的权重:
- 活生生的经历,
- 多学科背景,以及
- 关注工作的主体,而不仅仅是证书
在深入研究每一点之前,这个达到可信度的“验证过程”必须通过承认和认识自己的偏见来完成,并且对你正在评估的所有信息保持批判性的关注,这样你才能获得良好的可信度分数。
1.亲身经历
我们感同身受和想象他人经历的能力是一种强大的能力。然而,它有其局限性。当谈到解决人工智能中一些伦理挑战的分娩解决方案时,依靠有生活经验的人的洞察力将是必不可少的。
即使我们有良好的意图,并正在开发社会技术解决方案来应对挑战,但如果没有来自生活经验的正确的文化和背景洞察力,我们可能会产生弊大于利的风险。
我们经常在那些渴望帮助“解决”人工智能伦理领域问题的人们身上看到这种情况。不适当考虑问题的根源及其根深蒂固的社会技术背景是有风险的。社区如何受到影响以及他们可能拥有的见解也应纳入解决方案框架流程。
2.多学科背景
是的,这有时会很难,但优先考虑有机会在多个领域工作的人会给你更好的见解,因为(希望)那个人有能力将不同领域的方法和工作方式结合在一起。最好是那些跨越人文科学和技术科学背景的人会给你一个足够好的组合,让你对他们的想法给予足够的重视。
根据我的经验,如果我们足够努力地寻找,我们一定会找到有这种经历的人——令人担忧的是,在实际着手进入世界并寻找这些人的艰难任务时存在惯性。
有许多由组织维护的列表和目录有助于暴露这些个人,但它们往往很快就会过时,并且还会加剧问题,有时会在这些列表如何编制方面具有排他性。批判性地思考和审视谁是列表编辑的幕后推手,也能帮助你做出更明智的决定,帮助你实现目标。
这很重要的原因之一是,我们今天在人工智能伦理领域面临的一些挑战与其他领域类似,学者、活动家和从业者已经建立了一个解决这些挑战的工作机构。如果我们对这些土地不熟悉的话,很难找到这些地方,有人给我们带路是非常有用的。
3.关注工作的主体,而不仅仅是证书
当谈到人工智能伦理时,我所进行的一些最有见地的对话来自于社区中其他人不会“判断”他们有“正确”或“值得”的资格。(即使写下这句话,我也觉得很糟糕,但不幸的是,在某些时候,我们可能会遇到这种情绪。)
目前在这一领域过分强调拥有能够参与讨论和分享见解的傲慢的资格,这损害了整体讨论。
事实上,蒙特利尔人工智能伦理研究所的起源来自类似的认识:我们发现有很多人没有一个聚集的地方,他们可以以尊重和欢迎他们的专业知识和经验的方式谈论这些话题。
许多有价值的见解将来自“意想不到”的地方,我的经验法则是浏览这个人所做的工作,而不是太关注他们的证书来评估我可以分配给他们的可信度。
我确实遇到过这样的情况,那些拥有傲慢证书的人似乎无法兑现他们的证书所承诺的东西,而其他没有这些证书的人则让我走上了一条从研究和实践角度都产生了有趣发展的道路。
让我们帮助生态系统变得更加可信!
希望其中的一些观点能引起你的共鸣,你会明白我为什么强调这种可信度的想法以及与之相关的元素:
- 活生生的经历,
- 多学科背景,以及
- 关注工作的主体,而不仅仅是证书。
可信度是一个持续的过程,我们必须不断更新我们的信念,这样我们才能在充分知情的情况下做出决策。
我们的目标不仅是倾听有好想法的人的意见,而且要让他们有能力进入权力和决策的位置,这样这些想法才能公之于众。
在蒙特娄人工智能伦理研究所,通过我们的公共咨询研讨会和学习社区,我们正在帮助迈出第一步,将有伟大想法的人聚集在一起,并提供一个平台,通过这个平台,我们可以在人工智能的伦理、安全和包容性发展的技术和政策措施决策中强调他们的声音。
我希望你们能和我一起进一步讨论这些想法,并与在这一领域为带来积极变化而不懈努力的其他人分享这一信息。
****你可以在这里了解更多我的作品:https://ATG-abhishek . github . io
致所有数据科学家—不要生活在边缘,要有计划
TLDR;数据科学家通常对项目有偏见,需要更多地关注大局。这是晋升到高级职位和在组织中发挥影响力的一大障碍。这篇文章是关于为什么思考拥有一个可靠的计划是重要的。
我最近写了一篇关于“作为一名高级数据科学家需要的三项技能”的文章。它在读者中引起了巨大的反响(10K 在大约 3 天内的观点)。这促使我分享数据科学家的另一个鲜为人知的教训(或有时众所周知但被回避的教训)。
这些不仅仅是数据科学特有的,对于软件项目也是有价值的。有了正确的上下文,任何精明的技术团队都可以从中受益。另一件要注意的事情是,我画的大多数例子都与企业分析团队有关,因为这是我花了大部分时间的地方。最后,这些发现大多来自我自己的经验,我没有正式的项目管理背景。所以如果你找到了更好的方法来处理我在文章中提出的一些问题,请分享出来!以便其他人可以向他们学习。
我在这里分享的观点和倾向是我自己的,并不代表我现在或以前的公司。但是,我要感谢我在澳大利亚 QBE 保险公司的经理们,感谢他们给了我指导和帮助。
数据科学家是糟糕的规划者
好吧!先说最简单的;计划冲刺。冷酷的事实是,数据科学家甚至懒得合理地计划他们的一天,更不用说冲刺了(我真的很抱歉在那里对抗更有组织性更少混乱的数据科学家——我知道你的存在!).日复一日,我看到漫画书,推特上到处都是描述开发者有多讨厌规划/JIRA 等等。每个笑话背后都是苦涩的真相!
但这不是玩笑!如果你的团队不擅长计划,让项目随波逐流,它不会有好结果。如果你还是逃脱了,很可能是因为别人为你做了计划。如果你真的确定没有人真的做了那么多淘洗,但还是成功了…那就不会有第二次了!
遥远的王国…
这是科学家们认为他们的项目是如何工作的。
剧透警报!它从来没有这样工作过(图片来自作者)
话不多说,我给你讲个故事。
我个人经历中的辛酸
为了强调这一点,我将利用我个人的经验。几年前,我在从事一个激动人心的 ML 项目。我真的为此感到自豪,每次我的同事问起我的项目,我都会热情洋溢地一个接一个地解释我所做的事情。
你和同事的咖啡聊天(图片由作者提供)
几天后,我的经理参加了一个 sprint 规划会议,只是为了快速检查一下。天啊,天啊,这一瞬间变成了我最难忘的会议之一。我自信地解释了我们已经做了什么,以及我们计划完成什么。我的经理插话问道:“我们最终要实现什么?”。除了用随机的胡言乱语和结结巴巴来填补那个尴尬的时刻,我无法想出一个好的答案。
灯泡时刻
这是我顿悟的时候。以下是从那个启发性的时刻提取的一些想法!
我和我的经理从完全相反的角度看待这个项目。不一定是经理,也可以是产品所有者或最终客户。事实是这样的。
到底发生了什么(图片由作者提供)
为什么你的项目会误入歧途?
是的,计划是关于在你和利益相关者的会议中避免尴尬的沉默(背景中蟋蟀的叫声)。但是为什么我们不能从 A 到 B 一个接一个地冲刺呢?从个人经验来看,这里有一大堆理由!
- 范围蔓延 —利益相关者说,“我喜欢你在特性 X 上所做的工作,你能为 A、B、C 也做同样的工作吗”。没有进一步的思考或咨询,你同意工作。当你意识到你没有时间去开发你计划交付的核心特性时,已经太晚了。
- 技术债务——你在自己的盘子上撒了一点太多的自信,你承诺了一项任务(例如,你的模型的一个新功能,更多的训练数据),这确实应该在待办事项中。
- 缺乏沟通——我看到开发人员说“如果我按时交付工作,为什么我需要参加会议”。我不想打破它,但是,事情变了。你在项目开始时认为重要的“工作”现在可能不是优先事项了。你是团队的一员,还有其他人依赖于你的工作,你有责任分享你的更新。
- 外部因素 —你的组织偏好会改变。您的公司可能会修改目标,或者您的利益相关者可能会认为一项新技术需要作为一项功能来整合,等等。
这里我将讨论两个教训。一个解决如何避免前三个原因。第二个解决的是后者。
一个好的计划的第一课:有一个一致的反馈回路
利益相关者带来的最有价值的东西是全新的视角。
利益相关者不关心你如何到达那里,而是你要去哪里
为了避免不得不放弃产品特性的代价高昂的错误,或者更糟糕的是,整个项目,你需要善于计划。
冲刺复习拯救世界
我不能强调在项目的生命周期中有一个反馈循环的重要性。幸运的是,如果你遵循像 scrum 框架这样的敏捷工作流,你不必担心。这就是冲刺复习的目的。scrum.org 将冲刺评审描述为一个会议,
Scrum 团队和利益相关者回顾在 Sprint 中完成了什么,他们的环境中发生了什么变化,并就下一步做什么进行合作
框架中明确包含 sprint 评审是有原因的。如果你没有这个反馈环,你最终会得到一个没有人欣赏的项目。
冲刺计划/回顾和评审的典型流程。计划发生在冲刺阶段的开始,回顾/评审发生在最后。(图片由作者提供)
不被重视的冲刺评审
我已经看到一些团队用诸如“我们这周没什么可展示的,所以让我们跳过”这样的借口来贬低 sprint 回顾的价值。那是第一个红头文件!如果两周的努力后你没有任何表现,那就令人担忧了。这是发生的几个原因,
- 你正在大胆地假设你所做的工作是“毫无疑问”会被涉众接受的
- 您低估了所需的工作量,因此您认为需要 1 个 sprint 的工作实际上需要 2 个
- 真的,你没什么可展示的。例如,你可能在 sprint 中专注于改进机器学习模型。在这种情况下,在模型被训练和评估之前,没有什么可以展示的。
这里重要的是知道你为什么跳过 sprint 回顾!这与我的文章中的“批判性思维”技能有关:“作为一名高级数据科学家你需要的三项技能”。
规划不是产品负责人说了算吗?
是也不是…
——角色定义越往上越模糊
是的,你可以这么说。但是当你往上爬时,你会发现这些角色的定义变得模糊不清。一个角色的责任和义务渗透到另一个角色。因此,有时候你必须身兼数职,比如开发人员、产品所有者等等。这样,规划就变成了一种协作努力。例如,产品负责人可能做 60%,而作为高级/首席开发人员的您将做 40%的计划。
-对机器学习产品所需的努力了解较少
另一个使职责分离变得困难的事实是,与软件开发相比,机器学习是一个定义较少的领域。例如,你会对一个功能的可行性充满信心,你点击一个按钮,它就会导出一个 PDF。但是如果有人说“这里有一些数据,让我做一个 ML 模型”,你会更加怀疑。
-数据科学家在 sprint 评审中的角色
更糟糕的是,有时会有产品负责人(几乎没有 ML 背景)认为为一些任意数据开发 ML 模型是一个定义良好的任务。然后由你(数据科学家)来干预 sprint 评审,解释为什么不是这样。
-交流是会传染的
在 sprint 评审中鼓励这种双向交流还有另外一个好处。它迫使数据科学家掸去他们内向心态的灰尘,积极参与这些会议,以在会议结束时获得更现实的丰硕成果。然后他们会展示同样的技能,让他们在做什么的时候更加透明。
在这里,您可以看到,在 sprint 评审中拥有一个可靠的反馈循环和技术成员的参与如何有助于避免范围蔓延、对技术债务的不合时宜的承诺和懒散(是的,这是一个词)的数据科学家。
下一点不是引入新的视角,而是改变你自己的视角。
第二课:依靠分层思维发展
图片由来自 Pixabay 的 Marco Costanzi 拍摄
像洋葱一样…
引用我最喜欢的童年电影《怪物史莱克》中的一句话,
洋葱有层次。食人魔有层次。洋葱有层次。明白了吗?我们都有层次。
为什么我要引用一部与现实相去甚远的电影?因为要担任高级职位,你需要将你的思维转移到复杂的技术之外。你也必须开始关注大局。正如你将看到的,也没有一个更大的画面。因此,这需要一个分层的视野…就像洋葱一样。
一个组织中有许多不同的目标
这里有一个图,描述了当你在做一个项目时存在的不同目标。请记住,它们都可以塑造你需要导航的路径。
目标在不同的层面上起作用,你跨越的越多,你的工作就越有影响力
战术目标与战略目标
以上这些目标属于其中一类。战略目标将是长期(1 年以上)目标,而战术目标将是短期目标,以帮助你实现这些战略目标。
为什么分层思考很重要?
现在让我们来看看为什么接受这种思维方式很重要。
-向 MVP 心态问好
当开发数据科学产品时,你从 MVP 开始;最低可行的产品。然后,在从 MVP 到成熟产品的过程中,了解不同层次的目标,你会感激做最起码的事情来将产品提供给利益相关者。现在,我不是指交付一个带有自毁按钮的部分功能的仪表板。我的意思是只开发必要的功能。
-假设以下场景
企业向咨询公司支付大笔费用来制定长期目标,并定期修改(例如每年一次)。假设你在保险公司 X,X 设定了一个崇高的目标,在他们所有的理赔业务中采用机器学习。一年后,该公司意识到,即使有了一些 ML 解决方案,理赔人员的效率也没有提高。
深入研究后,他们意识到,他们仍然使用 excel 和 word 文件在许多相关的不同方之间共享数据。有了仪表板和数据库,这些流程可以标准化,并拥有单一数据源。现在,战略目标从 ML 下降到“使所有理赔业务现代化”。
-这不太好
你认为你一直在做的那个很酷的 ML 项目会发生什么?资金将会消失,你和你的团队将很快被安排到其他事情上。现在,如果你是一个有多层次理解的人,这里是你应该如何处理它。
- 首先,你应该很早就预料到这一点(是的,那些你通过多重任务处理的市政厅会议是很重要的),并在事情变成这样时制定应急计划。
- 其次,你从项目 A 的退出会顺利得多——你有几个冲刺来完成事情。您将创建一个简单端到端的解决方案(可能会取消您承诺的高级 ML 模型,并恢复到一组业务规则——当然,直到您可以回到这个用例)。因为你只做了需要做的最少的事情,所以与承担太多事情却无法完成相比,你需要弥补的差距和漏洞就不那么严重了。
我们如何将分层思想融入冲刺规划
首先要意识到的是,那些超越了你的春天的目标,并不是到了提出新目标的时候再去重温的。他们应该是引导你的项目的积极力量。因此,在制定冲刺计划的过程中考虑它们是很重要的。你怎么能这样做?
-冲刺规划应该是什么样的?
我不确定最好的方法是什么,但是,在计划的时候,我会遵循下面的方法。
- 思考冲刺目标(5 分钟)
- 思考——冲刺目标与我们 3 个月后的目标一致吗(5 分钟)
- 思考——冲刺目标与我们的年度团队目标/战略愿景一致吗(5 分钟)
- 根据需要修改冲刺目标
- 将冲刺目标分解成任务和子任务
- 将它们分配给成员并估计工作量
所以每两周只需要 15 分钟,但是会有很大的不同。其他人在你的冲刺计划中采用这种想法,你可以有不同类型的计划会议。举个例子,
- 冲刺规划(每两周一次)
- 扩展冲刺规划(每 3 个月一次)
- 战略会议(6 个月)
重申一下,根据我的经验,这是我发现行之有效的方法。但是如果有更好的方法,请随意使用。
结论
这就是我要说的。总之,这里是主要的收获。
- 冲刺计划不仅仅是让你有效地从 A 点到达 B 点。
- 不要扔掉 sprint 的评论。不断与利益相关方分享更新,并让数据科学家参与这些讨论。
- 采用分层思维。在计划冲刺时,分配几分钟时间来思考冲刺目标与全局的一致性。
如果你喜欢我分享的关于数据科学和机器学习的故事,考虑成为会员吧!
https://thushv89.medium.com/membership
敬。适用或不适用。应用
在这篇文章中,我们将向你展示如何将你的熊猫代码的日期相关计算速度提高 10,000 倍以上!
这篇文章是与 山姆·穆拉德 合作的
熊猫烂透了
如果没有正确使用
这是一百万美元
比宾利还值钱
介绍
我们不是在谈论这些熊猫(可爱),而是 python 库我们所有的数据科学家每天都在使用它来做任何与数据相关的事情。
来自不同背景的新用户对熊猫很熟悉。
如果你是一个 Excel 用户,在 pandas 中可以通过调用DataFrame.sum
或DataFrame.cumsum
方法来完成操作,比如计算一个数组中所有列的总和或累计总和。
import pandas as pd
df = pd.DataFrame({"a": [1,2,3], "b": [4,5,6]})
print(df.sum())
print(df.cumsum())
如果你是 SQL 用户,像 select 或 join 语句这样的操作可以通过调用DataFrame.query
或DataFrame.merge
方法来完成。
import pandas as pd
df = pd.DataFrame({"a": [1,2,3], "b": [4,5,6]})
bf = pd.DataFrame({"a": [6,5,4], "b": [3,2,1]})
print(df.query("a == 1"))
print(df.merge(bf, how="inner", left_on='a', right_on='b'))
如果您是 R、Stata、SAS、SPSS 或其他统计语言的用户,可以通过调用DataFrame.corr
、DataFrame.std
或DataFrame.ewm
方法来完成寻找相关性、标准差甚至指数加权函数等操作。
import pandas as pd
df = pd.DataFrame({"a": [1,2,3], "b": [4,5,6]})
print(df.ewm(com=0.8))
最后但同样重要的是,矩阵乘法可以通过使用[DataFrame.dot](<http://DataFrame.dot>)
方法来完成。
import pandas as pd
df = pd.DataFrame({"a": [1,2], "b": [3,4]})
bf = pd.DataFrame({"a": [5,6], "b": [7,8]})
print(df.dot(bf.T))
或者真的任何一个 NumPy 的通用函数又名 ufunc 都可以被熊猫用来尽可能多地利用矢量化运算。
尽管你运气很好,什么事都想用熊猫。
例如日期-时间操作
一个常见的操作是计算两个日期之间的间隔,比如说以年为单位。首先,让我们创建一个简单的函数和一些全局变量:
import pandas as pd
from datetime import date, timedeltadef calc_age_function(start_date: date, end_date: date):
"""Calculate difference between 2 dates in years."""
return (end_date - start_date)/timedelta(days=365.25)
现在,让我们定义一些示例日期,并计算它们之间的年龄:
[In]:
start = date(
year=1930,
day=10,
month=5
)
end = date(
year=2020,
day=10,
month=8
)
print(calc_age_function(start, end))[Out]: 90.2532511978097
然而在实践中,很可能你有不止一个日期需要做这个操作。让我们用上面列出的例子数量创建一个系列,用于计时,以及一个DataFrame
:
from datetime import datetime, timedelta
from random import randint, seedimport pandas as pdseed(42)
N_SAMPLES = 1_000_000
start_date_list = [
datetime.fromisoformat("2019-01-01") + timedelta(days=randint(0,365))
for _ in range(N_SAMPLES )
]
end_date_list = [
datetime.fromisoformat("2020-01-01") + timedelta(days=randint(0,365))
for _ in range(N_SAMPLES )
]
start_dates = pd.Series(start_date_list, name="start", dtype="datetime64[ns]")
end_dates = pd.Series(end_date_list, name="end", dtype="datetime64[ns]")age_df = pd.DataFrame(
{
"start_date":start_dates,
"end_date": end_dates
}
)
现在,让我们使用 lambda 函数(非最佳)对数据帧中的列使用我们的函数来计算年龄
%%timeit
# slow, for loop apply
age_df["age"] = age_df.apply(
lambda x: calc_age_function(x["start_date"], x["end_date"]),
axis=1,
)20.6 s ± 63.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
作为一个 python 新手,应用可能是一件容易上手的事情。你需要记住的只是一个 apply 方法以及如何编写一个 python 函数。
这是可行的,尽管对我们来说还不够快。
有了 pandas,我们可以在序列对象上使用算术运算,这比循环要快得多(通常 apply 会这样做,例外情况我们稍后会谈到)。
如果我们通过我们的函数来传递这个序列呢?
%%timeit
# with date series, vectorized
ages = calc_age_function(start_dates, end_dates)10.3 ms ± 104 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
直接在序列上运行计算使这个操作快了 2000 倍!
但是我们能让它更快吗?
在上面的代码片段中,我们使用 pandas 日期-时间操作来获取两个日期之间的天数,并将其除以一个代表一年中天数的timedelta
对象。
如果我们尝试使用整数运算进行相同的计算,将开始和结束日期表示为 epoch 整数,而不是 DateTime 对象,会怎么样?
%%timeit
SECONDS_TO_YEARS = 60*60*24*365.25*1_000_000_000
(end_dates.astype(int) - start_dates.astype(int))/SECONDS_TO_YEARS2.22 ms ± 32.6 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
这是否使我们的计算速度比 apply 快了 10,000 倍?
没错。
压力测试
使用样本大小:100,1000,10000,100000,500000,1000000
作者图片
令人惊讶的是 apply 方法的性能相对于数据大小的线性程度,在上图中显示为 O(n)。此外,它比 datetime64[ns]和 epoch 矢量化计算的规模大得多。我们无法真正比较所有三种计算的性能。让我们在这里放大到 datetime64[ns]和 epoch(矢量化)计算:
作者图片
使用历元的好处确实在 100k 左右的样本中显现,因为 datetime64[ns]性能是 O(log n ),而历元计算几乎是O(1)。
关于用日期时间数据类型进行序列实例化的说明
%%timeit
# format series WITHOUT numpy dates
start_dates = pd.Series([start]*N_SAMPLES, name="start")
end_dates = pd.Series([end]*N_SAMPLES, name="end")1.59 s ± 6.91 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
通过指定 Numpy datetime64:
%%timeit
# format series WITH numpy datetime
start_dates = pd.Series([start]*N_SAMPLES, name="start", dtype="datetime64[ns]")
end_dates = pd.Series([end]*N_SAMPLES, name="end", dtype="datetime64[ns]")1.73 s ± 4.04 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
相差 140 ms,但是如果您要对这些色谱柱进行多次操作,这些成本是非常值得的。
如果你愿意,也可以使用熊猫内置的to_datetime
功能,性能差不多:
%%timeit
# format series WITH pandas datetime
start_dates = pd.to_datetime(pd.Series([start]*N_SAMPLES, name="start"))
end_dates = pd.to_datetime(pd.Series([end]*N_SAMPLES, name="end"))1.76 s ± 4.57 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
结论
- 在 pandas 系列(或数据帧)上运行算术运算利用了 pandas 中可用的矢量化功能,并且比按行应用相同的运算要快得多
- 使用 pandas 本地 dtypes(在本例中是 datetime64[ns])可以使您的操作速度大大加快
- 对纪元日期时间的算术运算比 DateTime 对象开销小
- 对于 1,000,000 个数据点的情况也是如此。增益并不与数据点的数量成线性比例,所以不要期望它们会这样。Travis Oliphant 在与 Lex Friedman 的播客中指出,pandas 矢量化操作的性能增益始于 10,000 点
- 熊猫的收获并不局限于它的表现。数据管道的易用性是使用 pandas 的一个巨大优势。如果性能对于您的生产过程不是非常重要,那么使用任何容量的 pandas 都可以为您节省数天或数周的数据管道开发、分析或操作时间
下一步是什么
敬请期待我们下一篇熊猫的博文。我们将更深入地研究 NumPy 的 ufunc ,并分析 Andrej Karpathy 的关于 NumPy 的 sqrt 函数的臭名昭著的 tweet !
要做伟大的数据科学,拥抱领域知识
作者聚焦
即使细节混乱、不确定、难以自动化,也不会浪费精力
在 Author Spotlight 系列中,TDS 编辑与我们社区的成员谈论他们在数据科学领域的职业道路、他们的写作以及他们的灵感来源。今天,我们很荣幸地邀请到埃利奥特·冈恩https://medium.com/u/aad1101621dd?source=post_page-----167cb83dc050--------------------------------与兰迪·奥进行对话。****
照片由 Randy Au 提供
Randy Au 目前是谷歌的一名定量用户体验研究员,使用数据科学和传统的研究方法来更好地了解用户,并帮助创造更好的产品。在此之前,他花了十多年的时间为纽约地区的各种科技初创公司做数据工作。他每周写一份时事通讯,统计数据,强调数据科学平凡但仍然重要的方面。他目前的兴趣包括用各种 SQL 方言做令人不舒服的事情,以及追求许多奇怪的爱好,例如:烹饪、摄影和宝石切割。
你在数据科学领域有一个独特的职位/工作范围,还有一个非常有趣的教育背景(本科阶段是大陆哲学!).你是如何成为谷歌高级定量 UX 研究员的?
是的,我有一个古怪的背景,主要是因为做了当时看起来有趣的事情。正式来说,我本科学习的是工商管理和哲学,主要是因为我最终出于兴趣选修了这两个专业的大部分课程。教授们都很好,我在两个系都做了大量的本科研究工作。后来,我修读了传播学硕士课程,在那里我学到了社会科学、科学哲学和研究方法。在得知学术出版生活不适合我之后,我去了一家精品室内设计咨询公司,帮助他们做调查分析和 Excel/Powerpoint 自动化。我最终在工作中学会了 SQL,在作为一名数据分析师完全进入技术领域之前,我在一个广告-技术职位的生产实践中学习。
在我职业生涯的大部分时间里,我只是纽约小型科技初创公司的一名“数据分析师”。“数据科学”作为一个术语在那个时期才开始成为一种事物。这些都是小组织,总是<150 people, often <100. Most of the time I was the only data person on the team, tasked with making everyone else smarter and more effective with data. That meant I got to work with literally everyone in the company, top to bottom. It was a hyper-broad experience and I got exposed to lots of viewpoints, problems, and people.
Quant UX research is a pretty obscure job title in industry, with only a few companies officially having the role. I had been looking for work and a friend within Google was helping me search through positions, the usual data science/analyst stuff, and happened to find this for me. It fit all the product work I had been doing for years so perfectly, I applied, and, to my surprise, got hired. If you have a data science and research skill set, but find yourself always drawn to learning about users, QuantUXR might be for you.
什么是你最喜欢的项目,或者你特别自豪的项目?
可能我接手的最重要的项目甚至没有被正式称为工作“项目”——它是与以前从未有过定量研究支持的团队和人员一起工作,并与他们一起工作,直到他们真正理解使用数据来构建。与他们合作,了解什么样的问题最好用数据来回答,如何形成可以测试的假设,学习理解所有的成本和收益,检测产品和设置指标、报告和监控的来龙去脉。有一些过程需要到位和发展,新的习惯需要形成。它总是非常复杂,每次都不一样。每做一次,我就多学一点。
这种工作需要惊人的长时间,几个月,有时几年,但最终结果是值得骄傲的。一个团队将从不知道如何处理给他们的数据,转变为产生假设,找出测量和测试事物的方法,并积极寻找研究和数据来帮助他们做出最佳决策。他们不会是这方面的专家,有时会需要指导,但他们会明白何时需要专家的帮助。这些人有一天会转移到其他团队和组织,并与他们分享经验。仅此一点就让我为这项工作感到骄傲。
你已经写了许多帖子,为新进者和更有经验的分析师提供建议,从 展示作为支持数据科学家的价值 ,到 提升自己 ,以及 作为一名新的独立数据科学家 。对希望追随你脚步的读者有什么建议吗?
拥抱领域知识!
它很混乱,令人困惑,而且通常很难(或者完全不可能)自动化,所以没有人喜欢学习它。这意味着向背景完全不同、说着不同语言的专家学习。但是,许多好的数据科学都依赖于这些知识,从知道收集什么数据和如何收集数据,到知道提出什么问题,到最终以最佳方式传达您的结果。在关于数据科学的讨论中,领域知识往往没有得到足够的重视,因为复杂的细节意味着答案总是“视情况而定”,但这永远不会白费力气。
除了你的工作和个人责任之外,你是如何做到写得如此一致的?你是怎么找到文章灵感的?
我坚持每周写一次,因为我非常了解自己,知道如果我允许自己“就这一次”滑倒和变懒,我会很快被我正在做的所有其他事情分心并变懒。我对自己发誓,我会每周拿出一个,我会尽我所能不让自己失望。有鼓点至少让我保持诚实,并且有一种令人欣慰的节奏,知道当周五到来时,我需要开始起草一些东西,以便在周一晚上出门。
如果你打算稳定地写作,想出点子总是一个挑战。幸运的是,生活充满了灵感。我从我一直在做的工作、我周围发生的事情、我一天中看到的关于数据的推文和模因、读者的问题中汲取灵感。如果这是我正在努力解决的事情,或者我看到其他人也在努力解决的事情,这是一个好的开始去寻找一些可以写的东西。这项工作是在采取种子,可以很小,并分析它一点,直到你可以拉一篇文章出来。
保留一个笔记本或者一个打开的文件会有所帮助,当你遇到一些想法的时候,可以把它们扔进去。这样你就有了一大堆材料可以开始,而不仅仅是一张白纸。
您希望更多地看到 DS/ML 中的哪种写作?
如今,针对该领域新进入者的内容层出不穷。你不可能一天都找不到另一篇“如何成为一个 DS”的文章发表在某个地方。它吸引了眼球和指标,因为该领域目前非常热门,但作为一个实践社区,我们需要为我们从业者提供更多内容。我们需要更多的人来制作内容,让有经验的人能够继续学习、分享和成长。
这意味着分享经验、技术、成功和失败,以及构成数据科学的所有工具和经验。我们可以使用更多的帖子,将最新的学术成果翻译成通俗易懂的语言,介绍不太常见的技术,或者揭示极其常见的技术中的怪癖和陷阱。它也不必是最前沿的“我创建了一个新的 ML 框架并解决了世界和平”类型的内容。即使你写的是 150 年前发明的你最信赖、最喜欢的方法,也有很多人不熟悉它,他们可以从你的实践知识中受益。我相信有很大的空间让人们来写他们的经历,并加入数据科学作家的社区。
你对未来几个月/几年的 DS 社区有什么希望?
随着世界非常缓慢地从新冠肺炎封锁中解冻,一些国家的速度更快,不幸的是,另一些国家的速度更慢,我希望数据社区继续像以前一样令人敬畏。我们很快就能在会议和活动中再次见面。最重要的是,我希望我们已经了解了一两件关于运行令人敬畏的在线数据事件的事情,并希望其中一些能够保留下来,因为它们很有趣,很棒,并且可以非常包容。
想了解更多关于 Randy 的工作和数据科学兴趣的信息吗?你会在的媒体简介上,在他的子堆栈统计数据上,以及在他的推特账户上找到他的文章。以下是我们最近最喜欢的一些。
- 数据清理是分析,而不是繁重的工作 ( TDS ,2021 年 4 月):Randy 探讨了“清理”是如何对数据进行价值、判断和解释的一种分析形式,并且不应该被认为是真正的数据科学工作的一部分。
- *日期、时间、日历——数据科学创伤的普遍来源 ( *TDS、2019 年 9 月):深入全面地潜入数据科学家的一大痛点。
- 做自己:你在公共场合看到的数据科学家不具有代表性 ( TDS,2019 年 12 月):兰迪提醒我们,如果你从事数据工作,你的工作就在数据科学的范围之内。不要被看门人吓倒。
请继续关注我们即将推出的下一位专题作者。如果你对你想在这个空间看到的人有建议,请在评论中给我们留言!
预测还是不预测,这是供应链的问题
商业科学
解决利润而不是准确性的 5 个秘密因素
顾客是不可预测的。几乎没有任何关于它们的事情是可以正确预测的。也许改变方法?
预测错误无处不在。在过去的 15 年里,我与 1000 多名经理会面并共事,帮助他们每天做出更好的决策。首先,在麦肯锡担任管理顾问的时候;然后,在 Evo Pricing 开发 B2B 技术产品,担任研究员。
在整个经历中,我感觉到预测我们人类系统共享的未来的基本需要:感觉到更多的控制。
然而,放弃狭隘预测的冲动会产生非凡的结果!
拥抱指令式人工智能 的快速响应方法,转变性能,释放浪费的资源。例如,当应用于供应链时。
即使一个完美的销售预测本身也不能导致最佳的利润驱动决策。
例如,如果您的完美需求预测= 50 件,您会希望您的供应链发运 50 件吗?事实上,我将展示最优装运量如何可能是=0 或=100,这取决于其他因素。
1 个展示以评估挑战
从根本上说,预测销售是根据过去和现在的数据对未来销售做出预测的过程。
这种活动可能会遭受粒度的诅咒(或者,更专业地说,维度的诅咒):在高级别的聚合中,例如预算总销售额,可以进行估计;但是到了更低层次的细节,事情变得令人毛骨悚然:太多的事情同时发生了。
不幸的是,日常管理决策必须精确地发生在那些较低的粒度级别,在那里预测是模糊和低效的。例如:
- 向客户收取什么价格?
- 仓库里要储存多少产品?
- 为获得和/或更新向哪些客户投资?
喜欢摄影:从远处看,打印的照片有意义。仔细看,你看到的都是 混乱的圆圈 。即使是最大的全球领导者在他们自己的领域也很难预测低的个位数错误率。
****预测误差无处不在。图片来源:作者来自 Evo 定价 (CC 带归属)
在 2021 年,这似乎令人惊讶。然而,这是由于问题的内在特征。为了便于处理,让我专门关注一下供应链。
供应链预测的挑战
当过于颗粒化时,就不可能做出准确的预测。如果你甚至不知道你自己的配偶在某些情况下会有什么行为,你怎么能预测一个完全陌生的人的反应呢?类比比较直接。
供应链经理的决策需要精细的预测,这造成了物理和经济上的浪费。
一些公司调整了衡量标准,以掩盖潜在的预测效率低下,例如,通过报告广泛的总量、平均值或更糟的数据。哎哟!当然,这解决不了任何问题。
更广泛的销售预测艺术和科学是有缺陷的。几个世纪以来,预测未来的欲望一直是人类的天性。毕竟:很难改变!
我们的星球饱受供应链预测错误之苦
我们的星球饱受各种预测误差的折磨。图片来源:作者来自 Evo 定价 (CC 带归属)
仅在美国,就有超过 2 万亿美元的存货。年销售额每 1 美元产生 1.43 美元的库存: 今天此时的库存,比今年全年销售的所有产品多 43%。**
面对增加生产还是减少销售的选择,任何经理都会很容易选择第一个选项,多生产多销售。但是我们的星球会发生什么呢?
我们每天都在浪费巨大的资源。
根据联合国的说法,浪费是巨大的。多大?
- 全世界每年产生 5000 万吨电子垃圾,比所有商用飞机制造的电子垃圾还要重。只有 20%被回收。
- 全世界每年浪费 13亿吨粮食,占总量的三分之一,(资料来源:联合国)。****
- ****每个欧洲人每年浪费179 公斤食物,根据瑞典食品与生物技术研究所。
虽然 45%的 5 岁以下儿童死于营养不良(来源:世界卫生组织),但我们的供应链每天浪费三分之一的粮食。
我们能更好地匹配供需吗?
如果我们能以某种方式防止预测错误造成的差距,那么对地球、经济乃至最终每个人的好处都将是巨大的。****
开发成功的规范解决方案
为了避免预测错误,解决影响,而不是准确性;让数据和机器自己找到答案。****
在无法预测的情况下,专注于快速响应。
行动/反应/反馈理论专注于因果行动/反应——可能在某处有一个脚注说反馈很重要。由于反馈是不可预测的,经典理论倾向于忽略或研究不足。让职业学习变得更容易预测因果联系。
一个基于反馈的供应链系统,一个规定的系统,是面向持续学习和发现的:一个反馈优先的机器。
为了建造一台供应链学习机器,**让我们用 5 种不那么秘密的原料精心烹制一份美味的食谱。
成分 1:目标有效性,而不是准确性
对于许多人来说,这是一个深刻的文化转变,他们的整个工作职责就是构建精确的系统。
至少在预测系统的传统定义中,准确性是以观察到的需求与预测的需求来衡量的,这与规定系统不太相关。一个规定性的系统实际上是一种特定类型的学习机,它有效地为其目标瞄准最佳结果。如果你通过问错误的问题设定了一个不准确的目标,那么你将会得到错误的结果。****
不仅仅是错了,而是非常高效地错了,甚至!
****错题准确回答。图片来源:作者来自 Evo 定价 (CC 带归属)
以下是一些传统准确性在业务方面效率低下的例子:
- ****业务成果以美元衡量。想象一下,预测你将卖出 10 件,然后卖出 20 件——这意味着你需要更快地补货。这将是一个 100%不准确的预测:以 10 为基线,误差为 10。但也是 100%的商业收益!为什么要对 100%的收益进行惩罚?原则上,这是可以理解的,但从商业角度来看,这是错误的。仔细想想,这真的毫无意义。
- 风险成本。不是所有的错误都有相同的代价。前面的例子显示了库存不足的一种情况(销售超过预期);如果相反,你最终库存过剩怎么办?假设你有两个产品 A 和 B,通常是快销品和滞销品,每周分别销售 100 和 10 件。你做了一个广告,预测每种产品的销量是 300,但是他们每种产品只卖了 200。这两个预测误差都是 50%,但是准确性度量并没有告诉你 A(仅 1 周的常规销售)与 B (10 周的销售)多留 100 件的风险。).糟糕的度量。
- ****顾客跨产品替代。测量粒度精度假设不同产品的销售是独立的,这是不正确的。例如,你有两个产品,A 和 B,并估计销售 10 个 A 和 10 个 B。那么对于实际是 5 & 15(替代)或 5 & 5(比例相同但总体较少)的情况,你有相同的 50%平均误差( MAPE )。在第一种情况下,20 的总估计是 100%正确的,但在另一种情况下,它是 50%错误的。准确性告诉你关于替代的任何有价值的东西。
- 概率与现实。预期销售额是一个先验的概率分布,没有好的方法从观察到的结果后验的评估实际的概率分布,而不增加噪音和失真。你以曲线(预期)开始,以数字(销售)结束;如何将两者相对比?
- 需求与销售。你只能直接观察销量,不能观察底层需求。因此,即使在概念层面上,您也无法测量需求准确性,这将是正确的度量。为此,您需要对销售进行逆向工程调整,以接近需求,但是这样做,您实际上是在创建自己的数据,而且这种方法是不可靠的。
所有这些点都是暗示相同事情的例子:准确性并不是一个相关的商业度量标准,特别是,它不应该被用来建立或度量一个规定的系统。
与其提高准确性,不如改变视角:通过直接瞄准利润来克服结构性限制。
学习系统的美妙之处在于,它们直接针对你设定的任何业务成果。利润比准确性更关乎商业。
成分 2:将需求计划与物流相结合
如果你和我一样:在这一点上,还没有被说服!数据在哪里?证据在哪里?
将预测输入物流系统会破坏价值。神奇的“秘密”配方:混合成本和收入在一起!
不幸的是,如今公司的经理们被次优地分割成 T2 的筒仓。我的一个客户昨天解释了他们的预测如何反馈给订单系统,而订单系统又反馈给发货系统。三步之遥远离客户和市场。******
每一步都将问题分解成可管理的子块,从管理的角度来看,这些子块可能是有意义的,但会分散信息,因此最终会造成浪费。从股东的角度破坏价值。****
这是为什么,用数字表示。使用一个简单但相关的例子。
让我们假设你是一家销售香蕉的杂货零售商的供应链经理。你需要决定今天运送多少香蕉到你的商店。类似的逻辑适用于任何类型的产品或服务以及任何时间范围,但是为了便于讨论,让我们把事情简单化。
让我们假设你对香蕉的真实预期需求函数是经典正态分布,均值/众数/平均需求为 50,标准差为 10。可以使用任何其他概率分布,或者甚至只是暗示,但是让我们保持这个例子非常简单。****
传统系统根据点估计来思考;你可能需要稍微思考一下看这个概率分布的例子。**
示例需求函数。图片来源:作者来自 Evo 定价 (CC 带归属)
现在,如果有人问你香蕉的预测需求是多少,假设你想保住你的工作,你可能会回答最少错误,或者最准确,值 50。******
您可能会认为实际销售额的误差在 10%左右(为简单起见,假设标准偏差为 1),误差率为 20%,但是,嘿,如果您按照上面的开盘价基准,这实际上是一个相当不错的估计!所以一切都好。还是没有?
最准确的预测?图片来源:作者来自 Evo 定价 (CC 带归属)
你的误差测量将事后的销售与事前的预期需求进行比较,这在概念上是错误的,因为它们是不同的。但是,让我们接受这个错误:需求不是直接可见的,只有销售是可见的。因此,没有传统的方法可以用来直接衡量你的需求估计。好吧,让我们继续。****
然而,还有一个更大的问题。
在预测/订单/运输过程中,每天都会发生巨大的系统性使用错误,即使有完美的预测也是如此。
如果我是物流经理,收到您的预估 50 件,让我们假设我完成了所有任务,那么我会高效地将您的预测件传递给商店。接下来会发生什么?
每一次运输都有效地用今天的保底成本换取明天可能的利润。
- 今天,我直接把钱花在库存、物流、财务、损耗(运输途中丢失的产品)和间接费用的保证成本上,甚至没有考虑不把库存留在仓库的机会成本。****
- 明天,我将从售出的已发货产品中产生潜在利润,以及未售出产品的浪费和退货产生的额外成本。****
根据成本和利润的确切值,最佳装运可能与预测完全不同,即使是零误差。****
例如,假设每单位出货的总成本为 40,每单位销售的预期毛利为 60(假设定价为 100,产品成本为 40),标准差为 35,则基于出货次数 N 的预期利润曲线如下:
最佳装运与预测不同。图片来源:作者来自 Evo 定价 (CC 带归属)
然而,如果不是假设每装运单位的总成本为 10,原始标准偏差为 10,那么基于装运次数 N 的预期利润曲线变化如下:
最佳装运可以是任何东西。图片来源:作者来自 Evo 定价 (CC 带归属)
注: 附录 中的全部工作原理。
在这个例子中,通过运输 50 个单位,你将保证一个系统的利润错误,即使有一个正确的预测。对利润的直接负面影响。通过切断预测和物流之间所有有价值的需求信息,使用单点估计作为你的单独物流系统的需求输入,你将有系统地破坏价值。******
物流系统将无法对最优装运做出任何明智的评估,更不用说更复杂的跨产品估计,如替代。它只是试图满足需求的点估计。
传统的预测与客户的观点不一致,因此通过自己的设计破坏了商业价值。
有趣的是,上面简化但现实的预期利润曲线显示了强烈的偏斜。由于最优解右边的预期利润要高得多,经理们本能地倾向于过量出货,造成系统性的浪费(参见上面关于我们的星球的章节),而不是冒着错过有价值销售的风险。******
听说过安全库存 系统地添加在估计值之上吗?****
你不相信自己的预测,所以你保持安全边际。所以你一直在浪费自己的库存,错过销售机会。
成分 3:将风险视为机遇
根据需求的标准偏差,即市场的波动性和不可预测性,以及物流成本,最佳发货可能是 0 到 100+之间的任何值,预测需求仍然是 50。******
在现代世界中,需求终究会变得越来越不可预测,这使得传统预测更加过时。所以这是一个常见的场景。但是风险也可以是上升的机会!****
风险在技术上是需求差异:当需求变得更加不稳定和不可预测时会发生什么,即使同样预测为 50。
高方差需求函数示例。图片来源:作者来自 Evo 定价 (CC 带归属)
在本例中,标准差不是 10,而是 5 倍,因此标准差也是 50。
高得多的盈利机会。图片来源:作者来自 Evo 定价 (CC 带归属)
在这种情况下,最佳出货量将不再是 60,而是 98。大体上是 50 年预测的 2 倍。通过使用传统的预测,你会引入一个巨大的系统利润误差,将出货量限制在 50。****
你也不会变得更聪明,因为你会继续出货 50 件,并且通过卖出全部 50 件产品而成为接近 100%准确的。**
平均卖 50。这有时意味着而不是缺货,使得错过机会的检测变得棘手。如此反复重复同样的错误,直到需求函数发生变化——例如,竞争对手得到了你错过的香蕉销售,并感谢你给他们带来了新客户。**
商机一去不复返,但却几乎 100%准确。
有钱好还是权利好?
成分#4:装运范围=频率+提前期+风险+约束
根据成本和差异,最佳出货量可以是 0 到 100,即使预测需求始终是 50。****
最佳装运可以是从 0 到最大约束条件(本例中为 99)之间的任何数字,即使预测需求为 50。图片来源:作者来自 Evo 定价 (CC 带归属)
这个简化的例子假设你今天要运送香蕉,明天送到商店。在其他情况下,发货频率可能较低,发货提前期(订单和收货之间的时间)较长。预测系统会预测未来的销售,从而使误差变得更大。
另一方面,规定系统将这些参数作为输入:交付周期越长,运输频率越慢,需求的不确定性就越大,传统预测系统和流程的系统误差就越大。
那么约束呢?****
例如,如果我没有仓库限制(和偷偷吃一根香蕉的胃口),上表的左下角可能会显示比 99 更高的数字。).约束有一个简单的影响:限制规定系统操作的自由。**
每一个约束都只能恶化预期利润,而永远不能改善预期利润。所以越少越好。
例如,为什么要强制实施最小货架数量?还是在运输利润已经最大化的情况下的最小出货量?没必要,真的。
更多细节请见我的另一件中型作品:
******
成分 5:从快速反应中获得灵感
如何实现快速响应系统?
说明性分析是管理有效性的新领域,但它们也带来了重大问题:
- 需求函数怎么确定?
- 如何让系统推荐有意义?
- 如果准确性不是正确的衡量标准,如何验证结果?
我每天都看到常规系统比传统预测系统的库存效率高出 20–30%:用更少的库存实现更多的销售。有时候少可以多。
与此同时,我感到出现了认知失调。与我共事的经理的真实语录:
- 我们多年来一直致力于将精确度提高 1 到 2 个百分点。20–30%的改进怎么可能实现呢?[ 这实际上经常是一天 1 的改善]
- 在 A/B 测试之后,相对于其他可变业务因素,如何衡量长期改进?[ 通过选择正确的目标 KPI
- 我们会有正确的数据来完美地估计需求吗?[现有的数据在使用外部数据源时通常是可以的;越多越好,然而完美是不可能的
最终规范的系统只能通过测试来衡量,这是一个自我递归的循环:只有当人们相信它们是无法解决的挑战的解决方案时,它们才能工作。
类比示例
最初,包含上述所有复杂点可能会很困难。因此,让我们从其他快速反应系统的类比中得到启发:
类比:客户需求和天气
天气测量。马克·柯尼希在 Unsplash 拍摄的照片
天气预报其实就是:快速观测—模式识别—更新。由于这个问题是出了名的难,就像客户需求一样,科学家依靠先进的技术来收集大数据并实时调整估计。
根据美国国家海洋和大气管理局的说法,相对于传统方法的改进是显著的:把握地球的脉搏,处理大量的数据,为客户提供更好的服务。
快速响应供应链所需的完全相同的步骤。
类比:客户需求和股票市场
马克西姆·霍普曼在 Unsplash 上的照片
股票市场与其说是一个预测引擎,不如说是一个快速反应系统。从长期来看,它接近公司资产的估计值(总的来说,你也可以预测客户需求),但是,从日常来看,它是最有效的引擎,可以在新信息出现时快速吸收。
股票价格由供求平衡实时决定。一个持续发现引擎,每天可以相当高效地分配数万亿美元的实际资金。或者,至少,还没有人能想出一个更有效的机制!
为什么不采用同样的方法来匹配实物供给和需求,在日常供应链决策中分配数万亿美元的库存?
反应迅速,钱就来了
从业务目标开始,每天释放巨大的商业价值。这样做,比许多可持续发展项目更能帮助我们的星球。
快速响应保证了任何错误的自我纠正,那么风险是什么呢?
要建立一个快速反应系统,你需要两个要素:
- 机器学习根据尽可能大的数据集来估计预期需求
- 利润优化规定决策,使用经典的运筹学技术,但规模较大。
在之前的一篇文章中,我提倡三文鱼策略:从你想要的影响开始,然后向后努力。从这个角度来看是相对合理的。
就像中国谚语所说的:
千里之行始于足下
预测-订单-发货的准确性驱动的传统预测流程被打破。在我们这个日益复杂的世界里,拥抱规范的力量是最终实现供需平衡的合乎逻辑的第一步。
快乐快速回复!
附录 中的全部工作方式,还包括可下载的说明性源文件,用于详细查看示例。
PS 我定期写商业科学。推荐后续阅读:
*</94-perfect-the-surprising-solution-to-the-200-billion-inventory-problem-b6ba0bc1417a>
Monthly Business Science in your inbox, new software, and University-level learning:[**Free access**](https://evouser.com/register)Questions? Please reach out on [Linkedin](https://www.linkedin.com/in/fabrizio-fantini/)
为了增加数据分析能力,你必须知道频率分布(Stat-04)
在 7 分钟内找到频率分布的所有基础知识
约翰·博耶在 Unsplash 上的照片
数据在每个组织中都扮演着关键角色,因为它帮助企业领导者根据事实、统计数字和趋势做出合适的决策。由于数据范围的不断扩大,数据科学成为一个多学科领域。在数据科学中,数据分析是最重要的部分。为了清楚地理解数据,我们必须了解统计的频率分布知识。
数据分析的主要目的是从数据中获取信息,以便我们可以为我们的系统、组织或任何问题做出更好的决策。你脑子里在想什么?。我们可以很容易地通过查看表格格式来分析数据。耶!当数据集很小时,我们可以。如果是大数据集呢!!!假设您有一个 1000 行 50 列的数据集。你能仅仅通过观察来分析这个数据集吗?为了分析这种类型的大型数据集,首先,我们必须简化它。频率分布是分析数据的重要技术之一。
目录:
- 什么是频率分布?
- 用真实世界的例子算出频率表。
- 序数、间隔或比率标度变量频率表。
- 什么是相对频率和百分比频率。
- 如何制作分组频数分布表?
- 连续变量的频率分布。
- 最后的话。
什么是频率分布?
频率分布是一种图形或表格形式的表示,显示给定时间间隔或类别内的观察次数。有时,它也被称为频率分布表。
作者照片
让我们看看这张桌子。它有两列。一列记录唯一变量的名称。另一列记录每个唯一值的观察次数或出现次数。
通过本文,我们使用的是 wnba.csv 数据集。它有 143 行和 32 列。下面给出了数据集的完整概述。请随意观察数据集。
是时候尝试新的东西了。我们将使用 python 创建一个频率表。我们可以用 Series.value_counts() [method](https://www.geeksforgeeks.org/python-pandas-series-value_counts/#:~:text=value_counts()%20function%20return%20a,Excludes%20NA%20values%20by%20default.)
。我们将尝试在我们的数据集中制作一个pos(position)
列的频率表。
import pandas as pd
wnba = pd.read_csv(‘wnba.csv’)
freq_dis_pos = wnba[‘Pos’].value_counts()
freq_dis_pos
输出:
我们还可以使用相同类型的代码获得其他列的频率表。但是请记住,它只对分类变量有效。
在我们的输出中,我们看到值以降序排列。这个顺序有助于我们知道哪个频率值最大。如果我们有一个名义变量的情况,这个顺序对我们有帮助。如果你的变量是用序数、区间或比率尺度来衡量的,那么分析起来就会变得更加困难。为了理解这个变量,你可以看看我们之前关于变量的帖子。
总之,这个表将帮助你找到变量类型。
作者照片(序数、间隔或比例变量的频率表)
现在我们试着找到高度列的频率表。
freq_dis_height = wnba[‘Height’].value_counts()
freq_dis_height
输出:
有时候,你会遇到麻烦。要解决这个问题,您可能需要根据索引值对表进行排序。然后你可以使用Series.sort_index() [method](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.sort_index.html)
。
freq_dis_height = wnba[‘Height’].value_counts().sort_index()
freq_dis_height
输出:
有时您需要按升序转换数据。为了以升序表示数据,我们可以将 ascending 参数设置为 false。
freq_dis_height =wnba[‘Height’].value_counts().sort_index(ascending= False)freq_dis_height
输出:
你能按顺序制作上表吗?是的,你可以。首先,把整个身高范围分成若干区间。例如,在给定的数据集中,身高范围从 165 厘米到 206 厘米。假设,总范围是 45 厘米。现在,把它分成 5 类,每类间隔 9 厘米。并给每个音程起一个分类名称,如高、短或第一、第二等。然后计算频率。
什么是相对频率和百分比频率?
上面讨论的频率被称为某个变量的绝对频率。
(一)相对频率:
通过将频率(f)除以观察次数(n)可以得到特定观察值或类间隔的相对频率。
***Relative frequency = frequency ÷ number of observations***
(二)百分比频率:
百分比频率是相对频率乘以 100 得到的。
***Percentage frequency = relative frequency X 100***
在熊猫库中,我们可以用每个频率除以实例总数,一次性计算出所有的比例。下面是一个关于*Women’s National Basketball Association (wnba.csv)*
数据集的例子。
wnba[‘Age’].value_counts() / len(wnba))
但是通过将Series.value_counts()
normalize 值设置为 True,速度稍微快了一些。然后简单地将输出乘以 100。
percentages_pos = wnba[‘Age’].value_counts(normalize=True).sort_index() * 100percentages_pos
输出:
这个百分比将帮助我们找到我们需要的重要信息。
百分位数排名
分数的百分位数等级是分数在其分布中所占的百分比,并且低于它。为了找到百分位数排名,我们可以使用 python 中的一个名为scipy.stats.percentileofscore
的库。
如果我们想找到指数 25 的百分位数。我们只需编写如下代码。
from scipy.stats import percentileofscorepercentile_of_25 = percentileofscore(wnba[‘Age’], 25, kind = ‘weak’)percentile_of_25
输出:
40.55944055944056
你会非常惊讶地发现,我们只要写一行代码就可以很容易地找到百分位数。熊猫Series.describe()
方法帮助我们找到百分位数。
persecntiles = wnba[‘Age’].describe()
输出:
我们对前三行的值不感兴趣。默认情况下返回第 25、50 和 75 名,分数将分布分成四个相等的部分。也称为四分位数。第一个四分位数(也称为下四分位数)是 24(注意,24 也是第 25 个百分位数)。这意味着总数据的 25%在 0 到 24 年之间。第二个四分位数(也称为中间四分位数)是 27(注意,27 也是第 50 个百分位数)。第三个四分位数(也称为上四分位数)是 30(注意 30 也是第 75 个百分位数)。
作者照片(四分位数概念图形可视化)
我们可能有兴趣找到 25%、50%或 75%以外的百分比的百分位数。为此,我们可以使用 pandas Series.describe()
的百分点参数。这个方法需要传递 0 到 1 之间的百分比。
persecntiles = wnba[‘Age’].describe(percentiles = [.1, .15, .33, .5, .592, .85, .9])persecntiles
输出:
如何制作分组频数分布表?
有时频率分布表组织得不好。然后我们必须找到分组频率分布表。我们通过改变 pandas series.value_counts()
方法中的 bin 参数来设置分组值的限制。
grouped_freq = wnba[‘Age’].value_counts(bins = 5).sort_index()grouped_freq
输出:
有时,这个间隔不会给出更好的输出。为了获得更好的输出,我们必须创建自定义间隔。给我们创造定制系列的机会。
ntervals = pd.interval_range(start = 0, end = 600, freq = 100)intervals
输出:
IntervalIndex([(0, 100], (100, 200], (200, 300], (300, 400], (400, 500], (500, 600]], closed=’right’, dtype=’interval[int64]’)
在这里,我们必须提供三个参数。起始参数给出了我们范围的起始点。End 参数给出自定义范围的终点,Freq 值给出每个频率的数值。
连续变量的频率分布
对于一个连续变量,如果我们为变量的每个不同值取一个类,类的数量将变得过大,从而使列表的目的落空。
当表格中使用连续变量时,它们的值通常被分成几类。在这里,我们可以使用之前学过的音程的概念。
最后,
在整篇文章中,我们必须学习如何使用频率分布表来组织数据。要知道频数分布表有多厉害!频数分布表有助于我们深入理解数据。然而,是时候知道如何可视化这些组织好数据了。要了解它,请和我呆在一起。我很快会带着必要的可视化技术回来。
数据科学统计全系列文章
- 少即是多;取样的‘艺术’(Stat-01)
- 熟悉数据科学最重要的武器~变量(Stat-02)
- 要增加数据分析能力,你必须知道频率分布(Stat-03)
- 通过可视化频率分布找到数据集的模式(Stat-04)
- 比较多个频率分布,从数据集中提取有价值的信息(Stat-05)
- 用简短的讨论消除你对均值的误解(Stat-06)
- 通过规范化提高您的数据科学模型效率(Stat-07)
- 数据科学的基本概率概念(Stat-08)
- 从朴素贝叶斯定理到朴素贝叶斯分类器的路线图(Stat-09)
- 数据科学爱好者需要知道的假设检验(Stat-10)
- 用 ANOVA (Stat-11) 进行多组间的统计比较
- 用卡方检验比较分类变量的相关性(Stat-12)
要更快地学习数据科学,请教授它
作者聚焦
“我拒绝接受我的负面想法。”
在 Author Spotlight 系列中,TDS 编辑与我们社区的成员谈论他们在数据科学领域的职业道路、他们的写作以及他们的灵感来源。今天,我们很高兴与 Khuyen Tran 进行对话。
照片由 Khuyen Tran 提供
Khuyen 是 Ocelot 咨询公司的数据顾问。她在 Medium 上撰写了 100 多篇数据科学文章,并在 数据科学简化版 ,上发表了 270 多篇每日数据科学技巧,吸引了大量学习者和专业人士。她目前的任务是让开源项目更容易被数据科学界所接受。
让我们从头开始——你是如何决定成为一名数据科学家的?
两年前,我想知道我能用我的数学学位做些什么。我对当教授和从事金融都不感兴趣。幸运的是,在参加一次数学会议时,一位曾经是数学家的演讲者分享了他目前的数据工程师职业是多么有价值。那时我发现了数据科学。
从那以后,无论多忙,我每天都花时间学习和分享新的数据科学知识。由于我分享的文章,我已经能够在数据科学领域获得多份工作,创建了一个积极的反馈循环,将我的知识更深入地扩展到数据科学。
拓展到一个完全不同的领域有多困难?
一开始,我很难记住从数据科学课程中获得的新知识。比如我上了三个月的机器学习课程,经常忘记一个机器学习算法背后的语法和理论解释。我觉得编码和数据科学可能不适合我。
然而,我拒绝接受我的负面想法。也许我的学习方法不对。我问自己,什么样的学习技巧让学习变得愉快,最有助于我记住信息。答案是通过做项目和教学来学习。我发现,当我试图用新知识解决问题或把我学到的东西教给别人时,我会记住更多的新知识。
现在,每当我想更深入地了解一个数据科学概念或工具时,我就写这个主题。
根据你自己的经验,你会给刚开始从事数据科学的人什么建议?
我建议数据科学家在实践中学习,并分享他们所学到的东西。您不应该一门接一门地学习数据科学课程,而应该只学习最基本的知识,并在此基础上利用您的知识解决身边的问题。
你要解决的问题应该有趣,但不要太难。然后你就可以开始分享你的项目,写一些关于它们的文章,或者在 LinkedIn 上分享。渐渐地,你的技能会得到认可,甚至在你有机会申请之前,工作机会就会找上门来。
你认为公开写作有什么好处?你如何决定写些什么?
我相信我们都有一些有价值的东西可以分享,不管这个想法有多简单。我热爱开源工具,但有些工具因为藏在 GitHub 里而不为人所知。所以我想成为一个媒介,帮助那些不熟悉 GitHub 的人传播这些开源工具。我经常在上发表关于数据科学的文章,因为它帮助我将我的文章传播给更广泛的受众。
我也有很多写文章的乐趣。在写了一篇关于工具的文章之后,我常常对它有了更好的理解。另外,由于我写的文章,我获得了许多与数据科学相关的新职位。
如今最能激励你的工作或项目是什么?
我被回答有趣问题并需要技能和工具相结合的数据科学项目所激励。我对使用 Python 构建数据科学 web 应用程序特别感兴趣,因为它们构建起来很有趣,并且可以被其他人使用。
展望未来,你对数据科学社区有什么希望?你希望看到它朝哪个方向移动?
在未来几年,我希望人工智能伦理将成为许多数据科学从业者的焦点。尽管人工智能可以对社会产生非常积极的影响,但今天使用的许多模型都是不受监管和无可争议的,即使它们是错误的。因此,这些模型会强化歧视和偏见。数据科学从业者应该意识到这些负面影响,并在头脑中建立一个道德模型。
对于那些想了解人工智能如何对我们的社会产生负面影响的人,我推荐凯茜·奥尼尔的书《数学毁灭的武器】。
想了解 Khuyen 的工作和数据科学兴趣吗?你会在她的媒体简介,她的网站 数据科学简化版 以及她的推特账户上找到她的文章。以下是我们最近最喜欢的一些。
- [3 个跟踪和可视化 Python 代码执行的工具](http://Visualize the Execution of your Python Code) ( TDS ,2021 年 4 月)
正如 Khuyen 帖子的读者所知,她的文章总是以实用、真实的建议为中心。在她最近的热门文章中,她解释了三个工具的好处,这些工具有助于简化您的 Python 工作。 - 在 Python 中停止使用 Print 进行调试。用冰淇淋代替 ( TDS ,2021 年 1 月)
另一篇专注于 Python 的文章,这篇文章强调了使用 Icrecream 库进行更快、更流畅的调试的好处。 - 如何使用 Python 创建类似 3Blue1Brown 的数学动画 ( TDS ,2021 年 4 月)
每个人都喜欢圆滑的动画,但并不是每个人都有时间或精力去学习必要的技能。在这里,Khuyen 介绍了 Manim,这是一个 Python 包,使数据科学家能够以最小的工作量创建令人印象深刻的视觉效果。 - 通过三个步骤建立令人印象深刻的 Github 档案
作为一名从不同领域过渡到数据科学的顾问,Khuyen 认识到有效展示个人技能和经验的必要性。本教程引导读者完成构建一个专业、专注的 GitHub 概要文件的(简短)过程。
请继续关注我们即将推出的下一位专题作者。如果你对你想在这个空间看到的人有建议,请在评论中给我们留言!
为了充分利用你的数据科学家,嵌入他们
最大限度地包容和相互学习,你将最大限度地影响
“我有所有这些数据科学家,”我听到你在沉思,“我花了数百万去招募、雇佣和留住他们,他们拥有统计学、计算机科学的高级学位,其中一个还拥有‘真正的量化公共政策硕士’,他彻底击败了我们的带回家编码考试。我如何找到最适合他们做的事情?我怎样才能最好地管理这些书呆子?”
别担心,你最喜欢的外向书呆子会支持你的。没有放之四海而皆准的方法,但这是我发现的一种非常有效的获取高价值数据科学项目的方法。
战时新闻的一个教训
许多人看到我的简历时,都有一种困惑的反应,认为我是一个拥有调查性新闻硕士学位的人工智能极客。“你一定知道怎么写!”
🤔 🤞
然而,新闻教育的真相是,它传授的主要技能是倾听以获取信息,并将这些学到的信息结合起来以获得叙述和背景。这些技能对数据科学家非常有帮助,战地记者的工作为我们的工作提供了一个非常有用的模型。(澄清一下,虽然我是一名拥有新闻学硕士学位的战斗老兵,但这两个世界在我的案例中从未相遇,我也从未做过战地记者。如果你有,并且你发现我在这篇文章的其余部分歪曲了你的经历,请一定要告诉我。)
嵌入式记者在服务于真相方面有非常有益的作用:他们嵌入在一个单位中——例如一个部署的步兵排——从某种意义上说,他们跟随他们,看到他们看到的,听到他们听到的,并近距离观察他们的经历。在与东道主达成的某些协议的范围内,他们可以自由地去任何地方,与任何支持这一目的的人交谈。但重要的是,从任何有意义的管理意义上来说,他们不向该单位报告。那个排长不是他们老板。该单位的记者有着非常明确的合作关系,彼此承担着特定的责任。一个单位负责记者安全;记者受到协议的约束,例如,不得披露或发布会使其所在单位或平民面临风险的信息。相反,从管理的角度来说,记者向其他专业记者或编辑报告,他们最终要对他们的工作质量负责。
为了对业务部门进行有益的模拟,请考虑一种模型,在这种模型中,个人贡献者数据科学家被直接指派向某个其他工作职能的经理报告,而在另一种模型中,他们被嵌入到同一个业务部门中,但在非常具体的意义上:他们受到欢迎并可以自由参加该业务部门的常务会议,学习和提问,并对该部门的业务问题形成真正的理解。但是选择项目的责任和义务仍然掌握在数据科学领导层手中。
为什么这可能更好?
首先,它让已经忙碌的企业领导人从管理拥有一套他们可能并不完全了解的技能的专家中解脱出来。无意冒犯,但请记住,许多数据科学家已经花了几年时间,将统计学、计算机科学或其他定量领域的研究生教育灌输到他们的头脑中。其他人很难知道对他们来说什么是容易的、困难的或不可能的,或者一个问题必须有多具体才能为 DS-ready 做好准备。"对数据科学家来说,“改进这个 KPI”够具体了吗?"变成了,“我一直很好奇我们如何移动这个 KPI,我能告诉你这个问题并向你请教我们如何利用你的技能吗?”
其次,它让数据科学家对理解业务问题负责。DS 领导会说,“我的期望是,无论产品所有者要求什么型号,你都要交付”,然后会说“我对你的期望是,你要全面了解你的嵌入式合作伙伴业务,并为我们寻找增加价值的机会,以便我们能够从中做出明智的选择。我对他们的期望是,他们要开放、热情、透明,让你快速了解它。我对自己的期望是,至少我会扫清障碍,支持你实现这些目标。你对我的期望是什么?”
最后,它增强了数据科学家的创造力和能动性。根据我的经验,当数据科学家听到一个问题,并在脑海中将其与她知道可用的数据集或她熟悉的方法联系起来时,神奇的事情经常发生。这通常会创造出一个垂直业务领导者想都不会想去要求的机会,仅仅是因为他们的角色不涉及公司数据环境中的生活。数据科学家确实住在那里,给了我们一个独特的位置来判断可行性和上市时间。
为什么这可能是一个可怕的想法?
从快速、全面和透明的意义上来说,这旨在获得最佳机会。如果你的 DS 团队没有足够的带宽来开发新的项目,那么寻找资源的努力可能是一种浪费。嵌入解决了这个问题,它让数据科学家可以自由地,但不是必须地,参加那些常设的团队会议,在那里他们可以倾听和获取信息。不需要额外的火箭手术,只需要老式的,直接的交流当前的优先事项,为什么你不会出席。然而,大的、长时间的项目并不适合这种方法。如果一个完整的团队为一个计划好的产品发布会(已经在那里)合作几个月来精心制作深度学习模型,这个框架肯定会针对错误的标准进行优化。
最后,它并不适合每个数据科学家。额外的利益相关者的参与并不是驱动每个 DS 加入游戏的原因,对于那些想要在每天八小时的深度工作中处理棘手问题的人来说,在其中加入分散的邀请是一个糟糕的保留方法。
我该如何开始?
如果你是数据科学的利益相关者:
- 邀请已经和你一起工作的数据科学家参加任何会议,站着或解决问题,倾听或贡献。
- 创造一个欢迎他们提出想法的氛围,抑制住回应“这不是我要的”的冲动
- 就像敏捷产品负责人在设定优先级之前向技术合作伙伴咨询故事的 LOE 一样,带着好奇心接近你的数据科学合作伙伴,看看你如何能让它更容易、更好地工作。
如果您是数据科学主管:
- 确保你的团队有一个全面透明的地方来记录他们获得的所有机会,并有一个轻量级的循环方式供你的团队从中选择。
- 向其他职能部门的合作伙伴坦诚、透明地说明你对他们的要求和期望。说“我对嵌入式数据科学家的期望不是他们做你的功能所需的一切,而是他们了解你的所有需求,并做对我们有比较优势的工作”通常是有帮助的
- 对于您的团队会采取或不会采取的机会,要坦率而直接。
如果你是一名独立贡献的数据科学家:
- 把同样的好奇心带给任何与你合作的商业伙伴。与他们分享你对了解他们业务的渴望,这样你就能更好地为其增值。
- 对抗任何残余的冒名顶替综合症,任何告诉你“理解商业不适合我们数据人”的声音。同样,你已经把中心极限定理和两三种编程语言的语法牢牢记在了脑子里:你可以很好地搜索收入和支出。
监控还是不监控一个模型——有问题吗?
行业注释《模型监控指南》
这是模型监控系列博客的第一部分。本文概述了监控模型的需要,并用一个名为 appeally AI 的开源库演示了两个例子。
德万西·维尔马 *、马修·弗利吉尔 *、鲁帕·戈什 *、阿纳·博斯博士
*对本书有同等贡献,姓名按字母顺序排列。
什么是模型监控,我们为什么要关注它?
所以你终于完成了它——你已经找到了完美的超参数,建立了你的管道,做了大量的测试,并把你的机器学习模型投入生产!过程结束了,是时候停止思考你的模型了吧?要是有那么简单就好了…
由机器学习模型指导的业务操作依赖于这样的假设,即模型下面的数据分布不是漂移的(数据分布在训练和推断之间是相同的),以便模型保持与训练后一样有效。为了验证这一点,需要监控生产中的机器学习模型,以使它们的性能(准确性/内存使用/CPU 使用)在训练和测试期间设置的预期范围内。
当一个模型开始漂移时,它可能会被发现,直到它对业务运营产生负面影响。例如,在医疗保健领域,疾病预测的准确性可能会开始下降,以至于预防措施(基于预测)变得无效。在零售领域,发送给预期使用优惠券的客户(基于模型预测)的优惠券仍未使用。所有这些都会影响业务运营和收入。图 1 示出了分布偏移的一个例子。
图 1:分布转移。(图片作者)
如何监控模型?
有多种方法用于监测模型——一些关键技术,如先验概率转移和协变量转移在[1]中进行了概述。此外,模型监控方法有多种开源和商业软件实现。在本文中,我们走过一个开源模型监控库,显然是 AI [2]。
显然是艾
显然,AI 是一个开源的 python 包,它允许创建仪表板来比较训练和生产数据集。它很容易集成到 python 代码中来检测数据漂移。我们想调查它的模型监控能力,因为成本(免费!)和易于安装(来自 PyPi)使它成为有吸引力的候选产品。
人工智能是如何工作的
显然,人工智能是通过分析训练和生产数据集来工作的。它将数据从训练数据中的要素映射到生产数据中的对应要素。例如,在本文后面提到的天气模型中,将圣路易斯的培训数据映射到圣路易斯的生产数据。此后,它根据输入运行不同的统计测试。显然,AI 然后基于 plotly python 库创建图形,你可以在他们的开源 GitHub 库中阅读更多关于代码的信息。
对于二进制分类要素,它对比例差异执行简单的 Z 检验,以验证定型数据和生产数据具有二进制变量的两个值之一的频率是否存在统计上的显著差异。对于多元分类特征,它执行卡方检验,旨在查看生产数据中变量的分布是否可能基于定型数据中的分布。最后,对于数字要素,它会执行双样本 Kolmogorov-Smirnov 拟合优度测试,该测试评估培训和生产数据中要素的分布,以查看它们是否可能是相同的分布,或者它们是否彼此有显著差异。
在所有上述情况中,显然 AI 标记了统计上显著的结果。此标志表示训练数据和用于在现实世界中进行预测的推断数据之间的分布发生了变化。
我们的例子
在这篇文章中,我们用两个不同复杂度的例子展示了人工智能是如何工作的。在第一个示例中,一个模型使用附近 5 个城市(底特律、密尔沃基、奥马哈、多伦多和圣路易斯)的温度来预测芝加哥的天气。这是一个在表格数字数据中搜索数据移位的简单示例。在这种情况下,该模型是一个支持向量机-为了简单起见,该模型不是从时间序列的角度来处理的(其想法是,它可以根据其他城市的温度来实时预测芝加哥的温度)。这种情况考虑到了漂移的可能性(随着天气的季节性变化),以及整体的变化。
在另一个例子中,植物幼苗的图像通过卷积神经网络(CNN)模型运行,目的是将甜菜植物与其他类似的幼苗区分开。这里,漂移是通过在生产中使用不同的数据集来演示的。这是一个重要的例子,其中被监视的数据不容易用表格格式表示。
人工智能中的表格数据移位检测
说明数据转移的一个变化是将数据从多伦多切换到亚利桑那州的菲尼克斯。正如所料,这两个城市的温度分布(以摄氏度计)有很大不同,特别是在本例中使用的日期(从 3 月到 6 月初)。图 2 是数据被修改前的一个例子。
图 2:原始天气数据。(图片作者)
更改后的相同数据如图 3 所示。请注意“多伦多”的值明显高于其他城市,因为它的值已经更改为凤凰城的值!
图 3:极移后的天气数据。(图片作者)
显然,人工智能被用来监控模型——它的输入是原始训练数据的数据框架和生产数据的数据框架,它创建了一个分析仪表板,突出显示差异(如果有的话)。
它识别每个数据集中的输入变量(这里 df_old 对应于原始训练数据,df 对应于模型当前预测的数据)。显然,人工智能会匹配数据集之间的变量,并生成一份报告,突出显示差异。生成的仪表板的快照如图 4 所示。
图 EvidentlyAI 中的漂移仪表板。(图片作者)
很明显,“多伦多”的分布有漂移,因为现在有更高的值。有趣的是,底特律也出现了变化,但没有被篡改。这说明了为什么总有可能出现错误的结果——尽管我们没有改变这里的数据,但这表明我们应该关注这个特性。
显然,人工智能也有能力监测结果变量的漂移。这是为了了解模型的预测是否偏离了训练期间所看到的情况。这种模型输出漂移被称为目标漂移,或者更普遍地称为先验概率漂移。这时输入数据分布不变,但目标变量分布发生变化。例如,我们可以在信用卡违约者的上下文中使用它。人口的特征可能随时间而变化。总日客户的比例也可能有所不同。因此,由于这一变化,去年使用的模式在今天可能不再有效。例如,先前的概率可能是 20%的违约者和 80%的还债者,而现在可能是 30%的违约者和 70%的还债者。这种所谓的“目标转移”可能会对生产中的模型产生严重的业务影响,因此应该密切监控。下面的图 5 显示了一个例子。
图 5:预测漂移又称目标偏移。(图片作者)
可以看出,在当前数据集中,分布发生了变化。还提供了进一步的分析,显示了预测如何与每个特征相关联。这有助于通过观察我们的变量和结果之间的关系是否发生了显著变化来监控数据漂移。如果是,该模型可能不再适合生产。这为我们提供了另一种方法来评估我们的模型是否需要重新训练,如图 6 所示。
图 6:预测相关性。(图片作者)
显然,AI 也展示了预测值和预测行为的特征,如下图 7 所示。
图 7:按特征的预测行为。(图片作者)
注意坐标轴的移动——多伦多的参考(训练)值(实际上对应于多伦多的天气)的范围是从 0 到 30,而新的(测试/生产)值(菲尼克斯)的范围是从 0 到 40。
明显人工智能中的图像数据偏移检测
在第二个例子中,我们研究图像数据中的数据漂移。我们的模型是一个多类图像分类模型,它接受幼苗图片的输入,并将它们分类到 12 个可用类中的一个[3]。该监控检测生产数据何时漂移,并包括不在 12 类中的幼苗的图像。这种数据漂移监控是通过将生产数据与模型训练数据进行比较来完成的。
想象一下这样的场景,我们的训练数据由甜菜的图像组成,但是测试/生产数据接收不同类型的幼苗的图像,比如荠菜。下图显示了这一点;在图 8a 中,我们有培训数据图像,在图 8b 中,我们有荠菜的测试/生产数据图像。很明显,训练数据集和生产数据集是不同的。我们的目标是使用明显的人工智能来检测两个样本之间特征的数据漂移。
图 8(a):甜菜图像训练数据。(图片来自植物幼苗数据集[3])
图 8(b):荠菜图像测试/生产数据。(图片来自植物幼苗数据集[3])
具有明显人工智能的图像数据管理方法;
正如前面的例子中提到的,显然 AI 评估了训练和生产数据中的特征分布,以查看它们是否可能是相同的分布,或者它们是否彼此显著不同。因此,我们需要将图像数据转换成一种格式,以便人工智能比较特征。
下面是将数据加载到 appeally AI 中的步骤顺序的简要描述。这如图 9 所示。
加载数据并准备处理:
- 读入一组用于训练 ML 模型的图像。
- 从当前生产中读入一组图像。
- 根据所需的粒度,将两个集合的大小调整为适当的数组大小。数组大小为 n 乘 n,其中 n 是图像的像素数,也是图像的特征数。
特色工程:
4.根据像素值创建一个要素数组(n * n)。如上所述,像素代表图像的特征。
加载证据,运行数据漂移模块,并生成数据漂移仪表板。
图 9:检查图像数据漂移的步骤。(图片作者)
下面的图 10 显示了一个甜菜幼苗的原始图像的例子,随后是同一图像的 50 乘 50 大小的表示。
图 10:原始图像和调整大小的图像。(图片作者)
决定这些图像特征数量的“n”的合适值是多少?我们需要确定适合我们正在处理的图像类型的特征数量。我们实验了一些不同大小的数组,对于这个特定的例子,我们发现虽然将图像的大小调整到 5 乘 5 的大小对于人工智能来说是足够的,但是这并没有直观地说明图像的特征。因此,对于这个例子,我们选择将大小调整为 50 乘 50,这样我们可以直观地看到特征。
EvidentlyAI 比较每个特征的分布,并显示带有 p 值的结果,以指示统计显著性。小于 0.05 的 p 值被认为是统计上显著的漂移,并用于确定模型再训练。
使用显式人工智能检测数据漂移
虽然显然人工智能可以告诉我们哪些特征已经漂移,但这些特征的名称在很大程度上是任意的,并且来自为显然人工智能准备图像数据的过程。那么,我们如何直观地评估哪些特征/像素出现了漂移?幸运的是,显然 AI 有用的 Github 知识库有相关代码来识别(特征矩阵中)检测到数据漂移的特征。如图 11 所示,漂移不是真就是假。
图 11:特性漂移矩阵报告。(图片作者)
为了使用上面的真/假值重新创建一个图像,我们简单地将它转换为一个 NumPy 数组,重新整形为原始的 n 乘 n 大小,并显示图像。这一步对于确定漂移在哪里以及这种类型的漂移对我们的模型有什么意义是必要的。
在实验 1 中,我们将训练中的甜菜图像与测试/生产中的甜菜图像进行比较,并期望偏差最小。在这里,这是通常的情况-存在数据漂移,但它只发生在 2.5%的特征中。下图显示了检测到漂移的像素。总的来说,它们似乎在图像中随机分布,没有指向任何更广泛的模式。这在图 12 中可以看到。
图 12:可视化实验 1 中漂移=真的特征。(图片作者)
在实验 2 中,我们比较了测试/生产中的甜菜图像和荠菜图像,并期望看到大量像素的漂移(就像这些幼苗中的叶子形状非常不同)。果然不出我们所料,这是我们检测到漂移的 907 像素的曲线图!此外,看起来特征偏移广泛分布在整个图像中,图像的大块出现显著偏移。这在图 13 中可以看到。
图 13:可视化实验 2 中漂移=真的特征。(图片作者)
绘制上面的图向我们展示了漂移的范围,以帮助我们确定这是否重要,以及是否应该重新训练模型。
显然,人工智能数据漂移仪表板输出
显然,AI 提供了第二种形式,在一个整洁的仪表板中表示数据漂移,说明如何在两个训练和当前/生产数据集中比较所有功能,如图 14 所示。
图 14:实验 1 的数据漂移仪表板片段。(图片作者)
深入研究其中一个没有检测到漂移的特性,我们可以看到图 15 中的数据分布如下。
图 15:从特性 1607 的数据漂移仪表板向下钻取。(图片作者)
在接下来的两组图像中,我们将甜菜的图像与荠菜的图像进行比较,我们看到,显然 AI 在 2500 个特征中的 907 个特征中检测到了数据漂移,如图 16 所示,高达 36%的特征!我们可以立即看出这些图像与训练中使用的图像有很大的不同。
图 16:实验 2 的数据漂移仪表板片段。(图片作者)
针对每个要素的分布比较,显示了相应的 p 值。深入研究数据分布显示了检测到数据漂移的每个功能的以下内容。这可以在图 17 中看到。
图 17:实验 2 的数据漂移仪表板中的特性 1373 的下钻。(图片作者)
分类目标漂移(先验概率漂移)
为了评估我们的分类目标变量的先验概率转移,显然 AI 使用了卡方检验(如上所述),用于评估变量是否来自类似的分布。以下是如何在显然人工智能中创建它们:
图 18:目标在当前(测试/生产)和参考(训练)数据集中的分布。(图片作者)
正如您在图 18 中所看到的,仪表板的输出包含测试的 p 值,以及参考(训练)和当前(测试/生产)数据集的比例,当您将鼠标悬停在图形上时,目标漂移。一些关键驱动因素似乎是训练数据集和生产数据集之间玉米和切割刀比例的巨大差异。
模型性能
显然,AI 也有一个分类模型性能特性,支持二进制和多类分类。要运行此报告,我们需要具有实际和预测目标变量的输入要素。该工具目前支持表格数据,该团队打算为其添加更多功能。该团队还计划扩展对图像和文本数据的支持。下面是如何在 appeally AI 中创建这样的报告:
以下是图像数据的部分输出示例:
图 19:参考(训练)和当前(测试/生产)数据集的性能指标。(图片作者)
正如您在图 19 中看到的,为了评估模型质量,EvidentlyAI dashboard 显示了宏观平均指标,如 F1 得分、精度/召回率和准确性,这对多类问题很有帮助。
图 20:参考(训练)和当前(测试/生产)数据中的类别分布(绝对数量)。(图片作者)
图 21:参考(训练)和当前(测试/生产)数据的混淆矩阵。(图片作者)
图 22:参考(培训)和当前(测试/生产)数据的质量度量。(图片作者)
如图 20、21 和 22 所示,显然 AI 也为我们提供了数据集内类别分布、混淆矩阵和每个类别的质量度量的可视化表示。与上面的情况类似,交互式仪表板是使用 plotly 创建的。像这样的报告对于分析模型运行、运行 A/B 测试、调试以及为可能的再培训确定适当的阈值非常有帮助。
结论
总之,显然人工智能的输出可以用来识别所有表明数据漂移的特征。我们是否需要基于这些特征重新训练 ML 模型完全取决于业务用例以及这些特征对模型的预测或分类有多重要。
至于人工智能本身——鉴于它是一个开源平台,它出色地履行了自己的职责。在调查的两个例子中,它能够识别数据漂移的情况。然而,它更多地是为数据漂移的抽查分析而设计的,而不是为持续的监控系统而设计的。显然,人工智能对于可能不会持续产生产出的模型,或者对于生产中只有很少模型的团队非常有用。
我们计划在以后的博客中提出的一个注意事项是概念转变,一种更难通过标准模型监控技术捕捉的漂移。概念转变是模型设计或目标变量假设的转变,或因变量和自变量之间基本关系的转变。例如,当模型的预测对业务不再重要或不再相关时,或者如果有一个新的可用的重要自变量,而该模型没有考虑到。虽然人工智能显然没有捕捉到这些类型的问题,但没有模型监控平台真的可以,因为概念转变通常必须由业务所有者识别,这取决于模型在业务中扮演的角色。
你可以在 https://github.com/thisisdevanshi/MLOps-Blog 的查看完整代码。
参考
[1]https://www . kdnugges . com/2021/01/mlops-model-monitoring-101 . html
[3]Giselsson 等人,植物幼苗分类算法基准的公共图像数据库 (2017),可从 arXiv 预印本<arxiv.org/abs/1711.05458>获得。
再培训,还是不培训?
让我们分析一下 ML 模型的更新
图片作者。
是时候重新训练你的机器学习模型了吗?
尽管数据科学完全是关于…数据的,但令人惊讶的是,这个问题的答案往往基于直觉。
一些人连夜重新训练模型——因为这很方便。其他人每个月都这样做——这似乎是对的,而且必须有人来选择时间表。或者甚至是“当用户来抱怨的时候”——哎哟!
我们能做得更好吗?
为了更准确地回答再培训的问题,我们可以将其转换为三个。
首先,我们通常应该多长时间重新培训一次给定的模型?我们可以通过查看过去的漂移速度来预先了解我们的再培训需求。
其次,我们现在应该重新培训这种模式吗?我们的模型目前表现如何,有什么有意义的变化吗?
第三,稍微细致一点。我们应该重新培训,还是应该更新模型?我们可以简单地在旧的训练管道中输入新的数据。或者回顾一切,从特性工程到整个架构。
让我们开始吧。
为什么
图片作者。
首先,我们为什么要谈论改变模型?当我们建造它们时,我们确实尽了最大努力。
最明显的答案:机器学习模型会变老。即使没有什么大的变化发生,微小的变化也会累积。我们可以经历数据漂移,概念漂移,或者两者兼而有之。
为了跟上时代,模特应该重新学习模式。他们需要查看更能反映现实的最新数据。
这就是我们所说的“再培训”:将新数据添加到旧的培训管道中,并再次运行它们。
根据域的不同,模型衰减可快可慢。
不同型号的衰减速度不同。(图片由作者提供)。
例如,制造过程趋于稳定。一个质量预测模型可以持续一整年。或者等到第一次外部变化,比如新的原料供应商。
消费者需求可能更加不稳定。每个新一周的数据都可能带来一些你更好考虑的新奇事物。
当然,没有什么是一成不变的。我们已经看到,生产模式需要在每一个生产批次之后进行更新,而销售却保持着令人厌烦的稳定。
在欺诈检测等案例中,我们必须考虑对手。他们可能会很快适应。新型欺诈——我们模型的新概念——会不时出现。
如果模型保持不变,对手可以随着时间的推移适应它。(图片由作者提供)。
以搜索引擎优化为例。坏演员可能会试图玩弄系统。在这种情况下,模型再训练可能有双重原因。首先,我们这样做是为了保持排名质量。第二,解决这种不想要的行为。
即使排名质量保持不变,更新也是有意义的!目标是通过改变系统运行的方式使适应变得更加困难。
在实时系统中,我们可能非常关心最近的反馈。
推荐模型需要对最近的用户反馈做出反应。(图片由作者提供)。
考虑音乐推荐。如果用户否决了几首歌曲,推荐引擎应该在几秒钟内做出反应。
这并不意味着模型不再有效。我们不必总是完全重新训练它!但是我们需要考虑最新的口味。
例如,我们可以重新平衡用户偏好的权重。我们可以降低特定口味的重要性,提升其他口味。这种调整在计算上很快,我们可以在运行中完成。
这只是几个例子。不同的车型有不同的保养需求。它们从微小的在线校准到完全的离线更新或者两者的结合。有些模型漂移很快,有些没那么快。我们可以每天运行我们的培训管道,或者每月运行一次。
我们无法为所有型号和应用定义一个通用的时间表。但至少当谈到常规模型“老化”时,我们可以用一种系统的方式来解决它。
我们将在下面描述这种方法。
在更复杂的情况下,您可能需要修改它——使用这些检查作为灵感!
第一部分。预先确定再培训策略
图片作者。
我们的第一个问题来了。我们应该多长时间对模型进行一次再培训,这到底有没有必要?
像往常一样,我们可以从数据中学习!
为了制定时间表,我们可以做一些检查。根据您的模型的关键程度,您可能会经历其中的一些或全部。
检查#1。模型需要多少数据?
图片作者。
是的,学习曲线。
我们的目标是首先了解我们需要多少数据来训练模型。我们可能拥有太多,也可能太少。
在讨论再培训之前,这是一个需要检查的问题:我们完成培训了吗?
这张支票有很好的副作用。我们可能会减少训练数据量。此外,我们可以了解每个数据块包含多少信号。
我们从哪里开始?
如果你有很长一段时间的训练数据,你可以检查一下是否需要全部。
假设我们有 5 年的历史数据。我们可以看到在完整数据集上训练的模型是否比仅在最近时期训练的模型做得更好。
也许,仅仅一两年的数据就足以得到同样的结果?
在本例中,我们可能决定丢弃 40%的旧数据。(图片由作者提供)。
如果您处理时间序列数据和已知的季节模式,您可能需要自定义测试设计。但是在很多数据丰富的情况下,这种粗略的检查有助于方便地减少训练样本的大小。
你也可以直接进行更细致的测试。
当没有明显的数据过剩时,这一条是有意义的。或者当数据不是连续的时候:我们可能只是有一组带标签的对象,比如图像或文本。
那我们该怎么办?
这种检查类似于我们在梯度方法中定义训练迭代次数的方式。或者在模型验证期间选择集合中的树的数量,例如在随机森林算法中。
这是一个复习:为了达到一个最佳的数字,我们评估的替代品。我们挑选最小和最大数量的树。我们定义步骤。然后,我们检查所有选项的模型质量。当然,要注意交叉验证!
接下来,我们绘制模型质量如何依赖于树的数量。在某种程度上,它到达了一个平台:添加更多的树并不能提高性能。
我们可以采用这种方法来检查增加更多的数据是否会提高模型质量。
在这种情况下,没有时间维度。我们将训练集中的每个观察视为一个单独的条目。想象一个带标签的图片,一个信用申请人,一个用户会话,等等。
图片作者。
如何进行?
- 获取可用的培训数据
- 修复测试集
- 选择初始训练数据大小—可能是一半,也可能是 10%
- 定义步长-要添加的训练数据量
- 开始倒吧!
我们可以使用随机分割方法,并通过改变训练规模来执行交叉验证。这个想法是评估数据量对模型性能的影响。
在某些时候,我们可以到达一个平台期,然后就到此为止。增加更多的数据无法改善结果。
图片作者。
我们可以回过头来决定训练一个足够好的模型所需的最佳样本量。如果它比我们拥有的训练集小,我们可能会很高兴丢弃“额外的”数据。这使得训练更加轻便。
或者,我们可能还没有到达顶峰!如果质量不断提高,我们的模型需要更多的数据。
图片作者。
提前知道这一点真好!
检查模型衰减的速度还没有意义。我们仍处于改进阶段。假设获得更好的模型具有商业意义,我们应该在这方面努力。
也许,我们可以得到更多的标签数据?否则,做好持续改进和频繁再培训的准备——直到我们达到最佳表现。
通过外推结果,我们还可以粗略地估计我们需要多少实例来达到目标质量。这是一个来自 Keras 教程的图像分类案例。
作为一个副作用,这个练习给了我们一种“尺度感”模型质量变化有多快?需要 10 次观察还是至少 100 次?获取如此大量的新数据需要几天或几个月吗?
当我们对衰变和再训练进行更多的分析时,它将帮助我们选择一个合理的“步骤”。
这个检查本身并没有告诉我们多长时间重新训练一次模型。为什么?并非所有的数据都同样有用。比如说,更多“有价值”的数据可能只在周末到达。当我们混合数据时,我们忽略了这个因素。
还有一些检查要进行。
继续下一个!
检查#2。生产过程中质量下降的速度有多快?
图片作者。
这是另一个有用的启发。
让我们假设有一个平均的,预期的漂移速度。这可能是用户口味演变或设备磨损的速度。
然后,我们可以回顾我们的数据,并对其进行评估!
我们可以根据旧数据训练我们的模型,并将其连续应用到后期。
然后,我们将计算我们的模型在“变老”时表现如何目标是检测模型性能何时显著下降。
这种单点估算已经可以降低不确定性。我们可以粗略估计我们的模型老化的速度:是一周还是一个月?或者更多?
在本例中,我们仅在 3 个时间间隔后观察到性能下降。(图片由作者提供)。
如果我们有足够的数据,我们可以重复这个检查几次,改变初始训练集。然后我们可以对结果进行平均(考虑异常值,如果有的话!)
这样,我们可以得到更精确的评估。
图片作者。
当然,在练习过程中,模型训练方法应该保持不变。否则,模型参数对衰减的影响可能大于环境的变化。
警告:如果您的数据中有一些重要的子群体,您可能希望将这些子群体的模型质量作为一个单独的指标来检查!
测试结果可能会有所不同。有时,你会发现你的模型非常稳定:即使是 6 个月大的模型也能和新模型表现一样好!
在其他情况下,你会看到模型衰减很快。
有些型号可能会很快过时。(图片由作者提供)。
如果这很难处理,你可能会决定重新考虑你的训练方法。
一些可供考虑的选项:
- 使模型更“重”但更稳定。例如,添加更多数据源或执行更复杂的特征工程。该模型表面上看起来性能较差,但从长远来看更加稳定。
- 让模特更有活力。在较短的时间内训练模型,但要经常校准(每小时一次?)或者考虑主动学习。
- 分别解决模型缺陷。模型可能只在特定的部分快速退化。我们可以有选择地应用模型来排除那些(查看本教程中我们解释的想法!)并使用一些非 ML 的方法。也许,依靠良好的旧规则或人在循环中?
如果我们已经决定了结果,让我们写下数字!这个预期的衰减速度是我们再训练方程中的一个关键变量。
估计过去的漂移总是有意义的吗?
不总是。
背后的假设是世界变化的渐进速度。
有些问题本质上是模式动态的。(图片由作者提供)。
如果您正在创建一个图像模型来检测路标,那么问题是另一种类型的。你必须小心黑暗和嘈杂图像的“长尾”,但实际的迹象几乎没有变化。
文本模型也是如此,比如情感分析或实体提取。他们仍然需要更新,但很少遵循时间表。与其检查衰退的速度,不如寻找表现不佳的部分并监控变化更有意义。
其他情况更可预测动态。思考消费者行为、移动模式或电力消耗等时间序列问题。
假设一定的变化速度通常是有意义的。查看过去的漂移来估计模型退化的速率也是如此。
这些数据经常带有时间戳。你可以很容易地跳上“时间机器”进行计算。
检查#3。你多久收到一次新数据?
图片作者。
我们大概了解了我们的再培训需求。但是有一个问题。我们能重新训练它吗?
要运行再训练管道,我们需要知道目标值或者有新标记的数据。
如果反馈很快,这不是问题。
但是有时候,会有延迟。我们可能需要专家贴标签。或者,干脆等着!
检查哪个先出现是有意义的:新数据还是模型衰退。
图片作者。
这主要是一个业务流程问题:数据生成的速度有多快,以及它何时到达您的数据仓库。
比方说,我们了解到,从历史上看,我们的销售模式会在两周内降级。但是实际零售额的新数据每月只收集一次。这限制了我们的再培训能力。
我们能弥补吗?一些可供考虑的选项:
- 一连串的模型。有些数据是否可以更早得到?例如,一些销售点可能会在月底前交付数据。然后,我们可以创建几个具有不同更新时间表的模型。
- 混合模式集合。我们可以组合不同类型的模型,以更好地应对衰退。例如,使用销售统计数据和业务规则作为基线,然后在其上添加机器学习来纠正预测。粗略的规则可能在接近期末时表现得更好,这将有助于保持整体性能。
- 重建模型使其更加稳定。回到训练!我们也许可以用测试性能的一些数字来换取更慢的退化。
- 调整预期。模型有多重要?我们可能会接受现实,顺其自然。只是不要忘记传达现在预期的性能指标!在第一个测试周,这款车型将无法实现其全明星表现。
图片作者。
这对我们的再培训计划意味着什么?
此时,我们可以进入两种情况之一:
- 我们追求的是车型质量。它降级的速度比新数据进来的速度快。我们没有太多的选择。每当有足够大的数据到达时,我们应该重新训练模型。
- 你有一个新数据点队列。我们很快获得新数据,但我们的“旧”模型仍然表现出色!我们需要决定是否更频繁或更少地对其进行再培训。
如果我们有这种选择时间表的奢侈,我们最终会得到这个问题。
检查#4。你应该多长时间再培训一次?
图片作者。
到目前为止,我们对我们的模型轮廓已经略知一二了。
让我们考虑一个具体的例子。
- 我们的型号足够好。不需要一直更新它来变得更好。
- 通常大约需要 60 天才能看到业绩下滑。
- 新标记的数据在每周的结束时出现。
那么,确切地说,我们应该计划什么时候对它进行再培训呢?周刊?每月?每 60 天?
当然,你可以选择一个数字。过度的再培训也有不好的一面(稍后会有更多的介绍!)但不应该使模型变得更糟。
也就是说,我们可以做出更具分析性的选择。
我们可以像以前一样遵循类似的方法。在这种情况下,我们从衰减点之外选择测试集。然后,我们在性能稳定期间运行我们的实验。
我们开始以较小的增量添加更多的数据:在我们的例子中是一周接一周。
我们的目标是检测测试集的质量何时开始提高。
图片作者。
我们可能学到的是,在小桶中添加数据并不总是会改变结果。
例如,用每日数据重新训练模型对测试性能没有影响。我们需要几个星期才能看到结果。
更频繁地重新训练模型是没有意义的!
这通常是由于同样的“数据有用性”现象可能会有季节性模式或随着时间的推移积累的罕见事件的临界质量。该模型需要更多的数据来捕捉这些变化。
训练窗口的现实选择可能比看起来要小。
图片作者。
要做出具体选择,您可以考虑每个新铲斗带来的改进程度。在等式的另一半,考虑频繁再培训的成本和麻烦。
你也可以重复检查几次,看看什么时候你得到了一个有意义的平均质量增益。
或者是——在这条更窄的走廊里选一个数字。
频繁再培训有什么问题?
人们可以说:原则上,这不应该造成伤害。
我们为什么要自寻烦恼?比需要更频繁地更新模型有什么问题?
原因是,它增加了复杂性和成本,并且经常容易出错。
不要修复没坏的东西:这句格言也适用于机器学习。
并非每一次型号更新都是火箭发射,但它们也不是免费的。(图片由作者提供)。
更新是有代价的。
这涉及到直接的计算成本。有时候,贴标签的。然后,需要团队的参与!
是的,您可以自动触发更新。但是想象一下,一个新的模型在验证过程中由于数据问题或微小的质量下降而失败。这个团队会急于解决这个问题!
这是一个非常不必要的干扰——当这个模型不需要重新训练的时候。
并不总是只有数据科学团队参与其中。
新模型可能需要其他利益相关方的签署。这可能意味着整个验证过程!这增加了相当一部分组织和合规成本。
图片作者。
最后,我们需要证明架构决策的合理性。
如果我们还没有建立再培训管道,我们需要决定我们需要的系统有多复杂。
如果我们每个季度只对我们的模型进行一次再培训,我们可以得到一个更简单的服务架构。如果我们需要每日更新,我们应该预先投资一个更复杂的工具集。我们最好这样做,知道预期的质量提升!
当然,如果您已经有了一个高级的 MLOps 平台,计算成本很低,并且用例并不重要,您可能会放弃所有这些顾虑。
否则,更精确地维护模型是值得的!
检查#5。您应该丢弃旧数据吗?
这是额外的一个。
让我们假设我们为模型再训练定义了一个合理的时间表。具体应该怎么执行呢?我们应该接受新数据,放弃旧数据吗?该不该留“尾巴”?
这也是我们可以思考的问题。
假设我们的模型配置文件如下所示:
- 我们在培训中使用了 6 个数据“桶”。
- 该模型在接下来的 3 年中表现良好。
- 然后,在第四个阶段质量下降。
- 我们决定在每两个新的“桶”数据之后进行再训练。
图片作者。
让我们保持再培训计划不变。那就两桶吧。我们知道他们带来了我们需要的质量提升!
然后,我们可以尝试逐桶排除旧数据。我们的目标是评估这些“旧”数据对性能的影响。
这类似于我们考虑从初始训练中排除旧数据时的第一次检查。但是现在,我们使用一个定义好的测试集(具有已知的衰减)和一个更精确的步骤(考虑丢弃几个月的数据,而不是几年的数据)。
图片作者。
我们能得到哪个结果?
丢弃旧数据会让模型变得更糟。好吧,让我们暂时保留这一切吧!
丢弃旧数据不影响质量。需要考虑的事情:我们可以让模型更新更加轻量级。例如,我们可以在每次添加新数据时排除一桶旧数据。
丢弃旧数据提高质量!这些事情发生了。我们的模型忘记了过时的模式,变得更加相关。这是需要知道的一件好事:我们在一个快速变化的世界中运营,模型不应该太“保守”!
我们可能会研究更复杂的组合:
- 保留代表较少的人群和小类的数据。丢弃过去的数据可能会不成比例地影响不太受欢迎的类的性能。这是一个重要的事情来控制。你可能会决定有选择地删除旧数据:删除经常使用的,保留不常用的。
- 为较新的数据分配较高的权重。如果旧数据使模型变得更糟,您可能会决定降低其重要性,但不会完全排除它。如果你觉得有创造力,你可以针对不同的课程以不同的速度去做!
听起来很复杂!我需要这些吗?
图片作者。
看情况。
规划你的再培训绝对有意义。你想要多精确?您的用例将比其他任何东西更能定义它。
一些模型是轻量级的,使用很少的数据,在生产中不会造成重大风险。这里没什么好想的!只需要一两次健全检查就可以了。
其他的非常关键,需要广泛的治理和详细的计划来维护它们。额外详细地研究你的模型行为可能是个好主意。
这两种估计都不是精确的方法。但所有这些在从业者的食谱中都是有用的启发。
与往常一样,分析最好与常识和适当的假设相结合!
第二部分。监控运行中的模型性能
接下来是第二部分。
直到现在,我们一直在研究过去。一旦模型被激活,我们就进入野外!
时间表是有帮助的,但不是绝对可靠的。在模型操作的过程中,事情可能会发生变化。
我们如何知道是时候更新生产中的模型了?
监控!合理规划之上的现实检查。
我们需要评估实时数据的性能,并将其与我们的基准进行比较。这通常是过去一段时间的训练数据。
这样,我们就能知道是否比计划的更早进行干预。或者相反,跳过一个更新,所有的事情都考虑到了。
到底要找什么?
检查#1。监控性能变化
图片作者。
如果很快了解了基本事实,就可以计算实际的性能指标。
这可以是一个回归模型的平均误差率,或者是一个概率分类模型的精度。理想情况下,应该添加一个业务指标来直接跟踪模型对 it 的影响。如果你有特定的重要部分,也要关注它们。
你可以设置一个仪表盘和监控阈值,以便在出现问题时提醒你,或者设置自动再培训的触发器。
显然 仪表板:需求预测模型的错误监控。
设置阈值通常是用例特有的。有时,即使很小的下跌也会导致商业损失。你可以确切地知道每一个准确率要花费你多少钱。在其他情况下,波动没那么重要。
在初始性能评估期间设置这些阈值是有意义的。哪个质量下降够严重?了解了业务案例,您就可以明确什么值得关注——以及再培训工作。
此时,您还可以使用新记录的数据重新运行之前的一些检查。
你的离线训练数据总有可能不能完全代表真实世界。您可以验证您对模型衰退的评估与实际事态的匹配程度。
如果您在模型评估中使用黄金集,您可能还需要检查和更新它。动态数据可以带来您希望模型能够很好处理的新的极限情况或分段。
检查#2。监控数据的变化
如果你不能立即得到事实真相呢?
我们可能会再次被困在等候室:期待实际值或新标签。当这种情况发生时,我们只剩下故事的前半部分:数据!
图片作者。
知道了输入数据和模型响应的形状,我们就可以评估两者与训练相比有多么不同。
假设您每月运行一个模型,为您的客户选择合适的营销方案,并将其传递给呼叫中心团队。您可以从检查输入数据的统计漂移开始。
如果输入数据的分布保持稳定,您的模型应该能够处理它。在大多数情况下,甚至不需要更新模型。它没坏!
显然 仪表盘:在特征分布中没有检测到漂移。
如果检测到漂移,它会发出预警。你可能会重新思考如何根据预测采取行动。例如,您可能决定在您的概率分类中设置一个不同的决策阈值或排除一些片段。
如果您可以获得新的标记数据并重新训练,那么是时候这样做了!
关键特征的漂移通常先于可见模型的衰减。在本教程中,我们举例说明了这个例子。在模型性能失控前几周,关键特征发生了变化。
这就是为什么即使新标签来的很快,你也可能想要关注数据漂移。
对于高度关键的模型,这是一个方便的提前通知。
第三部分。再培训与更新
假设我们尽了最大努力为模型衰变做准备。我们得到了正确的估计,以确定再培训计划。我们构建了警报来检测实时变化。
但当它们发生时,我们只剩下最后一个问题。到底要怎么行动?
默认的想法是保持你的模型不变,并给它注入新的数据。这是我们在检查最佳训练窗口时的假设。
丢弃一些旧数据,添加一些新数据,重复相同的训练管道。在任何性能下降的情况下,这是一个合理的步骤。
但它可能并不总能解决问题!
图片作者。
如果我们面临重大转变,我们可能需要重新思考我们的模型。想象一个重大的外部变化,比如面对一个全新的客户群。
也许,我们需要调整模型参数或者改变它的架构?审查预处理或后处理?重新加权数据以优先考虑最近的例子?构建一个集合来解释新的细分市场?
在这里,它更像是一门艺术,而不是科学。解决方案取决于用例、变更的严重性以及数据科学家的判断。
奖牌的另一面是:我们也许能够改进这个模型!我们本可以从更简单的限量款开始。随着收集的数据越来越多,我们也许能够重建它并捕捉更复杂的模式。也许,还会从其他来源添加新功能?
警告:这个新模型可能有不同的衰变曲线!
为了做好这两方面的准备,我们需要三样东西。
首先,记住更新选项。
如果天真的再培训是唯一考虑的选择,我们可能会完全错过维护模型的其他方法。安排一些定期的时间来检查现有模型的改进潜力是有意义的。
其次,建立模型分析实践。
这是什么意思呢?让您的模特行为更加清晰可见!
不仅仅是像 ROC AUC 一样的单一性能指标。我们可以搜索表现不佳的部分、数据中的变化、特征相关性、模型错误中的模式等等。
图片作者。
要获得这些见解,您可以向您的监控仪表板添加更多视图。或者,在预定的模型检查期间分批进行深潜。
有一个清晰的背景有助于区分实验的优先次序,并知道如何行动。
第三,设计沟通渠道。
数据并不总是“自己”改变
假设您的业务涉众正在计划对您的模型所涉及的流程进行更新。在您的监控中,您不应该将一个新的产品线作为“突然的数据漂移”来了解!这是你可以被告知为“更冷”的开始准备模型的事情。
模型更新和再训练可能依赖于这样的外部触发器:业务决策、直接请求、数据存储过程中的变化。应该有办法精简那些!
图片作者。
总结
那么我们应该什么时候重新培训我们的模型呢?
为了找出特定用例的答案,您可能需要考虑一些事情。
1。计划定期再培训。我们可以衡量再培训的必要性和可能性,并选择最佳的再培训策略,而不是随意制定时间表。
2。监控实际性能。我们应该关注生产模式。我们可以及时检测到衰变并进行干预,否则就会感到安心。
3。分析一下。简单的再培训并不是唯一的选择。通过获得模型性能的详细可见性,我们可以决定如何准确地响应变化
最初发表于https://evidentlyai.com并与 埃琳娜·萨穆伊洛娃 合著。
在 appeally AI,我们创建了开源工具来分析和监控机器学习模型。在 GitHub 上查看我们的 项目,如果喜欢就给它一颗星吧!
想留在圈子里吗?
去胭脂还是不去胭脂?
实践教程
…为什么我称之为抽象文本摘要的代理度量。
作者图片
在本文中,我们将了解…
…提取和抽象文本摘要之间的区别。
…胭脂的分数是多少。
…失败的原因和原因。
文本摘要
我们将文本摘要称为训练人工智能(AI)模型以从较大文本块中产生较小文本块的过程。其中“较小的块”可以是人类可以总结的任何东西——标题、关键事实、结果、较大块的本质等等。
作者图片
我们怎么知道机器写的摘要是好是坏?
…坦白地说,好或坏到底意味着什么。
在回答这个问题之前,我们先来谈谈总结。
提取与抽象
人类和现在的机器可以做两种类型的文本摘要[1]。
- 提取:直接从文本中提取单词和短语。
- abstract:生成语义一致的词和短语,确保原文的关键信息得以保留。
“举个例子怎么样”你在想?我知道,我有时会读心术。;)
作者图片
如你所见,后者——抽象概括,更类似于人类写总结的方式。由于这种复杂性,它的可行性真正依赖于人工智能和深度学习的进步[2]。
使用 ROUGE 进行评估
在实践中,一个最常用的度量标准是所谓的 ROUGE score (面向回忆的 Gisting 评估替角)[3]。
计算胭脂分数的算法考虑连续的记号,也称为 n 元文法。将来自一个文本(例如,人类编写的摘要)的 n 元语法与另一个文本(例如,机器编写的摘要)的 n 元语法进行比较。n 元语法的大重叠导致高胭脂分数和低重叠——低胭脂分数。ROUGE 有多种变体,如单字母组合、双字母组合、最长公共子序列等。还有胭脂精度,召回和 F-score [4]。
ROUGE 是抽象总结的代理指标。
当目标是抽象摘要时,ROUGE 最好仅用作机器编写的摘要与人类编写的摘要有多少重叠的初始指示符,因为它没有考虑摘要的语义含义和事实准确性。
对于文本摘要,我们想要查看最长公共子序列(ROUGE L ),因为这将给我们最长的重叠。
我们来看一个例子!
在下面的图 1 中,我们可以看到左上角首先是人工编写的摘要,然后是机器编写的摘要。
这两个词有相当好的重叠,因此我们可以看到胭脂的分数很高(79%)。并且机器生成的摘要在语义上也是准确的。所以这太棒了!——胭脂给了我们一个很好的暗示。
图 1:高胭脂&语义准确(图片由作者提供)
在下一个场景中(图 2 ),我们再次在左上角看到了人类和机器编写的摘要。然而,这一次当我们仔细阅读机器编写的摘要时,我们可以看到,实际上机器弄错了——是狐狸跳过了狗,而不是狗跳过了狐狸!
我们看到,这里 ROUGE 未能给我们一个好的指示,因为它仍然显示机器编写的摘要的高 ROUGE 分数(77%),但该摘要实际上是不正确的。
图 2:高胭脂,但语义不准确(图片由作者提供)
这里是我们的最后一个场景(图 3 ),其中机器生成的摘要事实上是正确的,但 ROUGE 分数没有给我们一个好的指示(55%),因为它告诉我们摘要是平庸的。
图 3:胭脂较低,但语义准确(图片由作者提供)
如果你对抽象的摘要感兴趣,那么你不能期望人类编写的摘要中有很多单词和短语与机器编写的摘要重叠。
要重现这些结果你可以使用这个胭脂库。
所以,去胭脂还是不去胭脂?
当处理抽象概括时,我们应该使用 ROUGE 度量来获得对重叠的感觉。为了语义和事实的准确性,我强烈建议你总是咨询人类编写的摘要领域的主题专家!
开放式问题
- 我们如何度量抽象性/可提取性?—请继续关注我的下一篇博文。;)
- 你能推荐任何表明语义和事实准确性的工具吗?—这对于 NLP 社区来说仍然是一个挑战[5,6]。
- 总结模型呢?—您可以找到不同摘要模型的概述,以及它们在 NLP Progress 中相对于其他模型的排名[7]。
- … ?
资源
[1] Abigail See 等,“驯服递归神经网络以获得更好的摘要”,2017。http://www . abigailsee . com/2017/04/16/taming-rnns-for-better-summarying . html
[2]马頔·苏莱曼等,“基于深度学习的抽象文本摘要:方法、数据集、评估措施和挑战”,工程中的数学问题,第 2020 卷,文章 ID 9365340,29 页(2020)。https://doi.org/10.1155/2020/9365340
[3]李金耀,“胭脂:一个用于自动评价摘要的包”(2004)。https://www.aclweb.org/anthology/W04-1013.pdf
[4]卡维塔·加内桑,《胭脂入门,以及如何用它来评价摘要》(2017)。https://www . freecodecamp . org/news/what-is-rouge-and-how-it-works-for-evaluation-of-summaries-e 059 FB 8 AC 840/
[5]张宇慧等人,“对抽象概括中事实正确性评估的仔细检查”(2020)。https://web . Stanford . edu/class/archive/cs/cs 224n/cs 224n . 1204/reports/custom/report 53 . pdf
[6] Kryscinski,w .等人,“评估抽象文本摘要的事实一致性”(2020)。 ArXiv,abs/1910.12840 。
[7]塞巴斯蒂安·鲁德,《总结》, NLP 进展。http://nlpprogress.com/english/summarization.html
为了加速你的学习,选择困难的项目
作者聚焦
找到你的定位,写作如何既是多人游戏又是单人游戏,以及为什么我们都需要更多地考虑 ML 系统
在 Author Spotlight 系列中,TDS 编辑与我们社区的成员谈论他们在数据科学领域的职业道路、他们的写作以及他们的灵感来源。今天,我们很荣幸地邀请到埃利奥特·冈恩https://medium.com/u/aad1101621dd?source=post_page-----c0943d1fe27d--------------------------------*与尤金·严* 进行对话。
照片由尤金·严提供
Eugene Yan 设计、构建和运营机器学习系统,为大规模客户提供服务。他目前是亚马逊的应用科学家。此前,他在 Lazada 和 uCare.ai 领导数据科学团队。他在eugeneyan.com撰写和谈论数据科学、数据/ML 系统和职业发展,并在 @eugeneyan 发布推文。
你选择了一条相当有趣的职业道路进入数据科学领域。从获得心理学学位进入该领域,到在 Lazada 获得“火箭”角色,现在是亚马逊的应用科学家。你能分享一下你是如何进入这个领域的吗?
我不记得是从数据科学开始作为职业目标的。当时,我最感兴趣的是人们如何感知、决定和行为。这也是我当初进入心理学的原因。毕业后,我最初的目标是成为一名工业和组织心理学家,帮助人们在工作中更有效率、更快乐。不幸的是,没有任何角色适合应届毕业生(也许我不够好,哈哈)。
我最终加入了新加坡贸易和工业部。我专注于投资方面,试图让公司投资海外变得更容易、更安全。它主要涉及谈判投资和自由贸易协定,分析法律文本,研究仲裁案件。旅行是令人兴奋的,但过了一会儿,我开始怀念与数据打交道的日子。
在空闲时间,我参加了统计学、SQL 和 r 的在线课程。我还参加了初级数据职位的面试,并最终在 IBM 找到了一份数据分析师的工作。第一年,我主要从事分析项目,比如构建供应链仪表盘,为品牌搜集和分析 Twitter 数据。一年后,我有机会加入劳动力分析团队,从事工作需求预测和构建内部工作推荐引擎。这项工作与我最初的目标相似,即利用数据帮助工作中的人们,只是我花了更长的时间来实现这一目标。
尽管如此,另一个机会来了,那就是加入一家电子商务初创公司(Lazada)。我很好奇在政府和 IBM 工作过之后,在一家初创公司工作会是什么样的,于是我采取了这个行动。我已经写了关于那是如何发生的,这里就不赘述了。(Lazada 最终被阿里巴巴收购,又在一家医疗科技初创公司工作了一段时间后,我加入了亚马逊。)
你特别自豪的一个项目是什么?
我的第一个自学项目永远是我的最爱。为了那个项目,我用从亚马逊搜集的数据建立了一个 ML 系统来给的产品分类——根据标题分成数千种类别。机器学习方法是贝叶斯信息标准(Bayes-ic ),但它工作得很好(前 3 名的准确度为 0.965)。它最终演变成包括图像分类和图像搜索。(Lazada 也使用其中的一部分来帮助卖家对产品进行分类。)
我为这种努力感到自豪,因为当我开始时,我对机器学习和编程几乎一无所知,不得不(很大程度上)努力让它工作。为了训练和部署模型,我必须学习如何使用 AWS EC2、S3 和 Route53。为了服务我的模型,我不得不学习如何将它包装在 Flask 应用程序中,用 Bootstrap 和 HTML 构建一个基本的前端,并用 Nginx 处理。对于图像分类和搜索,我不得不学习如何将深度学习应用于计算机视觉,以及如何使用预先训练好的模型(例如 VGG 、 ResNet )进行迁移学习。
我花了很多周末在 Python、 Theano 、HTML、AWS 等上面纠结。我在这个项目上倾注的巨大努力可能解释了为什么我对它如此自豪。我从那个项目中学到的东西极大地促进了我的学习,并且也提高了我的工作效率。
寻找有“酒窝”的相似沙发(图片由 Eugene Yan 提供)
你已经写了许多文章,涵盖了各种各样的主题,从一个数据科学组合展示了什么,到在生产中维护模型,以及一系列工业中的 ML 学习系统指南。你创作如此多产的过程是怎样的?
我在笔记的某个地方列了一个潜在主题的清单。每当一篇文章有了灵感,我就会添加进去——它实际上只是一个标题列表。例如,一位朋友最近感叹教育利益相关者机器学习能做什么和不能做什么的困难——我认为这将是一个有趣的话题,并将其添加到列表中。我也通过我的话题调查和 AMA 得到问题,并和朋友聊天。
只是在那个单子上草草记下标题,就让我注意到了。当我遇到相关的材料或参考资料时,我会把它们加在这些标题下。标题可以在这个列表上停留几个月或几年。可能有一半不会发展成文章,因为我可能会发现我没有什么新奇的东西可以贡献出来。
每周一次,我会选择一个我最感兴趣的话题去探索。在这一周的早些时候,我写了一个作品的基本大纲,主要是使用为什么,什么,如何的结构。我的目标是把想到的东西都写进草稿里,而不是关心语言、内容、来源等等。这大约需要一到两个小时。
第二天,我浏览了一下大纲,然后试着凭记忆重写。这迫使我重新组织思路和内容。有时,细节或整个章节被忽略了——这表明它们对论文来说并不重要。尽管如此,我还是比较了我以前的大纲和新大纲,以确保新大纲更好,并且我没有排除任何重要的东西。我在不同的日子里迭代一两次大纲,每次花一到两个小时。但是如果我对那个主题的想法特别模糊,我可能需要三四次迭代。
不管大纲是什么状态,周六早上我就开始把大纲转换成散文。到这个时候,大纲已经相当详细了,只需要把要点改写成句子和段落。这需要五到十五个小时。一旦完成,我编辑一次语法和拼写,另一次可读性。我总是在星期天晚上装船。
写这样的文章,你最喜欢的事情是什么?
我喜欢写作迫使我研究、学习和总结我的想法,尤其是像拆卸和调查这样的技术性更强的作品。写作是一种无价的学习技巧。当我尝试写作时,我的知识出现了缺口。这导致我在完成作品之前需要更多的研究和学习。
我也喜欢写作帮助我反思、收集和组织我的想法。这主要适用于我根据经验撰写的文章,比如阅读论文的好处和如何在生产中维护 ML 系统。当需要我再次宣讲这些话题时,我会深入思考,甚至有一个分享的网址。
关于写作,我最喜欢的是它的可伸缩性。写作是 O(1)。写给一个人或者一万个人都是一样的努力。当我被多次问及同一个问题时,我会尝试写下这个问题(例如,如何编写 ML 设计文档,各种数据/ML 角色的区别)。作为额外收获,我的写作让我结识了新朋友,如其他 ML 从业者、风投、初创公司创始人等,并带来了几个有趣的机会。
你希望更多地看到 DS/ML 中的哪种写作?
我是一个务实的人,喜欢实用的内容。我喜欢能从别人的成功或错误中学习并应用到工作中的内容。这就是为什么我策划了 applied-ml 库。当我设计自己的 ML 系统时,阅读其他公司如何处理和解决 ML 问题很有帮助。尽管如此,我还是希望人们能分享更多关于失败的东西。也许不是每一个失败的实验,但是关于如何而不是解决问题的一般经验将会是一个很好的节省时间的方法。
我也喜欢作者包括消融研究的论文。令人惊讶(也有点悲哀)的是,我们可以用深度学习做很多事情,但对它如何学习却知之甚少。
同样,我喜欢关于人工智能系统的具体细节的内容,其中作者分享了机器学习、工程和产品如何结合在一起,来构建一些帮助人们的东西。我们需要更多这样的案例研究类型的内容来帮助社区学习如何有效地应用 ML。
你有一个非常全面的写作哲学。随着越来越多的工程师开始写作,你对希望提高写作水平并在网上脱颖而出的读者有什么建议?
开始吧。开始吧。
对此,我通常会得到两种回答:“如果我写得不好怎么办?”或者“但是我还没有找到自己的定位!”
不用担心你写的不好。事实是,几乎没有人会去读你的前十几篇文章(除非你在像数据科学这样的大刊物上写作😉).所以跳舞吧,就像没有人在看一样,写作吧,就像没有人在阅读一样。开始的时候,你在写练习。
同样,你也不会光靠思考就找到自己的定位。你通过写很多,把它放在那里,看看有什么共鸣来找到它。也许在 20 首左右之后,你回头看,会发现主题从你的作品中浮现出来。你只能向后看才能把这些点联系起来——最好的方法是通过持续运输来获得大量的点。
“你无法把向前看的点点滴滴串联起来;你只能回头看才能把它们联系起来。—史蒂夫·乔布斯
也就是说,我学到了一些关于写作的经验,让写作变得更容易、更愉快。我之前已经详细地写过这个问题,我将在这里分享其中的要点:
- 写作是 80%准备,20%写作。
- 写作对每个人来说都很难。
- 你没有找到自己的定位;你的利基找到你。
- 你的写作如果没用就一无是处。
- 你的声音不是你怎么写的;你的声音就是你。
我觉得你的作品在网上不突出也没关系。写作既是多人游戏,也是单人游戏。这是一个多人游戏,其他人可以参与并分享你的作品,给你反馈,和你交朋友。这是单人游戏,因为当你写作时,你在学习,深入思考,理清你的想法。不管多人游戏的结果如何,你总是赢得单人游戏。
你对未来几年的 DS/ML 社区有什么希望?
我希望看到社区更多地考虑 ML 系统——而不仅仅是 ML 模型——以及事物的生产方面。我有一种感觉,现在,大多数人认为培训和获得良好的验证结果是终点线。
然而,要让你的模型产生影响,还有很多工作要做。您必须建立数据管道,协调和安排它们,部署、测试、监控、扩展基础架构的延迟和吞吐量,制定数据隐私、安全、随叫随到等政策。所有这些都需要时间,很容易是训练和验证原型模型时间的 20-100 倍。
"原型具有生产版本中没有的额外功能。"(链接到的推文)
在你发货后,这只是一个起点。你必须保持它的可持续性。想象一下,每季度发布一次 ML 应用程序。一年后,您将有四个应用程序需要维护——在没有太多运营负担的情况下,您将如何做到这一点?
我也祝愿更多的数据科学家专注于问题公式化。例如,要识别社交网络上的滥用,你可以把它框定为一个受监督或不受监督的问题。受监督的方法需要高质量的标签。无监督方法有多种风格,如离群点检测(如隔离森林)或网络分析(如不良因素的图形聚类)。
我们如何构建问题对结果有着巨大的影响。这也适用于选择正确的阳性标签和阴性标签—阴性采样是一门晦涩的艺术。思考你的损失函数如何与你的离线验证指标(recall@k,nDCG)相关联,以及如何与在线 A/B 测试指标(点击、转化)和下游业务指标(收入、客户终身价值)相关联,也是很有用的。
想了解更多关于 Eugene 的工作和数据科学兴趣的信息吗?他邀请你在他的 AMA 上发表任何问题。你会在他的媒体简介,在他的网站,以及他的推特账户上找到他的文章。以下是我们最近最喜欢的一些。
- 你真的不需要另一门 MOOC ( TDS ,2021 年 5 月):尤金解释了及时学习如何比参加另一门在线课程更有效。开始做一个项目,让挑战引导你的下一步。
- Chip Huyen 谈她的职业、写作和机器学习 ( TDS ,2021 年 3 月):尤金是一位优秀的采访者,他和 Chip Huyen 分享了一次聊天,内容是她如何应对挑战以及写作如何改变她的生活。
- 数据发现平台及其开源解决方案 ( TDS ,2021 年 3 月):着眼于解决数据可发现性问题的关键特性。
请继续关注我们即将推出的下一位专题作者。如果你对你想在这个空间看到的人有建议,请在评论中给我们留言!
称重还是不称重——这是一个普通的问题
平均值是一个简单的计算。但有时,还有更多需要探索。让我们浏览一下这个主题,并在 Power BI 中实现这些计算。
介绍
我在学校学会了如何计算平均值:取一串数字,对它们求和,然后用结果除以数字的个数,就大功告成了。
这个计算听起来很简单。
巴勃罗·阿罗约在 Unsplash 上的照片
几天前我发现,平均计算中可能有比预期多得多的东西。
在本文中,我将向您展示平均值计算的一些变体。然后我切换到 Power BI 在 DAX 中执行这些计算。
你介意做一些数学吗?
让我们看看下表中的虚拟销售数据:
图 1 —示例数据(图片由作者提供)
我想按国家和年份计算订单的平均值。最后,我想计算一个总体平均值。
好的,接下来让我们将“销售额”列中的值除以订单数:
图 2 —每个国家和年份的平均值(图片由作者提供)
现在令人毛骨悚然的问题是:我应该如何计算总数?
计算平均值
原来有两种方式,导致了两种不同的结果。
为了缩短表格,我仅按照 2019 年来过滤表格:
图 3 —两个平均值(图片由作者提供)
第一个平均值(549.81)是“订单平均值”列中所有值的平均值。
第二个平均值(550.81)的计算方法是将总销售额除以总订单数。
哪个是正确的?
嗯,两个都是对的。
看你想算什么了。
第一个平均值是四个值的简单平均值,第二个平均值由每个国家的订单数加权。一个国家的订单数量越多,这个国家对结果的影响就越大。
让我们看看 2020 年加权平均的更好例子:
图 4—2020 年的平均值(图片由作者提供)
在这里,您可以看到第二个平均值比第一个平均值高,因为美国的订单数远远高于第一个平均值。因此,美国的高阶计数对结果的影响更大。
我将这个结果称为“加权平均”。
如果您想消除订单数量的权重,您必须使用第一个平均值。姑且称之为“未加权平均值”。
等等,我们还没说完。
给平均值增加额外的权重
有时,您需要通过向数据添加权重或等级来操纵计算。
图 5 —具有重要性的样本数据(图片由作者提供)
我引入了“重要性”列来操纵结果。
这一栏标明哪个国家最重要,必须影响结果。
我们将使用以下公式来计算结果:
总销售额=总和(销售额*重要性)
订单总数=总和(订单总数*重要性)
之后,我们可以计算平均值来得到结果。
结果如下:
图 6-2019 年重要性平均值(作者图片)
如您所见,加权平均结果比以前低得多,因为我们使用了“重要性”列来操纵每个国家的权重。由于法国和意大利的重要性最高,该值更接近其平均订单值。
未加权平均值与销售额之间的关系相同,订单数保持不变。甚至在与重要性相乘之后。
权重因子是强调数据部分与您选择的方面的重要性或相关性的适当方法。
现在我们可以切换到 Power BI,在 DAX 中实现这些计算。
在 Power BI 中实现
加权平均
我们可以用一个简单的方法来实现加权平均:
Average Sales Amount per Order =
DIVIDE( [Online Sales (By Customer)]
,[Order Count (By Customer)]
)
图 7 —功率 BI 的加权平均值(图片由作者提供)
过滤器上下文确保总平均值的计算是正确的:
934'403'814.18 / 486'949 = 1'918.894
未加权平均值
然而,计算未加权平均值则是另一回事。
我的第一个想法是预先计算所有的平均值,然后根据它们计算平均值。
该度量必须识别筛选器上下文是否包含国家/地区,如果包含,则必须将销售额除以订单计数。
一段时间后,我发现我们可以通过以下措施在 DAX 中解决这个问题:
Average per Country =
AVERAGEX(VALUES(‘Geography’[Region Country])
,DIVIDE([Online Sales (By Customer)]
,[Order Count (By Customer)] )
)
结果看起来像这样:
图 8 —每个国家的平均值(图片由作者提供)
当你把这个表导出到 Excel 中,就可以计算出每笔订单的平均销售额,你会得到 14'183.83。
当您想要将状态添加到表中时,棘手的部分就来了:
图 9 —每个国家的平均水平(按作者分类的图片)
当您现在导出表格时,平均结果将会不同。
为了得到正确的结果,我们必须向模型中添加一个新的度量:
Average per Country and State =
AVERAGEX(SUMMARIZE(‘Geography’
,‘Geography’[Region Country]
,‘Geography’[State Province])
,DIVIDE([Online Sales (By Customer)]
,[Order Count (By Customer)] )
)
该方法将计算每个国家/地区和州的正确值,并且在总体水平上:
图 10 —每个国家和州的平均修正值(图片由作者提供)
同样,这两种方法都是正确的。这取决于你的用户期望什么样的结果。你必须事先和你的利益相关者谈清楚这个问题。
加权平均列
现在我想加一个排名来定义每个国家的重要性。排名越高,这个国家对结果的影响力就越高。
为了这个计算,我给每个国家添加了一个任意的排名栏。每个国家的排名在 1 到 6 之间:
图 11-国家排名(作者图片)
现在我需要在计算中包括等级:
Average using Rank =
VAR SalesAmount = SUMX(‘Online Sales’
,’Online Sales’[SalesAmount] *
RELATED(‘Customer’[Country Rank])
)VAR OrderCount = SUMX(‘Online Sales’
,’Online Sales’[First Order Line Count] *
RELATED(‘Customer’[Country Rank])
)RETURN
IF(HASONEVALUE(‘Customer’[Region Country])
,[Average Sales Amount per Order]
,DIVIDE(SalesAmount, OrderCount)
)
让我们从这一措施的底部开始:
我使用 IF(hasone value(' Customer '[Region Country])来检查当前的过滤器上下文是否包含一个或多个国家。
如果当前的过滤上下文只包含一个国家,我可以使用[每个订单的平均销售额]来计算每个国家的平均值。这个方法非常有效,并且每一行都提供了正确的值。在这种情况下,是否将州或城市添加到报告中并不重要。结果是一样的。
只要当前过滤上下文包含多个国家,我就需要使用每个国家的排名来计算加权平均值。
我通过使用 SUMX 将在线销售表中每笔交易的销售额乘以国家排名来进行计算。
下图显示了所有测量的结果:
图 12 —所有度量(作者图片)
正如您所看到的,Total 行上的所有结果都与预期的不同。
注意:这是一个可能方法的例子,并没有给出明确的解决方案。根据您的数据和要求,您的解决方案可能与我的不同。
其他可能的方法
如果您需要为一个特定的场景准备度量,准备一个带有预先计算结果的 DAX 表可能是一个好主意。
我的示例中使用的 Contoso 数据模型在 Online Sales 表中包含 1200 万行,在 Customer 表中包含不到 20,000 行。本例中使用的矩阵计算结果不到一秒钟。
您的数据可以包含更多的数据,因此可能比我的例子慢。
在这种情况下,DAX 表是一个可行的解决方案。这种方法的缺点是其他表不能筛选结果,例如产品组。如果您需要这样做,您需要定义所需的关系,并相应地准备 DAX 表。
注意添加这样的列可能会意外地改变结果。
结论
当我开始写这篇文章时,我已经想到了 DAX 表的解决方案,因为它看起来很容易准备。
但是我不能说我喜欢它,因为这种方法在过滤结果的可能性方面增加了一些限制。
当我搜索计算加权平均值的可能方法时,我找到了这个网站:如何在维基上计算加权平均值
当将这种方法应用于 Excel 中的示例数据时,结果令我困惑。在与一位数学家同事交谈后,我们发现了计算平均值的不同方法。
尽管我已经写到一半了,我还是用我的新知识重新开始写这篇文章。
无论如何,我惊讶地发现,我可以通过不同的方式计算平均值来获得不同的含义。这个发现为我打开了一个新的世界,因为我也需要开始与我的客户讨论这个问题。
约翰·巴克利在 Unsplash 上拍摄的照片
直到现在,我的生活还不够复杂。叹息…
TODS:从时间序列数据中检测不同类型的异常值
用自动机器学习构建用于时间序列异常检测的机器学习管道。
https://github.com/datamllab/tods。图片作者。
时间序列异常检测旨在识别数据中意外或罕见的情况。离群点检测作为数据分析的重要任务之一,在时间序列数据上有着广泛的应用,如欺诈检测、故障检测、网络安全攻击检测等。例如,Yahoo [1]和 Microsoft [2]已经建立了他们自己的时间序列异常值检测服务来监控他们的业务数据并触发异常值警报。对于时间序列数据,异常值可以分为三种情况:点异常值、模式异常值和系统异常值。
在本文中,我将介绍一个用于构建机器学习管道的开源项目,以检测时间序列数据中的异常值。本文将简要介绍三种常见的异常值以及相应的检测策略。然后将提供基于两个支持的 API 的示例代码:用于开发时序异常检测管道的 TODS API 和用于使用第三方包进行实验的 scikit-learn API。
概观
TODS 的结构图。作者图片
TODS【3】是一个全栈的机器学习系统,用于多元时间序列数据上的离群点检测。TODS 为构建基于机器学习的异常检测系统提供了详尽的模块,包括:数据处理、时间序列处理、特征分析、检测算法和强化模块。通过这些模块提供的功能包括:用于一般目的的数据预处理、时间序列数据平滑/变换、从时间/频率域提取特征、各种检测算法以及涉及人类专家来校准系统。可以对时间序列数据执行三种常见的异常值检测场景:逐点检测(作为异常值的时间点)、模式检测(作为异常值的子序列)和系统检测(作为异常值的时间序列集)。
当时间序列中存在潜在的系统故障或小故障时,通常会出现逐点异常值。这种异常值以全局(与整个时间序列中的数据点相比)或局部(与相邻点相比)的方式存在于单个数据点上。全局异常值通常是显而易见的,检测全局异常值的常见做法是获得数据集的统计值(例如,最小值/最大值/平均值/标准偏差)并设置用于检测异常点的阈值。局部异常值通常出现在特定的上下文中,具有相同值的数据点如果没有出现在特定的上下文中,就不会被识别为异常值。检测局部异常值的常用策略是识别上下文(通过季节性趋势分解、自相关),然后应用统计/机器学习方法(例如,自回归、IsolationForest、OneClassSVM)来检测异常值。
当数据中存在异常行为时,通常会出现模式异常值。模式异常值是指时间序列数据的子序列(连续点),其行为与其他子序列相比是不寻常的。检测模式异常值的常见实践包括不一致分析(例如,矩阵剖面图 [6],hotax[7])和子序列聚类[4]。不一致分析利用滑动窗口将时间序列分割成多个子序列,并计算子序列之间的距离(例如欧几里德距离)以找到时间序列数据中的不一致。子序列聚类也将子序列分割应用于时间序列数据,并采用子序列作为每个时间点的特征,其中滑动窗口的大小是特征的数量。然后,采用诸如聚类(例如,KMeans、PCA)或逐点异常值检测算法的无监督机器学习方法来检测模式异常值。
当许多系统中的一个系统处于异常状态时,系统孤立点经常发生,其中系统被定义为多元时间序列数据。检测系统异常值的目的是从许多相似的系统中找出一个处于异常状态的系统。例如,从具有多条生产线的工厂中检测异常生产线。检测这种异常值的常用方法是执行逐点异常值检测和模式异常值检测,以获得每个时间点/子序列的异常值分数,然后采用集成技术为每个系统生成总体异常值分数,用于比较和检测。
通过 Scikit-learn API 进行实验
在建立机器学习管道的开始,需要进行大量的实验来调整或分析算法。在 TODS,sci kit-learn like API 可用于大多数模块,允许用户灵活地将单个函数调用到实验脚本中。这是一个使用 UCR 数据集[5]识别模式异常值的调用矩阵配置文件的示例。
小实验的 Sklearn 界面。
Accuracy Score: 0.89 precision recall f1-score support0 0.90 0.98 0.94 9005
1 0.21 0.04 0.06 995accuracy 0.89 10000
macro avg 0.55 0.51 0.50 10000
weighted avg 0.83 0.89 0.85 10000
用 TODS API 建造管道
在管道勘探的后期阶段,有必要在没有开发工作的情况下以可重复的方式管理实验,因为将会有更多的超参数和组件组合。在 TODS,我们的管道构建和执行 API 允许用户用一个脚本生成各种可重复的管道。生成的管道将存储为描述文件,其类型如。json 或者。yml 文件,可以很容易地用不同的数据集复制/执行,并与同事共享。以下示例利用 TODS API 在中建立自动编码器管道。json 格式,并使用 TODS 后端引擎运行管道,以检测雅虎网络入侵数据集中的离群点[1]。
第一步:生成管道描述文件 管道生成脚本如下。虽然它看起来比 Scikit-learn 界面长,但是用户可以很容易地用 candidate 添加超参数
管道施工脚本
第二步:管道运行
创建管道描述文件后,我们可以如下运行管道描述文件,并评估无监督管道:
管道运行脚本
metric value normalized randomSeed
PRECISION 0.285714 0.285714 0
RECALL 0.800000 0.800000 0
F1_MACRO 0.708549 0.708549 0
F1 0.421053 0.421053 0
尽管这个 API 需要一个脚本来生成管道描述文件,但它提供了灵活的接口来生成多个管道。生成具有不同污染率的多条自动编码器管线的示例可在这里找到。
带标签信息的自动模型发现
除了手动创建管道,TODS 还利用 TODS API 来提供自动化的模型发现。自动模型发现的目标是根据验证集中的标签信息和给定的计算时间限制寻找最佳流水线。
自动化模型发现示例
****************************************************
Search History:
----------------------------------------------------
Pipeline id: 0601567a-2b70-4a22-aa26-c5522be70ee7
metric value normalized randomSeed fold
0 F1_MACRO 0.708549 0.708549 0 0
----------------------------------------------------
Pipeline id: 538e4929-603c-4e88-9717-79d77ac6a9e2
metric value normalized randomSeed fold
0 F1_MACRO 0.616695 0.616695 0 0
----------------------------------------------------
Pipeline id: eaf6d5aa-f497-4176-9d2a-063d516eaa25
metric value normalized randomSeed fold
0 F1_MACRO 0.55474 0.55474 0 0
----------------------------------------------------
Pipeline id: f2efd81c-9fbc-46c6-aebd-ec7ec0c2dbd2
metric value normalized randomSeed fold
0 F1_MACRO 0.531302 0.531302 0 0
----------------------------------------------------
Pipeline id: 9d59afd8-4667-435c-b105-74c6a68a8f43
metric value normalized randomSeed fold
0 F1_MACRO 0.509059 0.509059 0 0
********************************************************************************************************
Best pipeline:
----------------------------------------------------
Pipeline id: 0601567a-2b70-4a22-aa26-c5522be70ee7
Pipeline json: {"id": "0601567a-2b70-4a22-aa26-c5522be70ee7", "schema": "[https://metadata.datadrivendiscovery.org/schemas/v0/pipeline.json](https://metadata.datadrivendiscovery.org/schemas/v0/pipeline.json)", "created": "2021-06-22T03:58:47.893794Z", "inputs": [{"name": "inputs"}], "outputs": [{"data": "steps.7.produce", "name": "output predictions"}], "steps": [{"type": "PRIMITIVE", "primitive": {"id": "c78138d9-9377-31dc-aee8-83d9df049c60", "version": "0.3.0", "python_path": "d3m.primitives.tods.data_processing.dataset_to_dataframe", "name": "Extract a DataFrame from a Dataset"}, "arguments": {"inputs": {"type": "CONTAINER", "data": "inputs.0"}}, "outputs": [{"id": "produce"}]}, {"type": "PRIMITIVE", "primitive": {"id": "81235c29-aeb9-3828-911a-1b25319b6998", "version": "0.6.0", "python_path": "d3m.primitives.tods.data_processing.column_parser", "name": "Parses strings into their types"}, "arguments": {"inputs": {"type": "CONTAINER", "data": "steps.0.produce"}}, "outputs": [{"id": "produce"}]}, {"type": "PRIMITIVE", "primitive": {"id": "a996cd89-ddf0-367f-8e7f-8c013cbc2891", "version": "0.4.0", "python_path": "d3m.primitives.tods.data_processing.extract_columns_by_semantic_types", "name": "Extracts columns by semantic type"}, "arguments": {"inputs": {"type": "CONTAINER", "data": "steps.1.produce"}}, "outputs": [{"id": "produce"}], "hyperparams": {"semantic_types": {"type": "VALUE", "data": ["[https://metadata.datadrivendiscovery.org/types/Attribute](https://metadata.datadrivendiscovery.org/types/Attribute)"]}}}, {"type": "PRIMITIVE", "primitive": {"id": "a996cd89-ddf0-367f-8e7f-8c013cbc2891", "version": "0.4.0", "python_path": "d3m.primitives.tods.data_processing.extract_columns_by_semantic_types", "name": "Extracts columns by semantic type"}, "arguments": {"inputs": {"type": "CONTAINER", "data": "steps.0.produce"}}, "outputs": [{"id": "produce"}], "hyperparams": {"semantic_types": {"type": "VALUE", "data": ["[https://metadata.datadrivendiscovery.org/types/TrueTarget](https://metadata.datadrivendiscovery.org/types/TrueTarget)"]}}}, {"type": "PRIMITIVE", "primitive": {"id": "642de2e7-5590-3cab-9266-2a53c326c461", "version": "0.0.1", "python_path": "d3m.primitives.tods.timeseries_processing.transformation.axiswise_scaler", "name": "Axis_wise_scale"}, "arguments": {"inputs": {"type": "CONTAINER", "data": "steps.2.produce"}}, "outputs": [{"id": "produce"}]}, {"type": "PRIMITIVE", "primitive": {"id": "30bc7cec-2ccc-34bc-9df8-2095bf3b1ae2", "version": "0.1.0", "python_path": "d3m.primitives.tods.feature_analysis.statistical_mean", "name": "Time Series Decompostional"}, "arguments": {"inputs": {"type": "CONTAINER", "data": "steps.4.produce"}}, "outputs": [{"id": "produce"}]}, {"type": "PRIMITIVE", "primitive": {"id": "67e7fcdf-d645-3417-9aa4-85cd369487d9", "version": "0.0.1", "python_path": "d3m.primitives.tods.detection_algorithm.pyod_ae", "name": "TODS.anomaly_detection_primitives.AutoEncoder"}, "arguments": {"inputs": {"type": "CONTAINER", "data": "steps.5.produce"}}, "outputs": [{"id": "produce"}], "hyperparams": {"contamination": {"type": "VALUE", "data": 0.01}}}, {"type": "PRIMITIVE", "primitive": {"id": "2530840a-07d4-3874-b7d8-9eb5e4ae2bf3", "version": "0.3.0", "python_path": "d3m.primitives.tods.data_processing.construct_predictions", "name": "Construct pipeline predictions output"}, "arguments": {"inputs": {"type": "CONTAINER", "data": "steps.6.produce"}, "reference": {"type": "CONTAINER", "data": "steps.1.produce"}}, "outputs": [{"id": "produce"}]}], "digest": "d4333e1733f1f50395de84cb65e650023a58185dc90d89a698f7facdeb300d64"}
Output:
d3mIndex anomaly
0 0 0
1 1 0
2 2 0
3 3 0
4 4 0
... ... ...
1395 1395 0
1396 1396 0
1397 1397 1
1398 1398 1
1399 1399 0[1400 rows x 2 columns]
Scores:
metric value normalized randomSeed fold
0 F1_MACRO 0.708549 0.708549 0 0
****************************************************
在管线搜索之后,允许用户通过管线 id 访问所有搜索到的管线,并保存任何管线描述文件以备将来使用。更多细节可以在官方演示 jupyter 笔记本中找到。
摘要
要了解这个项目的更多信息,请点击查看。该团队正在积极为该项目开发更多功能,包括带有可视化工具的图形用户界面、半监督学习算法和高级管道搜索器。目标是使时间序列数据的异常值检测变得容易和容易。我希望你喜欢阅读这篇文章,在接下来的文章中,我将详细介绍检测时间序列数据中不同类型异常值的常用策略,并介绍 TODS 具有合成标准的数据合成器。
参考
[1]蒂尔、马库斯、沃尔夫冈·科宁和托马斯·贝克。" webscope S5 数据集上的在线异常检测:一项比较研究." 2017 进化与自适应智能系统(EAIS) 。IEEE,2017。
[2]任,韩生,等.微软时间序列异常检测服务第 25 届 ACM SIGKDD 知识发现国际会议论文集&数据挖掘。2019.
【3】赖,k-h,查,d,王,g,徐,j,赵,y,库马尔,d,陈,y,尊卡瓦卡,p,万,m,马丁内斯,d,&胡,X. (2021)。TODS:一个自动时间序列异常检测系统。AAAI 人工智能会议论文集, 35 (18),16060–16062。
[4]基奥,埃蒙等,“时间序列分段:一项调查和新方法。”时序数据库中的数据挖掘。2004.1–21
【5】https://Wu . renjie . im/research/anomaly-benchmarks-is-infected/arxiv/
【6】Yeh,Chin-Chia Michael,等,“矩阵剖面 I:时间序列的所有对相似性连接:包括主题、不一致和形状的统一视图。” 2016 IEEE 第 16 届国际数据挖掘大会(ICDM) 。Ieee,2016。
[7]基奥、埃蒙、林欣童和艾达芙。"热 sax:有效地发现最不寻常的时间序列子序列."第五届 IEEE 数据挖掘国际会议(2005 年 ICDM)。Ieee,2005 年。
符号化算法解释
入门
满足您所有令牌化需求的一站式商店
介绍
对于外行来说,让我们从正式介绍标记化的概念开始— 标记化是一种简单的方法,它将输入的文本数据分割成单独的有意义的标记,这些标记可以被机器进一步理解和处理。记号可以是单词、字符,甚至是子单词,这取决于所采用的分裂算法。在本文中,我们将讨论所有三种主要的记号——单词、字符和子单词。我们还将重点关注最近大多数 SOTA 模型使用的子单词标记化算法— 字节对编码(BPE)、单词片段、单字符和句子片段。讨论结束时,您将对上述每一种方法有一个具体的了解,并且能够决定哪种标记化方法最适合您的需要。
基于单词的标记化
顾名思义,在基于单词的记号化方法中,整个单词由标点、空格、分隔符等分隔。被视为令牌。分离边界可能是特定于任务的,有时可能取决于您正在处理的数据的性质。用于标记 Twitter tweets 的基于单词的标记器会稍微偏离用于标记新闻文章本身的标记器。
为了正确理解,让我们从一个例子开始,展示仅基于空白字符执行的标记化
空间标记化
使用这种方法,您可以看到“标记化!”被视为单个令牌。如果你要在一个更大的数据集上运行它,这种方法将产生一个巨大的词汇表,因为无数的单词和标点符号组合将被视为与基础单词不同的标记。为了解决这个问题,让我们尝试标记标点符号和空白。
空格和标点符号化
现在,结果看起来比之前的输出要好一些。尽管如此,我希望你能理解,在英语中,如果不理解标点符号所处的上下文,并不是所有的标点符号都可以被视为象征性的界限。在上下文中,我们最好在这些场景中区别对待撇号——、【let】和【don】、——[" do "、" n t "]记号将提供比 ["don "、"'"、"' t"] 更有意义的语义,而我们可以使用 ["let "、" '、" ' s"]。
这就把我们带到了基于规则的单词分词器的话题。SpaCy 提供了一个伟大的基于规则的标记器,它应用特定于语言的规则来生成语义丰富的标记。感兴趣的读者可以先睹为快,看看 spacy 定义的规则。
基于规则的标记化—空间
这种方法非常简单,如果您能够忍受过多的处理时间和处理能力,它在大多数情况下都很有效。否则,仍然需要注意——随着训练数据的增加,词汇量也会增加。在一个巨大的语料库上用这种基于单词的标记化来训练一个模型会产生一个极其沉重的模型,并且需要过高的资源。
那么,你会问,为什么不仅仅使用字符集作为标记来减少词汇量呢?
基于字符的标记化
可以想象,基于字符的标记化将所有基本字符视为标记。它们可以是 UNICODE、ASCII 等。按照你的要求。继续上面的例子,结果看起来会像这样:
基于字符的标记化
当然,模型的复杂性和规模会大大降低,因为词汇表限制在 200 个左右。然而,标记不再携带有意义的语义。在上下文中,基于单词的标记化中的“国王”和“王后”的表示比字母“k”和“q”的上下文无关嵌入包含更多的信息。这就是语言模型在基于字符的标记上训练时表现不佳的原因。
如果性能对于您的业务需求来说并不重要,并且您愿意为了更高的速度和更少的计算强度而牺牲性能,那就去追求吧。
否则,如果你想两全其美,标记化算法找到一个中间地带是至关重要的,这个中间地带可以保留尽可能多的语义上有意义的信息,同时也在一定程度上限制模型的词汇大小。认识一下我们的新朋友,分词标记化!
基于子词的标记化
如果基于字符和单词的标记化不能让您的船漂浮起来,那么这是您应该保证的最佳点——不受无意义的标记的限制,也不需要太多的时间和处理能力。子词标记化方法旨在仅使用尽可能多的 N 个标记来表示数据集中的所有词,其中 N 是一个超参数,根据您的需求来决定。一般来说,对于基本模型,它徘徊在大约 30,000 个令牌。多亏了这些方法,不需要无限的词汇表,我们现在就可以很好地捕捉上下文无关的语义丰富的令牌表示。
我们现在将讨论一些用于执行子词标记化的最佳且广泛使用的算法。
字节对编码(BPE)
字节对编码首先需要对输入文本进行预标记化——这可以像空格标记化一样简单,或者您可以使用基于规则的标记化器(如 SpaCy)来执行预标记化步骤。
现在,我们形成了一个基本词汇表,它只不过是语料库中所有独特字符的集合。我们还计算每个单词的频率,并将每个单词表示为基本词汇中的单个字符的列表。
现在合并开始。根据以下标准,只要不超过最大大小,我们就继续向我们的基本 vocab 添加令牌——出现次数最多的令牌对被合并并作为新令牌引入。重复此步骤,直到达到配置的最大 vocab 大小。
字节对编码算法
字块
词块和 BPE 在实现子词标记化的方法上非常相似。之前我们看到 BPE 的主要标准是选择一个频率最高的候选配对。Word Piece 关注的不是最大化频率,而是最大化候选对的可能性——这可以通过下面的公式来简洁地总结:
其中 a、b 是词汇中的标记
Unigram
使用 BPE 的一个缺点是,在对单词进行标记时,如果出现歧义,它无法提供选择标记的排序机制。为了更好地理解这一点,假设我们的基本词汇由以下标记组成— the,th,at,eat,re ,如果我们被要求对单词 theatre — 进行标记,我们会看到两个选项,其中任何一个都不在另一个之前— (the,at,re)或(th,eat,re)。 BPE 专注于每一步的最佳预测,这是一个更贪婪的解决方案,因此在某些情况下可能会产生不太可能的结果。然而, Unigram 坚持预测最有可能的结果令牌,考虑训练期间学习到的概率。
在训练的每个阶段,我们计算每个子词标记的概率,并定义如果每个子词标记被丢弃将导致的损失值。然后,我们挑选掉总体损失最小的记号,本质上是那些对集合增加很少价值的记号。
句子片段
现在到了 NLP 社区所见证的最后也是最巧妙的方法之一。句片就像是本文到目前为止所描述的所有子词分词方法之父。它是语言不可知的——适用于所有语言,因为它不需要预标记器来处理语言特定的属性。它将空格视为一个独立的符号,从而完全解决了解码问题(我知道这听起来很简单!).与其他子词标记化方法相比,它的总体速度更快,这使得它成为大多数用例的首选标记化方法。如需进一步阅读,可查阅已发表的句子篇论文。
在本文中,我们介绍了一些最好的、广泛使用的标记化算法,权衡了它们的优缺点,并讨论了它们可能是正确选择的情况。希望您现在已经准备好了,可以更轻松地处理不同的标记化策略了!
东京 2020 使用 Python 通过机器学习进行主题建模
以下是如何使用机器学习按照主题对东京 2020 推文进行分类。
不出所料,两周以来,一切都与奥运有关。
许多伟大的故事被创造出来,许多明星诞生,许多不可思议的事件发生。而且,在社交媒体时代,“如果你没有发布,那就从来没有发生过”。因为这个原因,很多人在推特上谈论奥运,分享他们的感受和想法。
我们的目标是为推文的主题建模。这意味着,给定一条 tweet 作为输入,我们想要自动理解给定 tweet 的主题。
以下是一些带有一般句子的例子:
INPUT SENTENCE:
I'm so angry, so I think I'm going to buy a **cheeseburger**TOPIC:
**cheeseburger**INPUT SENTENCE:
This fast food makes the best **cheeseburger** of the entire cityTOPIC:
**cheeseburger**INPUT SENTENCE:
I really like **Coke**, so I think I'm going to buy a couple of bottles.TOPIC:
**Coke**
当然,如果你看第二句话,另一个话题可能是“快餐”或“城市”。事实上,我们更可能有一个主题列表,并筛选出最有影响力的主题。
我们开始吧!
0.图书馆
如题,我们将使用 Python 。特别是,我们将使用这些库:
1.想法是:
NLP 任务与其他任务(如表格数据分类)的不同之处在于您需要将单词/句子转换成向量。 所以你要做的第一件事就是把你的推文转换,表示到一个 N 维空间。
通常,N 非常大,因此您可能希望通过使用合适的方法(例如 PCA)来降低维度。
一旦完成,你需要使用一个聚类模型,以一种无人监管的方式对这些推文进行分类。
因此,你将得到 k 个分类的向量。最后一步是使用原始推文,并查看每个类别最常用的单词。
这个会给你每个班的题目。因此,您将拥有数据集中所有 tweets 的主题。
我制作的图像
下面详细解释一下:
2.数据集:
我在这里找到了数据集,用熊猫导入,出于计算原因只选择了 5000 条推文:
3.从文本到矢量:
用于文本预处理的一个很好的模型是 BERT 。一篇精彩的文章展示了为什么以及如何使用 BERT 来达到这个目的,这篇文章是。以下是如何将你的文本转换成矢量:
让我们使用 PCA*来绘制我们的向量:
- 二维主成分分析:
2。3D 主成分分析:
为了清楚地理解我们可能想要使用 PCA 分解方法的多少特征,让我们使用解释的方差比:
好的,所以 5 个组件就足够了,当然是(记住,在 Python 中,你从 0 开始计数)。
- PCA 是一种用于根据每个轴包含的信息减少数据维数的方法。我们正在使用它,因为我们的向量有 700 多个维度,它可能会干扰我们的过程。
4.分类和主题建模:
如果我们想要精确,我们不应该谈论分类,因为它是一种受监督的方法。相反,我们正在以一种无人监督的方式对我们的数据进行聚类,因为我们根本没有标签。
我们将使用的非常简单的方法是 sklearn K-Means。 没有什么比这更复杂的了:
from sklearn.cluster import KMeans
cluster = KMeans(n_clusters=20, random_state=0).fit(pca_data)
那么我们就用 TF-IDF* 来了解哪些词出现的次数最多(但排除比较太多的像“这个”,或者“那个”或者“安”)。
完整的代码可以在这里找到:
- TF-IDF 是一种以智能方式计算单词在一类文档中出现的次数的方法。聪明的地方在于,如果这个词也出现在所有其他类中,它可能不会影响(像“The”或“an”),因此,它不会被认为是“频繁的”。
5.最终结果:
下面是我们获取主题的方法:
- 按照 TF-IDF 的降序排列每一类中的单词
- 仅在具有最高 TF-IDF 的类中考虑每个单词(单词的 TF-IDF 值可以根据我们考虑的类而改变)
- 保持最高 TF-IDF 值的字为代表整个类的字。
这是代码:
当然,这种方法并不完美,但确实有些有趣的地方。
这 13 节课都是关于 biles 的。5 类是关于美国的。几乎每个班级都有一个特定的主题。
考虑因素:
当体育赛事发生时,我们会感到很亲近。整个国家在比赛的最后一秒屏住呼吸,分享胜利的喜悦或失败的悲伤。
如果你喜欢这篇文章,你想知道更多关于机器学习的知识,或者你只是想问我一些你可以问的问题:
A.在 Linkedin 上关注我,在那里我发布我所有的故事
B .订阅我的 简讯 。这会让你了解新的故事,并给你机会发短信给我,让我收到你所有的更正或疑问。
C .成为 推荐会员 ,这样你就不会有任何“本月最大数量的故事”,你可以阅读我(以及成千上万其他机器学习和数据科学顶级作家)写的任何关于最新可用技术的文章。
明日汽车硅脑,是怎么做出来的?
行业笔记
自动驾驶汽车的神经网络加速器——GPU、FPGA 还是 ASIC?
自动驾驶系统极其复杂。它们紧密集成了感知和决策等多种最先进的技术。只有精心设计的硬件才能支持这些特别需要资源的任务。此外,自动驾驶是首批严重依赖机器学习算法的嵌入式应用之一。因此,大量的研究工作被投入到开发满足特定要求的神经网络加速器中,例如冗余和功率效率。
自动驾驶汽车的发展无疑是当前人工智能领域最具挑战性的任务之一。自动驾驶机器必须精确地感知其环境,并计划一系列适当的行动来安全地在道路上导航。它必须处理各种各样的情况。路况、天气、复杂的道路交叉口、行人和其他道路使用者都是不确定性的来源,使场景理解变得复杂。尽管如此,这项任务至关重要。对汽车周围环境的全面了解是安全有效地在世界上导航所必需的。自动驾驶汽车装载了收集大量数据的传感器,以实现这一目标。但是,原始数据用处不大;必须要分析。
鉴于任务的复杂性,场景理解需要学习算法,尤其是神经网络。注意,在最先进的硬件平台上,这种算法的训练过程可能需要几天时间——多个强大的图形处理单元(GPU)或张量处理单元(TPU) [1] -。因此,这项任务显然不是在驾驶时执行的。嵌入式硬件只需计算神经网络中数据的正向传播,也称为推理。尽管如此,推论也是资源密集型的。尤其是必须达到更高刷新率以减少感知延迟。幸运的是,大多数神经网络中的前向传播可以计算为点积,这是高度并行化的操作。因此,中央处理单元(CPU)由于其有限的内核数量而明显不适合。如今,GPU 被用于许多机器学习应用程序,既用于训练,也用于推断。
尽管如此,对于关键的嵌入式系统,它仍然缺乏效率和可靠性。为此,该行业正在开发替代品。神经网络加速器(NNA)是专门用于神经网络计算的硬件系统。我们将主要讨论其中的两种:现场可编程门阵列和专用集成电路,如特斯拉的 FSD 计算机。
自动驾驶车辆嵌入式计算机要求
今天,最先进的自主系统主要依靠计算机视觉。事实上,自动驾驶汽车的主要计算任务是从图像中提取特征。系统必须理解它所感知到的东西。卷积神经网络(CNN)已被证明在这项任务中非常强大。它们通常由多层卷积、激活函数、汇集和解卷积组成。数据流经网络的所有层,从图像甚至视频中提取有趣的信息。这种算法的存储和计算成本很高。例如,一个 224×224 图像的经典分类器 ResNet152 需要 113 亿次浮点运算(TFLOP)来执行推理过程,并需要 400MB 内存来存储模型参数[2]。此外,目前的自动驾驶汽车有多个分辨率高得多的摄像头。以特斯拉 Model 3 为例。它有 8 个摄像头,分辨率为 1280 × 960。实时分析所有 8 个视频源。我们可以很容易地想象这需要巨大的计算能力。然而,卷积运算通常占通过 CNN 推理过程执行的运算的 98%以上。ReLU 和 pooling 是毫不费力的逻辑函数。他们只占不到 0.5%的业务。由于卷积是基于点积的,因此必须设计硬件来提高点积效率,这最终会转化为几个并行的乘法/加法运算。
自动驾驶汽车的嵌入式系统也有与安全性、可靠性和实时性要求相关的特定约束。有三个主要挑战需要克服:
- 处理流水线必须足够快,以消化收集的大量传感器数据。系统速度越快,在给定的时间框架内可以分析的数据就越多。请注意,系统运行的帧速率至关重要。感知系统的刷新率必须很高,以允许系统对意外情况做出快速反应,甚至(尤其是)高速反应。
- 必须避免单点故障。该系统必须足够健壮以从故障部分恢复。该系统不仅必须在资源减少的情况下运行,而且还必须检测故障。这个问题通常通过冗余和结果比较来解决。两条独立的计算流水线同时运行。当结果不匹配时,检测到错误。
- 该系统必须尽可能节能。自动驾驶汽车通常是电动的。因此,能源效率对于实现远程传输至关重要。此外,高功耗意味着散热解决方案和电源的额外重量和成本。
三种主要类型的计算平台
图形处理单元
Nvidia Drive platform 目前正引领基于 GPU 的自动驾驶嵌入式系统市场。这种通用计算解决方案集成了 Drive 软件堆栈,旨在让汽车制造商专注于其自动驾驶解决方案的软件实施。DrivePX 架构的最新版本——也是最强大的版本——提供了两个 Tegra X2 SOC。每个芯片包含四个 ARM A57 CPUs 和一个 Pascal GPU。两个 GPU 都有专用内存和优化的 DNN 加速指令。为了容纳大量传输的数据,每个 Tegra 都使用 PCI-E Gen2 × 4 总线直接连接到 Pascal GPU,总带宽为 4.0 GB/s。优化的输入/输出架构和 DNN 加速允许每个 Tegra 芯片执行 24 TFLOP/s
然而,这种系统的功耗高达 250 W。这种功耗确实成为嵌入式系统的一大障碍。因此,即使是 GPU 专家也在 2022 年生产的新平台上整合 ASICs。Nvidia Drive AGX Orin 宣布通过六种不同类型的处理器的组合提供 200 TFLOP/s 的速度,包括 CPU、GPU、深度学习加速器(DLA)、可编程视觉加速器(PVA)、图像信号处理器(ISP)和立体/光流加速器。
现场可编程门阵列(FPGA)
近年来,FPGAs 已经成为算法加速的绝佳选择。与 CPU 或 GPU 相反,FPGA 专门配置为运行目标算法。手头的任务因此以更高的效率执行。如果没有经验测量,很难估计 FPGA 的浮点性能,但对于几十瓦的功耗,几个 TFLOP/s 是很容易实现的。纯 FPGA 必须通过 PCIe 连接与主机系统一起工作,以提供数据,在我们的例子中,是图像和其他传感器输出。FPGA 通常仅用作推理目的的神经网络加速器。根据神经网络结构配置芯片,并将模型参数存储在存储器中。FPGA 内部存储器很少超过几百兆,这对于存储大多数 CNN 参数来说太小了。需要像 DDR SDRAM 这样的外存。这种外部存储器的带宽和功耗是重新获得高系统性能的瓶颈。
尽管如此,高端 FPGA 可以在我们的应用中实现良好的性能。比如 Xilinx 的 Zynq UltraScale MPSoC 。它的设计考虑到了自动驾驶任务,在速度和效率方面都可以超过特斯拉 K40 GPU 三倍以上(14 FPS/W vs. 4 FPS/W) [3]运行 CNN 推断。在实时 1080p 视频流中,它可以达到 60 FPS 的目标跟踪任务。采用多种硬件级技术在 FPGA 上设计神经网络加速器,以提高其性能和效率。计算单元的设计尤为关键。事实上,FPGA 上可用的低级组件(门、触发器)是有限的。因此,可以用较小的计算单元设计来实现更多的计算单元和更高的峰值性能。此外,对于精心设计的计算单元阵列,可以提高工作频率。Guo 等人[3]描述了通过优化计算单元设计来提高性能的三种主要技术:
- 低位宽计算单元:输入数组的位宽直接影响计算单元的大小。位宽越小,计算单元就越小。大多数用于神经网络应用的最新 FPGA 设计都用定点单元取代了 32 位浮点单元。虽然 16 位单元被广泛采用,但对于低至 8 位的单元来说也有可能实现良好的结果[5]。一般来说,CNN 和神经网络对降低的精度非常宽容[4]。
- 快速卷积方法:卷积运算可以通过多种算法加速。例如,离散傅立叶变换或 Winograd 方法可以通过合理的内核大小获得巨大的性能增益(4 倍)[3]。
- 频率优化方法:片内 SRAM 和数字信号处理(DSP)单元之间的路由可能会限制峰值工作频率。DSP 单元的不同工作频率可以与用作本地 ram 的相邻片一起使用,以分隔时钟域。这项技术是作为 Xilinx 的 CHaiDNN-v2 项目的一部分实现的[5]。他们实现了两倍的峰值工作频率。
ZynqNet FPGA 加速器[6]是一个全功能的概念验证 CNN 加速器,实现了这些技术以及更多。顾名思义,这个框架是为 Xilinx Zynq 板开发的。它使用嵌套循环算法来加速 CNN 推理,从而最小化算术运算和内存访问的数量。
专用集成电路(ASIC) —特斯拉 FSD 计算机
专用集成电路允许硬件实现的完全灵活性。因此,可以满足特定的要求,以实现特定任务的极高性能。对于有足够资源开发这种复杂系统的汽车制造商来说,这种解决方案无疑是必由之路。虽然它为自动驾驶汽车提供了最好的性能,但开发时间和价格同样巨大。
“我问埃隆·马斯克(Elon Musk)是否愿意花所有的钱来做完全定制设计,他问,‘我们会赢吗?’。我说,‘是啊,当然!’所以他说,‘我加入!。”—2019 年自治日期间,特斯拉硅工程副总裁皮特·班农(Pete Bannon)。
特斯拉全自动驾驶(FSD)计算机在 2019 年 4 月 22 日的 Autonomy Day 期间展示。该系统自发布以来就在所有特斯拉汽车上运行,并被证明效果非常好。根据 Elon Musk 的说法,FSD 计算机最终将为 5 级自动驾驶系统提供动力。该 ASIC 是对以下要求的响应:
- 电脑必须在 100 W 以下运行。
- 它必须至少处理 50 TFLOP/s 的神经网络模型。
- 对于数据预处理和后处理来说,适度的 GPU 仍然是必要的。然而,随着软件和人工智能技术的进步,在通用硬件上运行的经典算法可能会过时。
- 安全和安保在设计中至关重要。失败的百分比必须低于人类在驾驶时失去意识的概率。这一要求意味着完全的硬件冗余:每台 FSD 计算机有两个电源和两个独立的计算单元。
- 每个图像和数据集都是独立处理的(批量为一个)以减少延迟。
- 广泛的连接端口,以适应汽车的多个传感器。
由于应用的性质,FSD 计算机非常适合于图像处理。其接口提供 2.5Gpixel/s 串行输入,以适应汽车周围的高度摄像头,以及用于雷达等其他传感器的 LPDDR4 DRAM 接口。此外,独立的图像信号处理器负责降噪、色调映射(突显阴影中的细节),外部 H.265 视频编码器模块用于数据导出。这个不寻常的模块是特斯拉软件开发过程中的一个关键元素。数据是大多数机器学习算法的基石。特斯拉的车队是训练自动驾驶模型的大量视频数据来源。多年来构建特斯拉的数据库是其成功的关键因素。轻型数据处理在支持 32 位和 16 位浮点的 GPU 上运行,运行频率为 1 GHz,可实现 600 GFLOP/s。运行频率为 2.2GHz 的 12 个 ARM CPUs 用于几个次要任务。
尽管如此,FSD 计算机的主要目的是它的神经网络加速器(NNA)。为了安全起见,每台电脑都配有两个独立的 NNA。每个 NNA 有 32 Mb 的 SRAM 来保存临时结果和模型参数。请注意,DRAM 存储器比 SRAM (100 倍)更耗能。在每个时钟周期内,2056 字节的激活数据和 1028 字节的参数在每个 NNA 的 96 × 96 (9216)乘加阵列中组合。该数据流需要至少 1TB/s 的 SRAM 带宽(每个加速器)。乘法/加法阵列具有就地累加功能,每个周期最多可进行 10,000 次运算。因此,每个 NNA 在 2 GHz 下的运行速度为 36 TFLOP/s。但是,NNA 针对点积进行了优化。非线性运算在这些芯片上表现很差或者根本不表现。为 ReLU 和池操作添加了专用模块。
Tesla 软件的当前版本需要分析每幅图像 35 GOP。因此,FSD 计算机每秒可以分析总共 1050 帧。在运行测试版的全自主自驾软件时,FSD 电脑的 NNA 功耗为 72W — 15W。
系统比较
由于嵌入式系统的复杂性,其评估变得越来越困难。证明改进的最有效方式是一个标准的基准测试套件,以代表自动驾驶应用程序中使用的工作负载。我们可以将基准工具分为两类:数据集和工作负载压力。KITTI [7]是第一个针对自动驾驶的数据集基准。它包含许多感知传感器数据,如单目/立体图像和 3D 激光雷达点云。提供与数据相关的基本事实,以评估多种自动驾驶场景中的算法性能,如车道检测、里程计、物体检测和跟踪。这种数据集可以用作系统压力源,以评估其在自驾车相关任务中的峰值性能。第二类基准旨在通过一套应用和视觉内核评估新颖的硬件架构。CAVBench [8]目前是自动驾驶计算系统性能评估的良好起点。它是一套应用程序,通过基于数据集模拟不同的场景来创建虚拟环境,从而评估现实世界的性能。多种工作负载评估任务可用:对象检测、对象跟踪、电池诊断、语音识别、边缘视频分析和 SLAM。这种任务离散化允许开发人员找到系统的性能瓶颈。
不幸的是,在自动驾驶边缘计算社区,没有普遍采用的基准或评估流程。尽管如此,郭等人[3]已经能够比较多个最先进的神经网络推理加速器。
图 1:最先进的神经网络加速器设计的性能和资源利用的比较[3]
图 1 比较了不同基于 FPGA 的加速器和 GPU 加速器的计算能力和效率。一般来说,在 10100 GOP/j 范围内,FPGA 的能效略高于 GPU,但是,GPU 的速度性能仍然更胜一筹。提高基于 FPGA 的解决方案性能的主要挑战是可扩展性。Zhang 等人[9](图 1 中的参考文献[76])提出了一种基于 FPGA 集群的解决方案来实现 GPU 性能。他们使用 16 位定点设计将 Xilinx 的 6 个 Virtex-7 FPGA(设备 XC7VX690T)组合在一起。虽然这种架构相当于 GPU 的计算能力,但它也具有较低的能效。
然而,基于 FPGA 的 NNA 是一个快速发展的研究领域。大量工作致力于优化架构,以获得越来越好的能效和计算能力。事实上,基于 GPU 的解决方案已经达到了架构优化的高度。它们的性能现在主要取决于材料的物理极限和制造方法。另一方面,面向硬件的解决方案仍有很大的发展空间。甚至像 AMD、Intel 或 Nvidia 这样通用处理器专家现在也将他们的努力集中在硬件加速器上。
ASICs 仍然是表现最好的 NNA。例如,特斯拉 FSD 计算机总共执行 144 TFLOP/s,而 Nvidia 驱动程序架构在特斯拉的自动驾驶软件堆栈上运行的最高速度为 24 TFLOP/s。FPGA 有望赶上 ASIC 的性能,ASIC 的开发需要大量的工程努力。不仅要设计一个 ASIC,而且整个软件体系结构也必须适应。每个 ASIC ANN 都需要一个特定的编译器来部署神经网络。
结论
自动驾驶汽车不是普通的系统。他们对确保用户及其环境的安全有着严格的要求。自动驾驶计算机面临的挑战是提供足够的计算能力、鲁棒性和能效。通用计算处理器不是可行的选择,因为它们缺乏有效运行神经网络的并行化能力。事实上,任何 NNA 的关键特征是 CNN 中使用的点积操作的优化。
优化水平根据平台的自由度而变化。目前最灵活的人工神经网络是基于 GPU 的。尽管如此,由于有数千个内核,它们在神经网络上的表现异常出色。但是这些性能是以低能效为代价的。FPGAs 提供的灵活性稍差,必须配置为在相似的功耗水平下提供比 GPU 更好的性能。然而,FPGAs 很难扩展。大量的工作放在使用 FPGA 作为 NNA。最后,从各个角度来看,从底层开始构建的静态硬件系统(ASICs)目前提供了最好的性能;耐用性、能效和计算能力。
虽然 ASICs 的表现令人难以置信的好,但只有大公司才能负担得起它们的开发。同样,FPGAs 仍然是复杂的系统,需要精心设计的算法才能高效运行。由于这些原因,GPU 仍然广泛用于自动驾驶汽车,但可定制的硬件将很快取代它们。
个人想法
自主车辆开发是一个年轻的研究领域。开发人员目前正在探索教会机器驾驶的可能性。因此,机器学习解决方案不断发展。虽然 CNN 是目前的标准,但新的有前途的架构,如变形金刚[10],目前正在计算机视觉领域出现。由于这些解决方案规定了硬件级别的要求,NNA 目前很难进行大量优化。
软件和人工神经网络必须同时开发,以达到最佳性能。至少,机器学习模型可以优化,以充分利用可用的硬件平台。以端到端驱动算法的挑战为例[11]。这种方法肯定能产生更好的结果。然而,对于当前的 NNA 平台,它重新获得了太复杂的神经网络。
另一方面,通过添加人类工程向量将系统分为感知系统和决策系统允许拆分架构。特斯拉目前采用第二种解决方案是有充分理由的:它简化了计算。许多其他神经网络优化是可用的。然而,从数学的角度来看,它们往往是反直觉的(模型是建立在数学的基础上的)。例如,机器学习工程师更喜欢更深的网络而不是大型层,因为它可以优化通用处理器或 GPU 的计算成本。在定制硬件 NNA 上不一定是这种情况。
感谢阅读。在 LinkedIn 上与我联系,继续讨论!
参考
[1] Norman P. Jouppi,Cliff Young,Nishant Patil,David Patterson 等..张量处理单元的数据中心性能分析。 arXiv:1704.04760 。
[2],何,,,任,.用于图像识别的深度残差学习。CVPR。 arXiv:1512.03385 。
[3]开元郭、曾、金城余、、等。基于 FPGA 的神经网络加速器综述。arXiv:1712.08934 。
[4] Suyog Gupta 和 Ankur Agrawal 和 Kailash Gopalakrishnan 和 Pritish Narayanan。数值精度有限的深度学习。 arXiv:1502.02551 。
[5] Xilinx CHaiDNN-v2 项目。https://github.com/Xilinx/chaidnn访问时间:2020 年 3 月 21 日。
[6]大卫·格施文德。ZynqNet:FPGA 加速的嵌入式卷积神经网络。 arXiv:2005.06892
[7] A. Geiger、P. Lenz 和 R. Urtasun。我们准备好自动驾驶了吗?KITTI vision 基准套件,正在进行中。IEEE 会议。计算机。Vis。模式识别。(CVPR),2012 年 6 月,第 3354–3361 页
[8]王永元、刘绍林、吴晓红和史文伟。CAVBench:联网和自动驾驶汽车的基准套件,正在进行中。IEEE/ACM 研讨会。边缘计算。(秒),2018 年 10 月,第 30–42 页
[9],,孙家钰,孙光宇,,罗,.高能效 CNN 在深度流水线 FPGA 集群上的实现,2016 年低功耗电子与设计国际研讨会论文集。ACM,326–331。
[10] Alexey Dosovitskiy 和 Lucas Beyer 和 Alexander 和 Dirk Weissenborn 和 Xiaohua Zhai 和 Thomas Unterthiner 和 Mostafa Dehghani 和 Matthias Minderer 和 Georg Heigold 和 Sylvain Gelly 以及 Jakob Uszkoreit 和 Neil Houlsby。一幅图像相当于 16x16 个字:大规模图像识别的变形金刚。arXiv:2010.11929 。
[11]陈,张健宇,许卓和 m .富冢。基于顺序潜在表征学习的端到端自动驾驶感知。arXiv:2003.12464 。
调查问题太多?让蚁群优化来处理吧。
史蒂夫拍摄的照片。 on Unsplash
你的调查问题太多了吗?您是否担心您的参与者可能会厌倦在调查过程中回答问题?在本文中,我描述了如何在 r。
在社会和行为科学领域,研究人员经常使用在线调查和问卷从参与者样本中收集数据。此类工具提供了一种收集大量个人信息的高效且有效的方式。
调查用于从人们那里收集信息,以描述、比较或解释他们的知识、感受、价值观和行为。【1】
有时,参与者可能会厌倦在调查过程中回答问题,尤其是在调查非常长的情况下。这就是所谓的疲劳调查。当参与者感到疲惫时,他们可能会跳过问题,由于回答不够努力而提供不准确的回答,甚至完全放弃调查。为了缓解这一问题,我们需要缩短调查长度——要么手动删除一些问题,要么使用优化算法自动完成。
蚁群优化是计算机科学中一种先进的优化算法。ACO 最初是受到阿根廷蚂蚁的集体行为的启发,这种行为被称为 iridomyrmex humilis。在寻找食物时,这些蚂蚁将信息素丢在地上,并跟随其他蚂蚁先前丢下的信息素。由于最短的路径更有可能保留信息素,蚂蚁可以沿着这条路径更快地找到有希望的食物源(见图 1)。
图 1: 真正的蚂蚁是如何找到最短路径的。(a)蚂蚁到达决策点。(b)一些蚂蚁选择上面的路径,一些选择下面的路径。选择是随机的。(c)由于蚂蚁以大致恒定的速度移动,选择较低的较短路径的蚂蚁比选择较高的较长路径的蚂蚁更快地到达对面的决策点。(d)信息素在较短的路径上以较高的速率积累。虚线的数量大约与蚂蚁储存的信息素的数量成比例(来源: Dorigo,Maniezzo 和 Colorni (1996) ,第 54 页)
工程师们决定用阿根廷蚁群的运作方式作为类比来解决最短路径问题,并创造了 ACO 算法[3]。然后,其他研究人员已经开始将相同的算法应用于不同的选择问题,例如在一项调查中选择“最佳”问题。研究表明,ACO 优于传统的问题选择方法,例如选择具有高度相关性的问题[4]。
例子
在本例中,我们将使用亲密关系体验(ECR) 调查。该调查由 36 个问题组成,测量成年人的两个依恋维度:回避和焦虑(见图 2)。这些问题基于 5 分制的李克特量表(即 1 =完全不同意,5 =完全同意)。奇数编号的问题(即问题 1、3、5 等。)属于回避分量表(如 Q1。我不喜欢向伴侣展示我内心深处的感受。),而其余的问题属于焦虑分量表(例如,Q2。我担心被抛弃。).对于每个分量表,较高的调查分数表明较高水平的回避(或焦虑)。在这些维度中的一个或两个维度上得分高的人被认为有不安全的成人依恋倾向[5]。
图二。成人依恋个体差异的二维模型(来源:改编自http://labs . psychology . Illinois . edu/~ RCF raley/measures/measures . html的图)
ERC 调查的原始数据集可在开源心理测量项目网站上获得。出于演示目的,我们将根据以下规则使用原始数据集的子集:
- 来自美国的受访者必须参与调查,
- 受访者必须在 18 至 30 岁之间,并且
- 受访者必须回答所有问题。
最终数据集在这里可用。
使用 ACO 算法,我们希望将调查长度减少到 12 个问题(即每个子量表 6 个问题)。首先,我们将数据集导入到 R:
ecr <- read.csv("ecr_data.csv", header = TRUE)
图 3。ECR 数据集的预览(图片由作者提供)
其次,我们将在 R 中激活包含 antcolony.lavaan 函数的简写包,以使用 ACO 算法缩短调查。
library("ShortForm")
第三,我们将定义 ECR 调查的因子结构。也就是说,有两个维度(回避和焦虑),每个维度都与 18 个问题相关联。
model <- '
Avoidance =~ Q1+Q3+Q5+Q7+Q9+Q11+Q13+Q15+Q17+Q19+Q21+Q23+Q25+Q27+Q29+Q31+Q33+Q35
Anxiety =~ Q2+Q4+Q6+Q8+Q10+Q12+Q14+Q16+Q18+Q20+Q22+Q24+Q26+Q28+Q30+Q32+Q34+Q36
'
接下来,我们将定义在选择过程中每个维度可以使用哪些问题。在本例中,我们希望与每个子量表相关的所有问题都被视为“候选”问题。
items <- list(c(paste0("Q", seq(1, 35, by = 2))),
c(paste0("Q", seq(2, 36, by = 2))))
在最后一步,我们将把所有东西放在一起实现 ACO 算法。在准备 antcolony.lavaan 函数时,我们将使用默认值。然而,一些参数,如蚂蚁,蒸发和步骤,可以被修改,以找到一个最佳的结果(或减少计算时间)。
现在,我们可以继续查看结果。首先,我们将看到 ACO 选择了哪些问题。以下输出显示了选定的问题(“1”)和排除的问题(“0”)。
ecr_ACO[[1]]# Returned output below: cfi tli rmsea mean_gamma Q1 Q3 Q5 Q7 Q9 Q11 Q13 Q15 Q17
[1,] 0.9814 0.9768 0.05723 0.755 0 1 1 1 0 0 1 0 1 Q19 Q21 Q23 Q25 Q27 Q29 Q31 Q33 Q35 Q2 Q4 Q6 Q8 Q10 Q12 Q14 Q16
[1,] 0 0 1 0 0 0 0 0 0 1 1 1 1 1 0 0 0 Q18 Q20 Q22 Q24 Q26 Q28 Q30 Q32 Q34 Q36
[1,] 0 0 1 0 0 0 0 0 0 0
接下来,我们将检查每个维度选择了哪些问题。
cat(ecr_ACO$best.syntax)# Returned output below:Avoidance =~ Q7 + Q17 + Q13 + Q9 + Q5 + Q3
Anxiety =~ Q2 + Q10 + Q6 + Q22 + Q8 + Q4
我们还可以看到从 antcolony.lavaan 返回的结果。例如,在算法的每次迭代中,我们可以看到模型中解释的差异量的变化。
plot(ecr_ACO, type = "variance")# Other alternative plots
# plot(ecr_ACO, type = "gamma")
# plot(ecr_ACO, type = "pheromone")
图 4:ACO 中多次运行解释的差异量(图片由作者提供)
结论
在上面的例子中,ACO 能够制作一个简短的 ECR 调查版本,只包含 12 个问题。 antcolony.lavaan 函数很快找到最优解。然而,搜索过程的速度取决于蚂蚁的数量、蒸发率、模型拟合指数以及为这些指数建立的临界值。例如,可以修改截止值(例如,CFI > .90,TLI > .90)以加速搜索过程。我希望这个例子能帮助你创建更短更有效的调查。
注: 这篇文章的扩展版在我的个人博客上有。
参考文献
[1]芬克,阿琳(2015)。如何进行调查:分步指南。Sage 出版公司。
[2]戈斯、阿隆、德内堡、J.-L .、玛丽·帕斯特尔斯。J. (1989 年)。阿根廷蚂蚁的自我组织捷径。自然科学协会。
[3]m . Dorigo,v . manie zzo 和 a . color ni(1996 年)。蚂蚁系统:由一群合作的代理优化。 IEEE 系统、人和控制论汇刊,B 部分(控制论)26(1):29–41。
[4]莱特,王伟林,黄,李一中,马可利迪斯(2008).用蚁群优化算法开发短量表的项目选择。多元行为研究43(3):411–31。
[5]魏,m .,罗素,D. W .,马林克罗特,b .,,沃格尔,D. L. (2007)。亲密关系体验量表简表:信度、效度和因子结构。人格评估杂志88(2):187–204。
高效深度学习的工具
鉴于 PyTorch 和 Keras 的便利性,深度学习很有趣,但如果我们不能高效、聪明地进行实验,它也会令人厌倦。
做深度学习已经一年多了。PyTorch 和 Keras 之类的库使得实现深度模型变得更加容易,并提供了许多深度架构的标准实现,如 CNN、LSTM、soft max、embeddings 等。如果我们可以可视化或提出一个基于深度学习的问题解决方案,那么给定数据集,就可以很容易地证明给定的主张是否有意义。进行深度学习可能既有趣又令人厌倦,因为缺乏高质量的 GPU 导致训练缓慢,有时不可预测,难以调试,耗时,并且依赖于数据集的规模。根据我的经验,我发现下面的库非常方便有效地执行实验。
深度学习很好玩。不是吗?(图片由:Pixabay,链接)
九头蛇 —为整个实验提供一个配置文件。我们可以设置不同的参数。当我们想与其他人共享我们的代码或者在不同的机器上运行实验时,它会非常有帮助。它为我们提供了设置所需配置的灵活性,如学习速率、模型隐藏层大小、时期、数据集名称等。而不暴露某人对实际代码的更改。
当我们想要将代码移植到不同的机器上并安装所有的依赖项时,这证明是非常有用的。它帮助我们创建一个 python 依赖项列表,以及我们当前工作代码正在使用的版本,并将它们保存在一个文件中,该文件可以很容易地安装到其他任何地方。
>> pipreqs
INFO: Successfully saved requirements file in D:\blogs\requirements.txt
要在不同的机器上成功安装这些依赖项,请复制 requirements.txt 文件并运行
>>pip install -r requirements.txt
Getopt—可用于通过命令行参数传递参数。它为我们提供了设置强制参数和参数默认值的灵活性。argparse 库是另一个流行的选择。
运行以下命令,并将参数作为命令行参数传递。
>>python getopt_demo.py -r demo_experiment -d ./ -t CNN -l 0.4
tensor board—它用于通过记录和绘制训练损失、训练准确度等指标来测量我们实验进度的实时图。张量板日志是 Summarywriter 对象的一部分,它跟踪某些变量,如训练损失、验证损失、训练精度、验证精度等。并把它绘制得很漂亮,便于可视化。当我们想要实时或在稍后的时间点可视化我们的结果时,这就很方便了。
要查看 cmd 中运行的实时进度
>> tensorboard --logdir=runs
Serving TensorBoard on localhost; to expose to the network, use a proxy or pass --bind_all
TensorBoard 2.4.1 at [http://localhost:6006/](http://localhost:6006/) (Press CTRL+C to quit)
Tqdm——作为初学者,我曾经手动记下一个历元的训练时间,真的很繁琐。Tqdm 与循环一起使用时(这里我们使用 torch.utils.data.DataLoader 对象上的循环),可以很好地描述每个梯度步骤或时期的时间,这可以帮助我们设置不同结果的记录频率或保存模型,或者了解如何设置验证间隔。
logu ru—它提供了记录配置、实验名称和其他训练相关数据的记录器功能。当我们做多个实验并想要区分不同实验的结果时,这被证明是相当有帮助的。因此,如果我们记录实际的配置和结果,那么就更容易将适当的设置映射到我们得到的输出。
Pickle —可用于保存和加载 python 类或 PyTorch 模型以供重用。例如,在涉及文本预处理的实验中,我们需要存储训练数据集的词汇和相应的嵌入,以及 word2index 和 index2word 字典。我们可以对对象进行 pickle,并在将来加载它,以节省预处理的时间。
这些库节省了大量的时间,帮助我们保持实现的整洁,并使实验结果更有说服力。让我们让深度学习变得有趣和简单。
如何用 CVAT 和五十一注释和改进计算机视觉数据集
使用开源工具 551 和 CVAT 构建高效标注工作流和训练更好模型的技巧
图像 505f00d8762c07fc 来自在五十一中可视化的开放图像数据集(图像由作者提供)
每个人都想培养伟大的模特。机器学习社区已经有一段时间以模型为中心,每个人都试图创建下一个最好的模型。最近,通过像软件 2.0 这样的想法,向以数据为中心的工作流转变的重要性变得越来越突出。在为你的任务训练模型时,你可能会发现,对你的模型最大的改进将来自仔细管理和改进你用来训练模型的数据集,而不是担心你正在使用的特定模型架构。
在数据集监管和注释领域, 五十一 和CVAT是两种领先的开源工具,分别处理数据集监管和改进工作流的不同部分,每个部分都有数万名用户。此外,这些工具现在与紧密集成,允许更快、更高效的工作流程。 FiftyOne 是一个数据集管理和模型分析工具,提供灵活的 API 和直观的应用程序,作为开源的“数据集 IDE” CVAT 是领先的开源图像和视频注释工具之一,由于其广泛的功能集和易于使用的界面而被广泛采用。51 和 CVAT 之间的集成允许您在 51 中管理和探索数据集,然后只需一行代码就可以将样本或现有标签发送到 CVAT 进行注释。
这篇文章涵盖了两个工作流程的例子,展示了如何使用 51 和 CVAT 之间的集成。第一个工作流智能地选择未标记数据的子集,并将其发送到 CVAT 进行注释。第二个工作流评估现有数据集以查找注记错误,并使用 CVAT 来提高数据集的质量。这两个例子都显示了与 551 和 CVAT 合作进行注释工作流是多么容易,从而更快地开发更好的模型所需的微调的计算机视觉数据集。
免责声明 :我是 Voxel51 的工程师,在做五十一!
跟随在科拉布
文章中展示的例子可以通过 Google Colab 直接在你的浏览器中运行。点击此链接查看!
Colab 笔记本随这篇文章一起出现(图片由作者提供)
设置
为了跟随这篇文章中的例子,你需要设置 51 和 CVAT。
对于 FiftyOne,你只需要安装开源 Python 包:
pip install fiftyone
对于 CVAT,您需要在cvat.org(或本地设置 CVAT)上进行记账。在本地设置 CVAT 的主要好处是避免 cvat.org 的 10 个任务和 500 Mb 限制。
CVAT 登录界面(图片由作者提供)
运行本文中的例子时,511 需要连接到你的 CVAT 账户。将您的 CVAT 用户名和密码传递给 FfityOne 的最简单方法是将它们存储在环境变量中。
export FIFTYONE_CVAT_USERNAME=<YOUR_USERNAME>
export FIFTYONE_CVAT_PASSWORD=<YOUR_PASSWORD>
如果您不想使用这些环境变量,查看向 fiftone提供您的 CVAT 用户名和密码的替代方法。
本帖还运行了一些需要 TensorFlow 的深度模型:
pip install tensorflow
如果你有一个 GPU 和/或想用 Conda 设置 Tensorflow 或 PyTorch,请查看这篇文章。
概观
在您自己的数据上使用 51 和 CVAT 之间的这种集成的基本工作流程包括:将您的数据(可能还有现有标签)加载到 51 中,浏览您的数据集以找到需要检查或注释的子集,将这些子集上传到 CVAT ,在 CVAT 对它们进行注释,以及将更新后的标签加载回 51 中。
未标记的数据集标注
对于大多数机器学习项目来说,第一步是收集特定任务所需的数据集。特别是对于计算机视觉项目来说,这通常会产生数以千计的图像或视频,这些图像或视频是从像 Flickr 这样的互联网来源收集的,或者是由数据采集团队的新镜头捕捉的。
对于包含数千或数百万样本的集合,注释每个样本的成本可能是天文数字。因此,确保只将最有用和最相关的数据发送给注释是有意义的。衡量数据在训练模型中有多“有用”的一个标准是该示例相对于数据集的其余部分有多独特。多个相似的例子不会像视觉上独特的例子那样给模型提供那么多新的信息来学习。
FiftyOne 提供了一套方法来计算数据集属性,如样本硬度、标签错误率,以及对该工作流程最重要的视觉相似性/唯一性。
加载数据
我们从加载一组未标记的图像到 51 个开始。这只用一行代码就可以完成。例如,如果您正在使用您自己的数据,您可以运行以下内容:
然而,在这篇博客中,我们将使用内置的51 数据集 Zoo 从 Open Images V6 数据集下载一些图像。
不管怎样,让我们创建数据集[persistent](https://voxel51.com/docs/fiftyone/user_guide/using_datasets.html#dataset-persistence)
,这样我们就可以关闭 Python 会话,并在需要时重新加载数据集。
既然数据已经加载,让我们在 FiftyOne 应用中可视化它。
打开在第五十一中可视化的图像(图片由作者提供)
寻找独特的样本
让我们对数据集运行[compute_similarity()](https://voxel51.com/docs/fiftyone/user_guide/brain.html#visual-similarity)
方法,以便根据数据集中所有其他样本的视觉相似性来索引数据集中的所有样本。一旦完成,我们就可以使用索引来根据视觉相似性找到最独特的样本。还有其他衡量独特性的方法,但在这篇博客中,我们主要关注这种基于相似性的方法。
我们还可以可视化选择的确切样本。默认情况下,这种可视化是用降维包umap-learn
计算的:
pip install umap-learn
由第 51 个大脑选择的独特样本图(图片由作者提供)
现在让我们在数据集内创建一个视图,该数据集只包含所选的独特样本,并对它们进行可视化。
减少了需要注释的样本数量后,注释该数据集的时间和成本也减少了。
注释样本
无论您是自己注释数据还是有一个注释团队,从 FiftyOne 向 CVAT 上传数据的工作流程几乎是相同的。样本集合上的[annotate()](https://voxel51.com/docs/fiftyone/api/fiftyone.core.collections.html#fiftyone.core.collections.SampleCollection.annotate)
方法允许您为正在注释的标签指定名称、类型和类别。
例如,如果我们为类“person”、“vehicle”和“animal”注释分段掩码,我们可以运行下面的代码。假设您想自己注释这些样本,那么一旦加载了数据,您可以使用 CVAT 编辑器自动启动一个浏览器窗口。对于这个示例帖子,让我们只加载视图中的几个示例。
results
对象可用于获取已创建任务的当前状态。
Status for label field 'segmentations':
Task 386 (FiftyOne_example_dataset_segmentations):
Status: annotation
Assignee: None
Last updated: 2021-08-20T21:22:37.928988Z
URL: [http://cvat.org/tasks/386](http://localhost:8080/tasks/386)
Job 441:
Status: annotation
Assignee: None
Reviewer: None
在 CVAT 给一张图片做注解(图片由作者提供)
一旦注释完成并保存在 CVAT,我们就可以下载注释并自动更新我们的数据集。
如果您想要将数据集上传到一个注释者团队,那么您可以提供注释者和审阅者的 CVAT 用户名,这些用户名将被分配循环方式。segment_size
参数用于定义 CVAT 任务中每个任务的最大图像数量。
在 CVAT 分配给用户的工作(图片由作者提供)
对于较大的数据集,注记过程可能需要一些时间。我们提供的anno_key
存储了关于在数据集上运行的注释的相关信息。当注释准备好导入回 FiftyOne 时,我们可以很容易地这样做:
数据集改进
在许多项目中,数据集已经存在,并用于训练模型。在这种情况下,时间的最佳利用可能会提高数据集的质量,这通常比优化模型体系结构的类似努力提供更大的性能增益。
FiftyOne 提供了强大的 API 和应用程序工作流来识别需要更新的样本/注释,并且与 CVAT 的紧密集成允许您采取必要的措施来提高数据集的质量。
对于这个示例工作流,让我们从第五十一数据集 Zoo 加载 COCO 对象检测数据集。
在这种情况下,我们将使用来自 FiftyOne Model Zoo 的模型,但是您也可以轻松地将您自己的模型预测添加到您的数据集中。为了运行这个特定的模型,我们还需要安装 TensorFlow 模型花园,其中包含:
eta install models
注意:建议在有 GPU 的机器上运行!
让我们想象一下这些模型预测。
可可数据集在五十一中可视化(图片由作者提供)
为了找到该模型表现如何的具体案例,让我们来评估该模型:
0.3957238101325776
使用 FiftyOne 复杂的查询语言,我们可以在数据集中构建不同的视图。具体来说,让我们找到模型对其预测有信心但预测被标记为不正确(假阳性)的样本。这表明模型可能是正确的,但是地面实况注释是不正确的。
浏览这些结果,我们可以看到一个模式出现。COCO 数据集在标签上包含一个iscrowd
布尔属性,指示边界框是包含一群多个对象还是仅包含一个对象实例。在许多模型不正确的情况下,iscrowd
属性被错误地注释或者完全丢失。
不正确的iscrowd
标签出现在第五十一(图片由作者提供)
我们可以通过点击选择相关样本并点击标签按钮来标记这些样本中的一些样本。
在五十一中标记样本(图片由作者提供)
我们现在可以使用annotate()
方法将这些样本和标签上传到 CVAT 进行重新标注。以下代码在您的帐户中的cvat.org上创建一个新任务,其中仅包含带有requires_annotation
标签的样本:
更正 CVAT 中的iscrowd
标注(图片由作者提供)
在更新了所有示例中的相关注释之后,确保点击 CVAT 中的 save 按钮。现在重记已经完成,让我们将更新的标签加载回 51,并清理在 CVAT 创建的任务。
更新了第五十一中的iscrowd
注释(图片由作者提供)
正如我们所见,数据集上的ground_truth
标签已经更新。让我们在这些更新的标签上再次评估同一个型号。
0.3984999388520894
模型的图仅仅通过更新一个样本中的单个标签,就从 39.57%提升到了 39.85%!下一步是花更多的时间探索 51 年的数据集,找出更多的注释错误,并将它们发送给 CVAT 的注释者团队进行审查和重新注释。可以指派特定的用户来注释或审阅通过该 API 创建的任务。
此工作流展示了如何改进数据集的验证拆分以及该拆分下模型的后续性能。在这一点上,我们实际上从未重新训练过模型!下一步是在整个数据集上迭代这个工作流,一次一个分割,直到它被完整地细化。然后,当需要训练模型时,演示与 PyTorch 数据加载器或 PyTorch Lightning Flash 集成的其他工作流是一个很好的起点。
摘要
构建高质量的数据集是产生高性能模型的最可靠的方法。用于构建和改进数据集的开源工具允许计算机视觉社区作为一个整体来开发更好的模型。五十一和 CVAT 是两个开源工具,现在紧密集成在一起,你可以用来从头管理和注释数据集,以及探索和重新注释现有的数据集以改进它们。
关于体素 51
Voxel51 总部位于密歇根州安阿伯,由密歇根大学教授 Jason Corso 博士和 Brian Moore 博士于 2016 年创立,是一家人工智能软件公司,通过提供开放核心软件构建模块,使计算机视觉和机器学习工程师能够快速设计数据驱动的工作流,从而实现软件 2.0 的民主化。
在 fiftyone.ai 了解更多!
处理阶级不平衡的工具
数据科学
你的工具带上必须有工具
照片由 Unsplash 上的 Aziz Acharki 拍摄
C 类不平衡指的是属于每个类的观察值的数量与属于其他类的观察值的数量显著不同的情况。这是机器学习中的常见问题之一,因为大多数机器学习算法都偏向于具有更多观察值的类,而且这经常会通过消除稀有类和预测多数类来误导我们的最终目标。
有许多处理类不平衡的技术,如成本敏感学习、采样方法和 SMOTE。我们将看到一些 python 库,它们将帮助我们通过使用这些技术来解决这个问题,从而节省我们的时间并改善结果。
Imb-learn:
不平衡学习是 scikit-learn-contrib 项目的一部分。这个软件包通过使用重采样技术的方法帮助我们处理类不平衡问题,例如
- 欠采样多数类
- 对少数民族阶层进行过度采样
- 结合过采样和欠采样技术
- 创建平衡数据集的集合
使用
让我们看看如何实现不平衡学习中的欠采样技术
首先,我们导入必要的库和所需的数据集,然后将它们分成训练集和测试集,对于这个例子,我们将使用 20 个新闻组数据集
现在,我们拟合一个朴素贝叶斯分类器并报告结果,正如您看到的度量宏平均 f1 分数(用于不平衡数据集)是 79%
我们修改了现有代码,添加了一个来自不平衡学习的 RandomUnderSampler,并安装了一个朴素贝叶斯分类器,您可以看到我们如何将 f1 分数从 79%提高到 85%
RandomUnderSampler 通过随机选择替换或不替换的样本对大多数类别进行欠采样[1]。因此,多数和少数阶级将成为平等的比例,这有助于改善指标
SMOTE-变体:
SMOTE-Synthetic Minority over sampling Technique 的缩写,是一种广泛使用的处理类不平衡问题的重采样技术,这个包 smote-variants 实现了 SMOTE 技术的 80 多种变体,除了这些实现之外,这个框架还可以方便地启用任何数量的过采样技术来处理未知数据集上的类不平衡。
尽管不平衡学习包实现了 smote 技术,但 smote-variants 包提供了 smote 技术的其他变体来帮助实现,而且作者已经发表了一篇论文[2],阐述了 SMOTE 技术在不平衡数据集上的所有比较和评估
用法:
smote-variants 包可以以各种方式用于解决类不平衡问题,我们将使用来自不平衡数据库库的不平衡数据集 iris0,该不平衡数据库具有许多不平衡数据集。
这是一个二元分类数据集,下图显示了类的散点图。从图中,我们可以注意到两个阶级之间的阶级不平衡
两类散点图
现在,我们可以使用 smote_variant 包中的 smote 技术对此数据集进行过采样
下图显示了使用 SMOTE 技术创建的新少数民族样本
带有 X 标记的样本是 SMOTE 新创建的
现在,我们可以使用这个过采样数据集来训练模型。查看库以获得更多示例。
回归重采样:
难道在回归任务中也会发生职业不平衡的问题!?
是的,当目标变量偏离特定范围时,这种情况会发生在回归任务中,即在特定范围内存在更多数量的样本,假设您正在为您所在的州构建一个预测房价的预测分析模型,但由于一些问题,您只能收集几个城市的数据。但是各个城市的房价不同,因此您当前数据集的目标变量现在与几个城市的房价有偏差,这将在您的模型中引起问题,因为您将对整个州使用您的模型。
偏斜度示例
为了避免这种情况,您可以使用此包,并使用不平衡学习包对数据集进行重新采样。
用法:
使用这个包相当简单明了
- 从包中导入重采样器类并初始化它。
- 使重采样器适合目标变量,这将通过宁滨目标变量来创建目标类
- 启动您喜欢的过采样技术,通过包中的重采样方法对数据集进行重采样(记住使用目标类而不是目标)
查看官方教程以获得更多示例[3]
感谢阅读:
如果你喜欢这篇文章或者有任何问题,请随时联系我
参考资料:
[2] 在大量不平衡数据集上对少数过采样技术的实证比较和评估
Python 的 Matplotlib 工具提示
如何在 Matplotlib 图表中添加工具提示
作者图片
允许用户悬停鼠标或点击我们的可视化的一部分,以获得更多的上下文是非常好的。工具提示是节省图表空间的绝佳方式。
例如,对于大多数散点图来说,标记每个点会变得很棘手。您可以对它们进行颜色编码并使用图例,但当数据太多时,即使这样也会变得混乱。
作者图片
在本文中,我们将了解如何使用事件处理程序并向 Matplotlib 图表添加工具提示。
mpl_connect
对于下面的例子,我们将使用 Matplotlib 和 Pandas。数据来自《世界幸福报告》。你可以在他们的网站上找到一个. xls 作为“数据面板”,或者从 Kaggle 获得一个. csv。
我正在使用 Jupyter Lab,所以我需要神奇的命令%matplotlib widget
来正确地渲染图形。
根据您的 Jupyter 版本,您可能需要不同的命令,如%matplotlib notebook
或%matplotlib ipympl
。如果你正在运行一个脚本,你不需要任何东西。
import matplotlib.pyplot as plt
import pandas as pd
%matplotlib widget# [https://www.kaggle.com/ajaypalsinghlo/world-happiness-report-2021](https://www.kaggle.com/ajaypalsinghlo/world-happiness-report-2021)
df = pd.read_csv('data/world-happiness-report.csv')
df = df[df['year'] == 2020]x_name = 'Healthy life expectancy at birth'
y_name = 'Freedom to make life choices'
tooltip_name = 'Country name'x = df[x_name]
y = df[y_name]
tt = df[tooltip_name].valuesdf
作者图片
让我们从一个简单的散点图开始,并以此为基础进行构建。
fig, ax = plt.subplots(1, figsize=(12,6))ax.scatter(x, y)plt.xlabel(x_name)
plt.ylabel(y_name)plt.show()
简单散点图—图片由作者提供
现在,我们将创建一个函数,当鼠标悬停在可视化效果上时,将调用该函数。
简单地说,我们将添加一个文本“图表就绪”,我们的函数在被调用时会将该文本变为空白。
fig, ax = plt.subplots(1, figsize=(12,6))ax.scatter(x,y)
plt.xlabel(x_name)
plt.ylabel(y_name)**annot_x = (plt.xlim()[1] + plt.xlim()[0])/2
annot_y = (plt.ylim()[1] + plt.ylim()[0])/2
txt = ax.text(annot_x, annot_y, "Chart Ready",
ha='center', fontsize=36, color='#DD4012')****def hover(event):
txt.set_text("")****fig.canvas.mpl_connect("motion_notify_event", hover)**plt.show()
检测光标移动-作者提供的图像
我们使用 Matplotlib 的 "motion_notify_event" 来检测鼠标移动,但是还有很多其他的事件可以尝试。
button_press_event,button_release_event,draw_event,key_press_event,key_release_event,pick_event,resize_event,scroll_event,figure_enter_event,figure_leave_event,axes_enter_event,axes_leave_event,close_event。
光标 XY 坐标
我们的想法是用我们将使用的所有元素来绘制图表,然后使用事件来修改这些元素。
因此,即使某些元素只在特定事件被触发时显示,我们仍然应该在函数之外定义它。
我们在悬停函数中从 mpl_connect 接收到的事件具有一些有价值的属性;让我们试着得到鼠标的 XY 坐标。
plt.close('all')
fig, ax = plt.subplots(1, figsize=(12,6))ax.scatter(x,y)
plt.xlabel(x_name)
plt.ylabel(y_name)**lnx = plt.plot([60,60], [0,1.5], color='black', linewidth=0.3)
lny = plt.plot([0,100], [1.5,1.5], color='black', linewidth=0.3)
lnx[0].set_linestyle('None')
lny[0].set_linestyle('None')****plt.xlim(x.min()*0.95, x.max()*1.05)
plt.ylim(y.min()*0.95, y.max()*1.05)****def hover(event):
lnx[0].set_data([event.xdata, event.xdata], [0, 1.5])
lnx[0].set_linestyle('--')
lny[0].set_data([0,100], [event.ydata, event.ydata])
lny[0].set_linestyle('--')**
fig.canvas.mpl_connect("motion_notify_event", hover)plt.show()
用鼠标位置画线-作者图片
我们添加了线条,将它们的样式设置为 none,当检测到光标移动时,我们更改该线条的数据和样式来显示它。
工具提示
太好了!我们知道如何在绘图中添加和修改元素,以及如何检测光标的移动。
我们将创建一个空白注释,并检查鼠标位置是否在其中一个绘制点上。在这种情况下,我们会相应地更改注释的文本、位置和可见性。
plt.close('all')
fig, ax = plt.subplots(1, figsize=(12,6))# plot and labels
sc = ax.scatter(x,y)
plt.xlabel(x_name)
plt.ylabel(y_name)# cursor grid lines
lnx = plt.plot([60,60], [0,1.5], color='black', linewidth=0.3)
lny = plt.plot([0,100], [1.5,1.5], color='black', linewidth=0.3)
lnx[0].set_linestyle('None')
lny[0].set_linestyle('None')**# annotation
annot = ax.annotate("", xy=(0,0), xytext=(5,5),textcoords="offset points")
annot.set_visible(False)**# xy limits
plt.xlim(x.min()*0.95, x.max()*1.05)
plt.ylim(y.min()*0.95, y.max()*1.05)def hover(event):
**# check if event was in the axis
if event.inaxes == ax:**
# draw lines and make sure they're visible
lnx[0].set_data([event.xdata, event.xdata], [0, 1.5])
lnx[0].set_linestyle('--')
lny[0].set_data([0,100], [event.ydata, event.ydata])
lny[0].set_linestyle('--')
**lnx[0].set_visible(True)
lny[0].set_visible(True)
# get the points contained in the event
cont, ind = sc.contains(event)
if cont:
# change annotation position
annot.xy = (event.xdata, event.ydata)
# write the name of every point contained in the event
annot.set_text("{}".format(', '.join([tt[n] for n in ind["ind"]])))
annot.set_visible(True)
else:
annot.set_visible(False)
else:
lnx[0].set_visible(False)
lny[0].set_visible(False)**fig.canvas.mpl_connect("motion_notify_event", hover)plt.show()
工具提示!—作者图片
在那里!
我们的图表上有一个工具提示,但它并不容易构建。我们正在绘制一个散点图,它使用方便的方法.contains()
返回一个 PathCollection 对象。
Matplotlib 为不同的可视化返回不同的对象。bar 将返回 BarContainer,。plot 将返回 Line2D 列表,依此类推。
这意味着我们必须开发不同的解决方案来为每个可视化添加工具提示。
自由发展你的图表在每个事件中的表现是非常好的。但是取决于你的视觉化有多复杂,这可能会考验你的耐心。
幸运的是,在 Matplotlib 中添加工具提示还有其他解决方案。
mpl 光标
这个便捷的包通过一些简单易用的方法来简化 Matplotlib 中的鼠标事件。
他们还有许多易于定制的例子。所以与其去挖掘 Matplotlib 的文档,去揣摩你的方式。您可以替换示例中的几行,并立即获得工具提示。
import matplotlib.pyplot as plt
import mplcursors
%matplotlib widgetfig, ax = plt.subplots()
sc = ax.scatter(x,y)# by default the tooltip is displayed "onclick"
# we can change it by setting hover to True
cursor = mplcursors.cursor(sc, hover=True)# by default the annotation displays the xy positions
# this is to change it to the countries name
[@cursor](http://twitter.com/cursor).connect("add")
def on_add(sel):
sel.annotation.set(text=tt[sel.target.index])plt.show()
更简单的工具提示—按作者排序的图像
df = df.sort_values('Log GDP per capita')
df = df[df['Log GDP per capita'].notna()]fig, ax = plt.subplots(figsize=(12,6))
ax.bar(df['Country name'], df['Log GDP per capita'], align="center")
plt.xticks([])cursor = mplcursors.cursor(hover=mplcursors.HoverMode.Transient)
[@cursor](http://twitter.com/cursor).connect("add")
def on_add(sel):
sel.annotation.set(text=df.iloc[sel.target.index]['Country name'])plt.show()
条形图中的工具提示—按作者分类的图像
结论
总的来说,向 Matplotlib 图表添加工具提示会很快变得复杂,即使使用 Mplcursors,也没有想象中那么简单。
代号 —图片作者
我的看法是,我们可以使用 Mplcursors 为您的可视化添加一些额外的功能,而不必做太多的努力。如果您愿意付出更多的努力,您可以用 Matplotlib 的所有可用事件构建最复杂的可视化。
Python 还有其他选项,比如用于设计交互式数据可视化的 Plotly 或者 MplD3,它通过将 Matplotlib 图表转换成 D3.js,为 Matplotlib 图表增加了一些额外的功能
感谢阅读!
所有图像都是我自己的。请随意使用它们。
参考资料:
https://matplot lib . org/stability/users/event _ handling . html;
https://matplotlib . org/stability/API/后端 _ bases _ API . html;
https://matplotlib . org/stability/API/_ as _ gen/matplotlib . lines . line 2d . html;
https://matplotlib . org/stability/API/_ as _ gen/matplotlib . pyplot . bar . html;
https://mplcursors . readthedocs . io/en/stable/;
每个机器学习工程师都应该知道的 10 大 CNN 架构
数据科学
2012 年至今
深度 CNN 的进化史(图片由作者提供)
卷积神经网络(CNN 或 ConvNet)是一种特定的深度学习架构。目前,有许多技术公司开发了积极的研究小组来探索 CNN 的新架构,如谷歌、微软和脸书,他们证明了 CNN 是理解和分析图像内容的最佳学习算法之一,在图像分割、分类、检测和检索相关任务中表现出高性能。
CNN是什么?
CNN 是为图像识别任务设计的,最初应用于手写数字识别的挑战。CNN 的基本设计目标是创建一个网络,其中网络早期层的神经元将提取局部视觉特征,后期层的神经元将组合这些特征以形成更高阶的特征。
作者图片
几乎每个 CNN 都有三种主要类型的层,分别是卷积层、汇集层和全连接层。
十大 CNN 架构
多年来,已经开发了许多 CNN 架构的变体来解决现实世界的问题。LeNet 是 CNN 的第一个成功应用,由 Yann Lecun 在 20 世纪 90 年代开发,用于读取邮政编码、数字等。最新的工作被称为 LeNet-5,它是一个 5 层 CNN,在孤立字符识别上达到 99.2 %的准确率。
十大 CNN 架构(作者举例)
在本文中,我们将讨论每个机器学习工程师都应该知道的 10 大 CNN 架构,这些架构推动了全球深度学习领域的发展。
AlexNet
2012 年,Alex Krizhevsky、Ilya Sutskever 和 Geoff Hinton 以 84.6%的测试准确率赢得了 ImageNet 大规模视觉识别挑战赛。该模型的表现明显优于第二名(前五名的误差为 16%,而第二名的误差为 26%)。Krizhevsky 使用 GPU 来训练 AlexNet,这使得 CNN 模型的训练速度更快,并开始了一波基于 CNN 的兴趣和新作品。
AlexNet 网络架构(由作者说明)
该网络由 5 个卷积层和 3 个全连接层组成。
VGG-16
该模型在 ImageNet 中达到了 92.7%的 top-5 测试准确率,ImageNet 是一个包含属于 1000 个类的超过 1400 万个图像的数据集。这是由 2014⁴.牛津大学视觉几何小组实验室的卡伦·西蒙扬和安德鲁·齐塞曼提出的
VGG-16 网络架构(由作者说明)
VGG16 中的 16 是指它总共有 16 层有权重。
VGG-19
VGG-19 是一个 19 层深的卷积神经网络,可以将图像分类为 1000 种对象类别,如键盘、鼠标和许多动物。该模型对 Imagenet 数据库中的 100 多万张图像进行了训练,准确率达到 92%。
盗梦空间和谷歌网
谷歌网络(或盗梦空间 v1)有 22 层 deep⁴.该模型以 93.3%的准确率赢得了 2014 年 ImageNet 竞赛的分类和检测任务。
雷斯内特
网络是由微软创建和熟悉的。该模型以 96.4%的准确率赢得了 2016 年 ImageNet 竞赛。由于其深度(达到 152 层)和残余块的引入,它是众所周知的。
挤压网
它由 18 个深层组成,可以将图像分为 1000 个对象类别,如键盘、鼠标、铅笔和许多动物。对于与 AlexNet 相同的精度,SqueezeNet 可以快 3 倍,小 500 倍。
DenseNet
“DenseNet”这个名字指的是黄高、刘庄和他们的团队在 2017 年 CVPR 大会上开发的密集连接卷积 Networks⁷。它获得了最佳论文奖,并被引用了 2000 多次。传统的具有 n 层的卷积网络具有 n 个连接,但是由于前馈方式,DensetNet 总共具有 n(n+1)/2 个连接。
Shuffile 网
这是一种极其高效的 CNN 架构,拥有 173 个深层,专为计算能力为 10–150 mflops⁶.的移动设备而设计在图像网络分类上,它设法获得比移动网络系统更低的 top-1 误差(绝对 7.8%)。
ENet
有效的神经 Network⁸提供了实时执行逐像素语义分割的能力。ENet 的速度提高了 18 倍,所需的触发器数量减少了 75 倍,参数数量减少了 79 倍,精度与现有模型相当或更高。Enet 是语义分割中最快的模型。
结论
我们可以看到,随着时间的推移,在大多数情况下,精确度一直在逐渐提高。
参考
[1] Fukushima,K. Neocognitron:不受位置变化影响的模式识别机制的自组织神经网络模型。生物。控制论 36,193–202(1980)。https://doi.org/10.1007/BF00344251
[2] Y. LeCun、L. Bottou、Y. Bengio 和 P. Haffner。基于梯度的学习在文档识别中的应用。IEEE 会议录,1998。
[3]克里热夫斯基,亚历克斯&苏茨基弗,伊利亚&辛顿,杰弗里。(2012).基于深度卷积神经网络的图像网分类。神经信息处理系统。25.10.1145/3065386.
[4] C. Szegedy 等人,“用卷积走得更深”,2015 年 IEEE 计算机视觉和模式识别会议(CVPR),波士顿,马萨诸塞州,2015 年,第 1–9 页,doi:10.1109/cvpr . 20015 . 486868666106
[5]西蒙扬,卡伦&齐塞尔曼,安德鲁。(2014).用于大规模图像识别的非常深的卷积网络。arXiv 1409.1556。
[6] X. Zhang,X. Zhou,M. Lin 和 J. Sun,“ShuffleNet:一种用于移动设备的极其高效的卷积神经网络”,2018 年 IEEE/CVF 计算机视觉和模式识别会议,犹他州盐湖城,2018 年,第 6848–6856 页,doi: 10.1109/CVPR.2018.00716
[7] G. Huang,Z. Liu,L. Van Der Maaten 和 K. Q. Weinberger,“密集连接的卷积网络”,2017 年 IEEE 计算机视觉和模式识别会议(CVPR),檀香山,HI,2017,第 2261–2269 页,doi: 10.1109/CVPR.2017.243
[8]帕兹克、亚当&乔拉西亚、阿布舍克&金、桑皮尔&库尔切洛、尤金尼奥。(2016).ENet:一种用于实时语义分割的深度神经网络架构。
面向初学者的十大数据科学项目
加强你的技能,建立一个突出的投资组合
Jo Szczepanska 在 Unsplash 上拍摄的照片
作为一名有抱负的数据科学家,你一定听过“做数据科学项目”这个建议超过一千次。
数据科学项目不仅是一次很好的学习经历,还能帮助你从一群希望进入该领域的数据科学爱好者中脱颖而出。
然而,并不是所有的数据科学项目都有助于你的简历脱颖而出。事实上,在你的投资组合中列出错误的项目弊大于利。
在这篇文章中,我将带你浏览简历上的那些必备项目。
我还将为您提供样本数据集来试验每个项目,以及相关的教程,帮助您完成项目。
技能 1:数据收集
詹姆斯·哈里森在 Unsplash 上拍摄的照片
数据收集和预处理是数据科学家最重要的技能之一。
在我的数据科学工作中,我的大部分工作涉及到 Python 中的数据收集和清理。了解业务需求后,我们需要访问互联网上的相关数据。
这可以通过使用 API 或 web 抓取器来完成。一旦完成,数据需要被清理并存储到数据帧中,其格式可以作为输入输入到机器学习模型中。
这是数据科学家工作中最耗时的方面。
我建议通过完成以下项目来展示你在数据收集和预处理方面的技能:
网络搜集——食品评论网站
教程:使用 BeautifulSoup 的 Zomato Web Scraping
语言:Python
从食品配送网站上搜集评论是一个有趣且实用的项目,可以写进你的简历。
只需构建一个 web scraper,从该网站的所有网页中收集所有评论信息,并将其存储在一个数据框中。
如果你想让这个项目更进一步,你可以使用收集的数据建立一个情感分析模型,并对这些评论中的哪些是积极的,哪些是消极的进行分类。
下一次你想找点吃的,挑一家评论总体情绪最好的餐馆。
网络搜集—在线课程网站
教程:用 Python 在 8 分钟内搭建一个 Web 刮刀
语言:Python
想找到 2021 年最好的在线课程吗?很难在数百门数据科学课程中找到一门价格合理但评价很高的课程。
您可以通过抓取在线课程网站并将所有结果存储到数据框中来实现这一点。
更进一步,你还可以围绕价格和评级等变量创建可视化,以找到一个既负担得起又质量好的球场。
你也可以创建一个情感分析模型,得出每个在线课程的总体情感。然后你可以选择总体情绪最高的课程。
奖金
创建一些项目,使用 API 或其他外部工具收集数据。这些技能通常会在你开始工作时派上用场。
大多数依赖第三方数据的公司通常会购买 API access,您需要借助这些外部工具来收集数据。
您可以做一个示例项目:使用 Twitter API 收集与特定 hashtag 相关的数据,并将数据存储在数据框中。
技能 2:探索性数据分析
收集和存储数据后,您需要对数据框中的所有变量进行分析。
你需要观察每个变量是如何分布的,并了解它们之间的关系。你还必须能够在可用数据的帮助下回答问题。
作为一名数据科学家,这是你经常要做的工作,甚至可能比预测建模还要多。
以下是一些 EDA 项目的想法:
识别心脏病的危险因素
数据集:弗雷明汉心脏研究
教程:弗雷明汉心脏研究:决策树
语言:Python 或 R
该数据集包括用于预测患者心脏病发作的预测因子,如胆固醇、年龄、糖尿病和家族史。
您可以使用 Python 或 R 来分析该数据集中存在的关系,并得出以下问题的答案:
- 糖尿病患者在年轻时更容易患心脏病吗?
- 有没有某个人口统计群体比其他人患心脏病的风险更高?
- 经常锻炼会降低患心脏病的风险吗?
- 吸烟者比不吸烟者更容易患心脏病吗?
能够在可用数据的帮助下回答这些问题是数据科学家必须具备的一项重要技能。
这个项目不仅有助于加强你作为分析师的技能,还将展示你从大型数据集获得洞察力的能力。
世界幸福报告
数据集:世界幸福报告
教程:世界幸福报告 EDA
语言:Python
《世界幸福报告》追踪了衡量全球幸福的六个因素——预期寿命、经济状况、社会支持、廉洁、自由和慷慨。
对该数据集执行分析时,您可以回答以下问题:
- 世界上哪个国家最幸福?
- 一个国家幸福的最重要因素是什么?
- 总体幸福感是增加了还是减少了?
再说一遍,这个项目将有助于提高你作为分析师的技能。我在大多数成功的数据分析师身上看到的一个特质是好奇心。
数据科学家和分析师总是在寻找促成因素。
他们总是在寻找变量之间的关系,并不断提出问题。
如果你是一名有抱负的数据科学家,做这样的项目将有助于你培养分析思维。
技能 3:数据可视化
当你开始作为一名数据科学家工作时,你的客户和利益相关者通常是非技术人员。
您将需要分解您的见解,并向非技术观众展示您的发现。
最好的方法是以可视化的形式。
展示一个交互式仪表板将有助于你更好地传达你的见解,因为图表乍一看很容易理解。
正因如此,许多公司将数据可视化列为数据科学相关职位的必备技能。
以下是一些你可以在作品集上展示的项目,以展示你的数据可视化技能:
构建新冠肺炎仪表板
教程:用 Python 和 Tableau 搭建新冠肺炎仪表盘
语言:Python
您首先需要使用 Python 预处理上面的数据集。然后,您可以使用 Tableau 创建一个交互式新冠肺炎仪表板。
Tableau 是最受欢迎的数据可视化工具之一,是大多数入门级数据科学职位的先决条件。
使用 Tableau 构建仪表板并在您的投资组合中展示它将有助于您脱颖而出,因为它展示了您使用该工具的熟练程度。
构建 IMD b-电影数据集仪表板
数据集: IMDb 顶级电影
您可以使用 IMDb 数据集进行实验,并使用 Tableau 创建交互式电影仪表盘。
正如我上面提到的,展示你制作的 Tableau 仪表盘可以帮助你的投资组合脱颖而出。
Tableau 的另一个优点是,你可以将你的可视化上传到 Tableau Public,并与任何想使用你的仪表板的人分享链接。
这意味着潜在雇主可以与你的仪表板互动,从而激发兴趣。一旦他们对你的项目感兴趣,并能真正地摆弄最终产品,你就离得到这份工作更近了一步。
如果你想入门 Tableau,可以在这里访问我的教程。
技能 4:机器学习
凯文·Ku 在 Unsplash 上拍摄的照片
最后,你需要展示展示你在机器学习方面的熟练程度的项目。
我建议两者都做——有监督的和无监督的机器学习项目。
食品评论的情感分析
数据集:亚马逊美食评论数据集
语言:Python
情感分析是机器学习的一个非常重要的方面。企业经常用它来衡量顾客对其产品的总体反应。
客户通常会在社交媒体和客户反馈论坛上谈论产品。可以收集和分析这些数据,以了解不同的人如何对不同的营销策略做出反应。
基于所进行的情感分析,公司可以对他们的产品进行不同的定位或者改变他们的目标受众。
我建议在你的投资组合中展示一个情绪分析项目,因为几乎所有的企业都有社交媒体存在,并且需要评估客户反馈。
预期寿命预测
数据集:预期寿命数据集
教程:寿命回归
语言:Python
在本项目中,您将根据教育程度、婴儿死亡人数、饮酒量和成人死亡率等变量来预测一个人的预期寿命。
我上面列出的情感分析项目是一个分类问题,这就是为什么我要在列表中添加一个回归问题。
在你的简历上展示各种各样的项目来展示你在不同领域的专长是很重要的。
乳腺癌分析
数据集:乳腺癌数据集
教程:乳腺癌数据集的聚类分析
语言:Python
在本项目中,您将使用 K-means 聚类算法根据目标属性检测乳腺癌的存在。
K-means 聚类是一种无监督学习技术。
在你的投资组合中有聚类项目是很重要的,因为大多数真实世界的数据是没有标记的。
即使是公司收集的海量数据集,通常也没有训练标签。作为一名数据科学家,你可能需要使用无监督学习技术自己做标记。
结论
你需要展示展示各种技能的项目——包括数据收集、分析、可视化和机器学习。
在线课程不足以让你获得所有这些领域的技能。然而,你可以找到几乎所有你想做的项目的教程。
你所需要的只是 Python 的基础知识,你将能够跟随这些教程。
一旦你让所有的代码都工作起来,并且能够正确地遵循,你就可以复制这个解决方案,并且自己处理各种不同的项目。
请记住,如果你是数据科学领域的初学者,并且没有该学科的学位或硕士学位,那么展示项目组合非常重要。
组合项目是向潜在雇主展示你技能的最佳方式之一,尤其是在这个领域获得你的第一份入门级工作。
点击这里,了解我如何获得我的第一份数据科学实习。
迟早,胜利者是那些认为自己能行的人——保罗·图尼尔
2021 年将使用的 10 大数据库
MySQL,Oracle,PostgreSQL,微软 SQL Server,MongoDB,Redis,Elasticsearch,Cassandra,MariaDB,IBM Db2
数据库是任何软件应用程序的基石。您将需要一个或多个数据库来开发几乎所有类型的软件应用程序:Web、企业、嵌入式系统、实时系统、AI、ML、HPC、区块链、物联网和许多其他应用程序。
二十年前,选择数据库要容易得多。在大多数情况下,您可以选择一个关系数据库系统,这样就完成了。但是在现代软件开发中,选择正确的数据库是最具挑战性的任务之一。
随着微服务、云、分布式应用、全球扩展、半结构化数据、大数据、快速数据、低延迟数据的兴起:传统的 SQL 数据库现在加入了各种【NoSQL】。 NewSQL、 和 Cloud 数据库。
目前有多达 343 个 T21 数据库。在这里,我将根据以下标准从这些数据库中筛选出 10 个数据库:
- 关键特征
- 流行
- 趋势
- 主流用途
- 美好未来
我将针对每个数据库讨论以下内容:
- 概述,包括简史。
- 5 个关键特征。
- 何时使用它们。
- 何时不使用它们。
- 人气。
- 趋势。
- 数据库即服务(DBaaS)。
- 替代品。
1.关系型数据库
1995 年,两位软件工程师 迈克尔·维德纽斯 和 大卫·阿克马克 ,创造了开源关系数据库管理系统 MySQL 。自诞生以来,MySQL 以其企业级的特性和免费、灵活( GPL )的社区许可,以及升级的商业许可,迅速在业界和社区中流行起来。在开源数据库中,PostgreSQL 侧重于创新和高级功能,而 MySQL 则侧重于健壮性、稳定性和成熟度。
今天,MySQL 是最流行和最广泛使用的 SQL 数据库之一。它也是 Web 应用程序中使用最多的数据库之一。一些世界上最大的网络规模的应用程序(如脸书,优步)使用 MySQL。
5 个关键特征
- 具有两种许可模式的开源 RDBMS:免费社区服务器和专有企业服务器。
- 提供 ACID 事务保证(使用 InnoDB 引擎)。就 CAP 而言,它提供了即时的一致性。
- 通过其无共享 MySQL 集群提供水平分区(分片)。因此,它提供了高可用性和高吞吐量,同时具有低延迟和接近线性的扩展能力。
- 通过 MySQL 集群,它提供了多主 ACID 事务。
- 多模型数据库,支持结构化数据(SQL)和半结构化数据(JSON)。
何时使用 MySQL
- 具有 ACID 事务保证的结构化数据(SQL)。
- 水平可伸缩性是一项关键要求,尤其是在写入大量数据时。
- 多主 ACID 事务是一个基本要求。
- 数据安全性是一个关键特性。
- 需要一个融合数据库,即一个数据库同时用于 OLTP 和 OLAP 工作负载。
何时不用 MySQL
- 当需要在一个全球分布式数据库中处理数百万个事务时,就需要使用分布式 SQL 。
- 数据是非常相关的(例如,社交媒体),即,像图表一样的数据。
- 数据是半结构化的,即具有高级查询功能的 JSON 数据。
- 高级数据保护(例如屏蔽、混淆、节流)是必须的。
MySQL 即服务
- MySQL 数据库服务(多云、OLTP 和 OLAP)
- 缩放网格(水平缩放)
- Vitess (水平缩放)
- Aiven for MySQL (多云)
- 亚马逊 MySQL RDS
- Oracle MySQL 云服务(横向扩展)
- Azure MySQL 数据库
- 用于 MySQL 的谷歌云 SQL
可供选择的事物
人气:
MySQL 社区版是业内使用最广泛的免费数据库。此外,其商业版本在行业中广泛使用。
最著名的数据库排名网站 DB-Engines 将 MySQL 列为排名第二的数据库,仅次于 Oracle:
作者图片(数据: DB-Engines )
《2020 年栈溢出开发者调查》将 MySQL 列为 2020 年最受欢迎的数据库:
趋势
有着 25 年历史的 MySQL 并不是目前最时髦的数据库。但与其他较老的数据库不同,它仍然保持着很高的吸引力,如下所示:
来源: DB-Engines
此外,谷歌趋势在过去几年中显示了一个相对稳定的图表:
来源:谷歌趋势
2.神谕
当 Edgar F. Codd 发表了他的革命性论文“ 一种用于大型共享数据银行的数据的关系模型”(1970)关于关系数据库管理系统(RDBMS)时,它彻底改变了数据库系统的面貌。这篇论文特别启发了一位年轻的软件工程师拉里·埃里森(现任甲骨文公司首席技术官)。他后来在 1979 年创造了世界上第一个商用 RDBMS 系统 甲骨文 。从那时起,Oracle 一直是领先的商业 RDMBS 系统,并主导了 Unix 和 Linux 系统。在过去的 41 年里,Oracle 与时俱进,为 RDBMS 和整个数据库系统的创新做出了贡献。
目前,Oracle 是最受商业支持的数据库,也是广泛使用的 RDBMS 之一。它的最新版本( 21.c )增加了许多创新功能,这将使它在未来几年成为一个有吸引力的选择。
5 个关键特征
- 专有 RDBMS。
- 提供 ACID 交易保证。就 CAP 而言,它提供了作为单个服务器的即时一致性。
- 支持结构化数据(SQL)、半结构化数据(JSON、XML)、空间数据和 RDF 存储的高级多模型数据库。根据具体的数据模型提供多种访问模式
- 提供区块链表。
- 支持 OLTP 和 OLAP 工作负载。
何时使用 Oracle
- 如果公司想要一个聚合数据库或主数据库(一个数据库用于 OLTP 和 OLAP)。
- 具有结构化(SQL)数据的传统事务性工作负载,以及 ACID 事务保证是关键标准的情况。
- 需要区块链表。
- 用于数据仓库。
- 包括地理空间数据类型的多模型数据库是一项基本要求。
何时不使用甲骨文
- 如果一个公司想在数据库上省钱。
- 多主 ACID 事务是一个必须具备的特性。
- 数据是半结构化的,即带有高级查询功能的 JSON 数据。
- 数据是非常相关的(例如,社交媒体),即,像图表一样的数据。
Oracle 即服务
可供选择的事物
流行
四十年来,Oracle 一直为其客户提供稳定、成熟的企业级数据库。尽管它面临着来自开源 SQL 数据库和 NoSQL 数据库的激烈竞争,但它仍然是 DB-Engines 排名中最受欢迎的数据库系统:
作者图片(数据: DB-Engines )
然而,在 Stack Overflow 开发者调查中,它被排在第 8 位,因为该列表被开源数据库所主导:
趋势
甲骨文公司的最新版本可能会大赚一笔。因此,在过去几年里,它获得了很大的吸引力。考虑到市场正在转向开源数据库,这是一个壮举:
来源: DB 引擎
此外,Google trends 为 Oracle 显示了一条奇怪的平坦曲线,这对于商业数据库来说是罕见的:
来源:谷歌趋势
3.一种数据库系统
自 20 世纪 70 年代初以来, 加州大学伯克利分校 一直致力于通过其开创性的数据库项目 Ingres 塑造现代数据库管理系统。1986 年,传奇人物 迈克尔·斯通布雷克 领导 POSTGRES(后 Ingres)项目解决现有数据库项目的问题。 PostgreSQL 诞生于 POSTGRES 项目的一部分,是一个关系数据库管理系统。在过去的 30 年里,PostgreSQL 引领着现代数据库的发展,贡献了许多创新,迈克尔·斯通布雷克在 2014 年获得了图灵奖,主要是因为他在 PostgreSQL 方面的工作。
如今,PostgreSQL 是使用最多的数据库之一。它也是最先进的开源关系数据库。
5 个关键特征
- 开放源码 RDMBS,带有非常许可的 PostgreSQL 许可证。PostgreSQL 有许多扩展,具有各种高级特性。
- 提供 ACID 交易保证。就 CAP 而言,它提供了作为单个服务器的即时一致性。
- 作为 PostgreSQL 的扩展,Citus Data 提供了人们梦寐以求的分布式 SQL 特性,即具有 SQL 数据库的事务保证和 NoSQL 数据库的水平伸缩的数据库。
- 它提供了更高级的索引,如部分索引,布隆过滤器。此外,在 PostgreSQL 中创建索引是非阻塞的。
- 它是一个功能丰富的多模型数据库,支持结构化数据(SQL)、半结构化数据(JSON、XML)、键值、空间数据。
何时使用 PostgreSQL
- 数据是结构化的(SQL),ACID 事务保证是具有严格数据完整性的关键标准。
- 当需要“分布式 SQL ”时,数百万个事务应该在一个全球分布式数据库中处理。
- 需要一个复杂的查询规划。
- 需要高级可靠性和灾难恢复,例如 PITR、主动备用。
- 包括地理空间数据类型的多模型数据库是预期的。
何时不使用 PostgreSQL
- 多主 ACID 事务是一个必须具备的特性。
- 数据是半结构化的,即带有高级查询计划器的 JSON 数据。
- 需要融合数据库(OLTP 和 OLAP)。
- 数据是非常相关的(例如,社交媒体),即,像图表一样的数据。
PostgreSQL 即服务
- 【PostgreSQL 的 EDB(水平缩放)
- CitusData (分布式 SQL)
- ScaleGrid (水平缩放)
- Aiven for PostgreSQL (多云)
- 亚马逊 RDS for PostgreSQL
- Azure PostgreSQL 数据库
- Google Cloud SQL for PostgreSQL
可供选择的事物
流行
PostgreSQL 是最古老的开源免费数据库之一。它拥有巨大的社区支持,在社区和行业中都有使用。
根据数据库引擎,它是最受欢迎的数据库之一:
作者图片(数据: DB-Engines )
根据 Stack Overflow 开发者调查,它是 2020 年第二受欢迎的数据库:
趋势
由于其先进的特性和创新,PostgreSQL 在推出 30 年后仍受到广泛关注,如下所示:
来源: DB 引擎
Google Trends 还显示,近年来 PostgreSQL 的吸引力有所增加,这证明了人们对 PostgreSQL 的兴趣越来越大:
来源:谷歌趋势
4.Microsoft SQL Server
1988 年, 微软 联合 阿什顿-泰特 和Sybase创建了一个 RDBMS 作为Sybase SQL Server的变种。1989 年,他们发布了第一版 微软 SQL Server 。尽管不像其他产品那样具有创新性或先进性,但 Microsoft SQL Server 多年来经历了重大的更新和改进。最初是为 IBMhttps://en.wikipedia.org/wiki/IBM****OS/2、 发布的,很快就为 Windows 系统发布了。在过去的三十年里,它是 Windows 系统中占主导地位的商业中型数据库。********
目前,它是领先的商业数据库系统之一,拥有微软优秀的工具支持。
5 个关键特征
- 拥有不同许可的专有 RDBMS:开发人员和快速(免费)、标准和企业(商业)。
- 提供 ACID 交易保证。就 CAP 而言,它提供了作为单个服务器的即时一致性。
- 通过 T-SQL 支持服务器端脚本。NET 语言、R、Python 和 Java。
- 它是一个多模型数据库,支持结构化数据(SQL)、半结构化数据(JSON)、空间数据。
- 出色的内部和云工具支持。此外,Azure 还提供了将内部 SQL Server 轻松迁移到云的工具。
何时使用 SQL Server
- 数据是结构化的(SQL ),具有 ACID 事务保证。
- 开发平台与其他微软产品紧密结合。
- Azure Cloud 是首选的公共云技术,更倾向于托管 SQL 数据库。
- 一家公司已经有了 MS-SQL 数据库,并希望将它们迁移到云中。
何时不使用 SQL Server
- 不适合数据库预算较低的公司。
- 多主 ACID 事务是一个必须具备的特性。
- 数据是半结构化的,即 JSON 数据,需要高级的查询操作。
- 分布式 SQL 数据库是可取的。
- 需要一个融合数据库。
SQL Server 即服务
可供选择的事物
人气:
MS SQL 是 Windows 平台中最流行的商业数据库,也是 Azure Cloud 中首选的 SQL 数据库。由于这些事实,根据 DB-Engines 排名,它仍然是第三大最受欢迎的数据库:
作者图片(数据: DB-Engines )
它也是栈溢出开发者调查中第三受欢迎的数据库:
趋势
MS SQL 是这个列表中最老的数据库之一。尽管它是一个可靠而稳定的数据库,但它不是最具创新性或最先进的数据库,并且有下降趋势,如 DB-Engines 趋势所示:
来源:DB-引擎
谷歌趋势显示 MS SQL 多年来呈下降趋势,这一趋势在 2021 年也不会改变:
来源:谷歌趋势
5.MongoDB
当我们需要在数据库中保存半结构化数据(例如,JSON、XML)时,有许多用例。此外,使用面向对象编程语言将数据加载和访问到 RDBMS 中需要额外的应用级映射(对象关系阻抗不匹配)。为了解决这些问题,特别是处理文档数据,公司 10gen (现为 MongoDB Inc. )于 2009 年发布了 MongoDB 作为第一个文档数据库。在接下来的十年里,MongoDB 经历了重大改进。它解决了许多缺点(例如安全性),并创新和开创了许多功能。**
目前,它是主要的文件数据库和主要的 NoSQL 数据库。
5 个关键特征
- 开放核心的 NoSQL 文档数据库(BSON),拥有各种许可:社区服务器(免费)、企业服务器(商业)、Atlas(在云中管理)。
- 通过自动分片提供水平扩展,并通过主从节点提供内置复制。CAP 方面,是 CP(一致和分区容忍)。
- 具有快照隔离的分布式多文档 ACID 事务。
- 丰富而强大的查询语言,使用聚合管道进行复杂查询。它还支持地图缩小查询、文本搜索、图形搜索和地理搜索。
- MongoDB Inc .也提供了基于 MongoDB 构建的全文搜索引擎(Atlas Search)和数据湖(Atlas Data Lake)。
何时使用 MongoDB
- 数据是具有高级查询功能的文档或半结构化数据(例如 JSON、XML)。
- 模式不断变化的快速应用程序开发。
- 大型结构化数据被规范化为多个 SQL 表,在性能和复杂性方面受到影响。
- 数据是无模式的。
- 对于半结构化数据,一致性优于可用性。
何时不使用 MongoDB
- 数据是结构化数据。
- 数据是非常相关的(例如,社交媒体),即,像图表一样的数据。
- 用于数据仓库(OLAP 数据库)。
- 写负载繁重时需要多主机写入。
- 高可用性优先于一致性。
MongoDB 即服务
- MongoDB 图集(全局缩放)
- ScaleGrid MongoDB (托管 MongoDB)
- 用于 MongoDB 的 ApsaraDB
可供选择的事物
- 亚马逊 DynamoDB
- 蔚蓝宇宙数据库
- 亚马逊文档数据库
- 沙发底座
- CouchDB
- 谷歌云 Firestore
流行
作为著名的文档数据库,MongoDB 近年来人气飙升,根据数据库引擎排名,MongoDB 是第五大最受欢迎的数据库:
图片作者(数据: DB-Engines )
2020 年堆栈溢出开发者调查也将 MongoDB 排在第五位:
趋势
近年来,MongoDB 的发展势头越来越猛,DB 引擎就说明了这一点:
来源: DB 引擎
Google Trends 还显示了 MongoDB 的上升趋势:
来源:谷歌趋势
6.雷迪斯
2009 年,一位意大利开发人员, 萨尔瓦托勒·桑菲利波, 试图提高他的初创公司的可扩展性,并希望开发一个实时日志分析器。他在使用传统数据库系统时遇到了严重的伸缩问题,并创建了 Redis 作为分布式内存键值存储。Redis 很快得到了社区的支持,并发展成为一种高度可伸缩的内存数据结构存储,在业界得到了广泛应用。
5 个关键特征
- 具有 BSD 3 条款许可的开放核心分布式内存中 NoSQL 数据结构存储。
- 用作分布式内存中的键值数据库。也用作分布式缓存(有或没有数据库)或具有可选持久性的消息代理。
- 支持广泛的数据结构:字符串、散列、列表、集合、带有范围查询的排序集合、位图、超级日志、地理空间索引和流。
- 高度可扩展,内置复制、自动故障转移和通过 Redis 集群进行分片。CAP 方面,是 CP(一致和分区容忍)。
- 高级缓存功能(LRU 驱逐策略、TTL 有限的密钥)。
何时使用 Redis
- 需要分布式内存数据结构。
- 例如,为了提高数据库访问性能,需要分布式和企业级缓存。
- 用于会话管理。
- 实时用例,例如库存系统。
- 对于大量的数据集。
何时不使用 Redis
- 一小组数据需要一个服务器内存数据结构存储。
- 具有 ACID 事务保证的主数据存储(OLTP 数据库)。
- 一小部分数据需要单个服务器缓存。
- 数据是非常相关的(例如,社交媒体),即,像图表一样的数据。
- 当需要 OLAP 数据库时。
Redis 即服务
- Redis 企业云(多云)
- ScaleGrid Redis (托管 Redis)
- Aiven for Redis (多云)
- 亚马逊 elastic cache
- Redis 的 Azure 缓存
- 谷歌记忆商店
可供选择的事物
人气:
分布式内存数据存储和分布式缓存是几乎所有企业的常见用例。因此,Redis 在业界非常受欢迎,如下所示:
作者图片(数据: DB-Engines )
Stack Overflow 开发者调查还将 Redis 列为第六大最受欢迎的数据库:
趋势
随着云和微服务的兴起,Redis 近年来受到了极大的关注,如下所示:
来源: DB-Engines
谷歌趋势还显示,自 Redis 成立以来,其趋势直线上升:
来源:谷歌趋势
7.弹性搜索
无论是小型创业公司,还是网络规模的电商公司,都需要全文搜索。 道格·切 于 1999 年为全文检索目的开发了 Java 库 Lucene 。从那时起,Lucene 就是全文搜索的行业标准。elastic search是基于 Lucene 的全文搜索引擎,最初由Shay Banon开发,于 2010 年发布。它是一个分布式的、支持多租户的全文搜索引擎,提供 REST API。
5 个关键特征
- 开放核心,分布式搜索引擎。
- 通过自动分片提供水平缩放。它是最具扩展性的搜索引擎。在 CAP 方面,是 AP(可用和分区容忍)。
- 提供 REST API,支持结构化和无模式数据(JSON)。因此,它特别适合于分析日志记录或监控数据。
- 支持自动复制和跨集群复制(CCR)。
- 强大的“弹性栈”(Elasticsearch,Kibana,Logstash,Beats)的一部分。组织在可观察性领域大量使用它。
何时使用 Elasticsearch
- 需要中级到高级的全文搜索。
- 高级机器学习功能(例如欺诈检测)需要近实时的全文搜索。
- 具有高级工具支持的搜索引擎(Kibana、Logstash、Beats)。
- 对于大量的数据集。
- 使用半结构化数据(例如 JSON、日志数据)。
何时不使用橡皮筋搜索
- 只需要基本的全文搜索功能。
- 需要符合 ACID 的主数据库(OLTP 数据库)。
- 数据集很小,只有结构化数据。
- 只需要全文搜索,不需要复杂的工具(Kibana、Logstash)。
- 当先进但昂贵的功能(如高级机器学习)不是关键需求时。
弹性搜索即服务
- 弹性云(多种云)
- Aiven for Elasticsearch (多云)
- 亚马逊弹性搜索服务
可供选择的事物
人气:
最近,Elasticsearch 被大量用作搜索引擎和应用程序的可观察性。因此,在 DB-Engines 排名中,它是第八大最受欢迎的数据库和最受欢迎的搜索引擎:
图片作者(数据: DB-Engines )
在 2020 年 Stack Overflow 开发者调查中,Elasticsearch 排名第 10 位,作为全文搜索引擎,这是一个巨大的成就:
趋势
最近,由于云计算和微服务的兴起,可观测性正引起人们极大的兴趣。作为现代可观测性堆栈的基石,弹性搜索近年来获得了巨大的牵引力:
来源:数据库引擎
来自 Google Trends 的数据也显示,近年来,人们对弹性搜索的兴趣显著上升:
来源:谷歌趋势
8.卡桑德拉
在 2000 年代中期,脸书发展迅速,需要大规模扩展的数据库。不幸的是,市场上没有能够满足脸书伸缩需求的数据库。受谷歌的 大表 论文(2006)和亚马逊的迪纳摩 论文(2007)、两位脸书工程师 阿维纳什·拉克什曼 (亚马逊迪纳摩论文的合著者) 普拉尚特·马利克 它是一个高度可扩展的数据库,在行业中广泛用于处理海量数据。
5 个关键特征
- 具有 Apache 许可证 2.0 的开放核心分布式宽列存储数据库。
- 用作 OLAP 数据库(如数据仓库)来处理海量数据。也用作时间序列数据库。
- 提供线性水平扩展和具有自动分片功能的最具可扩展性的数据库之一。在 CAP 方面,是 AP(可用和分区容忍)。
- 具有自动复制和多数据中心复制的分散式数据库(无领导)。因此,它是容错的,没有单点故障。
- 有用户友好的和 SQL 一样的查询语言:卡珊德拉查询语言(CQL)。
何时使用 Cassandra
- 作为典型的 OLAP 数据库,例如作为数据仓库。
- 作为具有大量写操作的时序数据库。
- Web 规模的应用程序需要以线性可伸缩性处理大量的读写操作。
- 适用于数据丢失可接受的高耐用性使用情形。
何时不使用 Cassandra
- 作为需要 ACID 事务保证的主数据库(OLTP)。
- 如果不需要线性可伸缩性或不需要高可用性。
- 如果数据被频繁删除,其性能就会下降(“墓碑”)。
- 它是基于 JVM 的,需要更多的节点,并且会导致高额的云费用。基于 C++的 Cassandra compliantScyllaDB是节省云账单的更好选择。
卡珊德拉即服务
可供选择的事物
人气:
Cassandra 是最流行的 NoSQL 数据库和最流行的宽列存储数据库之一。它是第九大最受欢迎的数据库,如下所示:
作者图片(数据: DB-Engines )
栈溢出开发者调查也将 Cassandra 排在 2020 年的第 12 位:
趋势
作为大规模 OLAP 工作负载的领先数据库,Cassandra 在 2016 年获得了巨大的牵引力,并且仍然保持着这一水平:
来源:DB-引擎
Google Trending 也显示出对 Cassandra 的长期稳定兴趣:
来源:谷歌趋势
9.MariaDB
当 Oracle 收购 Sun Microsystems 时,MySQL 的未来并不明朗,因为 Sun Microsystems 拥有它。MySQL 的联合创始人迈克尔·维德纽斯(Michael Widenius)分叉 MySQL,创建了 MariaDB 。MariaDB 是一个关系数据库管理系统,兼容 MySQL 协议和 MySQL 客户端。MySQL 服务器可以毫不费力地替换为 MariaDB 服务器,无需更改代码。与 MySQL 相比,MariaDB 更受社区驱动。
5 个关键特征
- 使用 GPL v2 许可证的开源 RDBMS。它有两种许可模式:免费社区服务器和商业企业服务器。
- 提供 ACID 事务保证(使用 InnoDB 引擎)。就 CAP 而言,它提供了作为单个服务器的即时一致性。
- 通过其存储引擎“ColumnStore”,MariaDB 提供了具有大规模并行分布式数据架构的列存储。它还通过其 MaxScale 和 Spider 引擎提供水平分区(分片)。因此,MariaDB 也适合作为 OLAP 数据库。
- 通过其图形计算引擎“OQGRAPH”,它支持分层和复杂的图形数据类型。
- 凭借其 Xpand 智能存储,它提供了开箱即用的“分布式 SQL 特性。因此,它每秒提供数百万次交易。
何时使用 MariaDB
- 数据是结构化的(SQL),ACID 事务保证是一个关键标准。
- 在需要在全球分布式数据库中处理数百万事务的情况下,需要使用“分布式 SQL ”。
- 需要多主机集群和多节点数据仓库(OLAP)。
- 需要多模型数据库,即一个数据库处理结构化、半结构化、图形和列数据。
- 需要一个聚合数据库,即一个数据库用于 OLTP、OLAP 和图形工作负载。
何时不使用 MariaDB
- 多主 ACID 事务是一个必须具备的特性。
- 数据是半结构化的,即需要 JSON 数据和非常高级的查询功能。
- 像降序,功能和不可见的高级索引是预期的。
- 需要高级认证和授权(例如,密码重用策略、部分撤销)。
MariaDB 即服务
- SkySQL (分布式 SQL)
- 亚马逊 RDS for MariaDB
- Maria db 的 Azure 数据库
可供选择的事物
人气:
四大 SQL 数据库主导着 SQL 数据库领域。作为这个榜单中最年轻的 SQL 数据库,MariaDB 获得人气并不容易。
但是 MariaDB 做得相当好,已经是最受欢迎的数据库之一,如下所示:
图片由作者提供(数据: DB-Engines
根据 Stack Overflow Developer Survey 2020,它已经超过了许多成熟的数据库,如 Oracle 和 IBM DB2:
趋势
MariaDB 拥有许多创新和分布式 SQL 特性,是最流行的 SQL 数据库之一,如下所示:
来源: DB-Engines
此外,正如 Google Trends 所显示的那样,它近年来越来越受欢迎:
来源:谷歌趋势
10.IBM Db2
1966 年,IBM 为阿波罗计划https://en.wikipedia.org/wiki/Apollo_program开发了第一个数据库管理系统 IMS (一个层次数据库)。当 IBM 工程师 Edgar F. Codd 发表他关于关系数据库的开创性论文时,IBM 不愿意放弃他们的 IMS 数据库。一旦 Oracle 发布了第一个关系数据库,IBM 很快纠正了它的路线,并在 1983 年发布了作为商业支持的 RDBMS 的 Db2。最初,IBM 为 IBM 的大型机发布了 Db2。1987 年,IBM 发布了适用于 Windows、Linux 和 Unix 系统的 Db2 LUW。这里我将讨论 Db2 LUW,因为 Db2 家族还有其他数据库。
多年来,IBM Db2 经历了许多重大变化,与 Oracle 发展得很像。
5 个关键特征
- Db2 是专有的 RDBMS,具有 ACID 事务保证。它有不同的许可:社区(免费)、标准和高级(商业)。
- 最先进的多模型数据库之一,支持结构化数据(SQL)、半结构化数据(JSON)和图形数据。
- 它也是一个聚合数据库(或主数据库),并通过 IBM BLU 加速(内存计算、大规模并行计算、基于列的 Db2 影子表)拥有出色的 OLAP 支持。
- 对 AI 的原生支持。
- 通过 Db2 pureScale 提供水平扩展。
何时使用 Db2
- 如果聚合数据库或主数据库(一个数据库用于多种用途)是关键要求。
- 作为具有 ACID 事务保证的主数据库(OLTP 数据库)。
- 数据库中的人工智能功能是竞争优势所必需的。
- 作为 OLAP 数据库(如数据仓库)。
- 该公司已经在使用 IBM Cloud 或 IBM Cloud Pack 用于数据 。
什么时候不用 Db2
- 如果公司想省钱或在预算内。
- 多主 ACID 事务是一个必须具备的特性。
- 数据是半结构化的,即带有高级查询功能的 JSON 数据。
- 需要一个没有人工智能功能的纯 SQL 数据库。
- 当只使用 Azure 或 Google Cloud 作为云提供商时。
Db2 即服务
可供选择的事物
人气:
Db2 曾经是市场的领导者,但近年来已经失去了它的声望,因为现在数据库领域的竞争是多方面的。
尽管如此,它仍然是大中型企业中使用最多的数据库之一,并且在受欢迎程度方面享有突出的地位:
作者图片(数据: DB-Engines )
在栈溢出开发者调查中,它的排名很低,这是有最近偏差的:
趋势
Db2 近年来也没有得到太多的关注,如下所示:
来源:数据库引擎
谷歌趋势也证实了其持续下降的趋势:
来源:谷歌趋势
结论
在这个列表中,我已经展示了 10 个在 2021 年使用的数据库。RDBMS 系统在列表中占主导地位。MySQL 和 PostgreSQL 是开源和免费数据库的领导者,紧随其后的是 MS SQL。MySQL 兼容的 MariaDB 越来越受欢迎。
在商业数据库中,Oracle 在其最新版本中增加了许多增值特性,向未来迈出了一大步。虽然 IBM Db2 仍在大型组织中使用,但会慢慢衰落。
在 NoSQL 数据库中,MongoDB(文档数据库)、Redis(内存键值存储)、Cassandra(宽列数据库)和 Elasticsearch(全文搜索引擎)都是各自领域的佼佼者。
该列表并不全面,许多重要的数据库类型无法进入前十名,如 NewSQL 数据库、云原生数据库。但它将给出 2021 年顶级数据库的高层次概述。
类似文章
****</5-best-public-cloud-database-to-use-in-2021-5fca5780f4ef> </21-predictions-about-the-software-development-trends-in-2021-600bfa048be> ****
十大 GitHub Repos 立即加入书签
你可能以前没有遇到过
每个开发者都应该知道的 10 个 GitHub Repos 作者图片
GitHub 不仅仅是一个版本控制服务;对于所有事物的发展来说,这是一个极好的内容资源。从免费的电子书和教程,到面试准备材料和令人惊叹的列表,GitHub 是渴望提升自己技能并保持相关性的开发人员的首选学习中心。此外:
在这里,我整理了一份最有价值的回购清单,每个开发人员都应该研究一下,不管他们在职业生涯的哪个阶段。
我敢打赌,你可能没有见过下面这些宝石中的大部分!
1 —漂亮的文档
[beautiful-docs](https://github.com/PharkMillups/beautiful-docs) - ⭐️ 4.8K
众所周知,文档是任何软件项目的重要资产。编写自文档化的代码是一回事,但以有意义的方式呈现它是另一回事。作者收集了那些在结构、设计、可用性、风格、图表等方面都很“漂亮”的在线资源,因此任何人在寻找如何设计自己的文档的灵感时都会发现这些资源丰富。
2 —命令行的艺术
[the-art-of-command-line](https://github.com/jlevy/the-art-of-command-line) - ⭐️ 86.3K
许多开发人员甚至一想到打开终端窗口就畏缩不前,但是对命令行有一个很好的理解对于成为一个熟练的、多产的开发人员来说是绝对必要的,他们可以使用“计算机魔术”工具。
3 —秘密知识之书
[the-book-of-secret-knowledge](https://github.com/trimstray/the-book-of-secret-knowledge) - ⭐️ 38K
以类似的方式,这个 repo 包含一组资源来帮助开发人员和 DevOps 工程师做他们的日常工作。这是一个链接的金矿,几乎包含了你需要知道的关于运行机器的每个主题:一行程序、web 工具等等。
4—关于会谈…
[programming-talks](https://github.com/hellerve/programming-talks) - ⭐️ 5.6K
[awesome-talks](https://github.com/JanVanRyswyck/awesome-talks) - ⭐️ 3.2K
我将这些回购组合在一起,因为它们服务于相同的目的:它们都提供了一个精选的演讲列表,按照编程语言或“理论”进行分类,以深入探讨广泛的 IT 主题(计算机科学、架构、设计、面向对象、数据库等)。
5 —程序员应该访问的最佳网站
[Best-websites-a-programmer-should-visit](https://github.com/sdmg15/Best-websites-a-programmer-should-visit) - ⭐️ 4.6K
我真的很喜欢这个列表,它有太多关于…一切的资源了!从你遇到故障时要访问的网站,到 YouTube 上最好的频道,到新闻聚合器和求职。
6 —开发人员的设计资源
[design-resources-for-developers](https://github.com/bradtraversy/design-resources-for-developers) - ⭐️ 27.5K
这是一个伟大的仓库,为设计师和用户界面或全栈开发人员寻求改善他们的 UX 知识。它包括颜色、字体、库存图片、矢量以及网络用户界面库和设计工具等方面的风格指南。
7 —算法
[TheAlgorithms/Python](https://github.com/TheAlgorithms/Python) - ⭐️ 106K
[TheAlgorithms/Java](https://github.com/TheAlgorithms/Java) - ⭐️ 37K
贡献者将这些报告致力于数据结构和算法及其实现。每种编程语言都有许多子仓库,但是 Python 和 Java 显然是最受欢迎的。除了算法,你会发现很多机器学习,神经网络,线性代数和其他主题。
8 —超赞的备忘单
[awesome-cheatsheets](https://github.com/LeCoupa/awesome-cheatsheets) - ⭐️ 18.5K
这是备忘单中的备忘单。这种类型的内容,当制作精良时,会使你的工作更容易,因为它成为任何日常任务的备忘录。因此,它是所有流行的编程语言、框架和开发工具的备忘单的集合。无论您的 IT 专业是什么,这里都有您需要努力的地方。
9 —开发人员路线图
[developer-roadmap](https://github.com/kamranahmedse/developer-roadmap) - ⭐️ 158K
开发者路线图当然会出现在其他 GitHub 列表中,但不能从本文中省略,因为它使用了巧妙的信息图来提供建议,说明人们需要获得哪些知识来遵循三条 it 实践路径之一:前端、后端和 DevOps。
10 —关于面试…
[coding-interview-university](https://github.com/jwasham/coding-interview-university) - ⭐️ 167K
[system-design-primer](https://github.com/donnemartin/system-design-primer) - ⭐️ 130K
[tech-interview-handbook](https://github.com/yangshun/tech-interview-handbook) - ⭐️ 53K
[system-design-interview](https://github.com/checkcheckzz/system-design-interview) - ⭐️ 14K
同样,这些回购在其他 GitHub 列表中非常受欢迎,但我必须将它们也包括在我的列表中,因为我完全尊重它们的贡献者以可消化的方式分享知识的时间努力和无私奉献。它们包含无穷无尽的材料,通过合并计划来指导我们完成准备过程、案例研究、问答、设计模式,甚至还有关于如何构建我们的简历的提示,从而击败任何技术面试。
我在这里列出了那些 GitHub Repos,我利用它们来保持最新,并致力于实现我的技术卓越的使命!希望对你也有帮助…
感谢阅读!
我经常在媒体上写关于领导力、技术&的数据——如果你想阅读我未来的帖子,请‘关注’我 !
Numpy 中的 10 大矩阵运算及其示例
使用 Python 执行线性代数
以赛亚·贝克斯在 Unsplash 上的照片
数据科学和机器学习所需的数学知识中,大约 30–40%来自线性代数。矩阵运算在线性代数中起着重要的作用。今天,我们在强大的 numpy 库的帮助下讨论 10 个这样的矩阵运算。Numpy 通常用于在 Python 中执行数值计算。它也有矩阵运算的特殊类和子程序包。矢量化的使用通过避免许多 for 循环,使 numpy 能够更有效地执行矩阵运算。
我将包括本文中讨论的每个矩阵操作的含义、背景描述和代码示例。本文末尾的“要点”部分将为您提供一些更具体的事实和矩阵运算的简要总结。因此,请务必也阅读该部分。
我将按以下顺序讨论每个矩阵运算。下面是我为大家精心挑选的 10 大矩阵运算列表。
- 内积
- 点积
- 转置
- 追踪
- 排名
- 行列式
- 真逆
- 伪逆
- 压平
- 特征值和特征向量
先决条件
为了充分利用本文,您应该了解 numpy 基础知识和数组创建方法。如果你没有那方面的知识,可以看看下面这篇我写的文章。
先说第一个, 内积 。
内积
内积 取两个大小相等的向量,返回一个数字(标量)。这是通过将每个向量中的相应元素相乘并将所有这些乘积相加而计算出来的。在 numpy 中,向量被定义为一维 numpy 数组。
为了得到内积,我们可以使用 np.inner() 或者 np.dot() 。两者给出相同的结果。这些函数的输入是两个向量,它们的大小应该相同。
等到加载 Python 代码!
两个向量的内积(图片由作者提供)
点积
为矩阵定义了 点积 。它是两个矩阵中相应元素的乘积之和。要获得点积,第一个矩阵中的列数应该等于第二个矩阵中的行数。
在 numpy 中有两种创建矩阵的方法。最常见的一种是使用 numpyndarray 类 。这里我们创建二维 numpy 数组(ndarray 对象)。另一种是使用 numpy 矩阵类 。这里我们创建矩阵对象。
ndarray 和 matrix 对象的点积都可以使用 np.dot() 获得。
等到加载 Python 代码!
两个矩阵的点积(图片由作者提供)
当使用 ***** 运算符将两个 ndarray 对象相乘时,结果是逐元素相乘。另一方面,当使用 ***** 运算符将两个矩阵对象相乘时,结果是点(矩阵)积,它相当于前面的 np.dot() 。
等到加载 Python 代码!
*运算符在矩阵和数组对象上的不同行为(图片由作者提供)
转置
矩阵的 转置 是通过用矩阵的列交换矩阵的行而得到的。我们可以使用 np.transpose() 函数或者 NumPyndarray . transpose()方法或者 ndarray。T (一种不需要括号的特殊方法)得到转置。都给出相同的输出。
等到加载 Python 代码!
获取矩阵的转置(图片由作者提供)
转置也可以应用于向量。但是,从技术上讲,一维 numpy 数组是不能转置的。
import numpy as npa = np.array([1, 2, 3])
print("a = ")
print(a)
print("\na.T = ")
print(a.T)
作者图片
如果真的要转置一个向量,应该定义为二维 numpy 数组,带双方括号。
import numpy as npa = np.array([[1, 2, 3]])
print("a = ")
print(a)
print("\na.T = ")
print(a.T)
作者图片
追踪
迹 是方阵中对角元素的和。有两种方法可以计算迹线。我们可以简单地使用 ndarray 对象的 trace() 方法或者先得到对角元素,然后得到和。
import numpy as npa = np.array([[2, 2, 1],
[1, 3, 1],
[1, 2, 2]])
print("a = ")
print(a)
print("\nTrace:", a.trace())
print("Trace:", sum(a.diagonal()))
作者图片
排名
矩阵的 秩 是矩阵的列或行所跨越(生成)的向量空间的维数。换句话说,它可以被定义为线性无关的列向量或行向量的最大数量。
使用 numpy linalg 包中的 matrix_rank() 函数可以找到矩阵的秩。
import numpy as npa = np.arange(1, 10)
a.shape = (3, 3)
print("a = ")
print(a)
rank = np.linalg.matrix_rank(a)
print("\nRank:", rank)
作者图片
行列式
方阵的 行列式 可以计算 det() 函数,该函数也来自 numpy linalg 包。如果行列式为 0,则该矩阵不可逆。在代数术语中,它被称为奇异矩阵。
import numpy as npa = np.array([[2, 2, 1],
[1, 3, 1],
[1, 2, 2]])
print("a = ")
print(a)
det = np.linalg.det(a)
print("\nDeterminant:", np.round(det))
作者图片
真逆
方阵的 真逆 可以使用 numpy linalg 包的 inv() 函数找到。如果方阵的行列式不为 0,则它有真逆。
import numpy as npa = np.array([[2, 2, 1],
[1, 3, 1],
[1, 2, 2]])
print("a = ")
print(a)
det = np.linalg.det(a)
print("\nDeterminant:", np.round(det))
inv = np.linalg.inv(a)
print("\nInverse of a = ")
print(inv)
作者图片
如果你试图计算一个奇异矩阵(行列式为 0 的方阵)的真逆,你会得到一个错误。
import numpy as npa = np.array([[2, 8],
[1, 4]])
print("a = ")
print(a)
det = np.linalg.det(a)
print("\nDeterminant:", np.round(det))
inv = np.linalg.inv(a)
print("\nInverse of a = ")
print(inv)
作者图片
伪逆
使用 numpy linalg 包的 pinv() 函数,即使对于奇异矩阵(行列式为 0 的方阵)也可以计算出 伪(非真)逆 。
import numpy as npa = np.array([[2, 8],
[1, 4]])
print("a = ")
print(a)
det = np.linalg.det(a)
print("\nDeterminant:", np.round(det))
pinv = np.linalg.pinv(a)
print("\nPseudo Inverse of a = ")
print(pinv)
作者图片
方阵非奇异(行列式是 不是 0)的话,真逆和伪逆没有区别。
展平
Flatten 是将一个矩阵转换成一维 numpy 数组的简单方法。为此,我们可以使用 ndarray 对象的 flatten() 方法。
import numpy as npa = np.arange(1, 10)
a.shape = (3, 3)
print("a = ")
print(a)
print("\nAfter flattening")
print("------------------")
print(a.flatten())
作者图片
特征值和特征向量
设 A 为n×n 矩阵。一个标量 λ 称为 A 的一个 特征值 如果有一个非零向量 x 满足下式。
作者图片
向量 x 称为 A 对应 λ 的 特征向量。
在 numpy 中,可以使用 eig() 函数同时计算特征值和特征向量。
import numpy as npa = np.array([[2, 2, 1],
[1, 3, 1],
[1, 2, 2]])
print("a = ")
print(a)
w, v = np.linalg.eig(a)
print("\nEigenvalues:")
print(w)
print("\nEigenvectors:")
print(v)
作者图片
特征值之和(1+5+1=7)等于同一个矩阵的迹(2+3+2=7)!特征值的乘积(1x5x1=5)等于同一个矩阵的行列式(5)!
特征值和特征向量在主成分分析(PCA)中非常有用。在 PCA 中,相关或协方差矩阵的特征向量表示主分量(最大方差的方向),相应的特征值表示由每个主分量解释的变化量。如果你想更多地了解他们,请阅读下面我写的文章。
关键要点
由于有了 numpy 库,只需一两行代码就可以轻松地执行矩阵运算。今天,我们已经在 numpy 中执行了 10 次矩阵运算。Numpy 有常用函数,也有专门用于线性代数的特殊函数,比如 linalg 包就有一些专门用于线性代数的特殊函数。
在 numpy 中,矩阵和 ndarrays 是两回事。熟悉它们的最好方法是自己尝试这些代码。检查矩阵和数组的维数总是比较好的。
在 Scikit-learn 机器学习库中,当我们创建和拟合模型时,今天讨论的大多数矩阵运算都在幕后工作。比如我们使用 Scikit-learn PCA() 函数时,特征值和特征向量都是在幕后计算的。Scikit-learn 和许多其他库(如 pandas、seaborn、matplotlib)都构建在 numpy 之上。所以,numpy 是一个强大的 Python 库。
我们还可以将一些矩阵运算组合在一起进行复杂的计算。比如你想把 3 个叫做 A,B,C 的矩阵依次相乘,我们可以用 np.dot(np.dot(A,B),C) 。A、B、C 的尺寸要相应匹配。
感谢阅读!
本教程由Rukshan Pramoditha,数据科学 365 博客作者设计创作。
在 https://rukshanpramoditha.medium.com 阅读我的其他文章
2021–03–24
计算机视觉和医学成像初学者的十大项目
入门
计算机视觉和机器学习初学者综合实践指南
当前计算机视觉和医学成像项目的组合(图片由作者提供)
(人工智能)和计算机科学,使自动化系统能够看到,即以类似人类的方式处理图像和视频,以检测和识别重要的对象或区域,预测结果,甚至将图像更改为所需的格式[1]。CV 领域中最受欢迎的用例包括自动驾驶的自动感知、模拟的增强和虚拟现实(ar、VR)、游戏、眼镜、房地产以及面向时尚或美容的电子商务。另一方面,医学图像(MI)处理涉及对通常为灰度级的医学图像(例如用于自动病理检测的 MRI、CT 或 X 射线图像)进行更详细的分析,这是一项需要训练有素的专家的眼睛进行检测的任务。MI 领域中最受欢迎的用例包括自动病理学标记、定位、与治疗或预后的关联以及个性化医疗。
在深度学习方法出现之前,2D 信号处理解决方案,如图像滤波、小波变换、图像配准,以及分类模型[2–3]被大量应用于解决方案框架。信号处理解决方案仍然是模型基线的首选,因为它们具有低延迟和跨数据集的高泛化能力。然而,深度学习解决方案和框架已经成为新宠,这是因为其端到端的性质完全消除了对特征工程、特征选择和输出阈值的需要。在本教程中,我们将为 CV 和 MI 领域的初学者回顾“十大项目”,并提供带有数据和起始代码的示例来帮助自定进度学习。
CV 和 MI 解决方案框架可以分为三个部分进行分析:数据、过程和结果【4】。重要的是,始终可视化此类解决方案框架所需的数据,使其具有格式“{X,Y}”,其中 X 表示图像/视频数据,Y 表示数据目标或标签。虽然自然出现的未标记图像和视频序列(X)可能是大量的,但是获取准确的标记(Y)可能是一个昂贵的过程。随着[5–7]等多种数据注释平台的出现,图像和视频可以针对每个用例进行标记。
由于深度学习模型通常依赖于大量带注释的数据来自动学习用于后续检测任务的特征,因此 CV 和 MI 域经常遭受“小数据挑战”,其中可用于训练机器学习模型的样本数量比模型参数的数量少几个数量级。“小数据挑战”如果得不到解决,可能会导致模型过拟合或欠拟合,从而无法推广到新的未知测试数据集。因此,为 CV 和 MI 域设计解决方案框架的过程必须始终包括模型复杂性约束,其中具有较少参数的模型通常是优选的,以防止模型欠拟合。最后,通过可视化解决方案对解决方案框架的结果进行定性分析,并根据众所周知的指标进行定量分析,如精确度、召回率、准确度以及 F1 或 Dice 系数[8–9]。
下面列出的项目在数据预处理和模型建立方面呈现了不同的难度级别(难度级别简单、中等、困难)。这些项目也代表了当前在研究和工程界流行的各种用例。项目是根据目标、方法和结果定义的。
项目 1: MNIST 和时尚 MNIST 的图像分类(级别:简单)
目标:处理大小为[28x28]像素的图像(X)并将它们分类到 10 个输出类别(Y)中的一个。对于 MNIST 数据集,输入图像是 0 到 9 范围内的手写数字[10]。训练和测试数据集分别包含 60,000 和 10,000 个标记图像。受手写数字识别问题的启发,推出了另一个数据集,称为时尚 MNIST 数据集[11],其目标是将图像(大小为[28x28])分类为服装类别,如图 1 所示。
图 1:MNIST 和时尚 MNIST 各有 10 个输出类别的数据集。(图片由作者提供)
方法:当输入图像很小([28×28]像素)并且图像是灰度图像时,卷积神经网络(CNN)模型是合适的分类模型,其中卷积层数可以从单层变化到多层。colab 文件中提供了一个使用 Keras 构建 MNIST 分类模型的示例:
时尚 MNIST 数据集的另一个分类示例如下所示:
在这两种情况下,要调整的关键参数包括层数、dropout、优化器(首选自适应优化器)、学习速率和内核大小,如下面的代码所示。由于这是一个多类问题,在最后一层使用“softmax”激活函数,以确保只有一个输出神经元的权重大于其他神经元。
多类问题的最终深度学习层。
结果:随着卷积层数从 1-10 增加,分类精度也增加。文献中对 MNIST 数据集进行了充分的研究,测试准确率在 96–99%之间。对于时尚 MNIST 数据集,测试准确率通常在 90-96%之间。下面的图 2 显示了使用 CNN 模型的 MNIST 分类结果的可视化示例。
图 2:MNIST 数据的 CNN 模型的可视化结果的例子。输入显示在左上角,并显示相应的层激活。最终结果在 5 到 8 之间。见前端可视化【https://www.cs.ryerson.ca/~aharley/vis/conv/
项目 2:医学图像的病理分类(级别:简单)
目标:将医学图像(使用光学相干断层扫描,OCT 获得)分类为正常、糖尿病性黄斑水肿(DME)、玻璃疣、脉络膜新生血管(CNV),如[12]所示。如图 2 所示,数据集包含大约 84,000 幅训练图像和大约 1,000 幅带有标签的测试图像,并且每个图像具有 800 到 1,000 像素的宽度。
图 2:来自[12]中 Kaggle 数据集的 OCT 图像示例。
方法:深度 CNN 模型如 Resnet 和 CapsuleNet [12]已经被应用于对该数据集进行分类。数据需要调整到[512x512]或[256x256]才能输入标准分类模型。由于与非医学室外和室内图像相比,医学图像在每个图像帧的对象类别中具有较小的变化,因此发现训练大型 CNN 模型所需的医学图像的数量明显少于非医学图像的数量。[12]和 OCT 代码库中的工作演示了为测试图像的迁移学习和分类重新训练 ResNet 层。这里要调整的参数包括优化器、学习速率、输入图像的大小和 ResNet 层末尾的密集层数。
结果:对于 ResNet 模型,通过改变训练图像的数量,测试精度可以在 94–99%之间变化,如【12】所示。图三。定性地展示分类模型的性能。
图 3:使用 python 中的 Gradcam 库将每个病理的感兴趣区域(ROI)叠加在原始图像上。(图片由作者提供)
这些可视化是使用 Gradcam 库产生的,该库将 CNN 层激活结合到原始图像上,以理解感兴趣的区域,或者自动检测的重要特征,用于分类任务。使用 tf_explain 库的 Gradcam 的用法如下所示。
使用 tf_explain 来可视化可解释的热图。
项目 3:多标签图像分类的人工智能可解释性(级别:简单)
目标: CNN 模型支持端到端交付,这意味着不需要为分类设计和排列特征,并且模型结果是期望的过程结果。然而,如专题 2 的后面部分所示,可视化和解释 CNN 模型的性能通常是很重要的。一些众所周知的可视化和可解释库是 tf_explain 和本地可解释的模型不可知解释(LIME) 。在这个项目中,目标是实现多标签分类,并解释 CNN 模型将什么视为以特定方式分类图像的特征。在这种情况下,我们考虑一个多标签场景,其中一个图像可以包含多个对象,例如 Colab for LIME 中的猫和狗。
这里,输入是包含猫和狗的图像,目标是识别哪些区域分别对应于猫或狗。
方法:在本项目中,每幅图像都经过超像素分割,将图像分割成几个像素颜色和纹理特征相似的子区域。划分的子区域的数量可以作为参数手动提供。接下来,调用 InceptionV3 模型来为每个超像素子区域分配属于 InceptionV3 最初被训练的 1000 个类别之一的概率。最后,对象概率被用作拟合回归模型的权重,该回归模型解释了对应于每个类别的 ROI,如图 4 和下面的代码所示。
设置 LIME 来解释图像中的区域重要性。
图 4:使用类回归模型解释图像超像素的可能性。(图片由作者提供)
结果:使用所提出的方法,大多数非医学图像中的感兴趣区域应该是可以解释的。这里显示的定性评估和可解释性在极端情况下,或者在模型错误分类或错过感兴趣的对象的情况下特别有用。在这种情况下,解释 CNN 模型在看什么,并相应地提高 ROI 以校正整体分类性能,可以帮助显著减少数据引起的偏差。
项目 4:对新物体进行 2D 包围盒检测的迁移学习(级别:中等)
目标:图像分类后的下一步是通过在感兴趣的物体周围放置边界框来检测它们。这是自动驾驶领域中的一个重要问题,以从静态对象(如路障、街道标志、树木和建筑物)中准确识别移动对象(如汽车和行人)。本项目与以前项目的主要区别在于数据的格式。这里,标签 Y 通常是每个感兴趣对象的[x,Y,w,h]的形式,其中(x,Y)通常表示边界框的左上角,而 w 和 h 对应于输出边界框的宽度和高度。在这个项目中,目标是利用预训练的分类器的特征提取能力,然后在一小组图像上重新训练它,以创建围绕新对象的紧密边界框。
方法:在代码边界框 colab 中,我们可以扩展一个预训练的对象检测器,如具有 Resnet50 跳跃连接和特征金字塔网络主干的单次拍摄检测器(SSD),它是为 MS-COCO 数据集[13]上的对象检测而预训练的,以检测一个完全看不见的新对象类别,在这种情况下是一个橡皮鸭。在这种转移学习设置中,来自对象检测器的早期层的已经学习的权重对于从图像中提取局部结构和纹理信息是有用的,并且只有最终的分类器层需要为新的对象类重新训练。这使得可以使用新对象的 5-15 幅图像来为新类别重新训练对象检测器,例如本用例中的橡胶鸭子。要调整的参数包括优化器、学习速率、输入图像大小和最终分类器层中的神经元数量。
结果:对象检测器和上面所示的先前的基于 CNN 的分类器模型之间的一个主要区别是称为并集上的交集(IoU) [11]的附加输出度量,其测量实际边界框和预测边界框之间的重叠程度。此外,对象检测器模型通常由分类器(预测对象类别)和边界框回归器(预测对象周围边界框的尺寸)组成。图 5 和下面的代码显示了 Google API 在新的不可见图像上进行对象检测的例子。
Google api 调用对象检测。
在这些项目中显示了 2D 包围盒检测器对专门用于自动驾驶的 3D 包围盒的扩展。
图 5:使用 tensorflow api 进行对象检测的 2D 包围盒检测示例
项目 5:个性化医疗和可解释性(等级:中等)
目标:在这个项目中,目标是自动分割来自多个病理部位的 ROI,以对患者贫血样苍白的程度进行分类,并随着时间的推移跟踪苍白[13]。该项目与先前项目的两个主要区别在于:1)需要跨多个图像位置(例如结膜(眼睛下方)和舌头)检测苍白,以预测单个标记,如图 6 所示,2)需要显示对应于苍白的 ROI,并随时间进行跟踪。
图 6:使用从多个病理部位处理的图像的贫血样苍白检测的例子。(图片由作者提供)
方法:在这个项目中,使用 Keras 中的图像数据生成器对基于特征的模型和基于 CNN 的分类器进行大量数据扩充。为了融合来自多个病理部位的结果,可以应用早期、中期和晚期融合。[13]中的工作应用了后期融合,其中分类器之前的层被认为是图像的最佳特征表示,用于融合多个病理部位的特征。最后,如 Deepdream Colab 所示,将 Deepdream 算法应用于原始眼睛和舌头图像,以可视化 ROI 并解释病理的程度。这个项目中要调整的参数包括项目 2 中的参数以及 Deepdream 可视化的附加梯度因子。
结果:此项工作的数据可用于基准测试。使用 Deepdream 算法,在图 7 中示出了可视化,其中,我们观察到与眼睛中的任何其他地方相比,在眼睛下方的血管中对应于苍白的特征的浓度更高。类似地,我们观察到舌头的内侧和外侧部分之间的特征差异。这些评估有助于为贫血患者创建个性化病理跟踪系统。
图 7:深度梦实现的特征集中的例子。在结膜或眼睛下方的血管区域观察到高浓度的梯度。(图片由作者提供)
项目 6:用于对象检测的点云分割。(等级:硬)
目标:在这个项目中,输入是点云流,即提供深度分辨率的激光雷达传感器的输出。激光雷达点云与影像之间的主要区别在于点云提供 3D 分辨率,因此每个体素(像素的 3D 等效物)表示对象相对于激光雷达源的位置以及对象相对于激光雷达源的高度。点云数据模型带来的主要挑战是:I)如果使用 3D 卷积,模型计算复杂;ii)对象变换不变性,这意味着旋转的对象应被检测为对象本身,如[13]所示。
方法:这个项目的数据集是 ModelNet40 形状分类基准,包含来自 40 个对象类的超过 12,000 个 3D 模型。对每个对象进行子采样,以提取固定数量的点,然后进行扩充,以适应形状的多次变换。接下来 1D 卷积被用于学习形状 ness 特征,使用 Pointnet colab 中的 Pytorch 库,如下所示。
Pointnet 类的定义。
要调整的参数包括优化器、学习率和损失函数。
结果:模型的结果可以使用下面的图 8 来总结。通过该方法可以实现高达 89%的对象分类训练准确度,该方法还可以扩展到 3D 语义分割。这项工作的扩展可以用于自动驾驶用例的 3D 边界框检测。
图 8:来自[15]的图像,该图像从点云中识别物体
项目 7:使用 U-net 进行二值和多值图像语义分割。(中等)
目标:到目前为止,CNN 模型已经被应用于自动学习特征,然后可以用于分类。这个过程被称为特征编码。下一步,我们应用与编码器结构相似的解码器单元来生成输出图像。编码器-解码器对的这种组合使得输入和输出能够具有相似的维度,即输入是图像,输出也是图像。
方法:具有剩余跳跃连接的编码器-解码器组合通常被称为 U-net [15]。对于二进制和多类问题,数据必须被格式化,使得如果 X(输入图像)具有维度[m×m]像素,Y 具有维度[m×m×d],其中‘d’是要预测的类的数量。要调整的参数包括优化器、学习率和 U-net 模型的深度,如下面的[15]和图 9 所示。
图 9。U-net 模型示例。来源https://papers with code . com/paper/multi runet-reflecting-the-u-net
结果:U-net 模型可以学习从大小数据集生成二元和多类语义图[16–17],但发现它对数据不平衡很敏感。因此,选择正确的训练数据集对于获得最佳结果非常重要。这项工作的其他扩展将包括 DenseNet 到模型的连接,或其他编码器-解码器网络,如 MobileNet 或异常网络[17]。
项目 8:姿态和意图分类的机器翻译(等级:硬)
目标:姿态或手势的自动检测通常包括视频中的关键点识别(如骨骼结构的识别),这些关键点识别可以导致行人姿态(站立、行走、移动)或意图(过马路,而不是过马路)等的识别。[18–19],如下图 10 所示。对于这类问题,来自多个后续视频帧的关键帧信息被共同处理,以生成与姿势/意图相关的预测。
图 10:来源:【https://matthew29tang.github.io/pid-model/#/pose/
方法:对于这个项目,所应用的模型类别被称为“序列对序列”模型,其中来自视频的一系列图像帧被处理以预测行人是否打算过马路。该过程首先使用 2D 包围盒检测器来隔离行人,然后通过实时跟踪来跨帧跟踪同一包围盒。最后,来自被跟踪的边界框和骨架特征的特征被用于训练一个 DenseNet 模型,该模型预测行人是否会在移动的汽车前面移动。要调整的参数包括来自项目 4 的边界框检测器参数、Densenet 模型的层数以及每个行人姿势所适合的骨骼点的数量。骨架点的数量越多,计算复杂度越高。
结果:上述方法的定性结果如下图 11 所示,其中红色方框表示行人将穿过街道,绿色方框表示行人不会与驶来的车辆穿过道路。[18–19]中的工作和 Colab 文件可用于测试复合模型,该模型使用边界框内的特征和骨骼特征作为任何新数据集的早期融合设置,以从一系列图像帧中生成姿势相关预测。
图 11:在 JAAD [18]数据集上行人意图预测的例子。来源:https://matthew29tang.github.io/pid-model/#/integrated/
项目 9:用于数据增强的生成式对抗网络(GAN)(使用 Pix2pix 模型)(级别:硬)
目标:CNN 模型的一个流行用例是使用 GANs 自动生成假图像。在这样的设置中,训练两个 CNN 模型:1)生成器,其目标是从噪声和一些约束中创建真实的假图像,2)鉴别器,其目标是从真图像中识别假图像。基础数据集需要成对的图像和语义分割图{X,Y}用于训练,如图 12 和 GAN Colab 中所示。
图 12:来自 CMP 正面数据集的示例,使得语义分割图用于预测真实的 RGB(红绿蓝平面)图像。
方法:对于这个项目,pix2pix 设置依赖于条件 GANs 来训练基于 CNN 的生成器(这是一个修改的 U-net 模型)来生成难以从真实图像中区分/分类的假图像。GAN 模型通常利用损失函数,该损失函数是最小最大损失或 GAN 损失以及实际图像和伪图像之间的平均绝对误差的组合。要调整的参数包括优化器、学习率、特征补丁大小(通常 30-70 像素宽和高是 PatchGAN 的首选)、输入图像大小和生成器模型的复杂性,如下所示。
发电机模型在 GANs 中的使用。
结果:pix 2 pix 方法可用于从灰度图像生成彩色图像,从陆地图像生成地图图像,从线描图像生成 RGB 图像。该模型允许低维到高维的数据生成,这对于增加训练数据集和解决“小数据挑战”是至关重要的。
项目 10:使用 CycleGAN 进行图像转换(级别:硬)
目标:虽然 pix2pix 支持图像转换,但它需要成对的图像和目标标签,即出于训练目的需要图像及其相应的语义分割。然而,在成对输入和标签不可用的情况下,CycleGANs [17]可能是有用的。在 CycleGAN 模型中,使用了两组发生器/鉴别器组合。如果目标是将域 A 中的图像变换到域 B,则 Generator_1/Discriminator_1 用于将图像 A 变换到 B,而 Generator_2/Discriminator_2 用于将图像 B 变换回图像 A。因此在一个周期结束时,获得图像 A 的双重变换版本。总损失函数旨在减少以下各项之间的差异:1)在全周期结束时生成的图像 A 和实际图像 A,2)从周期中间到实际图像 B 生成的图像 B。
图 13:没有成对训练图像的图像变换的例子。https://github.com/xhujoy/CycleGAN-tensorflow 来源。
(顶行),Generator_1/Discriminator_1 以马图像为输入生成假斑马图像,(底行)Generator_2/Discriminator_2 以斑马图像为输入生成假马图像。
方法:使用 CycleGAN Colab ,我们观察到 CycleGAN 和条件 GAN (cGAN)模型之间的主要差异是损失函数,该函数包括项目 9 中为每个发生器/鉴别器对定义的 GAN 损失以及前向和后向循环一致性损失,该损失表示 A- > B 变换和 B- > A 变换的伪图像和原始图像之间的平均误差。要调整的其他参数包括生成器复杂度、优化器、学习速率、输入图像大小和周期损失函数。
结果: CycleGAN 已用于图像域转换功能,如白天到夜晚的时间转换[18],可用于分别在白天和夜晚重复使用自动驾驶物体检测器的标签。这些模型也可以用于艺术变换、图像去噪和 AR/VR 变换。
结论
几种不同类型的基于 CNN 的模型框架可用于设计 CV 和 MI 问题的端到端解决方案。为了修改这种基于 CNN 的框架以适合各个数据集和用例,需要考虑的因素如下:1)需要调整的参数,2)损失函数的修改,3)用于模型训练的标记数据量,4)关于数据不平衡的考虑。
在扩展此处显示的 10 个项目中的任何一个时,理想的策略是首先通过将数据集格式化为与上面示例中类似的格式来复制手头数据集的现有代码库。一旦训练过程成功,下一步将是修改/预处理数据,然后调整模型参数和结果的定性和定量报告。值得注意的是,输出指标可能因图像域和使用情形而异。例如,在自动驾驶用例中,误报物体检测可能会因过度鸣响和干扰驾驶员而破坏驾驶体验,因此在这种用例中应尽量减少误报。或者,在医学图像病理学检测用例中,遗漏病理学远比自动过度检测更糟糕,因为专家最终会查看患者图像以丢弃假阳性。因此,假阳性和假阴性的权重并不总是相同的,在报告 CV 和 MI 解决方案的结果时,应该考虑到不同用例之间的差异。
本博客中展示的项目和资源应该可以帮助所有初学者和 CV、MI 爱好者开始他们自己的数据集自学之旅。
参考文献
[1]techno pedia[在线]:【https://www.techopedia.com/definition/32309/computer-vision T2
[2] Roychowdhury、Sohini、Dara D. Koozekanani 和 Keshab K. Parhi。"梦:使用机器学习的糖尿病视网膜病变分析."IEEE 生物医学和健康信息学杂志 18.5(2013):1717–1728。
[3]王,李一清。" Viola-Jones 人脸检测算法分析."4 号线图像处理(2014):128–148。
[4]S. Roychowdhury,“使用 U-net 转移学习多类图像分割的机器学习工程师教程”,走向数据科学[在线]:https://towardsdatascience . com/A-Machine-Learning-engineers-Tutorial-to-Transfer-Learning-for-Multi-class-Image-Segmentation-b 34818 caec 6b
[5]A .杜塔等人。艾尔。https://www.robots.ox.ac.uk/~vgg/software/via/:VGG 图像注释者【在线】
[6]伯克利深层驱动。“Scalabel.ai”。https://www.scalabel.ai/
[7]GNU 图像处理程序[在线]https://www.gimp.org/about/
[8]E. Solutions,“准确度、精确度、召回率和 F1 分数:性能测量的解释”,[在线]:https://blog . ex silio . com/all/Accuracy-Precision-Recall-F1-Score-Interpretation-of-Performance-Measures/
[9]E. Tiu,《度量评估你的语义分割模型》,[在线]:https://towards data science . com/Metrics-to-Evaluate-your-Semantic-Segmentation-Model-6 BCB 99639 aa 2
[10]T. Kanstren《对精度、召回和 F1-Score 的看法》,走向数据科学[在线]https://towardsdatascience . com/A-Look-at-Precision-Recall-and-F1-Score-36 b5 FD 0 DD 3 EC
[11]吴,明,张及甄。"使用 mnist 数据集的手写数字分类."课程项目 CSE802:模式分类与分析(2010)。
[12]Roychowdhury,Sohini 等人,“SISE-PC:用于解释病理学的半监督图像子采样”arXiv 预印本 arXiv:2102.11560 (2021)。https://github.com/anoopsanka/retinal_oct
13 Roychowdhury 等人。艾尔。"基于 Azure 的贫血样苍白智能监测系统."未来互联网 9.3 (2017): 39。
[14]N. Karaev,“点云上的深度学习:在 Google Colab 中实现 PointNet”,走向数据科学[在线]:https://towardsdatascience . com/Deep-Learning-on-Point-clouds-Implementing-Point net-in-Google-Colab-1fd 65 CD 3a 263
[15]齐,查尔斯·r .等,“点网:用于三维分类和分割的点集的深度学习。”IEEE 计算机视觉和模式识别会议录。2017.
[16]曲,,等.“增强型 pix2pix 去雾网络”IEEE/CVF 计算机视觉和模式识别会议论文集。2019.
[17] Harms,Joseph 等人,“用于定量锥形束计算机断层成像的成对循环 GAN 基图像校正。”医学物理46.9(2019):3998–4009。
[18] Chowdhury,Sohini Roy 等人,“利用强化学习和 gans 进行自动增强,使用前摄像机图像对交通标志进行稳健识别。” 2019 第 53 届 Asilomar 信号、系统和计算机会议。IEEE,2019。
每个数据科学家都必须知道的 10 大 Python 库
和大量免费资源来学习它们
照片由来自 Pexels 的安德里亚·皮亚卡迪奥拍摄
数据科学很难。作为初学者,即使是为了解决最基本的任务,你也必须学习一些库。雪上加霜的是,库不断变化和更新,而且几乎总是有更好的工具来完成这项工作。
不知道使用哪种工具的问题很容易理解——它会导致完全失败或不能以最佳方式完成任务。同样危险的是对库不够了解。你最终会从零开始实现算法,完全不知道已经有了一个这样的函数。两者都耗费你的时间、精力和金钱。
如果你发现自己被数据科学图书馆淹没了,那你来对地方了。本文将向您展示启动您的数据科学之旅的 10 个基本要素。
了解学习数据科学需要时间是至关重要的。你不可能一蹴而就。看书看视频是个好的开始,但解决自己关心的问题才是唯一的长久之道。
Numpy
这是显而易见的。Numpy 代表数字 Python ,是处理数组、科学计算和一般数学的最佳库。
Numpy 附带了线性代数(np.linalg
)、傅立叶变换(np.fft
)和几乎所有相关数学的函数。它比传统的 Python 列表要快得多。当以速度和效率为目标时,总是使用它。
因此,在决定从头开始实现特征分解算法之前,请尝试一下 Numpy。
最佳起点:
熊猫
想想类固醇的作用。Pandas 是一个用于数据分析的基本库。大多数时候,你只需要为机器学习加载和准备数据集。它与 Numpy 和 Scikit-Learn 很好地集成在一起。
Pandas 基于两个基本的数据结构— Series
和DataFrame
。第一个非常类似于数组,而后者只是以表格形式呈现的Series
对象的集合。
一条建议——花尽可能多的时间学习熊猫。它为操纵数据、填充缺失值甚至数据可视化提供了无尽的选项。不可能很快学会,但是一旦学会,分析可能性是无穷无尽的。
最佳起点:
Plotly
在一个静态和可怕的数据可视化的世界里,有一个库脱颖而出——很明显。它比 Matplotlib 领先几光年,Matplotlib 是您可能首先学习的可视化库。
普洛特利做得更好。默认情况下,可视化是交互式的,调整的选项是无穷无尽的。可视化对于出版物和仪表板都是现成的。他们的 Dash 库就是一个完美的例子。我无数次使用它来围绕数据或机器学习模型构建交互式仪表盘。
最佳起点:
美丽的声音
偶尔,你会需要一个非常具体的数据集。你不会在网上以表格的形式找到它,但是你知道数据存在于某个地方。问题是——它列在网站上,格式不对(想想亚马逊上的产品列表)。
这就是 BeautifulSoup 的用武之地。这是一个从 HTML 和 XML 文件中提取数据的库。你必须下载带有requests
库的 HTML,然后使用 BeautifulSoup 解析它。
网页抓取是一个灰色地带。有些网站允许,有些不允许。如果你的请求太多,被网站屏蔽是很常见的。总是确保事先检查robots.txt
文件(更多信息在这里)。检查您想要抓取的网站是否有可用的 API。那样的话,刮就没有意义了。
最佳起点:
达斯克
Dask 与 Pandas 非常相似,但提供了一个重要的优势——它是为并行性而构建的。Numpy 和熊猫不是你的大数据集的好朋友。默认情况下,不可能将 20 GB 的数据集放入 16 GB 的 RAM 中,但 Dask 可以做到。
小数据集上 Numpy 和熊猫没毛病。当数据集变得比可用的 RAM 大,并且计算时间变长时,事情就会变得不可收拾。Dask 可以将数据分割成块并并行处理,解决了这两个棘手问题。
最好的部分是——你不必从头开始学习一个新的库。Dask 中的数组和数据帧与 Numpy 和 Pandas 中的几乎具有相同的功能,所以它应该感觉就像在家里一样。
还可以用 Dask 训练机器学习模型。这是一个最适合大型数据集的三合一包。
最佳起点:
- 【Dask 官方教程
- 4 小时视频教程
- 我的平行运行 Python 指南
统计模型
Statsmodels 允许您训练统计模型并执行统计测试。它与其他用于统计建模的 Python 库略有不同,因为它与 R 非常相似。例如,您必须使用 R 风格的公式语法来训练线性回归模型。
该库为每个估计器返回一个结果统计的详细列表,使模型易于比较。
这是迄今为止训练时间序列模型的最佳库。它提供了你能想到的所有统计模型——从移动平均线和指数平滑,到季节性 ARIMA 和 GARCH。唯一的缺点是——它不能用深度学习算法训练时间序列模型。
最佳起点:
sci kit-学习
这是用 Python 进行机器学习的圣杯。该库构建在 Numpy、Scipy 和 Matplotlib 之上,为大多数监督和非监督学习算法提供了实现。它还附带了一套用于数据准备的函数和类,例如缩放器和编码器。
这个图书馆到处都是。你会发现它被用在任何基于 Python 的机器学习书籍或课程中。几乎所有的算法都有相同的 API——你首先要通过调用fit()
函数来训练模型,然后你可以用predict()
函数进行预测。这种设计选择使得学习过程更加容易。
该库可与 Pandas 一起开箱即用,因此您可以将准备好的数据帧直接传递给模型。
最佳起点:
OpenCV
图像是深度学习和人工智能的一大部分。OpenCV 打包了几乎可以做任何事情的工具。可以把它想象成 Photoshop 的非 GUI 版本。
该库可以处理图像和视频,以检测物体、人脸和几乎任何你可以想象的东西。它的效果不如复杂的物体检测算法(想想 YOLO),但对于计算机视觉的新手来说,这是一个很好的开端。
我不喜欢的一点是语法。不是 Pythonic 的。图书馆用骆驼箱代替蛇箱。例如,函数被命名为getRotationMatrix2D()
而不是get_rotation_matrix_2d()
。后者更像 Pythonic,而 prior 看起来更像 Java。这并不妨碍交易,你很快就会习惯的。
最佳起点:
张量流
深度学习是数据科学的重要组成部分。TensorFlow,再加上高层的 Keras API,可以让你用很少的代码训练深度学习模型。
发展的可能性是无限的。您可以对表格数据集、图像或音频使用神经网络。您还可以构建高度精确的检测和分割模型,或者尝试图像风格转换。
机器学习和深度学习的另一个重要方面是部署。你不希望你的模型闲置在硬盘上。TensorFlow 允许您将模型部署到云、内部、浏览器和设备。所有理由都包括在内。
最佳起点:
瓶
最后,还有烧瓶。这是一个用于构建 web 应用程序的库。我几乎在每个项目中都使用它,尽管我并不关心 web 开发。在数据科学中,Flask 是围绕机器学习模型构建 web APIs 和应用程序的首选库。
您可以坚持使用 Flask 来开发应用程序,但是我推荐使用 Flask-RESTful 来构建 API。
最佳起点:
最后的想法
这就是你想要的——每个数据科学家都应该知道的十个库。不需要所有的专家知识,但是你应该知道他们的能力。Numpy、Pandas、Scikit-learn 和任何可视化库都是必须的,你应该学习你认为合适的其他库。
当然,您可以很容易地交换这些库,只要它们实现相同的目标。例如,可以使用 PyTorch 代替 TensorFlow。最终的选择将归结为个人偏好,或者你工作的公司的偏好。
你有什么想法?你同意这份清单吗,或者你认为还应该增加些什么?
喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。
https://medium.com/@radecicdario/membership
保持联系
人工智能十大研究论文
被引用最多的影响我们今天日常生活的人工智能作品
每年,来自世界各地的科学家发表成千上万篇人工智能研究论文,但只有少数论文能够获得广泛的受众,并在世界上产生全球性影响。以下是过去 5 年在顶级人工智能会议上发表的前 10 篇最有影响力的研究论文。排名基于引用的数量,包括主要的人工智能会议和期刊。
10.
训诂治例 ,古德菲勒等人,ICLR 2015,被 6995 引用
什么?为神经网络生成对抗示例的第一批快速方法之一,并引入对抗训练作为正则化技术。
影响:暴露了一个有趣的现象,任何精确的机器学习模型的性能都可能因攻击者对输入进行微小的修改而显著降低。在其他任务和模态(例如文本和视频)中也观察到了这种现象,并导致了大量的研究工作,这些工作试图重新思考 ML 对现实世界关键任务的适用性。
原始图像的轻微扰动会导致神经网络的严重错误分类。来源。
9.
带图卷积网络的半监督分类 , Kipf 和 Welling ,ICLR 2017,被 7021 引用
什么?一个简单而有效的图形神经网络,在半监督节点分类任务上表现极佳。
影响:新药或高效储能催化剂的发现需要将分子建模为图形。图形卷积网络将深度学习的工具包带入了图形领域,显示了它相对于以前主导该领域的手工启发式方法的优越性。
用图形卷积网络变换图形特征的例子。来源。
8.
深度卷积生成对抗网络的无监督表示学习 ,拉德福德等,ICLR 2016,被 8681 引用
什么?提出了 DCGAN,一种深度 CNN 架构,用于 GAN 模型的生成器,以获得前所未有的自然图像。
影响:gan 是机器学习模型,能够生成人、动物或物体的新图像,因此负责在照片编辑和设计应用程序中流行的机器的创造力。现在,所提出的方法对于生成新的逼真图像的所有现代 GAN 模型都是基本的。
用 DCGAN 生成的卧室。出处。
7.
用深度神经网络和树搜索掌握围棋博弈 , Silver 等人,《自然》2016,被 9621 引用
什么?AlphaGo 介绍,alpha Go 是深度强化学习与蒙特卡罗树搜索算法相结合,在围棋比赛中击败其他程序和职业人类棋手。
影响:历史上第一次,一个计算机程序赢了最强的人类选手之一李·塞多尔——这是人工智能的一个重要里程碑,而这在至少未来十年内都被认为是不可能的。
AlphaGo 中的蒙特卡罗树搜索,用于 Go 中的下一步棋选择。来源。
6.
人类级控制通过深度强化学习 , Mnih 等人,《自然》2015,被 13615 引用
什么?推出强化学习算法 DQN,在许多 Atari 游戏上实现了人类水平的性能。
影响:制造业、机器人和物流背后的算法已经从硬编码规则转向强化学习模型。DQN 是最受欢迎的深度强化学习算法之一,它在各种应用中显示出优越的性能,而无需将手动设计的策略纳入自身。
雅达利游戏中 DQN(蓝色)与 SOTA 算法(灰色)和人类玩家(百分比)的比较。来源。
5.
联合学习对齐和翻译 的神经机器翻译,Bahdanau 等人,ICLR 2015,被 16866 引用
什么?神经网络首次使用注意机制进行机器翻译。注意力是模型只关注源句子中的特定单词而不是整个句子的一种方式。
影响:在机器翻译中,RNN 等传统模型试图将源句子的所有信息压缩到一个向量中。认识到一个模型可以有效地将每个单词表示为一个向量,然后关注每个单词,这是神经网络如何构建的一个重大范式转变,不仅在 NLP 中,而且在 ML 的所有其他领域中。
从英语到法语翻译的注意矩阵。较亮的区域表示单词之间的相似性得分较强。出处。
4.
https://arxiv.org/abs/1706.03762,瓦斯瓦尼等人,NeurIPS 2017,被 18178 引用**
****什么?一个有效的神经网络,Transformer,它完全基于注意机制,在机器翻译中取得了优异的性能。
****影响:事实上,Transformer 模型中引入的多头注意力是最流行的深度学习块,是另一个流行的语言模型 BERT 的一部分。它取代了 RNNs 和 CNN,成为许多处理文本和图像的应用程序的默认模型。
用于机器翻译的转换器的编译码结构。来源。
3.
更快的 R-CNN:面向实时目标检测的区域提议网络 ,任等,NeurIPS 2015,被 19915 引用
****什么?高效的端到端卷积神经网络用于图像和视频中的物体检测。
****影响:更快的 R-CNN 是工业环境中 CV 应用蓬勃发展的原因。它在安全摄像头、无人驾驶汽车和移动应用中的使用极大地影响了我们今天对机器的看法。
更快的 R-CNN 探测到的物体。来源。
2.
批量规格化:通过减少内部协变量移位加速深度网络训练 ,约夫和赛格迪,ICML 2015,被 25297 引用
****什么?通过输入特征的标准化,使神经网络训练更快、更稳定的简单方法。
****影响:添加到现代神经网络的大多数架构中的最流行的技巧之一。批处理范数的存在是深度神经网络目前获得最先进结果的原因之一。
图像批量标准的说明。出处。
1.
亚当:随机优化的一种方法 ,金玛、巴,2015,被 67514 引用
****什么?随机梯度下降优化算法的一个流行变体,Adam,提供神经网络的快速收敛。
影响: Adam 已经被采用为现在人们训练的所有那些数百万个神经网络的优化算法的默认方法。
深度学习神经网络中 Adam 的快速收敛。来源。
鸣谢:本文是在叶卡捷琳娜·沃罗别娃、叶夫根尼娅·乌斯季诺娃、埃尔维斯·多赫马托夫、谢尔盖·科列斯尼科夫、瓦伦丁·马雷克的帮助下撰写的。谢谢你!
P.S .如果你喜欢这个故事,可以考虑关注我的 电报频道推特 ,以及 快讯 。**
每个数据科学家都应该知道的 10 大终端命令
从终端下载和浏览数据—这比您想象的要简单。
Philipp Katzenberger 在 Unsplash 上拍摄的照片
IT 界的每个人都应该知道终端的基础知识,数据科学家也不例外。有时,终端是您所拥有的一切,尤其是在将模型和数据管道部署到远程机器时。
今天,我们将讨论一些基本的数据收集、探索和聚合——全部通过 shell 完成。如果你在 Linux 或 Mac 上,你不会有任何问题,但是 Windows 用户应该在继续之前下载一个终端模拟器。
所以,让我们开始吧!
wget
wget
实用程序用于从远程服务器下载文件。如果您知道 URL,您可以使用它来下载数据集。在这个链接上,您将找到 CSV 格式的航空公司乘客数据集,因此您可以使用wget <url>
命令下载它:
图 1-使用 wget 下载数据集(按作者分类的图像)
如果你在 Mac 上,默认情况下wget
将不可用,所以通过从终端执行brew install wget
来安装它。
数据集现在已经下载完毕,让我们继续进行一些基本的探索。
头
如果你是 Python Pandas 的用户,你会感觉很熟悉。如果没有,使用head
命令打印文件的前 N 行。默认情况下将打印十行:
图 2 —使用 head 命令打印前 N 行(图片由作者提供)
如果您想要一个不同的数字,比如说 3,您可以使用-n
参数。完整的命令应该是:
head -n 3 airline-passengers.csv
让我们去下一个。
尾巴
tail
命令与head
非常相似,但是它打印最后 N 行。默认情况下将打印十行:
图 3 —使用 tail 命令打印最后 N 行(图片由作者提供)
与head
一样,您也可以用-n
参数指定要打印的行数。
我们现在已经了解了基础知识,所以让我们继续一些更有趣的内容。
厕所
有时你想知道文件中有多少个数据点。没必要打开手动滚动到底部。一个简单的命令可以为您节省一些时间:
图 4 —用 wc 命令计算行数(图片由作者提供)
最后, airline-passengers.csv 文件包含 144 行。
可做文件内的字符串查找
该命令用于处理文本,可以匹配字符串和正则表达式。我们将使用它只提取包含字符串“1949”的行。这是一个简单的数据集,所以我们不会有任何问题。默认情况下,grep
命令将打印结果,但是我们可以将其保存到另一个 CSV 文件中:
图 5 —使用 grep 命令提取和保存子集(图片由作者提供)
接下来让我们看看文件是否被实际保存了。
猫
为了验证前面的操作是否成功,我们可以使用cat
命令。它用于将整个文件打印到 shell 中。你也可以用它来合并文件等等,但这是另一个话题了。
现在,让我们打印整个文件。数据按月间隔汇总,因此总共应该有 12 行:
图 6 —使用 cat 命令打印文件内容(图片由作者提供)
像宣传的那样工作!
发现
你可以使用find
命令来搜索文件和文件夹。例如,执行以下命令会将当前目录(由点号指定)中的所有 CSV 文件打印到 shell 中:
图 7 —使用 find 命令打印所有 CSV 文件(图片由作者提供)
星号(*)表示文件名无关紧要,只要它以“.”结尾。csv”。
分类
顾名思义,sort
命令可以用来按照某种标准对文件内容进行排序。例如,以下命令按照乘客数量以升序对我们的 1949 数据集进行排序:
图 8 —按升序对 CSV 文件进行排序(按作者排序)
-k2
参数指定对第二列进行排序。
如果您想按降序对文件进行排序,您可以指定一个额外的-r
参数:
图 9 —按降序对 CSV 文件排序(按作者排序)
毫微;纤(10 的负九次方)
虽然从技术上讲不是 shell 命令,但执行它会打开 Nano 编辑器。以下是创建 Python 文件的方法:
nano pyfile.py
现在,让我们编写一些简单的 Python 代码:
图 10 —用 Nano 编写 Python 代码(图片由作者提供)
您可以在编辑器中编写任何 Python 代码,并进行对于简单的终端命令来说过于复杂的分析。完成后,您可以运行 Python 文件:
图 11-运行 Python 文件(图片由作者提供)
变量
让我们用变量的概念来概括今天的文章。例如,当文件路径变长,或者您需要多次使用它们时,它们会派上用场。
下面是如何声明两个字符串变量并使用mv
命令将airline-passengers-1949 . CSV文件重命名为 new.csv :
图 12 —使用变量重命名文件(作者图片)
ls
命令用于列出目录中的文件,正如我们所看到的,重命名操作是成功的。
这就是今天的全部内容——请随意继续阅读下面的最佳选择之一。
喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。
https://medium.com/@radecicdario/membership
了解更多信息
- 2021 年学习数据科学的前 5 本书
- 如何使用 Cron 调度 Python 脚本——您需要的唯一指南
- Dask 延迟——如何轻松并行化您的 Python 代码
- 如何使用 Python 创建 PDF 报告—基本指南
- 即使没有大学文凭也要在 2021 年成为数据科学家
保持联系
2021 年数据科学的 12 大 Python 库
数据科学
这些库是启动您的数据科学之旅的良好起点。
克里斯托夫·高尔在 Unsplash 上拍摄的照片
无论您是初学者还是寻求跟上潮流的经验丰富的老手,这 12 个 Python 库都是您 2021 年数据科学工具包中绝对需要的工具。请记住,这个列表并不详尽,所以如果我遗漏了你最喜欢的库,请在下面的评论中添加!
数据挖掘
注意: 从网上抓取数据时,请在抓取前检查你的数据来源的条款和准则。遵守数据源可能拥有的所有许可和版权规则非常重要。
1.Scrapy
Scrapy 是 Python 开发人员最流行的工具之一,他们希望从 web 上抓取结构化数据。Scrapy 非常适合构建能够从任何格式的网页中收集结构化数据的网络爬虫,这使得它成为一个收集数据的优秀工具。
2.美丽的声音
另一个收集和组织网络数据的伟大的库, BeautifulSoup 使抓取网站变得容易。BeautifulSoup 非常适合使用特殊字符的网页,因为在收集 web 数据时,您可以轻松地将不同的编码格式传递给它的函数。
3.要求
你可以说我过时了,但是在收集基于网络的数据,尤其是从 API 收集数据时,没有什么比得上 requests 库。Requests 使得在简单的一行解决方案中与 API 和其他 HTML 源进行交互变得容易。
数据处理
4.熊猫
Pandas 是一个开源库,是使用最广泛的数据科学库之一,GitHub repo 上有超过 2300 名贡献者,这个库不会很快消失。Pandas 使数据处理和争论变得容易,它从大量不同的来源(如 CSV、SQL 或 JSON)获取数据,为您提供强大的操作功能,如处理丢失的数据、输入丢失的数据文件和操作列,甚至提供一些基本但非常有用的可视化功能。
5.Numpy
如果你想对你的数据集做任何高等数学运算,那么你需要导入 Numpy 库。在深度学习和机器学习中大量使用,这对任何计算量大的算法和分析都是绝对必要的。Numpy 的多维数组也使得复杂的问题比标准列表简单得多。
6.Scipy
Scipy 源自 Numpy,也可以进行大量不同的数学复杂计算。如果您希望进行多维图像处理、微分方程或线性代数,这个库将使您的生活变得特别容易。
机器学习
7.克拉斯
现在进入深层的东西。 Keras 已经成为深度学习的首选库,特别是在神经网络方面。它建立在 TensorFlow 之上,但更加用户友好,使用户能够使用他们的深度学习 API 进行轻量级和快速的实验。
8.张量流
TensorFlow 之所以这样命名,是因为它使用了多维数组,称之为 tensors。所有大型科技公司都将 TensorFlow 用于其神经网络算法是有原因的:这个库几乎可以做任何事情。优秀的用例包括情感分析、语音识别、视频检测、时间序列分析和面部识别等。TensorFlow 是由谷歌开发的,所以这不会很快消失。
9.PyTorch
TensorFlow 使用静态图, PyTorch 可以随时定义和操作图形,使其更加灵活。尽管 PyTorch 比 TensorFlow 更接近 Pythonic,但后者更受欢迎,因此在它上面更容易找到资源。如果你正在寻找比 TensorFlow 更灵活、更容易掌握的东西,这个库(由脸书开发)是一个很好的资源。
形象化
10.散景
我见过的一些由 Python 代码创建的最令人惊叹的可视化效果是使用散景库开发的。Bokeh 提供了交互式可视化选项,可以很容易地在 Flask 等其他 Python web 工具中显示,这使得它成为向广大受众共享可视化的一个很好的选项。
11.海生的
Seaborn (至少在数据科学方面)最好的特性是关联图,它可以非常容易地直观地发现数据集所有维度之间的关联。Seaborn 构建在 MatPlotLib 之上,所以它很容易访问,是快速可视化数据的一个很好的工具。
12.Plotly
Plotly 是另一个创建高级交互式可视化的伟大工具,它非常适合做探索性分析和显示结果。真的没有什么是 Plotly 做不到的,但是某些类型的可视化在这个库中比其他替代方案更加用户友好。最终,在为您的项目选择最佳可视化库时,这只是一个品味和熟悉程度的问题。
该列表绝非详尽无遗,但对于任何踏上数据科学之旅的人来说,这都是一个很好的起点。你最喜欢的数据科学 Python 库有哪些?请在下面的评论中让我知道你在做什么!
又及:你有没有厌倦过等待熊猫把你的数据上传到你的数据库?通过使用原生 SQL 命令,你可以将它们 的加载速度提高 10 倍。
学习 Python 编程的 13 大资源
可以免费访问的资源,涵盖从入门到深入教程的所有内容。
编写 Python 代码的乐趣应该在于看到短小、简洁、易读的类,这些类用少量清晰的代码表达了大量的动作——而不是让读者厌烦得要死的大量琐碎代码。
吉多·范·罗苏姆
Python第四次被关注各种编程语言的独立软件质量公司 TIOBE 评为年度编程语言。这种流行的原因是Python 提供的简单性和易用性的完美结合。
此外, Python 的多功能性和 庞大的库集合 允许轻松开发驱动许多重要现代领域的应用,如 Web、 人工智能 、 机器学习 、数据科学、游戏、GUI 等等。
这些原因使得 Python 成为许多对学习编程感兴趣的人的首选编程语言。为了帮助你跟上 Python 的潮流,让学习 Python 变得更容易,我们将分享一些最好的网站,它们将涵盖 Python 的所有内容,而不管你的编程经验如何。
查看一些关于 Python 的有趣文章—
**https://blog.digitalogy.co/python-interview-questions-and-answers-for-freshers/
学习 Python 编程的顶级网站
由于电子学习领域的推动,互联网现在充斥着大量学习 Python** 的便利资源,比如 视频 ,在线课程、电子书、网站等等。**
与任何其他网站一样,我们在本文中介绍的 Python 网站可以免费访问,涵盖了从入门到深入教程、练习题等面向 Python 学习者的所有内容。
我们在下面列出了学习 Python 的首选网站。请继续阅读!
1.Python.org
Python.org是所有 Python 事物的圣杯,因为它拥有 Python 编程语言的官方文档。但更重要的是,它还提供了大量其他与 Python 相关的东西,比如 Python 下载、信息视频和播客、开发者社区访问、最新新闻、事件以及 Python 在现实世界中的应用。
对于学习者,网站提供了 Python 各种主题的综合文档、备忘单、外部测验和练习、教程和指南。绝对的初学者会发现从网站上学习 Python 轻而易举,这要归功于整齐分类的教程,这些教程面向以前有或没有任何编程专业知识的学习者。
对于有 Python 经验的开发人员来说,他们会发现网站上充满了方便获取的深入的参考资料,比如指南、书籍和常见问题解答。包含的帮助部分也使每个人更容易找到东西。
2.学习 Python.org
大多数网站都采用僵硬的方法来涵盖 Python 中的主题,learnpython.org则更多地采用互动的方法来完成这项工作。learnpython.org不仅仅是向读者展示所有关于 Python 的信息,而是更加强调实践学习。该网站是你能想到的几乎每一个 Python 主题的交互式 Python 教程的家园。
Python 新手使用网站探索 Python 中的各种主题并测试他们对浏览器的理解是没有任何困难的。此外,学习者还将获得一系列高级教程,如 decorators、serialization、正则表达式、生成器、闭包等,以及一些与数据科学相关的教程。
你可能会惊讶地知道, Ron Reiter,learnpython.org 的创造者,同样涵盖了很多面向初学者的编程语言,比如 Java ,HTML,C, JavaScript , PHP 等等。
</10-cool-python-project-ideas-for-python-developers-7953047e203>
3.面向初学者的 Python
面向初学者的 Python****提供了大量与 Python 相关的内容供好奇的个人学习编程语言。当谈到教授 Python 的基础知识时,网站以广泛但对初学者友好的教程的形式为新手提供了所有必要的内容。
他们的教程涵盖了从设置 Python、变量、函数、文档字符串、循环、列表、操作符、异常处理到许多其他基础主题的所有内容。不仅仅是这些,该网站还提供了一个有见地的阅读部分,以一种易于理解的格式涵盖了这些介绍性的主题。
如果您觉得您已经牢牢掌握了网站上列出的主题,为什么不试试他们的 Python 代码示例部分,并评估您的立场呢?
4.一个字节的 Python
Swaroop C H 的 一个字节的 Python 本质上是他的通俗易懂且免费的 Python 书籍的网站改编,也就是针对初学者的。他的网站非常直观的侧面板以整洁和结构良好的方式为学习者展示了所有的 Python 入门主题。除了为新手介绍 Python 的基础知识之外,作者还提供了大量关于安装和设置 Python 的内容。
每个主题都有一个简单的介绍,一个示例程序,它的输出,以及它工作背后的详细解释。尽管该网站面向 Python 新手,但有经验的 Python 开发人员也可以使用该网站从新的角度重温基本概念。
5.牛逼的 Python
- Github Stars: 92.4k
- Github 乡亲: 18.1k
- Github 链接:https://github.com/vinta/awesome-python
Python 的多功能性使其成为创建各种强大解决方案的完美编程语言,开发人员可以立即将这些解决方案插入到其他项目中。正是 Python 的这一特性导致了数百个应用程序和库的诞生。当谈到列出这些巨大的资源集合,如库、 GitHub repos 和软件时,没有人比 GitHub 上的“Awesome”系列做得更好。
Vinta Chen 的 GitHub repo 包含了 Python 基本组件、库、工具等的详尽列表,比如构建工具、管理面板、数据分析工具、调试工具、图像处理工具、测试工具、RESTful APIs 等等。这个列表很长,我们强烈建议 Python 开发人员将这个 GitHub repo 加入书签,以便为他们的下一个项目快速找到合适的组件。
6.谷歌的 Python 类
互联网巨头谷歌是 Python 的狂热用户,并在其几项服务中使用了 Python。为了鼓励人们学习 Python,他们的 Google for Education 平台提供了一个 Python 类,它涵盖了 Python 中的几个关键主题。这个免费的课程包括像演讲视频、书面材料和大量练习这样的资源。
除了对 Python 的简单介绍之外,本课程的主题是在现代应用程序中更常用的主题,这使得它更适合具有一定 Python 编程经验的个人。
更具体地说,这门课涵盖的主题包括初始设置、介绍、字符串、列表、排序、字典和文件、正则表达式以及一些书面和视频形式的实用工具。
查看顶级谷歌人工智能工具—
7.蟒蛇斑
Python Spot 是最拥挤的网站之一,无疑是学习 Python 编程语言的最佳网站之一。平台涵盖了来自 Python 的大量初学者友好的主题。
此外,Python Spot 网站涵盖了 Python 世界中如此多的内容,以至于您不会觉得有必要从一个网站跳到另一个网站来搜索特定主题的教程。对于初学者,该网站不仅提供了一个包罗万象的编程训练营课程,还提供了 Python 中每个基础主题的教程。
除了基础知识之外,Python Spot 还涵盖了各种各样的教程来帮助您使用数据库、 web 开发 、GUI 开发、HTTP 客户端和服务器网络、图形绘制、游戏开发等等。
</10-world-class-companies-using-python-26cde24919a8>
8.Python 的搭便车指南
《Python 搭便车指南》一书的网站改编本为理解 Python 中的各种主题提供了一个自以为是的指南。该网站面向 Python 初学者和老手,提供帮助你设置 Python 和开始 Python 编程所需的一切。
该网站还提供了一些适用于常见应用程序开发场景的高度推荐的工具,如网络应用程序、数据抓取、命令行应用程序、GUI 应用程序、数据库、密码学等等。
为了提高 Python 代码的质量,该网站有一个专门的部分,为构建、测试、记录和有效记录您的项目提供有价值的提示。
https://medium.com/analytics-vidhya/top-8-python-tools-for-app-development-df63bd127cf2
9.深入研究 Python 3
来源:潜入 Python 3
还记得 Python 的一个字节吗,这是我们几分钟前讨论过的另一个 Python 学习网站?Mark Pilgrim 在他的书《深入 Python 3》中采用了类似的方法,并为学习者提供了网站版本。
如果您对 Python 2 的概念有基本的理解,但是想跳到最新的 Python 3,那么这个资源将是您的最佳选择。该网站在 Python 3 中引入的变化以及如何让自己和程序适应现在标准版本的编程语言方面做得非常好。
但是不要让这给你留下一点都不适合初学者的印象。该网站涵盖了从设置 Python 到让您开始编写第一个程序,以及让您熟悉其他重要的 Python 概念,如数据类型、重构、序列化、类、迭代器等等。
10.全栈 Python
全栈 Python 是一个为 Python 学习者准备的惊人且完全免费的便利资源集合。与我们列表中的其他几个条目类似,Full Stack Python 也从一本书重新构建成了它的网站格式。
该网站假设学习者对 Python 有基本的了解,这对于完全的新手来说是一个不公平的建议。但是如果你对 Python 基础有很强的理解,我们真心实意地向你推荐这个网站。为什么?因为网站的目标是 通过指导你开发你的第一个全面的 Python 应用程序来测试你的 Python 技能**** 。
该网站提供了 Python 中各种主题的教程,这些主题与 web 应用程序开发、应用程序部署、DevOps 等相关。它还介绍了其他几个有用的主题,如开发环境、使用数据库、测试技术、API、数据分析和可视化。
https://blog.digitalogy.co/best-python-frameworks-for-web-development-2020/
11.真正的 Python
虽然Python.org采用了更专注于主题的方法来涵盖 Python 相关的主题,但是真正的 Python 采用了一种稍微更具教育性的方法。被认为是学习 Python 的最令人惊叹的在线资源之一,它的成功来自于它的广为人知的信息丰富的播客系列,称为真正的 Python 播客。
回到网站,您会发现一系列的部分,包括 Python 教程、视频课程、测验、学习路径等等。这里需要注意的一点是,尽管该网站免费提供大部分内容,但也有一个订阅选项,可以向学习者开放大量的资源。
无论您是学习 Python 的学生、中级开发人员还是专业开发人员,Real Python 都为您提供了所有合适的学习途径,可以让您迅速掌握 Python。
https://www.youtube.com/channel/UCI0vQvr9aFn27yR6Ej6n5UA
12.Python 大师
Python 大师是另一个 Python 学习网站,旨在为新一批 Python 开发者简化 Python。该网站非常深入地涵盖了 Python 的基本主题,每个主题或教程都在前一个主题的基础上进行扩展,以提供更平滑的过渡。
一旦你浏览了网站上的基础主题,然后提供了一波适合更高级学习者的 Python 主题,比如生成器、正则表达式、递归函数、虚拟化、字符串格式化等等。
更进一步,Python Guru 网站还包括 Python 内置函数、MySQLdb 数据库访问和 Django web 开发的教程。
13.谈 Python
如果你喜欢播客,你会发现 Talk Python To Me 网站既有趣又发人深省。这些播客最大的好处是你可以随时随地收听它们。Talk Python 网站提供了一个由 Michel Kennedy 主持的优秀的每周播客系列,他在他的 45 分钟长的播客中采访了 Python 爱好者和创造者。
该播客涵盖了从 Python 世界的最新动态到其教育内容的所有内容,并且是一个从行业专家那里获得方便的技巧和见解的绝佳场所。目前,该网站拥有近 300 集关于一系列有趣且引人入胜的讨论话题的内容。
尽管该网站因其播客而闻名,但该平台也提供有益的在线视频课程,但请记住,这些课程是有偿的。
https://www.youtube.com/channel/UCKPSmMfDsXTKrCZApukcJ7A
奖励资源—
- 如何像计算机科学家一样思考
- 官方 Python 教程
- 艰难地学 Python
- 用 Python 发明
- 学习 Python —初学者完全教程【freeCodeCamp.org】
- 教程点
- SoloLearn
- 代码学院
结论
祝您的 Python 编码之旅一切顺利
显而易见,Python 在过去几年里发生了巨大的变化,已经成为在不同领域工作的众多开发人员的首选编程语言。得益于这些改进,Python 在企业中的采用率大幅提高。这种在行业中更广泛的采用直接转化为编程语言更好的未来,以及 Python 开发人员的职业机会。
这对于新手和资深开发人员来说都是一个很好的信号。总结一下,我们在本文中分享了 10 多个 Python 学习网站,这应该会让你更容易找到合适的学习资源,现在我们想听听你对此的想法。
注: 为了消除各种各样的问题,我想提醒你一个事实,这篇文章仅代表我想分享的个人观点,你有权不同意它。
如果你有更多的建议,我很想听听。
更多有趣的读物
我希望这篇文章对你有用!以下是一些有趣的读物,希望你也喜欢
</12-cool-data-science-projects-ideas-for-beginners-and-experts-fc75b5498e03>
关于作者
克莱尔 D 。在digital ogy—是一个内容制作者和营销人员。这是一个技术采购和定制匹配市场,根据全球各地的特定需求,将人们与预先筛选的&顶级开发人员和设计人员联系起来。与我连线上 中Linkedin&推特 。**
数据目录失败的两大原因
以下是两个最重要的原因,尽管有很多好的意图,但是许多数据目录最终还是失败了
由 Unsplash 上的 CHUTTERSNAP 拍摄
你注意到数据生产者(数据工程师、产品工程师、分析工程师)和数据消费者(数据分析师、数据科学家、商业用户)不知道数据存在什么,如何使用它,什么是值得信任的。你会在 slack 上看到大量的问题,这对数据团队的生产力是一个真正的打击。
你得到了一个很大的花哨的数据目录——它有许多花哨的功能,但几个月过去了,没有人使用它。你在全体会议上展示它,你发送电子邮件,你甚至在人们在 Slack 频道谈论数据时谴责他们,促使他们在数据目录内进行这种对话。
但是到了最后,这种用法就不再适用了。你的数据目录永远不会被采用。
这个故事我已经看过很多次了。尽管初衷是好的,但许多数据目录最终还是失败了,以下是两大原因:
1.目录鬼城—缺少描述和元数据
为了从大多数数据目录中获取价值,您需要用有价值的信息填充它。这些信息包括描述、标签、主键、外键、查询数据的常用方法、最常见的 FAQ 等。你明白了。难的是让你的同事进入这种环境。
即使您以某种方式说服其他人添加文档,一旦添加了,它很快就会过时。因为数据进化很快,不仅需要添加一次,还需要不断的维护。
当维护没有发生时,你的数据目录没有帮助,反而会有伤害。这个故事是数据目录失败最常见的一个故事。
我见过三种最好的解药:
尽可能自动化。尽量通过自动化获取尽可能多的元数据。没有理由有人需要填充外键,主键,为每个数据集查询数据的常用方法。所有这些信息都已经隐藏在现有的使用模式和日志中,并且是最新的。提取最常见的过滤器、连接条件、上游依赖项和下游使用者。在以后的博客文章中会有更多关于如何做到这一点的内容。
从“流程”中提取文档。文档最好在用户的流程中获得。当创建新的数据集时,您需要强制添加文档。有时是过程的改变,但更多时候是技术上的——我见过很多成功的部署,你在 CI/CD 中进行文档检查,如果没有提供适当的文档,就中断构建。
策展人前 20% 。不可否认,有些事情需要人来策划。将您最常查看的指标、仪表板和表格记录下来。做到这一点的先决条件是认识到你不能煮沸大海,并了解什么是你最常查询的表和最常查看的仪表板。
2.您的目录太广,不够深入,导致碎片化
通常,在理解和信任数据时,您需要回答并执行以下操作:
- 关于这个数据最常见的对话有哪些?
- 有哪些关于这些数据的知识库/维基?
- 查询数据以进一步研究它
最近,目录变得相当庞大,导致用户的黄金路径支离破碎:
- 对话—您可以在空闲时间或在您的数据目录中进行对话
- 知识库—您可以在 Confluence 或您的数据目录中编写 wiki 文章
- 查询—您可以在 BI 工具(Tableau、Looker、Mode、雪花 UI)中进行查询,也可以通过数据目录查询数据。
这种分裂是最糟糕的事情。为什么?
- 用户现在必须弄清楚选择哪个工具来做什么。
- 数据团队现在必须维护上述两个选项。以查询为例。现在,您必须在 BI 工具和数据目录查询工具中实现 RBAC。就像在一个工具中实现 RBAC 还不够困难。
最终,这种碎片化会导致足够多的个人和组织摩擦,导致数据目录失败。你的目录最终在太多的事情上做了一个蹩脚的工作。
解决这个问题的方法是——如果你有一个过于庞大的目录产品,仔细选择你的黄金路径,在你的产品中禁用重复的功能,这样就有一个建议的选项。例如,为人们提供一个谈话的地方,要么在你的目录中要么在空闲时间中。阻止另一个选择。
摘要
数据目录失败有两个原因:
- 目录鬼城-没有足够的描述和元数据。
- 目录太宽,不够深入——用户黄金路径中的碎片。
为了避免这些问题,无论您选择什么工具,都要尽可能多地自动化元数据,只精选最有影响力的数据,并专注于用户的黄金路径。
要阅读更多类似的帖子并保持联系,请在 Twitter 上关注我,或者通过订阅这里获得类似内容的每月简讯。
熊猫的三大替代 Python 包
使用 Python 进行数据分析的备选工作流比较
如果你喜欢我的内容,并想获得更多关于数据或作为数据科学家的日常生活的深入知识,请考虑在这里订阅我的时事通讯。
对于许多现代数据科学家来说,Python 是他们日常工作中使用的编程语言——因此,数据分析将使用最常用的数据包之一来完成,即 Pandas 。许多在线课程和讲座会介绍 Pandas 作为使用 Python 进行数据分析的基础。
在我看来,Pandas 仍然是用 Python 进行数据分析的最有用和可行的包。然而,为了便于比较,我想向您介绍几种熊猫套餐。我不打算说服人们从熊猫换成另一种套餐,但我只想让人们知道熊猫套餐是有替代品的。
那么,这些熊猫备选套餐是什么呢?让我们开始吧!
1.极地
Polars 是一个数据帧库,通过实现 Rust 编程语言,以箭头为基础,设计用于快速光照时间处理数据。Polars 的前提是给用户一个比熊猫套餐更快捷的体验。使用 Polars 包的理想情况是当你的数据对于熊猫来说太大,而对于 Spark 来说又太小。
对于熟悉 Pandas 工作流的人来说,Polars 不会有太大的不同——有一些额外的功能,但总体来说它们非常相似。让我们尝试使用 Polars 软件包。首先,我们需要在您的 Python 环境中安装 Polars。
pip install polars
之后,我将使用 Polars 包创建一个 DataFrame 示例。
import polars as pl
df= pl.DataFrame({'Patient':['Anna','Be','Charlie','Duke','Earth','Faux','Goal','Him'],
'Weight':[41,56,78,55,80,84,36,91],
'Segment':[1,2,1,1,3,2,1,1] })
df
作者创建的图像
与 Pandas DataFrame 类似,界面和数据分析工作流程也很熟悉。有一点不同的是数据类型在数据的顶部,并且没有显示索引。让我们尝试使用 Polars 中的一些功能。
#Print DataFrame datatype
print(df.dtypes)#Print DataFrame columns
print(df.columns)#Print DataFrame top 5
print(df.head())#Conditional Selection
print(df[df['Weight'] < 70])
作者图片
Polars 中有许多与 Pandas 功能相同的可用功能,并且有条件选择的可能性。我并没有说熊猫身上所有的功能在极地也有。比如我想用iloc
做索引选择的时候。
df.iloc[1]
作者图片
当我想选择索引时,出现了错误。这是因为熊猫指数的概念不适用于极地。
适用于极坐标的一个特殊概念是表达式。在 Polars 中,你可以产生一个连续执行的函数(称为表达式)并用管道连接在一起。让我们用一个例子来理解这个概念。
#Parallel Expression df[[ #Expression for executing the stats (sum) and create the column names "sum"
pl.sum("Weight").alias("sum"),
pl.min("Weight").alias("min"),
pl.max("Weight").alias("max"),
pl.std("Weight").alias("std dev"),
pl.var("Weight").alias("variance"),
]]
作者图片
如果我们借用熊猫的概念,通常我们在上面所做的是类似于熊猫的条件选择。然而,在我们使用 Polars 的情况下,当我们传递表达式时,表达式执行会产生另一个数据集。
使用 Polars 的主要卖点仍然是它们更快的执行时间。那么,与熊猫相比,Polars 的执行时间有多快呢?在这种情况下,让我借用 Polars 文档中的图像示例来进行比较。
内连接 Polars vs. Pandas 执行时间(来源:https://github . com/pola-RS/Polars/blob/master/examples/10 _ minutes _ to _ pypolars . ipynb
上图是使用三种不同方法进行内部连接时的时间比较:Polars 内部连接、Pandas 内部连接和 Polars 内部连接平行。如您所见,与 Polars 相比,当数据变大时,Pandas 的执行时间会变慢。在较小的数据量中,执行时间可能没有太大的差别,但是当数据量较大时,这一点就变得更清楚了。
2。Dask
Dask 是 Python 中并行计算的 Python 包。Dask 中有两个主要部分,有:
- 任务调度。类似于气流,用于通过自动执行任务来优化计算过程。
- 大数据采集。并行数据框,如 Numpy 数组或 Pandas 数据框对象—专用于并行处理。
更简单地说,Dask 提供了一个数据帧或数组对象,就像你在 Pandas 中可以找到的那样,但是它是并行处理的,以获得更快的执行时间,并且它提供了一个任务调度器。
因为这篇文章只涉及 Pandas 的替代方案,所以我们不会测试任务调度功能。相反,我们将关注 Dask 数据框对象。让我们尝试几个简单的 Dask 函数示例——但是首先,我们需要安装 Dask 包(Anaconda 默认有这个包)。
#If you want to install dask completely
python -m pip install "dask[complete]"#If you want to install dask core only
python -m pip install dask
安装 dask 后,让我们试试 Dask 函数。最初,我们可以启动一个仪表板来监控数据处理。
import dask
from dask.distributed import Client, progressclient = Client(processes=False, threads_per_worker=4,
n_workers=1, memory_limit='2GB')
client
作者图片
Dask 在不同的端口中为您提供了一个客户端仪表板,您可以在启动它之后访问它。当您单击仪表板链接时,它将类似于下图。
作者图片
我要说的是,这个仪表板很容易理解,它包括了您当前与 dask 的所有活动。您可以尝试查看 dask dashboard 中所有漂亮的选项卡,但现在让我们继续。现在让我们试着创建一个 dask 数组。(类似 Numpy 拥有的东西)
import dask.array as da
x = da.random.random((10000, 10000), chunks=(1000, 1000))
x
图片来自作者
当 dask 数组被创建时,你会收到矩阵信息,就像上面一样。这个数组将成为 dask 数据帧的基础。让我们尝试从 dask 创建一个数据集,以获得更详细的示例。
df = dask.datasets.timeseries()
df
作者图片
Dask 数据框具有与 Pandas 数据框对象相似的结构,但是因为 Dask 数据框是惰性的,所以它不会在 Jupyter 笔记本上打印数据。然而,您可以在 Dask 上执行 Pandas 中存在的许多功能。让我们举几个例子。
df.head()
作者图片
如果您正在使用.head
功能,您可以打印前五个数据。如果要做条件选择,还是和熊猫差不多。虽然,它需要一个特殊的函数来执行。让我向您展示一个示例代码。
df[df['x'] >0.9]
作者图片
正常做的话,会获得 dask 数据帧结构。如果您想要获取熊猫数据帧,您需要使用.compute
功能。
df[df['x'] >0.9].compute()
作者图片
这是计算 dask 数据框条件选择时获得的实际数据。dask 上的一切都是关于并行和快速计算,所以如果你决定使用 dask,最好熟悉熊猫。dask 的理想情况是当你有一个高计算量的数据集,但是如果你的数据可以用你的计算机内存轻松处理,那么就坚持用 Pandas。你还可以用 dask 做很多事情。我建议你访问他们的网站了解更多。
3.Vaex
Vaex 是一个 Python 包,用于处理和探索大的表格数据集,接口类似熊猫。Vaex 文档显示,它可以计算统计数据,如均值、总和、计数、标准差等。在一个 N 维网格到上,每秒有十亿 (109)个对象/行。这意味着 Vaex 是 Pandas 的替代方案,也用于改善执行时间。
Vaex 的工作流程类似于 Pandas API,这意味着如果你已经熟悉 Pandas,那么使用 Vaex 并不困难。让我们从安装 Vaex 开始这个例子。
pip install vaex
安装完 Vaex 包后,我们可以尝试使用数据集示例来查看 Vaex 数据框。
import vaex
df = vaex.example()
df
作者图片
与 Pandas 应用程序类似,您可以进行条件选择。
df[df['x'] > 88]
作者图片
然而,Vaex 文档中写道,“Vaex 的一个核心特性是在 N 维网格上极其高效的统计计算。这对大型数据集的可视化非常有用。”让我们尝试使用简单的统计方法。
df.count(), df.max('x'), df.mean('L')
作者图片
结果显示为一个数组对象,其中包含 value 数据类型的详细信息。Vaex 销售的另一个功能是绘图功能,您可以将统计功能应用于绘图功能。例如,我没有使用通常的计数统计,而是使用“E”列的平均值,其限制为只显示 99.7%的数据。
df.plot1d(df['x'], what='mean(E)', limits='99.7%')
作者图片
对于更高级的绘图功能,您可以访问 Vaex 文档。重要的是要知道,Vaex 的卖点是其快速统计计算和大数据可视化探索功能。然而,如果你有一个更小的数据集,你可以坚持用熊猫。
结论
作为一名使用 Python 作为分析工具的数据科学家,您肯定会使用 Pandas 包来帮助您的数据探索。但是,有几个 Pandas 替代方案可供您使用,尤其是在处理大数据时,它们是:
- 极地
- 达斯克
- 沃
希望有帮助!
如果您没有订阅为中等会员,请考虑通过我的推荐订阅。
数据科学中令人厌烦的 3 大假设和期望
关于我的工作,我的职称教会了我什么
拥有数据科学家的头衔会带来很多假设和期望。不同的公司对成为数据科学家有不同的定义。每家公司都有自己的期望和假设,希望你为他们做些什么。据此,我挑出了我作为数据科学家工作或面试时经常面临的三个最令人厌烦的假设和期望。
我们可以做任何事。
通常,数据科学家需要查看数据,并为请求数据的人进行分析。一些公司会雇佣并假设数据科学家可以扮演多种角色:数据科学家、前端开发人员、后端开发人员、数据分析师、数据工程师、ML Ops 等等。不幸的是,事实并非如此。不应该期望数据科学家执行管道的每个方面。
数据空间中的每个角色都有自己擅长的技能子集。每一个都是机器中的一个齿轮,使整个过程持续进行。不应该期望数据科学家知道并理解管道的每个方面。相反,我们应该与软件开发人员、工程师、SME 等团队合作,构建一个持久的产品。
我担任的一个角色希望我在一个单独的位置重新创建所有数据集。与此同时,我们有一个数据工程团队,他们将我们的数据以一种易于访问的格式存放在云中。我们不是一个小团队或初创公司,需要人们总结他们的技能来让事情运转起来。
我不久前写了一篇关于这个的帖子,因为这个请求让我很困扰。如果我们有一个数据工程团队将与我们密切合作,以我们需要的格式提供数据,为什么我们要重新创建所有这些呢?原因是——我的经理想要一个自给自足、不依赖他人的团队。这不公平。团队需要有效地合作,而不是反对不合理的要求。
所有项目都要求使用 ML/AI。
尽管有些人不想听,但并不是每个问题都需要最广泛的 ML/AI 算法或工具。您可以使用基于物理的分析、描述性统计或仪表板等解决方案来解决一些问题。
当您评估您的业务目标时,您需要确定最佳解决方案。当我开始成为一名数据科学家时,我得到的最好建议是首先找到最简单的解决方案。专注于简单的事情,然后在此基础上构建解决方案。不要为了展示你的技能而把问题复杂化。你也许可以解决某人的问题,而不需要广泛的 ML/AI。确保您首先评估用例,并在适当的时候使用 ML/AI。
一种开箱即用的工具。
不是每个工具都能解决所有问题。就像你可能不需要每个项目都需要 ML/AI 一样,你可能不需要每个工具或推荐的工具。我经常看到公司试图推动使用一种或另一种工具,因为这是目前的趋势,或者他们在一次谈话中听到它,认为它可以解决他们的问题。不幸的是,情况并非总是如此。
例如,Databricks 提供了一个管理的 MLFlow 选项。我已经对这个工具进行了两次评估,两次都得出了相同的结论:对于手头的用例来说,它不是合适的工具。该产品具有实验跟踪、模型部署、模型管理和模型部署的能力。对于我评估的用例来说,这个工具不起作用。我们没有部署传统的人工智能模型。相反,我们使用基于物理学的定制分析,这些分析不遵循 MLFlow 模型有效工作所需的相同结构。尽管如此,其他人仍然想使用这个工具。
项目中使用的每个工具都需要评估其有用性。该产品是否提供了您需要的功能?如果是,他们的竞争产品是否需要在功能、价格、安全性等方面进行评估。?同样,是否已经有了一个你可以使用的公司标准?不要赶新潮流。确保您为手头的项目选择了正确的工具。
最后的想法
数据科学家的头衔可能伴随着许多假设和期望。不要让这个压倒你。相反,你应该关注哪些技能和知识对你的角色和目标是必不可少的。
- 不要专注于掌握一切。确定你想把你的技能应用到数据领域的什么地方,并以此为目标,无论是数据科学、数据工程、ML Ops 还是其他。找到你的领域并在那里发展技能。
- 你不需要对每个项目都使用 ML/AI。了解您的业务目标,并了解您的使用案例。在适用的情况下,应采用 ML/AI。
- 与 ML/AI 一起,工具不能开箱即用。你需要评估一个工具是否适合这项工作。最新的工具或下一个趋势并不总是适合您的用例。
你对数据空间中的哪些假设或预期感到厌倦?
如果你想阅读更多,看看我下面的其他文章吧!
作为数据科学家起步的三大挑战
我作为一名年轻工程师转型为数据科学家时遇到的问题以及我是如何克服这些问题的
照片来自 Unsplash 上的 Jukan Tateisi
当我开始职业生涯时,我是我所在的团队和公司中唯一的女工程师。我正在攻读数据科学硕士学位,同时在 DevOps 中从事服务器和开发仪表板的工作。我所在的房间有近 30 人;所有男人都期待我。据我所知,那种环境不是我能茁壮成长的地方。这种环境会让我隐藏起来,过度工作,并暂停我的职业发展。我做出的最好的决定是,在我继续职业生涯并努力成为一名数据科学家的过程中,认识到这些问题并找到解决它们的方法。
1.开会时我会被遗忘,就好像我不在那里一样。
几乎每天都有这样的事情发生,我的队友在会议、公开对话或路过时忘记了我。起初我没有注意到,但后来我开始意识到,一些和我一起工作的人忽视了我的存在,或者干脆无视我。正如我所看到的,我开始想办法在会议中脱颖而出,不被边缘化。我不再会理想地坐着开会。
我可能会在会议的大部分时间里保持沉默,但我会在讨论中思考,收集我的想法,并制定回应。我工作得越多,我开始有更多的经验,我意识到我需要站起来,为自己站出来,因为没有人会这样做。我不能让自己在会议中退居幕后。如果有我感兴趣但未被邀请参加的会议,我会询问我是否能被邀请参加。
在我旅程的早期,我发现很容易被遗忘,如果你放任不管的话。保持安静和不太参与小组对话有助于促进这一点,所以我喜欢积极参与团队讨论,并参加不同类型的会议,以了解正在进行的工作。
建议:不要让自己在会议或团队中被遗忘。你应该觉得你可以大声说出正在发生的事情。无论是分享你的观点,提出一个问题,还是讨论一个问题,你都不应该觉得你不能表达自己。
2.他们没有认真对待我的意见,因为我不被视为一个在我的领域有知识的数据科学家。
我经常分享我对数据科学话题的看法,但我的团队并没有认真对待。有什么问题?我希望团队认识到他们手边的数据量,并开始利用这些数据为他们自己和他们的客户提供更好的见解。不管我如何陈述我的情况,也不管我向谁陈述,我总是收到相同的反馈。他们告诉我,我没有足够的经验,没有受过足够的教育,或者不知道我在说什么。他们认为我资历太浅,不能分享我的意见。
在尝试了这么多月之后,我认识到该公司并没有打算也没有兴趣改变他们的流程来更好地利用他们的数据。那时,我离开去寻找一家公司,这家公司会尊重我的意见,欣赏我的经历和教育,并与我一起寻找项目前进的道路,以改善他们的过程。
当我开始作为一名全职数据科学家工作时,我学会了如何处理数据,将数据提供给其他团队,以及运行分析。我开始与团队内外的其他人分享我的见解。作为团队成员,我赢得了他们的信任,他们开始尊重我的想法和决定。
建议:永远不要觉得自己的职位太低,无法分享自己的观点或经验。你应该能够在与任何人的交谈中表达你的想法。如果你所在的地方听不到你的意见,找一个你可以信任的团队来倾听你的意见并尊重你的观点。并不是每个环境都有利于你在职业生涯中取得进步。有时候你需要离开去寻找一个你可以一起学习和成长的团队。
3.他们给了我一个项目,我没有被期望完成,然后当我展示我完成的作品时,他们嘲笑我。
我的第一个大项目是更新一些服务器。我必须更新操作系统,所有的依赖,并确保我们的软件在机器上正常工作。我花了前三个月的时间学习系统架构,从事这个项目,并测试我的改变。然后我走进了我的 90 天回顾。
我希望与我的经理一起回顾我的成就,并让他向我提供反馈。他反而笑了。他给了我一个项目,他并不期望我在那个时间框架内完成,当我告诉他我完成了工作,需要在服务器上测试时,他笑了。这是对我作品的第一次令人不安的回顾。如果他真的觉得我做不了这个项目,为什么他要陷害我让我失败?
虽然这不是一个数据科学项目,但我相信这个故事仍然提供了一些有价值的经验。当我离开这份工作去找另一份工作时,我学到的第一件事就是不要让自己被暗算。相反,我努力在项目的所有阶段收集经理的期望。我这样做是为了了解他们对项目、时间表和预期交付成果的期望。这也让我有机会与我的经理讨论为什么事情会比预期的时间长,并检查我遇到的任何障碍。
从这个项目中学到的下一个教训是理解测试和评审的重要性。让别人测试或审查您的代码可能会带来您可能没有意识到的问题。在我 90 天的回顾之后,接下来的几个月,我和我的经理一起在本地服务器上测试我的代码。这些测试显示了一些小问题,我能够识别、修复,然后重新测试。对于这个项目,评审集中在软件/服务器测试和代码评审上。但是,您也可以将这个概念应用到数据科学工作中。不管你在做什么工作,都要测试你的项目是否如预期的那样,并且让至少一个能提供反馈的人来检查你的工作。获得反馈,尤其是在数据科学方面,可以提供您可能没有考虑到的有趣见解,例如添加新功能或包含您可能没有意识到的额外数据集。
忠告:不要让一次糟糕的经历阻止你学习和变得更好。自从我的第一个大项目以来,我已经带走了许多对我目前职位有帮助的东西:
- 你将面临新的挑战和别人认为你无法完成的项目。不要不知所措。相反,把工作分解成可管理的小块,并努力实现它们。如果需要,寻求帮助。
- 理解项目的期望。如果你不清楚它们是什么,那就要求澄清。
- 安排频繁的会议来回顾你的进展,获得反馈并讨论接下来的步骤。
- 准备你的评论。无论是 90 天、每季度还是每年,都要为此做好准备。展示你所有的成就,你超越的地方,以及你可能奋斗过的领域。列出你想在接下来的 X 个月里关注的任务,并定义你的目标。知道你下一步想完成什么。
最后的想法
我最初的几份工作并不理想,也不是我想做的,但它们教会了我许多经验,我至今仍在使用。这些工作教会了我如何更好地沟通以被他人听到,如何在团队中建立信任以获得对我决策的支持,以及如何在一切似乎注定失败时坚持下去。
- 不要让自己在会议中被遗忘,或者退居幕后。沟通是一项在工作场所需要提高的技能,无论是书面还是口头的。你应该觉得你可以大声说出正在发生的事情。
- 在你的团队中建立信任,努力让别人听到你的意见。收集证据来支持你的主张,并与你的团队和领导分享你的想法。如果你努力让别人听到你的声音,和你的经理或导师讨论改进的方法。如果在寻求帮助后你仍然纠结于此,你有时需要离开去寻找一个你可以一起学习和成长的团队。
- 不要让一次不好的经历阻止你学习和变得更好。无论你的背景是数据科学还是其他,你都可以回顾过去的工作,从中学习,并将这些经验应用到当前的工作中。
你从过去的工作中学到了什么?在你目前的职位上,你是如何运用这些经验的?
如果你想阅读更多,看看我下面的其他文章吧!
离开我热爱的工作的三大教训
办公时间
跳槽到下一个机会:成为数据科学顾问
我在同一份工作上干了将近两年,直到 4 月份,我“走进”我的远程办公室,辞去了工作。我的经理脸上的表情是震惊。他的眼睛有点凸出,不知道该说什么。我很清楚的是,“我以为我们有更多的时间。”老实说,我也是。在将近一年的时间里,我和他一起规划我的职业生涯,决定我的下一步行动,并学习如何影响业务。发生了什么事?
面试
四月中旬,我第一次见到了我未来的经理。在一名招聘人员联系我,向我推荐一份数据科学顾问的工作后,我们进行了一次面试。我并不总是对招聘人员做出回应,但我的直觉告诉我这次机会是不同的。对我未来经理的面试分为两个阶段。第一次见面时,我们讨论了这个角色和公司的基本情况。我们第二次见面时,他给了我一个商业目标样本,并问我将如何与客户打交道。
我觉得后者很有意思,因为我以前从未做过顾问,所以我必须随机应变。给出目标的简要概述后,我说出了我在这次谈话中思考的问题,让我们可以公开讨论在与客户就类似主题进行互动时可能会发生或不会发生的事情。我问的一些问题包括:
- 你试图从这些信息中收集什么样的见解来帮助业务?
- 为什么这对你自己或团队很重要?
- 我在数据集中提供了哪些信息?
在我们的讨论之后,我还会见了一名团队成员进行了一次技术面试。这次面试与一些人可能习惯的典型的编码面试有很大的不同。我们不再关注编码挑战、基础和理论,而是谈论工作。他想知道在过去的两年里我做了哪些项目,以及我是如何解决这些项目的。当我们讨论所使用的解决方案和技术时,我们进入了假设情景并讨论了如何解决它们。我们意识到我们来自相似的背景,在维护管理数据空间中使用不同种类的设备。
该说的都说了,该做的都做了,周末我收到了一份工作邀请,但最具挑战性的部分还在前面。
决定
我现在的职位已经快两年了,我必须做出一个决定。离开我的角色是一个艰难的决定。当我慢慢地让人们知道我要离开的时候,这件事困扰了我整整一个星期。第一个人是我的老板,他睁大眼睛告诉我,“我以为我们有更多的时间。”那个星期,他不是唯一一个我认为会有这种反应的人。一个接一个,我从导师、同事和朋友那里收到了类似的回应,因为我告诉他们这是再见。
告别最难的部分是决定离开我热爱的工作。几年后,这是我喜欢的第一份工作;我有强有力的导师,并建立了许多联系。我向我的同事学习,并观察到我在数据科学和工程方面的技能有所提高。在这份工作带来了这么多好处之后,也许这就是为什么是时候离开了。
作为人类,我们会陷入安逸舒适的模式。工作中不再面临挑战,取而代之的是,日复一日地遵循同样的仪式。我不想在我的角色中得到安慰。我喜欢挑战,这种挑战会让我沮丧,直到我得到答案。我想要挑战,这将迫使我学习新的技能,并了解我在哪里需要帮助。我寻求挑战,知道我不知道所有的事情,但无论如何都需要弄清楚。
当我继续让人们知道我要离开的时候,我和与我共事了两年的顾问们进行了一些专门的谈话。这些人和我的团队一起开发项目,在我们合作和就各种主题进行富有洞察力的对话时,我从中受益匪浅。在我的最后一周,与他们坐下来,让我表达了我对咨询的担忧,并获得了他们的反馈。他们的建议是抓住这个机会。
结果
到 5 月份,我已经开始了数据科学顾问的新工作。与我做过的其他工作不同,在第一周结束时,我被要求并被信任制作向客户展示的作品。两个月后,我意识到我在数据科学工作中学到了多少东西。
我的头两个星期感觉像一个冒名顶替综合症压倒性的感觉。我担心辞职是个错误。我担心我不能胜任顾问的工作。夹杂着焦虑,这可能是一种难以粉碎和抛开的感觉。
我在这里学到的是我低估了自己的技能。过去两年我所学的一切,用 Python 编码,与数据工程师一起工作,关注团队之间的合作,等等,都让我为这个角色做好了准备。我在上一份工作中学到的最重要的经验是准备我的分析并把它们展示给其他人,这些经验很好地转移到了我的新工作中。是时候抛开骗子综合症,相信我的技能了。
对我认识到冒名顶替综合症帮助最大的是庆祝胜利,即使是很小的胜利。你是否写了一个笔记本,让你对数据有了新的见解?你在你的代码中发现一个 bug 并解决它了吗?在您的仪表板中构建一个新的可视化效果如何?不管你每天的胜利是小是大,都要庆祝。无论你的失败有多小或多大,都不要让它们击垮你。相反,退一步,向他们学习。把它们作为变得更好的工具,而不是夸大骗子综合症的工具。
最后的想法
说到底,我已经在那里呆了两个月了。辞掉工作,找一份新工作,在这个过程中更多地了解自己。从这次旅程中吸取了三个教训:
- 最具挑战性的部分可能是说再见。不要害怕离开去接受新的挑战、新的工作或不同的角色。
- 走出你的舒适区。你可能不知道会发生什么,但这是一个扩展你的技能和从变化中学习的机会。
- 冒名顶替综合症会让你觉得自己不够好。有时这种感觉会淹没真实的真相。关闭冒名顶替综合症,相信你的技能。庆祝胜利,从失败中学习。
如果你想阅读更多,看看我下面的其他文章吧!
在我成为数据科学家的过程中获得的 3 大经验
弄清楚你想成为什么样的人这一严酷的事实
洛根·费希尔在 Unsplash 上的照片
在高中,学生们被施加压力,让他们思考下一步该做什么。你想用你的余生做什么?学生们被要求在工作、攻读学位、经商或其他方面做出选择。如果你上大学,会被问到一个类似的问题:你想主修什么来度过余生?当你在找工作的时候,雇主会问:你认为自己 5 年后会怎样?你下半辈子想做什么?关于弄清楚你想成为什么样的人,一个严酷的事实是,在你找到正确的方向之前,可能需要很多年,很多次尝试,这没关系。
当我开始读高中时,我上了一所技术学校,在那里我可以学习电子技术。构建电路和每天玩机器人的想法让我很感兴趣,但还不够。随着大学申请的不断增加,我申请了许多不同的学校,最终决定成为一名英语专业的学生。我想探索我的写作兴趣,摆脱我花了四年时间涉足的硬件。接下来的两年充满了犹豫、担忧和否认。
我喜欢写作,尤其是技术写作和文档。但我看不到能让我开心的职业。在学习了两年不同的科学、数学、英语和艺术课程后,我签署了一份文件,将我从那所学校除名。相反,我转到了另一所大学,继续攻读电子工程,并回到 STEM。
现在回想起来,这很有趣,因为我当时只在电气工程专业学习了一个月左右。想起我在高中时的电气技术时代,我知道我对编程比对硬件设计更感兴趣。就在那时,我从电子工程转到了计算机工程。这个开关给了我两个世界最好的东西,得到了硬件和软件的混合类。在我学习这些课程的同时,我开始实习,探索软件和嵌入式工程领域。我喜欢这种组合,并对毕业后成为嵌入式工程师感兴趣。当我寻找可以帮助我实现这个目标的课程时,我开始发展我的毕业设计并申请电气工程硕士项目。
我的大四项目集中在嵌入式编程和将传感器连接到收集和分析数据的应用程序上。正当我开始对自己成为嵌入式工程师的决定感到放心时,我开始质疑自己的决定。在完成我的项目和毕业后,我偏离了嵌入式工程和电气工程硕士。
相反,我接受了一份 DevOps 工程师的工作,在服务器上工作,并为我的数据科学硕士进行兼职学习。在兼职工作和学习期间,我做了一个我需要做的最艰难的决定。我辞掉了工作,回到学校继续全日制攻读数据科学硕士。正是在那里,我学会了观察数据、将数据整合到不同的项目中以及与数据对话的意义。这可能让我多花了几年时间,但是要弄清楚你想成为什么样的人,这并不是一条容易的路。
获得硕士学位后,我找了一份数据工程师的工作,开发一个应用程序,让用户可以搜索公司所有可用数据集的元数据。那份工作结束后,我被聘为应用数据科学的高级工程师。
当我坐下来回顾我的旅程时,成为应用数据科学高级工程师的每一步都教会了我今天在日常工作中使用的不同技能:
- 书面和口头交流(英语专业)
- 与硬件上的传感器交互并收集数据(电子技术/计算机工程)
- 软件开发(计算机工程/数据工程)
- 服务器和诊断服务器问题(开发运营工程)
- 持续集成和部署(开发运营工程)
- 开发可靠的数据集(数据工程和数据科学)
- 分析和可视化数据(数据科学)
- 从事大数据和大数据应用(数据科学)
这些技能以及更多的技能在我担任当前角色和领导团队的过程中派上了用场。
如果说我从这次经历中学到了什么,那就是你的道路在开始的时候可能并不清晰。当我走过我的道路时,我经常改变我的想法,我很高兴我这样做了。如果我一直等待,我担心我会被困在我不喜欢的职业中,从事我的工作来维持生计,而不是试图在我的领域有所作为。找到每天让我开心去上班的事情是一件大开眼界的事情。这份工作给我带来了快乐,让我能够有所作为,这让我明白我在人生道路上做了正确的选择。可能花了我一段时间,但我找到了,我喜欢它。
最后的想法
当你穿越你的旅程时,要知道找出什么是适合你的最具挑战性的事实是知道这可能不是一条容易的路。
- 道路并不总是直线的。对改变你的想法保持开放的心态,找出什么是适合你的。没有马上想出所有的方法也没关系。我花了一段时间才承认,我没有其他人想得那么快。意识到我在我的旅程中并不孤独,这让我明白这没什么。
- 享受你正在经历的旅程,并且知道你会找到你喜欢做的事情。关键的经验和学到的技能将来自每一步。正如我上面分享的,总有一些东西你可以带走,即使是从一次糟糕的经历中。当你着手下一件事的时候,把这些经历带在身边,并从中成长。
- 知道什么时候说不。如果有些事情不适合你,你对你正在做的事情不满意,看看什么时候你可以离开它,说不。离开 DevOps 告诉我,当我觉得机会不适合我时,我可以说不。说不,找一个更适合自己的机会,也是可以的。
你是如何找到你喜欢做的事情的?为了达到这个目标,你必须克服哪些挑战?
如果你想阅读更多,看看我下面的其他文章吧!
你不知道的熊猫的三大功能
你不会偶然发现这些——我保证!
熊猫无需介绍。多年来,它一直是 Python 生态系统中的首选库,并将一直存在下去。库中有数百个可用的函数,即使对于最有经验的用户来说,知道所有这些函数也是不可行的。
今天你将学习三个不太受关注的有价值的函数。几乎在任何数据科学指南中都找不到它们,尽管它们在日常分析工作流中很有帮助。
你需要安装 Numpy 和熊猫来跟随。
eval()
您可以使用eval()
函数将 Python 表达式作为字符串进行求值。以下是您应该了解的参数:
expr: str
-要计算的表达式必须仅包含 Python 表达式。target: object
—赋值的目标对象—数据帧。inplace: bool
—指示是否应该修改target
。False
默认,所以返回一个副本。
让我们看看它在实践中是如何工作的。以下代码片段创建了一个虚拟数据帧,显示虚构的机器学习模型性能:
df = pd.DataFrame({
'Algorithm': ['XGBoost', 'DNN'],
'MSE': [63.3234, 51.8182]
})
它看起来是这样的:
图片 1 — eval() (1)(图片由作者提供)
现在,您将使用eval()
函数来计算基于 MSE 的 RMSE:
pd.eval('RMSE = df.MSE ** 0.5', target=df)
以下是新数据帧的外观:
图片 2 — eval() (2)(图片由作者提供)
函数提供了创建新属性或更改现有属性的替代方法。它没有提供任何突破性的功能。
你可以在这里了解更多关于的功能。
插值()
interpolate()
函数使用指定的插值方法填充缺失值。以下是您应该了解的参数:
method: str
—插值法。linear
默认。它可以有许多值,因此检查文档以找到合适的值。axis: int or str
-要沿其进行插值的轴。limit: int
—可选参数,用于指定要填充的连续缺失值的最大数量。inplace: bool
—指示是否应修改原始数据帧。False
默认。
让我们看看如何使用这个函数。下面的代码片段创建了一个熊猫序列,其中包含前五个整数,第四个整数缺失。interpolate()
功能应自动确定4
是正确的插值值:
s1 = pd.Series([1, 2, 3, np.nan, 5])
s1.interpolate()
结果如下:
图片 3-interpolate()(1)(图片由作者提供)
但是如果这种关系不是线性的呢?下面是列表值之间的二次关系示例:
s2 = pd.Series([1, 4, 9, np.nan, 25])
s2.interpolate(method='polynomial', order=2)
结果如下:
图片 4-interpolate()(2)(图片由作者提供)
非常管用!默认情况下,在上面的例子中调用interpolate()
会用17.0
填充丢失的值,因为这是周围元素的平均值。这不是你想要的。
你可以在这里了解更多关于的功能。
因式分解()
您可以使用factorize()
函数将对象编码为枚举类型或分类变量。以下是您应该了解的参数:
values: sequence
—要编码的一维值序列。sort: bool
—指示是否应对values
进行分类。False
默认情况下。na_sentinel: int
—标记缺失值的值。如果None
,丢失的值将被删除。
让我们看看它在实践中是如何工作的。以下代码片段分解了美国各州的虚拟列表,但没有进行排序:
codes, uniques = pd.factorize(
values=['NY', 'CA', 'AL', 'AL', 'AR', 'CA']
)print(codes)
print(uniques)
结果如下:
图片 5 —因式分解()(1)(图片由作者提供)
factorize()
函数返回一个元组,因此将结果存储到两个变量中是一个好的做法。
如果排序很重要,您可以指定sort=True
:
codes, uniques = pd.factorize(
values=['NY', 'CA', 'AL', 'AL', 'AR', 'CA'],
sort=True
)print(codes)
print(uniques)
结果如下:
图片 6 —因式分解()(2)(图片由作者提供)
Pandas 自动计算出它应该按字母顺序排列这些值。干净利落。
你可以在这里了解更多关于的功能。
最后的想法
似乎没有熊猫不能做的事情。每个版本都添加了越来越多的功能,因此不时查看文档是值得的。谁知道呢,也许你花几个小时手工实现的东西已经内置到库中了。检查一下也无妨。
你有喜欢的鲜为人知的熊猫功能吗?请在下面的评论区告诉我。
喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。
https://medium.com/@radecicdario/membership
保持联系
学习推荐系统的前 3 个 Python 包
从这些包中学习,提升您的推荐系统知识
维多利亚诺·伊斯基耶多在 Unsplash 上的照片
推荐系统是一个数据科学问题,它根据历史数据预测用户或客户想要什么。推荐系统有两种常见的工作方式——协同过滤和基于内容的过滤。
你对上面的术语感到熟悉吗?也许是,也许不是。无论如何,本文旨在使用这三个顶级 Python 包更好地理解推荐系统。这些包裹是什么?让我们开始吧!
1.惊喜
Surprise 是一个开源的 Python 包,用于构建基于评分数据的推荐系统。SurPRISE 这个名字是简单的 Python 推荐系统引擎的缩写。该包提供了构建推荐系统所需的所有工具,包括加载数据集、选择预测算法和评估模型。
让我们安装软件包来了解更多关于推荐系统的信息。
pip install scikit-surprise
安装包之后,我们试着在教程包的基础上搭建一个推荐系统。我们这样做是为了看看这个包是否被正确安装。
from surprise import SVD
from surprise import Dataset
from surprise.model_selection import cross_validate# Load the movielens-100k dataset (download it if needed).
data = Dataset.load_builtin('ml-100k')# Use the famous SVD algorithm.
algo = SVD()# Run 5-fold cross-validation and print results.
cross_validate(algo, data, measures=['RMSE', 'MAE'], cv=5, verbose=True)
作者图片
如果您可以看到上面的输出,那么您就可以开始了。上面的代码通过评级并使用 SVD 算法来分析数据集;我们创建了推荐系统。我们评估的指标是 RMSE 和 MAE,以 5 折作为评估方法。
如果我们想进一步了解算法和评估的工作原理,我们可以访问惊喜文档。开发人员表示,他们非常重视解释算法每个细节的文档。这就是为什么我们要为我们的材料学习探索文档。
作者 GIF
如果我们看入门部分,文档中充满了关于为推荐系统开发机器学习预测并对其进行评估的学习材料。
如果我们查看预测算法部分,我们将获得关于使用基线估计和相似性度量的估计的更详细的部分。这部分写得很好,让你理解推荐系统中使用的基本算法。
作者图片
该文档还为您提供了学习材料的绝佳选择;我建议您从以下部分开始,了解更多关于模型和评估的信息:
我喜欢这个文档中所有的计算和公式都写得很详细,这样你就可以理解在引擎盖下发生了什么。例如,余弦相似度的计算在下图中写得很清楚。
作者图片
2.TensorFlow 推荐器
TensorFlow 框架包含一个构建推荐系统的库,名为 TensorFlow 推荐器。与其他包一样,TensorFlow 推荐器包含数据集示例、推荐器算法、模型评估和部署。
要安装这个包,您需要运行下面的代码。
pip install tensorflow-recommenders
TensorFlow 推荐器将允许我们仅基于 TensorFlow 框架构建一个推荐系统。然而,该文档对初学者来说是完整的,因为它是为初学者和专业人士编写的。让我们看看文档页面进行学习。
作者 GIF
文档是根据如何加载数据、选择算法和评估算法来组织的。
该文档不仅包含初学者的操作方法,还提供了相关内容的提示,比如特性预处理。
作者图片
如果您想查看更高级的用例,您可以查看中间用例的文档。它显示你的内容,如多任务推荐,跨网络等。
作者图片
如果你想拥有源代码或者为开源做贡献,你可以访问 GitHub 页面。
3.再度量
如果没有评估指标,对推荐系统算法的学习将是不完整的。我提到的前一篇文章已经告诉了我们一些基本的推荐评估指标,但是 Python 包关注的是这些指标— Recmetrics 。
要安装这个包,您只需要运行下面的代码。
pip install recmetrics
该软件包包含推荐系统的许多评估指标,例如:
- 长尾图
- 新闻报道
- 新奇
- 使个性化
- 列表内相似性
还有很多。所有关于这些指标的解释都可以在 GitHub 页面上找到。
作者 GIF
如果你想用一个示例数据集来研究这个包,你可以研究这个包中提供的示例笔记本。
结论
推荐系统是一个数据科学问题,根据历史数据来预测用户或顾客想要什么。学习推荐系统可以更好的用 Python 包来陪伴你的学习。我推荐的软件包是:
- 惊喜
- TensorFlow 推荐
- Recmterics
希望有帮助!
如果您喜欢我的内容,并希望获得更多关于数据或数据科学家日常生活的深入知识,请考虑在此订阅我的 简讯。
如果您不是中等会员认购,请考虑通过 我的推荐 进行认购。
学习音频数据科学项目的前 3 个 Python 包
音频数据科学项目是你可以从这些包中学到的东西。
凯利·西克玛在 Unsplash 上的照片
当我们谈到数据项目时,许多人首先会想到表格数据、文本数据或图像数据作为数据源。然而,数据远不止这些。现代技术使得收集和存储各种数据变得更加容易,包括音频数据。它不像其他项目那样大肆宣传,但音频数据科学项目对许多行业都是有效的。
音频数据科学项目的示例包括通过声音进行情感预测、语音转文本预测和音乐生成。无论您的兴趣是什么,有几个 Python 包可以帮助您了解更多关于音频数据科学项目的信息。本文将概述我的前 3 个音频数据科学项目 Python 包。让我们开始吧。
1.品红
Magenta 是一个开源的 Python 包,建立在 TensorFlow 之上,用来操纵图像和音乐数据,以生成模型作为输出来训练机器学习模型。
Magenta 没有提供清晰的 API 参考供我们学习;相反,他们给了我们很多研究演示和合作者笔记本,我们可以自己尝试。
洋红色演示(作者提供的 GIF)
洋红色的 Colab 笔记本(作者 GIF)
对于第一次参与音频数据科学项目的人,我建议访问他们的 Hello World 笔记本进行音乐创作。我从他们的笔记本中学到了很多,特别是生成机器学习的部分,在那里你可以测试各种音调来产生你的音乐。让我们试试这个代码。
Magenta Hello World 测试(视频由作者提供)
正如我们在上面的视频中看到的,音乐完全是用代码创作的。我们试着用 Magenta 做一个生成式音乐机器学习。我将使用 MusicVAE 实现 Magenta 来制作音乐。很好用,只需要改变一些超参数。
generated_sequences = music_vae.sample(n=2, length=80, temperature=1.0)for ns in generated_sequences:
# print(ns) note_seq.plot_sequence(ns)
note_seq.play_sequence(ns, synth=note_seq.fluidsynth)
我们可以改变 n 来表示你想要制作的音乐的数量,音乐的长度,以及温度来表示音乐的随机性。让我使用下面的参数。
generated_sequences = music_vae.sample(n=2, length=100, temperature=15)
音乐生成(作者提供的视频)
生成的音乐将取决于你开始学习时使用的音频。你可以弹奏各种音乐来创造你的旋律。
2.利布罗萨
Librosa 是一个为音乐和音频分析开发的 Python 包。它专门用于捕获要转换成数据块的音频信息。但是,文档和示例有助于理解如何处理音频数据科学项目。让我们尝试安装 python 包并尝试快速入门。下面的代码将安装这个包。
pip install librosa
安装包后,让我们下载样本音乐。
import librosa
filename = librosa.example('nutcracker')
我们可以使用 librosa 包来捕获这个样本的音频信息。让我们用 librosa 加载音乐数据。
y, sr = librosa.load(filename)
当我们使用 librosa 加载一个音频文件时,我们获得了两个数据集;波形数据(存储在 y 中)和采样速率(存储在 sr 中)。我们来详细看看数据。
print('waveform')
print(y)
print('\nsampling rate')
print(sr)
作者图片
如您所见,波形数据存储为 NumPy 数组数据。如果我们想要可视化波形,我们可以使用 librosa 显示包。
import librosa.display
import matplotlib.pyplot as pltfig, ax = plt.subplots(nrows=1, sharex=True)
librosa.display.waveshow(y, sr=sr)
ax.set(title='Envelope view, mono')
ax.label_outer()
作者图片
我们可以通过音乐时间看到音频波形是怎样的。这是一个伟大的探索工具。使用 librosa,我们还可以用下面的代码跟踪音频节拍时间。
tempo, beat_frames = librosa.beat.beat_track(y=y, sr=sr)
print('Estimated tempo: {:.2f} beats per minute'.format(tempo))
作者图片
如果你想得到每一拍的时间,你可以用下面的代码来实现。
beat_times = librosa.frames_to_time(beat_frames, sr=sr)
beat_times 变量将在 NumPy 数组中存储每个节拍的所有时间戳。
我建议访问他们的 API 文档和高级材料以进一步学习,因为它包含许多学习音频数据科学项目的重要工具。
作者图片
3.py 音频分析
pyaudionanalysis是一个用于音频分析任务的 Python 包。它旨在进行各种分析,例如:
- 提取音频特征
- 用于音频分割训练机器学习模型
- 未知音频的分类
- 基于回归模型的情感识别
- 用于音频数据可视化的降维
还有很多。你可以用这个包做很多事情,特别是如果你是音频数据科学项目的新手。
您需要直接从 GitHub 页面克隆这个文件来安装这个包。
git clone https://github.com/tyiannak/pyAudioAnalysis.git
之后,您需要安装需求依赖项(您克隆文件的目录)。
pip install -r ./requirements.txt
然后使用下面的代码开始安装整个包(参考您克隆的目录)。
pip install -e .
安装包后,我建议访问维基,所有使用的例子都写在那里。
作者 GIF
对于初学者来说,该文档很容易阅读,尽管代码部分比较复杂,因为您需要了解如何使用 CLI 来执行代码。然而,出于学习的目的,软件包文档已经足够好了。
结论
数据科学项目并不总是关于表格、文本或图像数据。有时你可以使用非常规数据,如音频。在本文中,我概述了我学习音频数据科学项目的前 3 个 Python 包,它们是:
- 品红
- 利布罗萨
- py 音频分析
希望有帮助!
如果您喜欢我的内容,并希望获得更多关于数据或数据科学家日常生活的深入知识,请考虑在此订阅我的 简讯。
如果您没有订阅为中等会员,请考虑通过 我的推荐 订阅。
公众演讲能在数据科学领域帮助你的三大理由
理解你的听众,回答问题,并寻求反馈
照片来自 Unsplash 上的 Michal Czyz
大学时,我参加了演讲会。我花了两年时间提高我的演讲技巧,学习如何在众人面前演讲,并获得对我工作的反馈。当时,我没有预料到这会对我目前的职位产生影响。在数据科学和工程领域,学会有效沟通是一项有效且关键的技能。最近,我又报名参加了演讲会。我想分享一下为什么我决定报名参加,以及公众演讲如何有利于你的职业生涯。
如果你还不知道,演讲会是一个公共演讲俱乐部。这个俱乐部允许你练习你的公开演讲技巧,提高你的沟通能力,并建立领导技能。但是您可能会想,为什么我需要在数据科学岗位上提高我的演讲技能?我发现公开演讲技巧在我的日常工作中有三个方面是有益的:参与技术性和非技术性的讨论,即席提问,以及提供反馈。
技术和非技术受众
在过去的两年中,我参加了许多会议,在这些会议中,听众从技术人员到非技术人员都有。我练习公共演讲时经常关注的一个领域是学习如何让我的内容适应不同的观众。非技术受众通常是我的利益相关者。当我与他们会面时,他们想知道项目的工作状态、预计的时间表以及任何阻碍我工作的障碍。
当我第一次开始练习演讲时,我专注于向非技术观众发表技术演讲。演讲会是一个很好的场所,因为我的大多数听众都是来自不同背景的非技术人员。这种环境给了我一个很好的地方来谈论和接受反馈,告诉我什么进展顺利,什么令人困惑。
您向非技术观众展示的越多,您就越能确定适合展示的信息级别。除了非技术观众,我经常向另一类人展示的是不同领域的技术人员。我是数据科学的,但是我经常给数据工程师、软件工程师、电气工程师等等做演示。
当向其他可能与我不在同一领域的技术人员演示时,我可以添加更多的细节并讨论工作的技术方面。当我和那些技术人员一起工作时,我会根据相关的工作来调整我的对话。有了数据工程师,我可以了解为什么我的数据看起来是这样,或者我如何解决我在地面真实数据集中面临的问题。当和软件工程师在一起时,我可以问如何改进我们的代码库和过程。
即席演讲
在演讲会中,有三种类型的演讲约定:计划好的演讲,对他人演讲的评价,以及即兴的桌面主题。三个桌面主题中的一个是关于给定主题的 1-2 分钟的演讲,您将立即收到这些演讲。在这一点上,你需要快速、简洁地回答问题。
表格主题是我最喜欢练习的三个主题之一,因为它们对数据科学有很大的帮助。在向不同的观众做了演示或报告后,我开始提问和评论。这时,我面前出现了一个类似于桌上题目的东西,我必须在短时间内即席回答。我经常收到这样的问题:
- 这里使用的方法是最好的方法吗,或者你可以使用其他方法得到相同的答案吗?
- 你为什么使用这个指标而不是另一个?
- 那个参数是最好的吗?你能考虑一下另一个吗?
这些问题可能是你在分析中已经考虑到的东西,也可能不是。在会议中简洁快速地回答这些问题有助于推动讨论。如果你没有立即的答案呢?可以说你会进一步调查,然后回复那个人。
反馈
现在你可以向不同的听众演讲并回答即兴问题,让我们来讨论一下公众演讲中最具挑战性的部分:获得和给出反馈。我在某一方面很纠结,我觉得很多人都知道如何获得和给出反馈。如果你一直关注我的文章,那么你可能已经读过我去年是如何经常向我的同事和导师寻求反馈的。
通过我在演讲会的经历,我学会了提供反馈,我发现这非常有价值。在我学会给别人反馈后,我开始寻求反馈,以了解我做得好的地方,我需要改进的地方,以及我可以挑战自己改变的不尽如人意的地方。这方面的交流可能很难掌握。您希望能够提供反馈,而不会显得粗鲁或对某人居高临下。但是,一旦学会了,它会成为一个有价值的工具。
如果我不要求反馈,那么我通常会提供反馈。我被要求提供反馈的领域包括:
- 代码评审 —同事们经常在代码评审期间寻找对他们代码的反馈。他们想知道他们可以改进的地方或者他们需要改变的地方,以符合小组的编码标准。
- 项目输出——如果我不在代码评审中,那么我正在查看某人的分析输出。在这些通话中,他们希望了解分析中不清楚的内容,或者在工作获得批准之前需要添加哪些行动项目。
- 演示——通常,在我的团队中,有人会创建一套 PowerPoint 幻灯片,并就此征求意见。我们发现自己经常与其他团队交流,包括技术团队和非技术团队。当我对幻灯片提供反馈时,演示者想知道内容是否合适,对他们要演示的观众是否合适。你与不同的观众接触得越多,你就越能理解如何对为这些人写的演示文稿提供反馈。
提供反馈可能会让你很纠结,但是你可以通过实践提供有价值的见解来帮助你的团队。
最后的想法
乍一看,公开演讲似乎不是一项基本技能,但对于在数据科学和工程领域工作来说,公开演讲是至关重要的。通常,你会发现自己在会议、演示或讨论会中需要清晰简洁地展示你的工作。在练习公开演讲时,我关注的三个方面包括:
- 了解如何使我的内容适应不同的受众,包括来自不同领域的技术人员和非技术人员。
- 培养快速简洁地回答即兴问题的技巧。如果你不知道答案,就说你会记下这个动作,等你知道了再联系他们。
- 练习对你的工作给予反馈和要求反馈。学会向团队提供有用的反馈是一项有价值的技能,尤其是在参与代码评审、分析输出讨论和演示时。
这些领域对我的职业生涯非常有益,因为它们帮助我了解如何有效地沟通和展示我的工作。数据科学不仅仅是一个技术职业,也是一个需要大量讨论的职业。
你是如何提高自己的沟通技巧的?你是否也认为公开演讲是数据科学中的一项关键技能?
如果你想阅读更多,看看我下面的其他文章吧!
我作为数据科学家卖掉我的 M1 Macbook Pro 的三大理由
M1·麦克会给你 90%的机会。但是 90%就够了吗?
M1 奇普棒极了。想象一下,一个超快的处理器,一整天的电池续航时间,而且没有散热问题。听起来很棒,至少在纸面上是这样。尽管如此,它不得不去。
如果你想要一个的单句摘要——一些数据科学库要么不可能要么几乎不可能本地运行,连接两个外部显示器是一个噩梦,最后,eGPUs 不被支持。
这正是本文的结构,所以请随意浏览您最感兴趣的部分:
- 应用程序和库兼容性
- 外部显示器支持
- eGPU 支持
应用程序和库兼容性
我不太喜欢 Anaconda Python 发行版。总的来说,这是一个好主意,但是我更喜欢 Python 3 的干净安装和动态的依赖管理。不过,Anaconda 似乎是 M1 芯片的首选。
M1 上默认的 Python 3 是 3.9.x,你必须先把它降级到 3.8.x 才能让一些库工作。没什么大不了的,但肯定是额外的一步。即使在降级之后,我在原生安装库时看到的唯一一致的东西是终端中的一串红线。
想安装 TensorFlow?很好,但是请事先安装一个特定版本的 Numpy 和其他五个软件包。不用说,但是如果您没有指定一些额外的参数(或者如果您没有在虚拟环境中安装它们),这些版本会在安装其他包时被覆盖。如果你想让 TensorFlow 一直可用,那就有点麻烦了。
Anaconda 运行良好,但测试时 M1 芯片还没有正式发布。这意味着整个发行版通过一个名为 Rosetta 2 的模拟器运行,这个模拟器做得非常好。尽管如此,它不是原生支持。
对于我的日常工作,我需要与云数据库进行大量的交流,主要是 Oracle。用 Python 做到这一点的唯一明智的方法是通过 Oracle Instant Client,它没有移植到新的芯片上。
这只是不工作或不按预期工作的一个简短列表。我敢肯定,任何其他技术专业人员都可以在列表中添加问题。
外部显示器支持
如果您使用单个外部显示器,请随意跳过这一部分。
13 英寸对于舒适的 8 小时以上工作会议来说是不够的。当然,在家工作意味着在某些日子里在床上工作,但是你更多时候需要额外的屏幕空间。
我正在使用两台戴尔 U2419H 显示器。其中一个处于正常水平位置,而另一个垂直旋转,如下图所示:
图片 1–2 台 Dell U2419H 显示器(图片由作者提供)
想怎么说就怎么说,但是在垂直显示器上写代码不是你能轻易放下的事情。看看下面的图片,你会立刻明白其中的要点:
图 2 —代码和代码编辑器的垂直空间(图片由作者提供)
简而言之——垂直空间对于任何涉及代码的事情都是一个巨大的生产力助推器。只有一台显示器并旋转它不是最好的选择。对我来说,拥有两台相对便宜且色彩准确的显示器是一个不错的选择。
遗憾的是,Macbook Pro 和 Macbook Air 中的 M1 芯片仅支持单显示器。有一些方法可以解决这个问题,比如购买带有 DisplayLink 的扩展坞,但我上次检查时,亚马逊上没有推荐的那些。
eGPU 支持
我完全可以牺牲一个专用的 Nvidia GPU 来获得一个超便携和外观时尚的笔记本电脑。不过,选择通过 thunderbolt 连接 GPU 一直是基于英特尔的 MAC 电脑的一个选项。不便宜,但它就在那里。
M1 芯片以一种不好的方式改变了这一切。它根本不支持 eGPU,你也无能为力。这意味着你可以忘记偶尔的游戏。我知道没有人会为了玩游戏而购买苹果电脑,但拥有选择权不会有坏处。
M1 芯片确实带有一个神经引擎,如果你对此感兴趣,它应该对基本的深度学习任务有所帮助。但它仍然是一台笔记本电脑,所以不要指望一些疯狂的性能。为此,您必须切换到 Collab 或云 GPU。
如果你正在进行深度学习,这最后一点不应该成为一个交易破坏者,因为移动 GPU 只能让你到此为止。
结论
总之——M1 苹果电脑会让你达到 90%的目标,但如果你需要一些超具体的东西,它们不是最佳选择。跟着炒作走很容易,但一旦它过去,挫败感就会出现。至少对我来说是这样。
正如很多人会说的——千万不要买第一代苹果产品。我同意。
你对 M1 芯片有什么体验?我渴望听到任何 IT 职业的正反两面意见。
喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。
https://medium.com/@radecicdario/membership
了解更多信息
- 每位数据科学家必读的 3 本编程书籍
- 脊线图:用 Python 可视化数据分布的最佳方式
- Python 字典:你需要知道的一切
- 如何用 Python 发送漂亮的电子邮件——基本指南
- 新的 M1 macbook 对数据科学有好处吗?让我们来了解一下
保持联系
原载于 2021 年 3 月 26 日https://betterdatascience.com。
作为一名数据科学家,我不购买新款 M1 Pro/Max MacBook 的三大理由
相反,我在等待 M2——这就是你也应该等待的原因。
纳丁·沙巴纳在 Unsplash 上拍摄的照片
免责声明 :我从一个数据科学家的角度写了这篇文章。我不喜欢 8K 视频渲染,也不喜欢 Logic Pro 中的海量音轨。我有一台 2020 年的 M1 MacBook Pro,大部分繁重的工作都是在远程 GPU 机器上完成的,所以在阅读本文时要记住这一点。
我等苹果硅 MacBooks 新系列等了这么久。我有一台 M1 MacBook Pro,我喜欢它的一切——它速度快得惊人,重量轻,完全静音,有出色的屏幕和键盘,不会过热,电池续航时间长达一整天。简而言之,在地狱结冰之前,我是不可能回到 Windows 的。
在观看了苹果 10 月 18 日的活动后,我有两件事要说——新的 M1 Pro/Max 芯片是开创性的,作为一名数据科学家,我绝对不会购买它们。我有三个充分的理由。
不想看书?请观看我的视频:
1.普通的 M1 MacBook Air/Pro 已经足够好了
当然,我很想把每一个数据科学和深度学习基准都扔给新机器,并且连续第二年拥有一个永无止境的令人瞠目结舌的时刻。
但是忽略增加的内核和 RAM,M1 Pro/Max 仍然和普通 M1 一样,不支持更多的数据科学工具和库。安装 TensorFlow 你还是会纠结。一旦安装,它将运行得更快。这没什么大不了的,因为反正没人用超便携笔记本电脑进行严肃的深度学习。
我真正关心的是电池寿命。苹果声称电池寿命为 17/21 小时,这取决于你是选择 14 英寸还是 16 英寸的型号。这种说法只对基本型号有效,电池寿命可能会随着你对机器的规格越来越差。另一方面,普通的 M1 MacBook Pro 已经拥有出色的电池续航时间。一次充电我可以轻松获得 1.5-2 个工作日,前提是我不做任何疯狂的事情。
先说设计。当然,新型号有更薄的边框、更好的屏幕和更好的键盘——但老实说,这不是我想要的重新设计。与 2016 年的重新设计相比,今年的车型只是看起来 meh。
作为一名数据科学家,我不太关心笔记本电脑的设计,因为它 80%的时间都是关闭的,并插入外部显示器。我使用单 4K 显示器,但如果你需要更多,那么一个普通的 M1 不适合你。
房间里还有一头巨大的大象需要讨论。
2.MacBook M1 Pro/Max 实在是太贵了
我讨厌绝对地讨论金钱。1000 美元对一个美国人来说不算多,但这只是克罗地亚月平均净收入的一部分。美国人谈论这些新机器有多贵,但我认为他们得到了好处。
美国月平均工资为 3978 美元(如果我说错了,请纠正我),你可以用一份薪水买几乎任何新的 MacBook。然而,并不是每个人都有生活在美国的特权。以下是在克罗地亚购买新款 MacBook 系列需要多少工资:
图 1 —克罗地亚新 Mac 系列的相对价格(HRK =克罗地亚库纳,货币)(图片由作者提供)
是的,你没看错。在克罗地亚,你需要 3.14 到 5.37 英镑的月净收入才能买一台新的 MacBook。我还没有介绍定制配置,因此全力以赴使用 64 GB 内存和 8 TB 存储会让您头晕目眩。钱包空空如也,但这是必然的。
数据科学家的收入远高于平均工资中位数,但这仍然是一大笔钱。看在上帝的份上,你可以买辆像样的二手车。
如果你想知道常规的 M1 阵容相比之下要花多少钱,我可以帮你搞定。下表总结了商店中提供的 2020 年 M1 MacBook Air 和 Pro 型号(无自定义配置):
图 2 —克罗地亚普通 M1 Macbook 系列的相对价格(HRK =克罗地亚库纳,货币)(图片由作者提供)
当然,还是很贵,但没那么贵了。你可以用不到 14 英寸的价格买到最贵的 M1 MacBook Pro,它有 16 GB 的内存和 512 GB 的固态硬盘存储空间,剩下的钱可以用来支付每月的生活费用。
在你们国家,MacBook M1/M1 Pro/M1 Max 系列的平均工资是多少?
3.我无法从增加的马力中获益
在这里或那里节省几分钟是有益的,当然,但对我所做的事情不是强制性的。我的 M1 MacBook Pro 从第一天起就没有出现过任何问题——而且它只有 8 GB 的内存。我用锐龙 7 和 16 GB 的内存让 Windows 机器发疯。就马力而言,这不是一个公平的比较,但它们的价格大致相同。
我认为使用 Windows/Linux 机器的唯一好处是有更多可用的 Python 库和 CUDA 支持,前提是你有 NVIDIA GPU。我不知道 TensorFlow 在新的 MacBook 系列上的运行速度有多快,但我认为它绝对会令人惊叹。
简而言之,作为一名数据科学家,我想要的是一台轻薄便携的机器,能够做任何你扔给它的事情(在合理的范围内),具有惊人的屏幕和电池寿命。2020 年的 M1 MacBook Pro,甚至 Air,都完全符合这个描述。
我知道这些新机器是为专业人士设计的,或者至少是苹果认为的专业用户。如果你像我一样,使用 GPU 在远程机器上进行大量深度学习,并使用笔记本电脑连接到那台机器,那么你不属于专业类别。这完全没问题。
我现在的设置在一年前被认为是开创性的,那么今天它能有多糟糕呢?
我在等 M2,原因如下
不要误会我的意思——我喜欢迷你 LED 屏幕技术、120Hz 刷新率、增加的端口、多显示器输出,以及新 MacBook 系列所提供的一切。但对我来说,这还不足以改变现状。没有办法证明这个价格是合理的,因为我已经有了一台性能非常好的机器。如果我有任何基于英特尔的 MacBook,那将是一个完全不同的故事。
那么,未来会带来什么?
没人知道,但这是我的预测。明年的 M2 MacBook 将取代目前常规的 M1 MacBook Air 和 Pro 机型。一年前这些机器的大卖点是 1000 美元/1300 美元的起价,我认为苹果不会改变太多,如果有的话。
我认为 M2 将带来 M1 Pro/Max 提供的大部分+重新设计的小部分成本。我可能完全错了,但只有时间会证明一切。
作为数据专业人士,你对新 MacBook 阵容有什么想法?您订购了吗?如果订购了,您是从哪台机器升级的?作为一名数据科学家,你能从额外的马力中获益吗?请在下面的评论区告诉我。
喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。
https://medium.com/@radecicdario/membership
保持联系
数据科学中的三大统计悖论
入门
观察偏差和亚组差异产生统计悖论。
悖论与我们的期望相矛盾。在 Unsplash 上由 Greg & Lois Nunes 拍摄的照片。
在任何数据科学应用中,观察偏差和亚组差异很容易产生统计悖论。因此,忽视这些因素会完全破坏我们的分析结论。
观察到诸如子组 趋势在汇总数据中被完全还原的惊人现象确实并不罕见。在这篇文章中,我们看看在数据科学中遇到的 3 种最常见的统计悖论。
1。伯克森悖论
第一个引人注目的例子是观察到的新冠肺炎严重程度与吸烟之间的负关联(例如,参见文泽尔 2020 的欧盟委员会审查)。吸烟是众所周知的呼吸系统疾病的危险因素,那么我们如何解释这个矛盾呢?
最近发表在《自然》杂志上的 Griffith 2020 的工作表明,这可能是对撞机偏差的一个例子,也称为伯克森悖论和。为了理解这个悖论,让我们考虑下面的图形模型,其中我们包括第三个随机变量:“住院”。
伯克森悖论:“住院”对于“吸烟”和“新冠肺炎严重程度”都是一个对撞机变量。(图片由作者提供)
这第三个变量“住院”是前两个的https://en.wikipedia.org/wiki/Collider_(statistics)对撞机。这意味着吸烟和患有严重的新冠肺炎都会增加生病住院的几率。当我们在对撞机上设定条件时,也就是说,当我们只观察住院病人的数据而不是考虑整个人群时,伯克森悖论就出现了。
让我们考虑下面的数据集示例。在左图中,我们有来自整个人群的观察结果,而在右图中,我们只考虑住院患者的子集(即,我们以碰撞变量为条件)。
伯克森悖论:如果我们以对撞机“住院”为条件,我们会观察到吸烟和新冠肺炎的关系发生逆转!(图片由作者提供)
在左图中,我们可以观察到新冠肺炎严重程度与吸烟之间的正相关,正如我们所料,因为我们知道吸烟是呼吸系统疾病的一个风险因素。
但是在右图中——我们只考虑住院患者——我们看到了相反的趋势!要理解这一点,请考虑以下几点。
- 患有严重的新冠肺炎会增加住院的机会。特别是,如果严重程度> 1,则需要住院治疗。
- 每天吸几支烟是多种疾病(心脏病、癌症、糖尿病)的主要风险因素,这些疾病会增加因某种原因住院的机会。
- 因此,如果一个医院的病人有较低的新冠肺炎** 严重程度,他们有较高的机会吸烟!事实上,他们必须患有不同于新冠肺炎的某种疾病(如心脏病、癌症、糖尿病)才能住院,而这种疾病很可能是由他们吸烟引起的。**
这个例子与 Berkson 1946 的原始工作非常相似,其中作者注意到住院患者的胆囊炎和糖尿病之间呈负相关,尽管糖尿病是胆囊炎的一个危险因素。
2。潜在变量
一个 潜变量 的存在也可能在两个变量之间产生一种明显的反向相关性。虽然伯克森悖论的出现是因为对碰撞变量的调节(因此应该避免),但这另一种悖论可以通过对潜在变量的调节来解决。
例如,让我们考虑一下被派去灭火的消防队员的人数和在火灾中受伤的人数之间的关系。我们预计更多的消防员将会改善结果(在某种程度上——参见布鲁克斯定律),然而在汇总数据中观察到正相关:部署的消防员越多,受伤人数就越多!
为了理解这个悖论,让我们考虑下面的图形模型。关键是再次考虑第三个随机变量:“火灾严重程度”。
****潜在变量悖论:“火灾严重程度”是“部署消防员人数”和“受伤人数”的潜在变量。(图片由作者提供)
这第三个潜在变量与其他两个正相关。的确,越多的严重火灾越容易造成更多的伤害,同时它们需要更多的消防员去扑灭。
让我们考虑下面的数据集示例。在左图中,我们汇总了各种火灾的观察结果,而在右图中,我们仅考虑了与三种固定火灾严重程度相对应的观察结果(即,我们根据潜在变量来调整观察结果)。
****潜在变量:如果我们以潜在变量“火灾严重程度”为条件,我们观察到部署的消防员数量和受伤人数之间的关系出现逆转!(图片由作者提供)
在右图中,我们对火灾严重程度进行了条件观察,我们可以看到我们预期的负相关。
- 对于给定严重程度的火灾,我们确实可以观察到部署的消防员越多,受伤的人就越少。
- 如果我们观察更严重的火灾,我们会观察到相同的趋势,尽管部署的消防员数量和受伤人数都更高。****
3.辛普森悖论
辛普森悖论 是在子群体中一致观察到的趋势,但如果子群体合并,趋势就会反转时出现的令人惊讶的现象。这通常与数据子组中的类不平衡有关。****
这个悖论的一个臭名昭著的例子来自比克尔 1975 年的报告,在那里,加州大学 weer 的录取率被分析以寻找性别歧视的证据,两个明显矛盾的事实被揭露出来。
- 一方面,在各个部门,他观察到女性申请者比男性申请者的录取率高。****
- 另一方面,汇总 数字显示女性申请者的录取率低于男性申请者。
为了了解这是如何实现的,让我们考虑下面的数据集,它包含两个部门:部门 A 和部门 b。
- 在 100 名男性申请人中:80 人申请 A 部,68 人被录取(85%),20 人申请 B 部,12 人被录取(60%)。
- 在 100 名女性申请人中:30 人申请 A 部,28 人被接受(93%),70 人申请 B 部,46 人被接受(66%)。
辛普森悖论:女性申请者更容易被各个部门录取,但整体女性录取率不如男性!(图片由作者提供)
这个悖论由下面的不等式表示。
辛普森悖论:表面矛盾背后的不平等。(图片由作者提供)
我们现在可以理解我们看似矛盾的观察的起源了。重点是这两个部门(A 部门:80-30,B 部门:20-70)的申请人性别都存在明显的阶层失衡。事实上,大部分女生申请了竞争更激烈的 B 系(录取率较低),而****大部分男生申请了竞争不激烈的 A 系(录取率较高)。这导致了我们矛盾的观察结果。********
结论
潜变量、对撞机变量、类不平衡在很多数据科学应用中很容易产生统计悖论。因此,特别关注这些关键点对于正确得出趋势和分析结果至关重要。****
帮助您开展数据科学活动的三大可视化 Python 包
使用这些包来帮助您的数据科学工作
Firmbee.com在 Unsplash 上拍照
数据可视化是将数据汇总成图形表示以帮助人们理解数据的过程。想象一下没有数据可视化的数据探索或验证?很难,对吧?。此外,数据可视化可能揭示我们在统计摘要中找不到的额外信息。
数据可视化也有助于数据科学家的工作,例如,理解我们的数据、特征选择和验证我们的机器学习模型。为了进一步帮助您的工作,我想概述我的三个顶级可视化 python 包,以帮助您的数据科学活动。让我们开始吧。
1.AutoViz
AutoViz 是 AutoViML 包库下的一个开源可视化包,旨在自动化许多数据科学家的工作。许多项目快速而直接,但无疑是有帮助的,包括 AutoViz。
AutoViz 是一个单行代码可视化包,可以自动生成数据可视化。让我们尝试这个包来展示为什么 AutoViz 可以帮助您的工作。首先,我们需要安装 AutoViz。
pip install autoviz
安装完软件包后,让我们使用一个样本数据集。在本文中,我将使用来自 Kaggle 的纽约房地产销售数据集。
df = pd.read_csv('nyc-rolling-sales.csv')
使用 AutoViz,我们只需要从包中导入一个类函数,并执行一行代码来自动生成可视化。
#Importing the class function
from autoviz.AutoViz_Class import AutoViz_Class
AV = AutoViz_Class()#Automatically produce dataset
AV.AutoViz("",dfte = df )
作者 GIF
从上面的 GIF 中我们可以看到,AutoViz 包基于我们的数据集自动生成了许多可视化效果。可视化简单;然而,执行时间很快,并且该图有助于特征选择的初始分析。让我们详细看看 AutoViz 生产了什么。
作者图片
AutoViz 的第一步是将要素分类为特定的数据类型,并使用这些信息来决定使用哪种可视化来表示数据。从这里,让我们来看看一些生产的情节快照。
来自 AutoViz 的成对散点图(图片由作者提供)
分布图来自 AutoViz(图片由作者提供)
违反 AutoViz 的情节(图片由作者提供)
来自 AutoViz 的方框图(图片由作者提供)
这些是 AutoViz 制作的示例图。许多其他软件包自动可视化数据,但 AutoViz 有一些我觉得其他人没有的优势。可视化产生的速度有多快,结果的重量有多轻。这就是为什么我建议 AutoViz 自动可视化您的数据,特别是如果您需要对您的数据进行初步评估。
如果你想看看其他的自动可视化软件包,可以看看我下面的其他文章。
2.缺少编号
数据探索不仅限于数据集中存在的数据,还包括数据集中缺失的数据。有这样的情况,丢失的数据是由于一个意外或纯粹的机会发生的,但这通常是不正确的。缺失的数据可能会揭示出我们以前从来不知道的洞察力。如果想了解缺失数据的分类,可以看下面的文章。
推出missing no,一款专门为可视化您的丢失数据而开发的软件包。这个包提供了一个易于使用的有见地的一行代码来解释缺失数据,并显示了缺失数据之间的关系。让我们尝试一下这个包,以便更好地理解。
首先,我们需要安装 missingno 包。
pip install missingno
对于这个例子,我将使用 Kaggle 的 Mis sing migrators 项目数据集。
df = pd.read_csv('MissingMigrants-Global-2019-12-31_correct.csv')
df.info()
图片来自作者
数据集包含大量缺失数据,每列的缺失量不同。为什么会发生这种情况?这里是否有缺失的数据模式?让我们用 missingno 来找出答案。首先,让我们将缺失的数据可视化。
missingno.bar(df, figsize=(10,5), fontsize=12, sort="ascending")
缺失数据条形图(图片由作者提供)
上面的函数生成一个条形图来显示每一列中的数据数量。正如我们所看到的,“最小估计失踪人数”的数据最多,其次是“儿童人数”、“幸存者人数”,等等。如果要计算日志中缺失数据的数量,我们可以使用下面的代码。
missingno.bar(df, log=True,figsize=(10,5), color="tab:green", fontsize=12,sort="ascending")
日志缺失数据编号(图片由作者提供)
对数可以帮助您了解每一列中缺失数据的百分比。我们可以看到,‘最小估计缺失数’一栏只占目前全部数据的不到 10%,其余都是缺失的。
缺失的数据可能有一种模式,无论是因为另一列的存在、及时的方式,还是纯粹的偶然。为了可视化这个缺失数据模式,让我们尝试使用矩阵图来可视化数据集中缺失数据的位置。
missingno.matrix(df,figsize=(10,5), fontsize=12)
缺失数据矩阵(图片由作者提供)
为了给出一个背景,我们的移民失踪项目数据集按时间(从 2014 年到 2019 年)从最近到最早排序。最上面的数据位置是最近的(2019),最下面的数据位置是最早的(2014)。
如果我们看上面的图表,“URL”缺失数据似乎更多地出现在更早的时间,类似于“男性数量”。它不同于最近越来越多地丢失数据的“迁移路线”列。上面的图表可以让我们更好地了解我们的数据集中发生了什么。
使用 missingno,我们可以可视化零相关性(范围-1 到 1)来测量要素之间的缺失数据关系。让我们试一试。
missingno.heatmap(df, figsize=(10,5), fontsize=12)
无效相关热图(图片由作者提供)
零相关性为我们提供了丢失数据的列之间的关系。分数越接近-1,意味着一列的数据存在,另一列的数据将会丢失。相反,当它接近 1 时,当其他列数据存在时,该数据也存在。0 表示特征之间没有相关性。
为了更深入地理解特征之间的缺失数据关系,我们可以使用 missingno 来构建基于分层聚类算法和零相关性的树状图。
missingno.dendrogram(df, figsize=(10,5), fontsize=12)
缺失数据树状图(图片由作者提供)
为了解释上面的树状图,我们将从自上而下的角度来看。显示以最近距离链接在一起的要素或聚类,以预测彼此缺失的数据或更好地呈现数据。例如,要素“幸存者人数”和“最小估计失踪人数”比其他要素更早聚类在一起,这意味着它们比其他要素更好地预测彼此。
以零距离链接在一起的聚类要素意味着它们可以完全预测彼此(一个缺失,另一个存在,或者两者都总是缺失/存在)。不在零处分裂的叶聚类意味着它们可以预测彼此,但是可能是不完美的(越接近零,它们越能预测彼此缺失的数据/存在的数据)。
3.黄砖
当你探索了数据,发现了有见地的模式,就该开发机器学习模型了。为了帮助您的机器学习开发和评估,我们有一个名为 Yellowbrick 的 python 包来可视化机器学习模型过程。
Yellowbrick 是一个开源包,可以可视化并作为构建在 Scikit-Learn 之上的诊断工具。Yellowbrick 的开发是为了使用从 Scikit-Learn API 扩展而来的各种可视化 API 来帮助模型选择过程。
在开发我们的机器学习模型时,让我们尝试一些 Yellowbricks 的可视化 API。在这个例子中,我将使用来自 Kaggle 的客户分析数据集。首先,让我们尝试创建一个分类器模型,并使用 Yellowbricks 来可视化分类报告。
from yellowbrick.classifier import ClassificationReport
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split#Reading the data and dropping some data
df = pd.read_csv('marketing_campaign.csv', sep = '\t')
df = df.drop(['ID', 'Dt_Customer', 'Education', 'Marital_Status'], axis = 1).dropna().reset_index(drop = True)X_train, X_test, y_train, y_test = train_test_split(df.drop('Response', axis = 1), df['Response'])model = LogisticRegression()
visualizer = ClassificationReport(model)visualizer.fit(X_train, y_train)
visualizer.score(X_test, y_test)
visualizer.show()
逻辑回归分类报告自
我们从 Scikit-Learn 开发了逻辑回归模型,并从上面的函数可视化了分类报告指标。我们可以看到,与类 0 相比,我们的模型在类 1 中的得分较低。
为了评估我们的预测模型,让我们看看 ROC-AUC 指标的可视化。
from yellowbrick.classifier import ROCAUCvisualizer = ROCAUC(model)
visualizer.fit(X_train, y_train)
visualizer.score(X_test, y_test)
visualizer.show()
Yellowbrick 的 ROC-AUC 曲线(图片由作者提供)
ROC-AUC 似乎还不错。然而,我们已经有了以前的度量结果,它表明预测偏向于一个类。如果我们稍微研究一下数据,也许会更好。我们来查一下阶级不平衡;上述情况经常发生是因为不平衡的问题。
from yellowbrick.target import class_balanceclass_balance(df['Response'])
来自 Yellowbricks 的班级平衡(图片由作者提供)
有一个不平衡的问题,即 0 类人数超过 1 类。让我们也来看看特征相关性;这可能有助于预测。
from yellowbrick.features import Rank2Dvisualizer = Rank2D(algorithm="pearson")
visualizer.fit_transform(df)
visualizer.show()
来自 Yellowbricks 的皮尔逊相关性(图片由作者提供)
从上图中我们可以看出,目标(“响应”)与独立特征之间没有很强的皮尔逊相关性。也许我们可以尝试根据机器学习模型删除一些不重要的功能?让我们使用递归特征消除(RFE)进行特征选择。值得注意的是,RFE 是一种使用机器学习模型系数或分数的特征选择方法,通过移除最弱的特征,直到达到指定数量的特征。
from yellowbrick.model_selection import RFECVvisualizer = RFECV(model)visualizer.fit(df.drop('Response', axis = 1), df['Response'])
visualizer.show()
《黄砖》中的 RFE(图片由作者提供)
看起来我们应该使用的最佳特征数是 14 个。让我们看看从 RFE 方法中选择了哪些特征。
df.drop('Response', axis = 1).columns[visualizer.support_]
作者图片
看起来这些功能主要与购买、收入和客户的家属有关。我们可以尝试的最后一项技术是基于分类模型可视化交叉验证分数。
from sklearn.model_selection import StratifiedKFold
from yellowbrick.model_selection import CVScores
cv = StratifiedKFold(n_splits=9)visualizer = CVScores(model, cv=cv, scoring='f1_weighted')
visualizer.fit(df.drop('Response', axis = 1), df['Response'])
visualizer.show()
从 Yellowbricks 评分的交叉验证(图片由作者提供)
平均而言,我们的 F1 模型在 9 次迭代后的得分为 0.817。然而,你知道它受到不平衡等级的影响。
总的来说,Yellowbrick 中仍然有许多 API,您可以尝试帮助选择您的机器学习模型。如果你对这些功能感兴趣,请参考他们的文档这里。
结论
可视化是一个有助于数据科学工作的过程。如果没有数据可视化,我们的工作会变得更加困难。在本文中,我概述了三个可视化 Python 包,它们将有助于您的数据科学工作;它们是:
- AutoViz
- 缺少编号
- 黄砖
希望有帮助!
如果您喜欢我的内容,并希望获得更多关于数据或数据科学家日常生活的深入知识,请考虑在此订阅我的 简讯。
如果您没有订阅为中等会员,请考虑通过 我的推荐 订阅。
您应该关注的 4 大数据科学播客
作为一名数据科学家,敬请关注
如果你想有一个成功的职业生涯,跟上数据科学的最新进展是至关重要的。有不同的方法让自己保持最新,无论是参加会议,在 Twitter 上关注数据科学领袖,阅读博客和研究论文,还是在 YouTube 上关注数据科学频道。帮助我坚持下去的一个方法是听数据科学播客。当我在健身房、徒步旅行或在车里时,我发现自己在收听。在这篇文章中,我将列出我听得最多的 4 个播客,我强烈建议你亲自去看看。在我开始之前,我想提醒你看看我上周的文章,我在文章中谈到了我关注的 5 个 YouTubers,它们帮助我打入了这个行业。查看下面的链接:
</5-youtubers-that-helped-me-break-into-data-science-3bff12fc6b7f>
1.)走向数据科学
“走向数据科学”播客是我的首要任务。我真的很喜欢这个节目的主持人杰瑞米·哈里斯。他的嘉宾都很优秀,你真的能从剧集中学到很多。我非常喜欢 Jeremie 的一个事实是,他在节目中间解释了一些很多人不熟悉的术语或概念,这样你就可以更容易地跟上讨论。除此之外,你还可以在 YouTube 上观看剧集。Jeremie 是 SharpestMinds 的联合创始人,他绝对让我迷上了播客。我最喜欢的剧集是他讨论人工智能伦理的地方。点击下面的链接,你可以在 YouTube 上看到最新的一集,自己去看看吧。
除此之外,我还提供了苹果播客链接,所以你可以看看所有不同剧集的主题。
https://podcasts.apple.com/us/podcast/towards-data-science/id1470952338
2.)IBM 让数据变得简单
第二,在我的列表中有一个名为 IBM 制作简单数据的播客。主持人 Al Martin 目前是 IBM 专家实验室开发服务、云和认知软件的全球副总裁。在此之前,他是 IBM 的数据和人工智能开发副总裁。Al 在他的节目中讨论了关于大数据和人工智能的最新想法,他非常博学。我真的很喜欢艾尔,因为他真的会深入挖掘,从他向客人提出的问题中获得正确的信息。如果你感兴趣,请查看下面的链接,了解更多关于播客的信息。
https://podcasts.apple.com/us/podcast/making-data-simple/id605818735
3.)数据怀疑论者
另一个播客,我强烈建议你们去看看,叫做数据怀疑论。这是一个每周一次的播客,涵盖了数据科学,统计学,机器学习和人工智能的各种主题。这个节目的主持人是 Kyle Polich,他非常博学。他在提出正确的问题方面做得很好,在简单解释概念方面也做得很好。我也喜欢他节目中讨论的各种话题。如果你有兴趣了解他的播客,请点击下面的链接。
4.)TWIML AI 播客
TWIML AI 播客始于 2016 年,目前已是该领域的重要参与者之一。主持人山姆·查林顿(Sam Charrington)是机器学习和人工智能的商业和消费者应用专家。除此之外,他还专注于将人工智能产品推向市场。这也是一个每周播客,大部分剧集都是关于机器学习和人工智能的。这个播客已经有很长时间了,已经发布了 500+集。除此之外,它有一个很大的社区,所以我绝对推荐你去看看。像《走向数据科学》播客一样,你也可以选择在 YouTube 上观看剧集。
最后的话:
当我开始听数据科学播客时,我只知道走向数据科学播客。感谢我的同事,我被介绍到许多不同的节目,我不得不说,我上面列出的 4 个绝对是我学到最多的。主持人起了很大的作用,他们每个人都以自己的方式表现得很好,让人们享受不时切换节目的乐趣。我尽量每周至少收听一次。这真的帮助我跟上了这个领域的最新发展,你肯定学到了很多。正如我在本文开始时提到的,有各种各样的方法让自己保持更新。听上面提到的播客绝对是你不会错的一种方式。
如果你喜欢这篇文章,如果你能在任何社交媒体平台上分享它,我将非常感激。如果你听了我没有列出的任何其他数据科学播客,请随意在评论区写下它们。我喜欢被介绍给不同的播客。直到下一个 time️ ✌️
2021 年及以后的 4 大 Python 和数据科学 ide
功能与简单性—以下是日常数据科学工作流的首选
数据科学 IDEs 的世界可能会让人不知所措。你可以从简单到极致的纯文本编辑器到功能丰富到让你眼花缭乱的 ide。如果你愿意为一个编码软件付费,分析瘫痪会变得更糟。
你想要简单又实用的东西。你想要一些专业和功能丰富的东西,但不要让人不知所措。有印象吗?这可能不是一次性的决定。
简而言之,没有放之四海而皆准的解决方案。这是个人喜好。我有我的,但在比较这四个时,我会尽量保持公正。
JupyterLab
是的——这是数据科学家中最受欢迎的 IDE。Jupyter 笔记本使交互性成为可能,Jupyter 实验室将用户体验提升到了一个新的水平。这是一个极简的 IDE,它提供了开箱即用的基本功能,并为更高级的使用提供了选项和技巧。
图片 1 — JupyterLab(图片由作者提供)
JupyterLab 使创建包含代码和解释的丰富的笔记本变得容易。我不知道你是怎么想的,但是我不太喜欢厚重而不可读的代码块。Jupyter 允许你写 Markdown 来解释你的思考过程。这意味着你可以添加图片、网址和任何你能想到的东西。
如果降价对你来说还不够,你猜怎么着?也可以写 HTML 和 CSS。这些允许你像一个网站一样设计笔记本——有明显的限制。
IDE 非常强大,你可以为其他编程语言安装内核——比如 Java 、 C++ 或者 Scala 。您还可以安装大量的扩展来设计风格或添加功能。
优点 :免费,易于安装,大量可安装插件,极简界面,具有云协作选项。
缺点 :可怕的编码辅助,tab-autocomplete 慢,编辑 *.py*
文件简直是噩梦。
Visual Studio 代码
你想要最好的免费多面手吗?选择这一个。Visual Studio 代码非常通用。
想写笔记本?检查。
编辑 Python 文件?咄。
配置 Docker 容器?当然可以。
连接远程服务器?当然。
用 Git 进行版本控制?为您提供保障。
图片 2 — Visual Studio 代码(图片由作者提供)
它基本上是一个由微软开发的文本编辑器,但它比你的普通文本编辑器做得更多。你可以为任何东西安装插件。编码帮助非常有效。总的来说,这是一个容易推荐的产品。
你仍然可以用 JupyterLab 做任何你能做的事情,再加上其他事情。这些包括编辑 Python(或任何编程语言)文件,使用内置终端来管理环境和运行文件,用大量主题中的一个来设计编辑器,等等。
打开和编辑.ipynb
文件的能力是新的,在开始时并不是最好的。幸运的是,这种情况已经改变了。
这个你不会错的。最棒的是,它完全免费。
优点 :免费、轻量级、易于管理整个数据科学项目生命周期、高度可定制。
缺点 :有时候会觉得有点迟滞。
皮查姆
拥有一个像 VSCode 这样的防弹解决方案是非常好的,但是有时您需要一个专门的解决方案。PyCharm 是专门为 Python 构建的 IDE。正如你所想象的,这意味着它是功能最丰富的。
图片 3 — PyCharm Professional(图片由作者提供)
PyCharm 给你更专业的体验。这不容易描述,但是使用几分钟后你就会明白我在说什么了。编码帮助是极好的,调试器工作起来很有魅力,环境管理非常简单。
也就是说,一个主要的缺点是免费版本缺乏功能。最大的缺失功能是编辑.ipynb
文件,这是数据科学工作流程中必不可少的。该功能仅在专业版中可用,每年将花费您大约 90 美元。
我认为这是 Python 开发人员的最佳选择,而不是数据科学家。我主要在将代码从笔记本转移到 Python 文件时使用它。
优点 :感觉专业,惊人的编码辅助,轻松管理 Python 版本和环境。
缺点 :免费版缺乏对 *.ipynb*
文件的支持。编辑 HTML 和 CSS 文件也是一个难题,所以如果你经常使用 Flask,请记住这一点。
数据佩尔
这个是新来的。这是专门为数据科学家开发的 IDE。截至 2021 年 9 月,它仍处于预览版本,但你可以在这里注册。
图片 4 — DataSpell(图片由作者提供)
它与 PyCharm 由同一家公司开发,因此 JetBrains 粉丝会觉得和看起来很熟悉。IDE 包含了基本的数据科学特性,比如笔记本、Markdown、交互式 shell 和 SQL 支持。
你可以在这里阅读我的完整概述:
笔记本电脑的体验非常棒,但是它比 PyCharm 更有优势。它可能不会提供免费版本。你现在可以在预览模式下使用它,但是谁知道一旦正式发布会发生什么。
优点 :超级专用于数据科学,笔记本集成非常出色,可以轻松连接到任何数据库。
缺点 :可能不会免费提供——没有像 PyCharm 那样的社区版本。
你最喜欢的数据科学 IDE 是什么?请在下面的评论中告诉我。
喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。
https://medium.com/@radecicdario/membership
保持联系
构建交互式时间序列图的 4 大 Python 库
在本教程中,我们将使用 Plotly,Bokeh,Altair 和 Matplotlib 构建交互式时间序列图,并比较哪一个最好。
斯蒂芬·菲利普斯-Hostreviews.co.uk 在 Unsplash 上的照片
介绍
分析数据时遇到的最普遍的数据类型之一是时间序列。从识别趋势到理解“因果”行为,时间序列分析是理解用户行为、购买模式等等最流行的方法之一。
在 Python 中,我们通常从使用 Matplotlib 或 Seaborn 绘制简单的直线曲线开始,如果您只处理一个随时间变化的分类变量,这两种工具是完美的。但是通常你需要一起显示多个分类变量,例如市场数据的股票列表,或者销售数据的地区/位置。
在这种情况下,您可以在同一个图中显示所有系列,也可以为每个系列创建单独的图。然而,这些选项很难理解,而且会占用很多空间。
这就是 Plotly、Bokeh 和 Altair 等高级可视化库发挥作用的地方,因为它们允许您使用下拉菜单、滑块、按钮等功能创建交互式绘图和仪表板。,帮助您的用户探索复杂的数据。
在本文中,我们将探索时间序列可视化的两个交互元素
- 下拉菜单让你在同一个情节的不同系列之间切换
- 日期范围滑块允许您观察特定时间段之间的趋势
以下示例中使用的所有代码均可在这里找到。
免责声明:本文是与 Datapane 合作撰写的,我是 datapane 团队的一名社区布道者。
向线图添加下拉菜单
如果数据中有很多类别,例如股票或国家,并且您想在同一个图或图形中使用折线图来观察趋势,下拉菜单非常方便。这样可以避免在一个循环中创建多个图。
所有三个库,即 Plotly,Bokeh 和 Altair 允许你添加一个下拉菜单到图中,但每个都有其优点和缺点。
作为奖励,我还将向您展示使用 Matplotlib 或 Seaborn 实现这一点的方法,它们不支持开箱即用的交互式组件。
使用 Plotly 的下拉菜单
Plotly 提供了一系列被称为自定义控件的交互选项。这些控件最好的地方在于,它们可以完全用 pythonic 代码添加到绘图中。
来源:Plotly 文件(【https://plotly.com/python/#controls】T2)
出于本教程的目的,我们将使用 Covid 19 数据集,它可以在这里访问。
我们将创建一个图表来显示 Covid 19 在全球的分布情况,并添加一个下拉列表来更改同一图表中的国家。
buttons = []
i = 0fig3 = go.Figure()country_list = list(df['country'].unique())for country in country_list:
fig3.add_trace(
go.Scatter(
x = df['date'][df['country']==country],
y = df['confirmed'][df['country']==country],
name = country, visible = (i==0)
)
)
for country in country_list:
args = [False] * len(country_list)
args[i] = True
*#create a button object for the country we are on*
button = dict(label = country,
method = "update",
args=[{"visible": args}])
*#add the button to our list of buttons*
buttons.append(button)
*#i is an iterable used to tell our "args" list which value to set to True*
i+=1
fig3.update_layout(updatemenus=[dict(active=0,
type="dropdown",
buttons=buttons,
x = 0,
y = 1.1,
xanchor = 'left',
yanchor = 'bottom'),
])fig3.update_layout(
autosize=False,
width=1000,
height=800,)
您将有一个漂亮的下拉菜单添加到时间序列图中。
来源:https://data pane . com/u/shou mik/reports/0kz 9 za 7/drop-with-plotly/
使用散景的下拉菜单
来源:Bokeh 文档(https://docs . Bokeh . org/en/latest/docs/user _ guide/interaction/widgets . html)
散景有称为部件的组件,可用于将几个交互式组件添加到您的绘图中。小部件主要用于创建 Bokeh 服务器上的仪表板组件。你可以在这里阅读更多关于 widgets 的内容。
请记住,为了创建独立 HTML 文件的小部件,或者甚至在使用 Jupyter notebook 时,您将需要使用 CustomJS 回调。这需要一点 JavaScript 知识来让下拉菜单正常工作。如果你想用纯 pythonic 的方式来做,你必须使用 Bokeh 服务器来让小部件工作。
我们将使用散景下拉来复制与上面相同的用例。
cols1=df.loc[:, ['country','date', 'confirmed']]
cols2 = cols1[cols1['country'] == 'Afghanistan' ]Overall = ColumnDataSource(data=cols1)
Curr=ColumnDataSource(data=cols2)*#plot and the menu is linked with each other by this callback function*callback = CustomJS(args=dict(source=Overall, sc=Curr), code="""
var f = cb_obj.value
sc.data['date']=[]
sc.data['confirmed']=[]
for(var i = 0; i <= source.get_length(); i++){
if (source.data['country'][i] == f){
sc.data['date'].push(source.data['date'][i])
sc.data['confirmed'].push(source.data['confirmed'][i])
}
}
sc.change.emit();
""")menu = Select(options=country_list,value='Afghanistan', title = 'Country') *# drop down menu*bokeh_p=figure(x_axis_label ='date', y_axis_label = 'confirmed', y_axis_type="linear",x_axis_type="datetime") *#creating figure object*bokeh_p.line(x='date', y='confirmed', color='green', source=Curr)
*# plotting the data using glyph circle*menu.js_on_change('value', callback) *# calling the function on change of selection*layout=column(menu, bokeh_p) *# creating the layout*
show(layout)
这是剧情的样子-
来源:作者创作
使用 Altair 的下拉菜单
来源:Altair 文档(https://Altair-viz . github . io/gallery/multiple _ interactions . html)
在用纯 pythonic 方式构建可视化方面,Altair 类似于 Plotly。虽然 Altair 提供了许多交互式组件,但要以用户友好的布局来排列这些组件有点困难。你可以在这里阅读更多关于 Altair 交互组件的信息。
我们现在将使用 Altair 创建相同的绘图,并向绘图添加一个下拉菜单。
input_dropdown = alt.binding_select(options=country_list)
selection = alt.selection_single(fields=['country'], bind=input_dropdown, name='Country')alt_plot = alt.Chart(df).mark_line().encode(
x='date',
y='confirmed',
tooltip='confirmed'
).add_selection(
selection
).transform_filter(
selection
)alt_plot
这是剧情的样子-
来源:https://data pane . com/u/shou mik/reports/dkjVxgk/drop down-with-Altair/
使用 Matplotlib 和 Datapane 的下拉菜单
如果您想使用像 Matplotlib 或 Seaborn 这样的非交互式库,您可以使用 Datapane 添加交互性,data pane 是一个用于创建和托管数据报告的库。Datapane 提供了一些高级布局模块,如 dp。选择,让你模仿交互过滤能力,像这样:
plot_list = []plt.figure(figsize=(10, 5), dpi=300)for country in country_list:
plot = dp.Plot(df[df['country']==country].plot.scatter(x='date', y='confirmed'), label=country)
plot_list.append(plot)report = dp.Report(
dp.Text('''## Dropdown using Datapane'''),
dp.Select(blocks = plot_list)
)report.preview()
这就是它看起来的样子-
来源:https://data pane . com/u/shou mik/reports/r 70 pzg 7/drop down-with-data pane/
请注意,您目前不能使用 Datapane 将日期范围滑块添加到您的图中。如果你是 Datapane 的新手,你可以在这里阅读更多关于不同块的内容。
向折线图添加日期范围滑块
来源:Plotly 文档
在处理时间序列图时,另一个非常方便的交互组件是日期范围滑块或通用滑块。
由于大多数时间序列图都在 X 轴上有一个日期范围,因此滑块允许您动态更改时间段,并只查看图的一部分,以了解该特定时间段的趋势。
使用 Plotly 的日期范围滑块
Plotly 有一个通用的滑块组件,可以用来改变对应于任何轴的数据。虽然它没有针对时间序列数据的特定滑块,但通用滑块可用于创建日期范围滑块。
你可以在这里阅读更多关于滑块的内容。
为了创建一个滑块,我们将使用之前用下拉菜单创建的相同的 timeseries 绘图,并在绘图下面添加一个滑块组件。
buttons = []
i = 0fig3 = go.Figure()country_list = list(df['country'].unique())for country in country_list:
fig3.add_trace(
go.Scatter(
x = df['date'][df['country']==country],
y = df['confirmed'][df['country']==country],
name = country, visible = (i==0)
)
)
for country in country_list:
args = [False] * len(country_list)
args[i] = True
*#create a button object for the country we are on*
button = dict(label = country,
method = "update",
args=[{"visible": args}])
*#add the button to our list of buttons*
buttons.append(button)
*#i is an iterable used to tell our "args" list which value to set to True*
i+=1
fig3.update_layout(updatemenus=[dict(active=0,
type="dropdown",
buttons=buttons,
x = 0,
y = 1.1,
xanchor = 'left',
yanchor = 'bottom'),
])fig3.update_layout(
autosize=False,
width=1000,
height=800,)
这会给你这样的东西-
来源:https://data pane . com/u/shou mik/reports/43 gpbv 7/drop-and-slider-with-plotly/
使用散景的日期范围滑块
与 Dropdown 小部件类似,Bokeh 也有一个日期范围滑块小部件,专门用于处理时间序列数据。这个小部件不同于一般的范围滑块小部件。为了让这个小部件工作,需要一个 CustomJS 回调。
cols1=df.loc[:, ['country','date', 'confirmed']]
cols2 = cols1[cols1['country'] == 'Afghanistan' ]Overall = ColumnDataSource(data=cols1)
Curr=ColumnDataSource(data=cols2)*#plot and the menu is linked with each other by this callback function*
callback = CustomJS(args=dict(source=Overall, sc=Curr), code="""
var f = cb_obj.value
sc.data['date']=[]
sc.data['confirmed']=[]
for(var i = 0; i <= source.get_length(); i++){
if (source.data['country'][i] == f){
sc.data['date'].push(source.data['date'][i])
sc.data['confirmed'].push(source.data['confirmed'][i])
}
}
sc.change.emit();
""")menu = Select(options=country_list,value='Afghanistan', title = 'Country') *# drop down menu*
bokeh_p=figure(x_axis_label ='date', y_axis_label = 'confirmed', y_axis_type="linear",x_axis_type="datetime") *#creating figure object*
bokeh_p.line(x='date', y='confirmed', color='green', source=Curr) *# plotting the data using glyph circle*
menu.js_on_change('value', callback) *# calling the function on change of selection*date_range_slider = DateRangeSlider(value=(min(df['date']), max(df['date'])),
start=min(df['date']), end=max(df['date']))date_range_slider.js_link("value", bokeh_p.x_range, "start", attr_selector=0)
date_range_slider.js_link("value", bokeh_p.x_range, "end", attr_selector=1)layout = column(menu, date_range_slider, bokeh_p)
show(layout) *# displaying the layout*
这就是它看起来的样子-
来源:作者创作
使用 Altair 的日期范围滑块
与 Plotly 类似,Altair 可以将通用滑块用作日期范围滑块。但是,请记住,Vega 以毫秒为单位考虑时间序列数据,很难在滑块中显示日期信息。如果你有每年的数据,它可以工作,但是如果数据被分解成几天和几个月,就很难工作了。
input_dropdown = alt.binding_select(options=country_list)
selection = alt.selection_single(fields=['country'], bind=input_dropdown, name='Country')def **timestamp**(t):
return pd.to_datetime(t).timestamp() * 1000slider = alt.binding_range(
step=30 * 24 * 60 * 60 * 1000, *# 30 days in milliseconds*
min=timestamp(min(df['date'])),
max=timestamp(max(df['date'])))select_date = alt.selection_single(
fields=['date'],
bind=slider,
init={'date': timestamp(min(df['date']))},
name='slider')alt_plot = alt.Chart(df).mark_line().encode(
x='date',
y='confirmed',
tooltip='confirmed'
).add_selection(
selection
).transform_filter(
selection
).add_selection(select_date).transform_filter(
"(year(datum.date) == year(slider.date[0])) && "
"(month(datum.date) == month(slider.date[0]))"
)alt_plot
这就是它看起来的样子-
来源:https://data pane . com/u/shou mik/reports/VkGyaV3/drop-and-slider-with-Altair/
裁决
现在已经使用了所有三个库,我们可以对它们进行比较,并分享我们对哪一个是创建交互式可视化的最佳 python 库的看法。
Plotly
优点-
- 易于使用,并与 Python 无缝协作。
- 布局可以根据要求设计,以确保菜单出现在绘图的正确区域。
- 易于查看和嵌入 Plotly 情节。
缺点-
- 不提供许多交互式组件。
- 有一个陡峭的学习曲线来使交互组件工作。
散景
优点-
- 用散景创建的情节和交互部件看起来很有美感。
- 因为散景更倾向于创建仪表板,所以使用多个组件创建布局更容易。
- 一些交互式部件可以添加到绘图中。
缺点-
- 为了让小部件工作,您需要了解一点 JavaScript,以便能够创建 CustomJS 回调。
- 在创建这些 JavaScript 回调函数时,缺乏适当的文档和示例代码。
- 除非您使用散景服务器,否则很难嵌入这些图。
阿尔泰尔
优点-
- 与 Plotly 相比,Altair 提供了更多的交互式组件选项。
- 使用纯 Python 很容易构建交互式组件。
- 需要更少的代码行来使交互组件工作。
缺点-
- 使用 Altair 很难设计和创建视觉上吸引人的布局。
- 处理时间序列数据并不简单,因为 Vega 不支持现成的时间序列数据,需要进行一些转换才能使其工作。
结论
总的来说,如果您正在开始使用 Python 进行交互式绘图,那么使用有限的交互式组件创建简单的绘图时, Plotly 可能是一个不错的选择。
但是如果你想在你的剧情中加入一些互动元素,那么 Altair 是你应该真正尝试的东西。最好的部分是你可以用 Python 代码添加几个交互组件。
如果你想构建非常复杂的交互式仪表盘,你可以使用散景。但是请记住,您将需要一些 JavaScript 知识来使它们工作。
如果您想坚持使用 Matplotlib 和 Seaborn 之类的非交互式可视化库,并且仍然想要某种形式的交互性,比如只有一个下拉菜单,那么 Datapane 可能是一个不错的选择。
我希望本教程和示例代码对您有所帮助。
请在下面的评论中分享你的想法或反馈。
来自 Kaggle 的 4 大时序特征工程经验
了解库尔孩子们在做什么
照片由 Pixaline 上 Pixabay。 除特别注明外,所有图片均为作者所有。
介绍
在 Kaggle 上,每个人都知道要赢得表格比赛,你需要超越其他工程师。几乎任何人都可以执行出色的 EDA,开发验证策略并调整超参数,以充分发挥模型的性能。
通往顶层的关键永远是特性工程,而不是在教程、书籍或课程中教授的东西。这完全是关于创造力、经验和领域知识。
随着时间成分的加入,特征工程在时间序列预测挑战中变得更加重要。参加本月(7 月) TPS 游乐场比赛的顶尖选手再次证明了这一点。
这个月有太多关于 FE 的精彩例子了。特别是,仅使用可用数据创建的气象特定要素值得特别关注。
出于这些原因,我决定写这篇文章来收集创建健壮的时序特征工程工作流的最佳实践和方法。
https://ibexorigin.medium.com/membership
获得由强大的 AI-Alpha 信号选择和总结的最佳和最新的 ML 和 AI 论文:
https://alphasignal.ai/?referrer=Bex
1.特征工程与 EDA 携手并进
有效的特征工程归结于对数据集的深入理解。
为了获得创建新特性的初步想法,您需要对现有的列执行 EDA。在时间序列中,您可以提取的最基本的特征是基于日期的。
例如,您可以提取月份号、一个月中的某一天、一周中的某一天、一天中的某一部分(小时、上午或下午)等。
这个基于日期的特性列表很长,您最初的 EDA 应该有助于缩小值得探索的特性的范围。例如,让我们看看 TPS 七月数据集的传感器记录:
从这些图中看不出多少东西。
让我们进一步细化,从时间戳中提取日期、星期和小时属性:
我们将绘制第一个传感器的新特性,并合计得出每个传感器的平均值:
这些图告诉我们,传感器 1 的值在月中、周末确实会直线下降,并且在每天的高峰时间会显著增加。特别地,第二和第三子曲线暗示传感器 1 可以测量基于移动车辆的体积而变化的物质的量。
一般来说,您想要创建的任何基于时间的要素都应该通过绘制它们来进行仔细分析,并查看它们是否发现了在创建这些要素之前不可见的新模式。
换句话说,你生成的每个特征都应该在某种程度上有助于模型的预测能力。许多教程和课程建议您创建可以从时间戳中提取的每一个可能的特征,如下所示:
如果创建以上任何一项没有意义,或者至少在绘制时揭示了基本模式,它们只会增加模型的复杂性和数据集的维度,而不是有用的。
例如,添加一年中的星期、一年中的月份和年数是没有用的,因为 TPS 数据只记录了一年。这些特征将是噪声,因为它们不足以让模型进行概括。
您也不应该限制自己只使用默认的 pandas 函数来生成特性。
例如,参与者创造的一些非常规的基于时间的特征确实有助于得分。其中包括对周末(is_weekend)或办公时间(8-19 点)录制的每个样本进行编码。
2.有一个验证策略来检查新功能的有效性
几乎总是,你需要一个更健壮的方法,而不仅仅是图来评估新特性的有效性。
对于表格数据,这通常是简单的 k 倍交叉验证。专门针对时序数据的是 Sklearn 的TimeSeriesSplit
交叉验证器。它的设计使得在每一次折叠中,您只需要根据过去的值训练一个模型,并根据未来的数据点进行测试。
在创建任何新特性之前,您需要实现这个本地验证并建立一个基础性能。例如,在初始特征上训练和评分类似随机森林的基线模型,并设置基准:
然后,当您添加一两个特性时,运行这个验证管道,看看分数是否提高了。例如,让我们看看我们创建的前 3 个功能是否能提高分数:
即使分数略有提高,你也可以保留新的特性,因为一旦你添加了许多其他相关的特性,分数的提高就会累积并变得显著。
3.基于自相关创建滞后要素
时间序列数据具有季节性、趋势和周期等核心成分。
例如,冰淇淋销售通常具有年度季节性——你可以根据今年的销售情况合理地预测下一个夏天的销售情况。类似地,温度或空气质量测量也有每日或每年的季节性。
将这些信息编码为特征可以帮助模型在数据中发现新的学习模式。由于所有的时间序列都有不同的周期或季节性,剩下的唯一问题是,“你需要回顾多少个时期,才能得到对未来数据点的稳健估计?”
如果你一直在阅读我的最新帖子,你已经知道自相关图回答了这个问题。例如,让我们绘制 TPS 数据中温度的自相关图:
从这篇帖子中了解更多关于自相关和 ACF 图的信息。
如您所见,ACF 图显示了当前温度与其 12 小时或 24 小时滞后版本之间的强自相关性(记录了一天中每小时的 TPS 数据)。
这意味着您可以将温度的滞后 12 或滞后 24 添加到数据集:
这些特征被称为滞后特征,因为我们将数据点转移到未来。
通过对所有变量重复此过程,您可以提取许多相关的新要素-通过自相关找出季节性,并将此信息编码为新要素。
4.创建特定于领域的功能
真正区分有经验的数据专家和没有经验的数据专家的是领域知识。
今天,每个人都可以自学技术技能。相比之下,强大的领域知识只有在单一行业工作很长一段时间才能获得。
然而,每场 Kaggle 比赛都涉及完全不同行业的数据集,ka ggler 在没有领域知识的情况下仍能获得令人印象深刻的结果。那么,秘诀是什么呢?
答案很简单——你需要愿意付出额外的努力。您应该对每个功能进行额外的研究,并找出数据集描述中未提供的特定于领域的信息。
例如,7 月份 TPS 的参与者使用温度、绝对湿度和相对湿度变量提出了 3 个特定于气象学的特征。这些是:
- 露点:空气必须冷却到水蒸气饱和的温度。简单来说,就是空气中的水蒸气凝结成液态水的温度。露点越高,空气中的水分就越多。
- 分压:混合气体中一种气体所施加的压力大小。
- 饱和水蒸气:绝对湿度和相对湿度的关系。
我不会用计算来打扰你,但是你可以查看这个线程来了解更多。
这些类型的功能可能是在竞争中赢得解决方案的关键,或者提高最终得分,以跨越您需要的一些重要门槛。
特定于领域的要素将与现实世界中的目标有直接关系,但这些关系在放入数据集中时可能会丢失。
作为主要素工程师,您的工作是重新发现这些关系,并使数据集的信息更加丰富,以供模型利用。
摘要
通过阅读这篇文章,你发现了我从顶级 Kagglers 那里学到的强大的时间序列特征工程技术。
正如数据科学的大部分内容一样,您已经了解到正确的 EDA 是成功的特性工程的第一步。您还学习了使用基于时间序列的交叉验证的本地验证策略来评估每个新特性的效率。
此外,您可以利用时间序列的独特属性(如季节性)来生成滞后特征。最重要的是,向您介绍了特定于领域的特性生成。
感谢您的阅读!
你可以从这个介质列表中阅读这个时间序列预测系列的所有文章。
您可能也会感兴趣…
2021 年前 5 大数据科学工作角色
意见
数据科学家不是一个…
Yoal Desurmont 在 Unsplash 上拍摄的照片
云计算的兴起加速了人工智能的采用。期望产生了,公司认为雇用数据科学家并给他们一堆数据,就足以解决公司内部的所有问题。但是,像每个开始字段一样,在正确处理值之前需要时间。对于数据科学团队来说,这没什么不同。
对我们来说,幸运的是,情况正在迅速变化。关于“数据科学”的真正含义,每年都有更多的知识和经验。此外,数据科学社区分享了一种令人难以置信的协作精神,这在该行业经历的快速发展中至关重要。
根据 Linkedin 的最新报告,数据科学和人工智能在 2021 年最受欢迎的工作中分别排名第 14 和第 15 位。
这种专业知识正在迅速地将任务转化为角色,使得每个团队成员都应该知道的必要技能更加具体。世界终于理解了,就像在任何其他结构良好的领域一样,数据科学团队需要不同类型的专家来交付伟大的成果(尽管我见过一些一体化的超级英雄,但这样的伟大不应该总是被期待)。
成功构建数据科学项目所需的各种能力将数据科学家的角色转变为一个充满有价值背景的团队。在这个动态的环境中,新的职位不断涌现,是时候解释这些职位是什么以及为什么需要它们了。
分析翻译器
将业务问题构建到真正的数据科学项目中并不是一件容易的事情。它需要一些技术知识,但也需要一定的业务理解,这是一个你不会在每个角落都找到的组合。组织通常犯的一个错误是将每个数据问题都视为机器学习问题,这对团队的士气来说非常糟糕。可以更顺利解决的问题,如定义业务规则,只是浪费数据科学团队的时间和精力。
一个好的分析翻译者可以根据机器学习计划的业务影响及其数据科学相关性,充分确定这些计划的优先级。与来自企业或管理项目的人建立关系也在意料之中。后者可以减轻数据经理的工作量,让他们有更多的时间为团队提供指导。
如何成为一个?
在沟通技巧上多下功夫,这很关键,因为你将一只脚踩在业务上,另一只脚踩在数据科学团队上:翻译是一项双向任务。像 SQL、Python 或 R 这样的技术技能也非常值得推荐。它们是必需的,因为你将面临大量的探索性分析,记住目标是决定问题是否值得。此外,了解一些机器学习的基础知识,如监督学习和非监督学习,将有助于理解问题是否适用于传统的机器学习技术。
数据工程师
除了是我的最爱之一,完全有必要揭开一个普遍假设的神秘面纱。当人们定义数据工程师时,你最有可能得到的定义是这样的:“他们支持数据科学家和数据分析师”。但那其实是误导,他们不是数据科学家的助手。他们实际做的是顺利解决很多别人难以解决的数据任务。
它们变得相关,因为不太可能找到可以直接查询来解决机器学习问题的数据库。通常,有不止一个数据源,它们需要被连接和争论以创建最终的“主表”。数据工程师创建高效的数据管道,解决复杂的数据接收,实现快速数据传输,进行云数据集成,以及解决数据管道问题,这些只是他们的部分职责。
如何成为一个?
一定要精通 Python,SQL,Spark。如果可以的话,更进一步:不要只是做一些数据争论,试着用那些框架优化一些数据管道。云知识也将非常受欢迎,因为大多数云提供商都有自己特定的 ETL 工具。相信我,熟悉他们会提升你的表现。最后,一些基于 DAG 的编排工具可能会改变您的游戏规则。气流是实现这一目的的最佳工具之一,所以要确保你能跟着它一起飞。
机器学习工程师
关于机器学习工程师的第一个想法是,他们应该有很重的数据科学和软件工程背景。尽管如此,这两个背景还不足以成为这个角色的合适人选。一件事是了解机器学习模型背后的理论,并能够编写世界上最干净的代码,但另一件完全不同的事情是有效地生产分析解决方案。
一个好的机器学习工程师掌握模型部署,确保度量监控,解决管道集成,在高层次上可视化项目,并确保部署环境的可扩展性和灵活性。这些特征非常具体,你应该明白,成为一名机器学习工程师绝对不仅仅需要连接 API 和训练模型。
如何成为一个人?
有三个主要领域你应该练习:数据科学、基础设施和软件开发。在数据科学方面,只需了解基础知识:如统计学、机器学习和 ML 框架。对于基础设施,您应该了解如何部署模型,以及如何将它们用于业务目的。此外,您可以学习如何在任何云提供商上操作模型,因为一旦得到一个,其他的将遵循相同的原则。对于软件开发来说,学习如何编写干净和可维护的代码,理解分布式系统和一些容器化可能会有用。
数据架构师
你可以认为数据架构师是数据工程师的下一步。但是这种说法伴随着一些警告,因为从开发数据管道到设计数据系统是完全不同的。数据架构师的角色是一个更全面的角色,因为它需要大量的技术知识,但也需要能够解决非常抽象的问题。
数据架构师定义如何创建新的数据集合、确保数据质量、消除数据冗余,以及为商业智能和分析工作流精心设计最佳架构。更多的高级架构师可以参与公司的云战略。影响和责任会变得巨大。
如何成为一个?
数据架构模式应该是你清单上的第一件事。每天都有新的范例(比如 data lakehouses ),所以保持你的学习路径是必要的努力。云设计也很重要,一个很好的学习方法就是取得证书。有很多架构师认证,但最相关的来自前三大云提供商。还需要对数据库有深入的了解,所以要准备好配置不同的数据结构。
软件工程师
与相反的情况相比,没有与公司系统无缝集成的机器学习模型的成功概率要小得多。这就是软件工程师出手相救的地方。如果拥有一些软件工程和数据科学背景对机器学习工程师来说还不够,这里我们可以说它非常适合。
理解机器学习模型提供的输入和输出对于软件工程师来说是一笔巨大的财富。能够将内部系统和模型之间的一切放在上下文中,将确保适当的集成。没有什么比结构良好和健壮的软件开发更能为公司提供长期价值了。
如何成为一个?
对软件工程师有很多要求,但我将只关注他们的数据科学特性。如果你已经是一名软件工程师,向数据科学团队要一个项目!他们会为拥有你而感到幸福。如果你已经知道一些 Javascript 或 Java,那么选择 Python 是完全有意义的。大多数情况下,机器学习工程师会为你提供一个 REST API,所以独立于语言,学习数据结构的基础知识更重要。
数据科学家呢?
为什么不包括数据科学家的角色?因为对于大多数人来说,第一选择是作为数据科学家开始他们的数据职业生涯已经有一段时间了。尽管这没什么错,但在匆忙做出如此重要的决定之前,你必须明白,并不是只有一个角色。
图片作者。
也许你有很棒的项目管理和沟通技巧,但没有丰富的机器学习经验。在这种情况下,过渡到分析翻译可能是最适合你的。或者,你是一个伟大的数据库专家,为什么不投身于数据工程呢?。
最后的想法
我希望大家记住的最后一条信息是,数据科学家只是众多数据角色中的一个。你应该检查一下是否有其他的角色更适合你的技能和背景。如果在看了他们每一个人之后,你决定走数据科学家的道路,那么恭喜你!你的技能一定会变得非常有价值!。
参考
[1] N. Haunke,J. Levine,P. McInerney,分析译者:新的必备角色 (2018),麦肯锡。
[2] M. Southern,LinkedIn:2021 年 15 大热门职位(2021) ,Searchenginejournal。
[3]m·阿姆布鲁斯特,A·高德西,r·辛,m·扎哈里亚,莱克豪斯:统一数据仓库和高级分析的新一代开放平台 (2020),Databricks。
再见
我真的希望这个博客能让你感兴趣。如果你喜欢就跟着我!很快会有更多内容!。
我也在 Linkedin 和 Twitter 上。我很乐意与你交谈!如果你想多读一点,看看我最近的一些帖子:
数据科学面试中你应该知道的 SQL 中的五大日期函数
关注数据科学家最重要的概念
一个优秀的 SQL 程序员应该能够以他们喜欢的任何方式操作数据——其中很大一部分是能够操作日期。日期非常重要,因为企业喜欢比较和评估不同时期的经营业绩。因此,能够操纵日期对于顶层业务操作和业务报告是至关重要的。
在本文中,我们将深入探讨 SQL 中 5 个最重要和最有用的日期函数,以及一些可以使用它们的实际商业案例。
1.日期 _TRUNC()
语法:
DATE_TRUNC(date_expression, date_part)
它是做什么的?
DATE_TRUNC()将日期缩短到指定的日期部分。
在下面的示例中,由于我们指定了 date_part = MONTH,date_trunc()将截断日期以获得该月的第一天:
DATE_TRUNC('2021-06-28', MONTH) = '2021-06-01'
再举一个例子,如果我们指定 date_part = YEAR,那么我们将得到指定日期的一年的第一天:
DATE_TRUNC('2021-06-28', YEAR) = '2021-01-01'
什么时候有用?
- 当您希望定期(如每周、每月或每年)汇总数字时,DATE_TRUNC 非常有用
- 在进行群组分析时,DATE_TRUNC 是必需的,在群组分析中,你通常按月对用户进行分组
示例
示例 1:假设您想从下表中获取每周销售额:
表格:销售额
with sales_data as (
SELECT DATE_TRUNC(date, WEEK) as week_date,
daily_sales
FROM sales
)SELECT week_date,
SUM(daily_sales) as weekly_sales
FROM sales_data
GROUP BY week_date
2.日期差异()
语法:
DATE_DIFF(date_expression_1, date_expression_2, date_part)
它是做什么的?
DATE_DIFF()比较两个日期,并返回两个日期之间日期部分的差异。
例如,如果 date_part = DAY,则 DATE_DIFF()返回两个日期之间的天数。如果 date_part = MONTH,则 DATE_DIFF()返回两个日期之间的月数。
DATE_DIFF('2021-01-02', '2021-01-01', DAY) = 1
什么时候有用?
- 当您想要比较两个日期时,DATE_DIFF()非常有用,例如,包的发货时间和包的交付时间,或者用户注册的时间和他们取消注册的时间。
- 如果您想要过滤发生在 X 个周期之前的日期(例如,5 天前、2 周前、上个月),DATE_DIFF()在 WHERE 子句中也很有用。
示例
示例 1:假设您想要获取包裹运输和递送之间的时间:
表格:订单
SELECT order_id
, DATE_DIFF(date_received, date_shipped, DAY) as shipping_time
FROM orders
示例 2:使用上面的同一个表,假设您想要获得发货时间少于 10 天的所有订单:
SELECT order_id
, amount
FROM orders
WHERE DATE_DIFF(date_received, date_shipped, DAY) < 10
3.DATE_ADD() / DATE_SUB()
语法:
DATE_ADD(date_expression, INTERVAL int64 date_part)DATE_SUB(date_expression, INTERVAL int64 date_part)
它是做什么的?
DATE_ADD()将指定数量的日期部分添加到日期中。相反,DATE_SUB 将日期减去指定数量的日期部分。
DATE_ADD('2021-01-01', INTERVAL 3 DAY) = '2021-01-04'DATE_SUB('2021-01-04', INTERVAL 3 DAY) = '2021-01-01'DATE_ADD('2021-01-01', INTERVAL 1 MONTH) = '2021-02-01'
什么时候有用?
- DATE_ADD()和 DATE_SUB()可以像 DATE_DIFF()一样在 WHERE 子句中使用,以过滤发生在 X 个时段之前或未来 X 个时段的日期
示例:
示例 1:假设您想要获得发货时间少于 10 天的所有订单:
表格:订单
SELECT order_id
, amount
FROM orders
WHERE DATE_ADD(date_shipped, INTERVAL 10 DAY) > date_received
4.提取()
语法:
EXTRACT(part FROM date_expression)
它是做什么的?
EXTRACT()返回对应于指定日期部分的值。
EXTRACT(DAY FROM '2021-01-03') = 3EXTRACT(MONTH FROM '2021-01-03') = 1EXTRACT(YEAR FROM '2021-01-03') = 2021
什么时候有用?
- 使用 EXTRACT()是获取感兴趣的日期的特定组成部分的简单方法
- 例如,如果您的公司通过周数进行报告,您可以使用 EXTRACT()来获取给定记录的给定日期的周数
- EXTRACT()允许您从日期中获取月份或年份,这可以用作机器学习模型的特征
5.当前日期()
语法:
CURRENT_DATE([time_zone])
它是做什么的?
CURRENT_DATE()返回在指定时区执行查询的当前日期。请注意,timezone 参数是可选的,不需要指定。
什么时候有用?
- 与硬编码的日期相比,使用 CURRENT_DATE()是一种更简单的引用今天日期的方法,如果是一个安排在 Airflow 上的查询或者是一个您经常使用的查询,这种方法尤其有用
示例:
示例 1:假设您想要获取上周发货的所有订单:
表格:订单
SELECT order_id
, amount
FROM orders
WHERE DATE_DIFF(CURRENT_DATE(), date_shipped, DAY) < 7
示例 2:假设您想要获取任何一年中与今天日期同月发货的所有订单:
SELECT order_id
, amount
FROM orders
WHERE EXTRACT(MONTH FROM date_shipped) = EXTRACT(MONTH FROM CURRENT_DATE())
感谢阅读!
现在,您已经了解了 SQL 中五大日期函数的工作原理,是时候测试您的知识了。我将提供两种资源:
- Leetcode 是一个网站,有数百个你可以解决的编码问题。一个叫做“温度上升”的问题是一个挑战你处理日期能力的好问题。
- w3resource 是另一个很棒的资源——在这个链接中,有 21 个问题集中在 datetime 上。
一如既往,我祝你学习一切顺利!
不确定接下来该读什么?我为你挑选了另一篇文章:
又一个!
</10-statistical-concepts-you-should-know-for-data-science-interviews-373f417e7d11>
特伦斯·申
2021 年值得关注的 5 大深度学习框架以及为什么选择 TensorFlow
机器学习编程基础
2021 年值得关注的重要深度学习库,以及为什么 TensorFlow 应该是您的选择
克里斯托夫·高尔在 Unsplash 上拍摄的照片
深度学习领域非常令人兴奋。从强化学习应用到图像分类和声音生成,有大量的应用领域。当我们从事这些令人兴奋的项目时,我们往往希望将编写模型算法等繁琐的工作“外包”给深度学习框架。
有几个深度学习框架是由大型技术、大学和研究人员设计和支持的。但是,维护深度学习框架并不是一件容易的事情。有许多被否决的深度学习框架,尽管它们得到了微软等大型科技公司的支持。因此,找到一个仍在积极开发中的深度学习框架对于你的项目的未来至关重要。在本帖中,我们将了解 2021 年最新的深度学习框架,并了解你为什么要选择 TensorFlow。
什么是张量流?
TensorFlow 是一个开源的机器学习平台,特别关注神经网络,由谷歌大脑团队开发。尽管最初用于内部目的,但谷歌在 2015 年 11 月发布了 Apache License 2.0 下的库,这使其成为一个开源库。虽然 TensorFlow 的用例并不局限于机器学习应用,但是机器学习才是我们看到 TensorFlow 实力的领域。
具有稳定和官方 TensorFlow APIs 的两种编程语言是 Python 和 C。此外,C++、Java、JavaScript、Go 和 Swift 是开发人员可能会发现有限到广泛 TensorFlow 兼容性的其他编程语言。最后,还有 C#、Haskell、Julia、MATLAB、R、Scala、Rust、OCaml、Crystal 的第三方 TensorFlow APIs。
特别是在 TensorFlow 2.0 中,Google 显著提高了 TensorFlow APIs 的用户友好性。此外,TensorFlow 团队宣布,他们不打算引入任何其他重大变化。因此,你在 TensorFlow 2.0 中获得的技能将在很长一段时间内保持相关性。
为什么应该使用 TensorFlow?
有二十多个由科技巨头、科技基金会和学术机构开发的深度学习库可供公众使用。虽然每个框架在深度学习的特定子学科中都有其优势,但在 TensorFlow 中使用 Keras API 是最合理的选择。选择 TensorFlow 而不是其他深度学习框架的主要原因是它的受欢迎程度。另一方面,这种说法并不意味着其他框架比 TensorFlow 更好——尽管没有 tensor flow 受欢迎。特别是随着 2.0 版本的推出,TensorFlow 通过解决深度学习社区提出的问题加强了自己的力量。今天 TensorFlow 可能被视为最受欢迎的深度学习框架,它非常强大&易于使用,并且有出色的社区支持。图 X 显示了 TensorFlow 应用程序的工作流。
图十. TensorFlow 工作流程图(作者提供的图片)
安装和导入 TensorFlow 相当容易:
但是,我们也来谈谈其他深度学习框架:
其他深度学习框架和基本比较
从 80 年代开始,研究人员、大学和企业开始了几项计划来构建强大的深度学习库和框架。以下是这些工具的列表:
表十.按时间顺序排列的深度学习框架(来源:维基百科等)
虽然深度学习框架的总数超过二十个,但其中许多框架目前都不是由其设计者维护的。所以,我们只能谈极少数积极可靠的深度学习框架。在本帖中,我们将讨论除 TensorFlow 之外的四个深度学习框架,它们是:
让我们简单介绍一下:
克拉斯
Keras 是一个用 Python 编写的开源神经网络库,可以运行在 TensorFlow 、微软认知工具包、 Theano 、 R 和 PlaidML 之上。谷歌工程师 Fran ois Chollet 设计了 Keras 来实现神经网络的快速实验。它非常用户友好,模块化,可扩展。Keras 还以简单、灵活和强大而自豪。由于这些特性,Keras 被新人视为首选的深度学习库。
Keras 应该被视为 TensorFlow 的一个补充选项,而不是一个竞争对手的库,因为它依赖于现有的深度学习框架。2017 年,谷歌的 TensorFlow 团队同意在其核心库中支持 Keras。在 TensorFlow 2.0 中,Keras API 变得更加精简和集成,这使得创建神经网络更加容易。
要安装和导入 Keras:
Keras 官网: www.keras.io
PyTorch
PyTorch 是一个开源神经网络库,主要由脸书的人工智能研究实验室(FAIR) 开发和维护,最初于 2016 年 10 月发布。FAIR 在 Torch 库的基础上构建了 PyTorch,这是另一个开源机器学习库,一个科学计算框架和一个基于 Lua 编程语言的脚本语言,最初由 Ronan Collobert、Samy Bengio 和 Johnny Mariéthoz 设计。
由于 PyTorch 是由脸书开发的,并提供了一个易于使用的界面,它的流行程度在最近几年有所增加,特别是在学术界。PyTorch 是 TensorFlow 的主要竞争对手。在 TensorFlow 2.0 之前,尽管其 API 的易用性存在问题,但由于其社区支持、生产性能和附加用例解决方案,TensorFlow 一直保持着流行。此外,TensorFlow 2.0 的最新改进引入了对 TensorFlow 1.x 缺点的补救措施。因此,尽管 PyTorch 越来越受欢迎,TensorFlow 很可能会保持其地位。
要安装和导入 PyTorch:
PyTorch 官网:www.pytorch.org
阿帕奇 MXNet
MXNet 是由 Apache 基金会推出的开源深度学习框架。这是一个灵活、可扩展、快速的深度学习框架。它支持多种编程语言(包括 C++、Python、Java、Julia、MATLAB、JavaScript、Go、R、Scala、Perl 和 Wolfram 语言)。
MXNet 由亚马逊、英特尔、百度、微软、Wolfram Research、卡内基梅隆大学、麻省理工学院、华盛顿大学使用和支持。尽管一些受尊敬的机构和技术公司支持 MXNet 项目,但是 MXNet 的社区支持是有限的。因此,与 TensorFlow、Keras 和 PyTorch 相比,它仍然不太受欢迎。
要安装和导入 Apache MXNet:
MXNet 官网:mxnet.apache.org
微软认知工具包
微软在 2016 年 1 月发布了 CNTK 作为其开源的深度学习框架。CNTK 也称为微软认知工具包,支持 Python、C++、C#和 Java 等流行编程语言。微软在其流行的应用程序和产品(如 Skype、Xbox 和 Cortana)中使用了 CNTK,特别是在语音、手写和图像识别方面。然而,截至 2019 年 1 月,微软停止发布微软认知工具包的新更新。因此,CNTK 被认为是不推荐使用的。
安装和导入 CNTK ( 很不幸要复杂得多,下面的版本是针对 Google Colab 笔记本的):
微软认知工具包官网: www.cntk.ai
最终评估
截至 2020 年,可以肯定地说,TensorFlow 和 PyTorch 之间正在进行真正的竞争。尽管 PyTorch 做得非常出色,但出于以下几个原因,我仍然会将赌注压在 TensorFlow 上:
- TensorFlow 更成熟
- TensorFlow 支持更多编程语言
- TensorFlow 在就业市场上仍然更受欢迎
- TensorFlow 的社区支持是不可思议的
- TensorFlow 提供了许多支持技术
- TensorFlow 2.0 非常好用
另一方面,Keras 并不是 TensorFlow 的真正对手,更像是一个补充框架,我强烈建议您利用 Keras 资源及其 API。
深度学习框架能力排名
现在看来有点过时了,但是在 2018 年,Jeff Hale 为市面上的深度学习框架开发了一个漂亮的 power 排名。他权衡了在网上工作列表、相关文章和博客帖子以及 GitHub 上发现的提及。他的结果也支持上述评估:
基于他的深度学习框架的加权平均分数,我们可以画出这样的幂分数条形图:
图十.深度学习框架 Power Scores 2018 作者杰夫·黑尔(图由作者提供)
订阅邮件列表获取完整代码
如果你想获得我在 Google Colab 上的其他教程文章的代码,并能提前获得我的最新内容,考虑订阅:✉️的邮件列表
如果你对深度学习感兴趣,也可以看看我的人工智能内容指南:
https://oyalcin.medium.com/a-guide-to-my-content-on-artificial-intelligence-c70c9b4a3b17
既然您正在阅读这篇文章,我相信我们有着相似的兴趣,并且现在/将来会从事相似的行业。那么我们就通过Linkedin来连线吧!请不要犹豫发送联系请求!Orhan g . Yal n—Linkedin
前 5 名零售预测分析
分析零售预测并从中获得最大收益的最佳方法
帕特里克·托马索在 Unsplash 上的照片
零售预测非常具有战略性,因为它代表了数百万美元的采购预算,以及满足客户需求的承诺。在本文中,您将看到分析预测数据并从中获得最大收益的最佳方法。这篇文章不是关于预测算法。这是关于一旦你做了预测,你如何分析它们。
以下是本文涵盖的五大预测分析。
- ABC-XYZ 分析
- 预测误差范围
- 替代分析
- 预测相关性
- 销售损失
ABC-XYZ 分析
为了理解这个分析,让我们以一个零售商为例,他销售从玩具到配件的各种产品。该零售商拥有超过 100K 的产品,这意味着超过 100K 的预测,因为它需要对每种产品进行预测。
有这么多的预测,人们很容易迷失在庞大的数据中。这就是 ABC-XYZ 分析有助于提供全球视角的地方。这是 ABC-XYZ 分析的样子。
ABC-XYZ 分析(图片由作者提供)
这里 A、B、C 表示产品的销售量。XYZ 表示预测误差。颜色表示产品的数量。颜色越深,意味着产品数量越多。总共有 113,000 种产品。其中 57%的产品属于高产量和低误差类别(AX)。下面是 AX 类别产品的预测与实际对比的一个示例。
AX 中的产品示例(图片由作者提供)
该折线图展示了过去两年该产品的实际日销售额。正如你所看到的,这是一个繁忙且快速移动的产品,几乎每天都有销售。看着可视化,你可能会认为只有一行。但实际上,有两个——实际和预测。由于预测误差很小,两条线是重叠的。因此,这款产品是快速移动且预测误差非常低的产品的一个很好的例子。
现在让我们以另一种产品为例,它被归类为滞销和高预测误差(CZ)。绿线显示实际值,蓝线是回溯测试预测线。你可以看到这是一个滞销产品。预测与实际不符,这意味着预测误差很大。因此,这是一个很好的产品滞销和高预测误差(CZ)的例子。
CZ 产品示例(图片由作者提供)
因此,ABC-XYZ 可视化有助于理解全球观点。左边的产品越多越好。虽然预测从来不是 100%准确,但应该努力改进所有处于 AY 和 AZ 的产品的数据和预测算法,因为这些产品具有高销售额,但也具有高误差。
预测误差范围分析
预测误差范围有助于理解预测时间框架的可行性。这是预测计划者的必备分析。这种分析是为负责产品需求管理的预测计划员进行的。下面显示了预测计划者的分析,他希望预测误差的最大阈值为 10%。
预测误差范围分析(图片由作者提供)
在 Y 轴上,您可以看到计划员负责的产品列表。在 X 轴上,您可以看到从 5 天到 60 天的预测范围。颜色表示预测误差。例如,让我们拿第一个产品什锦档案盒来说。当该产品达到 10%的阈值时,颜色变成暗红色。因此,对于该产品,我们在 26 天的时间范围内达到 10%的误差阈值。这意味着我们可以提前 26 天预测该产品。
同样,对于这款产品 Woodland charlotte bag,我们在 32 天的预测期内达到了 10%的预测误差阈值。因此,这意味着我们可以提前最多 32 天预测该产品。
看一下这个图像,你可以说,对于三种产品,我们不能正确预测,因为 10%的阈值很早就达到了。然而,对于大多数产品,我们可以提前 60 天进行预测,而不会超过 10%的误差阈值。
因此,预测展望期分析是预测计划者控制其产品预测的一个好方法。
替补分析
预测替代分析有助于发现哪些是替代产品。这对于任何产品替换都很有用,无需对预测进行重大更改。让我们首先从数据科学的角度来看这是如何做到的。
预测算法提供近期内每天的产品预测。您可以使用这些信息来构建产品集群。此处显示了使用层次结构聚类的产品聚类结果。
层次聚类以查找具有相似预测的产品(按作者分类的图片)
你会看到不同的产品,每种产品都有一个颜色条。颜色条代表近期的产品预测。产品蓝 _ 工艺 _ 饰品 _ 盒子和奶油 _ 工艺 _ 饰品 _ 盒子有类似的颜色条。这意味着这两种产品具有相似的预测。正是因为这个原因,这两个产品都聚集在一个节点下。
群在替代计划中非常有用。尽管有最好的预测,事情还是可能出错。例如,如果你对蓝色工艺饰品盒有任何疑问,你可以用奶油工艺饰品盒来代替。不管是什么颜色,大多数顾客都会买一个饰品盒。因此,它使替代产品,而不是失去销售。
预测相关性
在前面的部分中,我们看到我们可以用一种产品替代另一种产品。但是,在很多情况下,产品的销售是相互依赖的。这意味着人们倾向于一起购买产品。这意味着,如果一个产品出现任何问题,也会冲击其他产品的销售。
有一种数据科学算法可以帮助找到相关性,这种算法叫做关联分析。
用于查找预测相关性的关联分析(作者图片)
每个产品显示为一个圆圈,产品之间的线显示依赖关系。例如,我们看到老式卡片和铅笔之间有联系。因此,如果老式贺卡的销售受到影响,很可能也会影响铅笔的销售。这些依赖关系信息有助于在产品级别上微调预测。
销售损失
销售损失是指由于缺乏库存而无法实现的销售。为了计算销售损失,我们可以预测一种产品和该产品的实际库存(包括其替代品)。该预测是回溯预测,因此我们可以将其与实际值进行比较。如果实际库存少于预测,那么它代表销售损失。这是午餐袋销售损失分析的可视化结果。
销售损失分析(图片由作者提供)
蓝线是预测,灰线是午餐袋和所有替代品的库存。你可以看到,在某个时间段,股票变成了零。因此,这是一种销售损失的情况,预测和库存之间的差异就是销售损失。我们可以计算销售损失,结果是 1590 个午餐袋因缺货而无法售出。
希望你喜欢这篇文章。
额外资源
网站(全球资讯网的主机站)
你可以访问我的网站进行零编码分析。https://experiencedatascience.com
每当我发布一个新的故事,请订阅保持通知。
https://pranay-dave9.medium.com/subscribe
你也可以通过我的推荐链接加入 Medium
https://pranay-dave9.medium.com/membership
Youtube 频道
这是我的 YouTube 频道
https://www.youtube.com/c/DataScienceDemonstrated的链接
2021 年你应该知道的五大 GPT 三代接班人
人工智能
AI 进步很快,这里有你需要知道的最新机型。
朱迪·纽迈耶在 Unsplash 上的照片
如果我们与今年人工智能向我们展示的相比,GPT-3 已经很老了。自 2017 年《变形金刚》问世以来,它在从语言到视觉的各种任务中都取得了巨大成功。GPT-3 去年彻底改变了世界,从那时起,多个突破性的模型已经出现。各个国家和公司都沉浸在建造越来越好的模型的竞赛中。
前提是更大的模型、更大的数据集和更强的计算能力构成了人工智能主导的三位一体。即使这个范例有重要的批评者,它的成功是不可否认的。
在本文中,我将回顾 2021 年以来最重要的 5 种基于变压器的模型。我将从 GPT 3 号开始这个列表,因为它意义重大,然后按时间顺序继续——最后一个是两周前发表的!
GPT 3 号——人工智能摇滚明星
OpenAI 于 2020 年 5 月在一篇题为 的论文中提出了 GPT-3,语言模型是很少出手的学习者 。2020 年 7 月,该公司发布了一个供开发人员使用的测试版 API,该模型一夜之间成为人工智能明星。
GPT-3 是第三代语言型号系列的第三个版本。它的主要特点是多任务和元学习 能力。在 570GB 的互联网文本数据上以无监督的方式进行训练,它能够通过看到几个例子(少数镜头)来学习它没有训练过的任务。它也可以从零和一次设置中学习,但性能通常会更差。
GPT 3 号展示了疯狂的语言生成能力。它可以对话(模仿活着或死去的历史人物),写诗、歌、小说和散文。它可以 写代码,乐谱,乳胶格式的方程式。它显示了适度的推理、逻辑和常识水平。它可以思考未来、生命的意义和自身。
除此之外,GPT-3 在标准化基准测试中表现出色,在一些测试中达到了 SOTA。它在生成性任务上表现最为突出,比如写新闻文章。对于这项任务,它达到了人类的水平,让试图将它的文章与人造文章分开的法官感到困惑。
这是我为写的一篇关于 GPT 3 号的完整概述,面向数据科学:
[## GPT-3 —全面概述
towardsdatascience.com](/gpt-3-a-complete-overview-190232eb25fd)
开关变压器——万亿参数先锋
2021 年 1 月谷歌发表了论文 Switch Transformers:缩放至万亿参数模型,具有简单有效的稀疏性 。他们提出了开关变压器,一种新的神经网络,其目标是在不增加计算成本的情况下促进更大模型的创建。
区别于以前模型的特征是专家混合算法的简化。混合专家(MoE)由一个系统组成,通过该系统,进入模型的表征(输入的基本部分)被发送到神经网络(专家)的不同部分进行处理。因此,为了处理给定的令牌,只有模型的一个子部分是活动的;我们有一个稀疏模型。这降低了计算成本,使它们能够达到万亿参数的水平。
在最初的 MoE 中,每个代币都被送到至少两个专家那里进行比较。有了 Switch Transformer,Google 简化了路由过程,因此每个令牌只发送给一个专家。这进一步降低了计算和通信成本。谷歌表明,大型开关变压器将优于大型密集模型(如 GPT-3,尽管他们没有比较两者)。这是减少大型预训练模型碳足迹的一个巨大里程碑,这些模型在语言方面是最先进的,现在也是视觉任务。
富有创造力的艺术家
OpenAI 于 2021 年 2 月在一篇名为 零镜头文本到图像生成 的论文中提出了 DALL E。该系统以西班牙画家萨瓦尔多·达利和皮克斯可爱的机器人瓦力命名,是 GPT-3(120 亿个参数)的缩小版,专门训练文本-图像对。用 OpenAI 的研究人员的话说:“通过语言操纵视觉概念现在触手可及。”
达尔·E 利用“语言的组合结构”探索了图像生成的可能性它将书面句子的意思与它可能具有的潜在视觉表现结合起来。不过,像 GPT-3 一样,它高度依赖于句子的措辞,以避免在图像中出错。它的力量依赖于它的零射击能力;它可以执行未经训练的生成任务,而不需要例子。
在其他功能中,它可以根据书面提示从头开始生成图像,重新生成图像的隐藏部分,控制对象的属性,或将它们集成到单个图像中。更令人印象深刻的是,DALL E 还可以在高抽象层次上组合概念(当被告知“一只竖琴制成的蜗牛”时,它通常会将蜗牛画成以竖琴为壳),并进行图像到图像的转换(当被告知“顶部的一只猫与底部的草图完全相同”时,它会画出一只与原始图片相似的猫)。
达勒展示了一种艺术的雏形。从对书面语言的松散解释描述中,它创造了一种视觉现实。我们可能比以往任何时候都更接近一个人工智能版本的“一图胜千言”。
下面是 OpenAI 的一篇博文,展示了 DALL E 的能力:
https://openai.com/blog/dall-e/
LaMDA——下一代聊天机器人
谷歌在 2021 年 5 月的年度 I/O 会议上展示了 LaMDA。LaMDA 有望凭借其惊人的对话技巧革新聊天机器人技术。现在还没有论文或者 API,只能等出点结果了。
LaMDA 代表LalanguageModel,代表DialogueAapplications,是 Meena 的继任者,Meena 是谷歌在 2020 年推出的另一个人工智能。LaMDA 接受了对话训练,并进行优化以最大限度地减少困惑,这是一种衡量模型在预测下一个令牌时有多自信的方法。困惑与人类对对话技巧的评价高度相关。
LaMDA 作为一个明智、具体、有趣且符合事实的聊天机器人而脱颖而出。与之前的产品相比,它可以在开放式的对话中做出有意义的回应。这可以使他们变得具体,避免像“我不知道”这样总是有效的回答它可以做出“有见地和意想不到的”回应,让对话保持有趣。当涉及到事实知识时,它会给出正确的答案。
这是我为写的一篇关于 LaMDA 的完整评论,关于数据科学:
[## 谷歌的 LaMDA:下一代聊天机器人
towardsdatascience.com](/googles-lamda-the-next-generation-of-chatbots-62294be58426)
妈妈——搜索引擎的大脑
谷歌与 LaMDA 一起推出了 MUM,这是一个旨在改革搜索引擎的系统,其方式与几年前 BERT 的方式类似,但更具影响力。与 LaMDA 一样,除了谷歌的演示和博客帖子外,没有进一步的信息,所以我们必须等待更多信息。
妈妈代表多任务型 U 型n 型 M 型型。它是一个多任务和多模态语言模型,比它的前身 BERT 强大 1000 倍。它已经接受了 75 种语言和许多任务的训练,这使它对世界有了更好的了解。然而,它的多模式能力使 MUM 比以前的型号更强大。它可以处理文本+图像信息和任务,这使它具有 GPT-3 和 LaMDA 都没有的多功能性。
妈妈能够处理复杂的搜索查询,如“你已经徒步过亚当斯山。现在你想明年秋天去富士山远足,你想知道要做哪些不同的准备。”有了今天的搜索引擎,一个精确而明智的答案将需要大量的搜索和信息汇编。妈妈可以帮你做,给你一个有针对性的答案。更令人惊讶的是,因为它是多模态的,“最终,你可能会拍下你的登山靴,然后问,”我可以用它们去富士山吗?"
这是我为写的关于妈妈的一篇完整的评论:
[## 谷歌妈妈会扼杀 SEO 吗?
towardsdatascience.com](/will-googles-mum-kill-seo-d283927f0fde)
武道 2.0——最大的神经网络
6 月 1 日,BAAI 年会推出了悟道 2.0——翻译过来就是悟。这个令人惊叹的人工智能拥有一年前属于 GPT-3 的最大神经网络的头衔。武道 2.0 拥有惊人的 1.75 万亿参数,10x GPT-3。
武道 2.0 是在 4.9TB 的高质量文本和图像数据上训练出来的。相比之下,GPT-3 是在 570GB 的文本数据上训练的,几乎少了 10 倍。武道 2.0 顺应多模态趋势,能够执行文字+图像任务。为了训练它,研究人员发明了 FastMoE,这是谷歌 MoE 的继任者,它“使用简单,灵活,高性能,支持大规模并行训练。”我们可能会在未来的模型中看到其他版本的 MoE。
它的多模态特性允许 Wu Dao 2.0 管理大量的任务。它能够处理和生成文本,识别和生成图像,以及混合任务,如为图像添加字幕和根据文本描述创建图像。它还可以预测蛋白质的 3D 结构,像 DeepMind 的 AlphaFold 。它甚至创造了一个可以不断学习的虚拟学生。她会写诗,会画画,将来还会学编码。
悟道 2.0 在一些标准语言和视觉基准上达到了 SOTA 水平,如 LAMBADA、SuperGLUE、MS COCO 或 Multi 30K,超过了 GPT-3、DALL E、CLIP 和 CL。这些惊人的成就使悟道 2.0 成为当今最强大、最全能的人工智能。然而,另一个更大的人工智能出现在地平线上只是时间问题。睁大眼睛!
这里是我为写的一篇关于悟道 2.0 的完整评论:
获取更多关于 AI、哲学、认知科学的内容!
在任何卷积神经网络中,你总能碰到的前 5 层
人工智能精要
卷积神经网络体系结构和最常见层的简介
图一。戴维·特拉维斯在 Unsplash 上拍摄的照片
C 选择性神经网络是一系列人工神经网络架构,专门为计算机视觉和图像处理任务而设计。它是一个多层神经网络,用于分析视觉输入并执行图像分割、分类、去噪(使用自动编码器)、生成(使用 GANs)和对象检测等任务。另一方面,近年来,除了视觉相关的 AI 任务,我们开始看到 CNN 在自然语言处理(NLP)等其他 AI 领域的实现。
图二。用于图像分类的示例卷积神经网络(图片由作者提供)
CNN 架构
正如我们在上一篇文章中提到的,CNN 架构是基于视觉皮层的功能和组织而设计的。CNN 架构简单地模仿了人脑中神经元的连接模式。尽管 CNN 有几个层次,但它实际上有两个主要组成部分:
- 由几个特定层(卷积、汇集、丢弃等)组成的卷积网络,能够分割和检测图像的特征;
图 3。卷积网络,视觉操作发生的部件(作者图)
- 完全连接的层或网络,其接受卷积网络的输出以预测图像的最佳输出;
图 4。完全连接的层,预测发生的组件(作者提供的图)
完全连接的层或网络与最基本的人工神经网络架构相同,是一种多层感知。另一方面,卷积网络是 CNN 架构所特有的。让我们在层级别上更深入地了解一下这些组件。
CNN 中的层
我们可以给卷积神经网络添加许多不同的层类型。CNN 可以包括不常见的层,例如上采样或转置卷积层。然而,在常规 CNN 中,我们通常会遇到五个特定层:
卷积层
卷积层是 CNN 架构中最具标志性的层。通过使用卷积层,我们可以创建一个特征图,通过应用一个过滤器扫描整个图像,每次扫描几个像素,来预测每个特征的分类概率。卷积是通过对输入图像数据应用滤波器来完成的,这会减小其大小。
使用卷积的优点之一是降低计算复杂度。由于一个像素通常更多地与相邻和邻近的像素相关联,所以在卷积之后,我们仍然保持图像的不同部分之间的关系。当我们使用步长为 1x1(每步移动 1 个像素)的 3x3 滤波器对 5x5 图像进行卷积时,最终会得到 3x3 的输出。这个过程相当于计算复杂度降低了 64%。
图 5 x 5 像素图像与 3 x 3 像素过滤器的卷积(步距= 1 x 1 像素)
汇集层
我们在 CNN 中遇到的另一个标志性的层类型是池层。标准做法是在卷积层之后插入一个池层。通过减少制图表达的空间大小来减少参数数量,池化图层有助于进一步降低计算复杂度。换句话说,我们聚合像素值以降低复杂性,这不会对模型性能产生不利影响。这种聚集可以基于选择像素值的最大值、平均值或总和。最常用的聚合方法是最大池法,举例如下:
图 6。2 x 2 的最大池(作者提供的数字)
如你所见,我们首先将它们分成 2×2 的正方形,并选择正方形内的最大像素值。通过使用 MaxPooling,我们将大小从原来的 4x4 减小到 2x2。
脱落层
丢弃层不是卷积神经网络架构中的强制层。然而,由于过拟合的频繁发生,我们经常会在卷积神经网络中遇到一个或多个脱落层。特别是,在相对较小的数据集上训练的大型神经网络可能会过度拟合训练数据,这可能会在现实世界的应用程序中导致糟糕的性能。
图 7。示例脱层(不在 CNN 中)(图由 Igor Filitschenski 在论文中提供)
虽然有几种正则化方法来处理过拟合,但对于卷积神经网络来说,最可行的方法是丢弃。丢弃过程实现起来非常简单:在训练期间,一些层输出被随机忽略或者“被丢弃”该过程具有使训练过程变得嘈杂的效果,并且它迫使层内的节点承担更多(如果没有被丢弃)或更少(如果被丢弃)的输入责任。得益于丢弃层,卷积神经网络可以学习以更灵活的方式适应优化模型权重,从而防止过度拟合。
展平图层
正如我们前面指出的,每个卷积神经网络都由一个卷积网络和一个全连接层组成。展平层充当这两个组件之间的桥梁。由于图像数据至少是二维格式,卷积网络的输出也至少是二维的。另一方面,由于我们的全连接层等同于多层感知(简单的神经网络类型),它期望接收一维输入。这就是展平层发挥作用的地方。平面化层唯一目的是将二维数组转换成一维数组。
图 8。扁平化层(作者图)
完全连接的层或网络
全连接层是卷积神经网络的最后一部分。它可以是单一的密集层,也可以是复杂的多层感知器。该层的输入来自展平层。因此,展平层可以看作是这个组件的输入层。分配给全连接层的任务是对卷积网络生成的输入应用权重,并生成预测的最终概率(例如,确定输入图像的对象类别)。
图 9。完全连接的层/网络(图由作者提供)
最终注释
将这五个常见的层和我们在本文中没有提到的其他一些不太常见的层结合起来,我们甚至可以创建一个非常先进的卷积神经网络。但是主要功能保持不变:当初始组件(由特定层组成的卷积网络)检测特征并将它们作为有价值的信息传递给完全连接的层时,完全连接的层通过调整其权重来学习根据这些特征进行预测。
如果你有兴趣将你的职业生涯推向深度学习,请查看我的人工智能内容指南。
https://oyalcin.medium.com/a-guide-to-my-content-on-artificial-intelligence-c70c9b4a3b17
更具体地说,如果您正在寻找使用 TensorFlow 构建自己的卷积神经网络,并使用 MNIST 数据集对手写数字进行分类,请查看下面的文章:
[## 使用 MNIST 数据集在 10 分钟内完成图像分类
towardsdatascience.com](/image-classification-in-10-minutes-with-mnist-dataset-54c35b77a38d)
订阅邮件列表获取我的最新内容
如果你喜欢我迄今为止分享的内容,可以考虑订阅简讯 !✉️
对于我的订阅者,我也分享我的私人 Google Colab 笔记本,其中包含我发表的每篇文章的完整代码。
如果你正在阅读这篇文章,我确信我们有着相似的兴趣,并且正在/将要从事相似的行业。那么我们就通过Linkedin来连线吧!请不要犹豫发送联系请求!Orhan g . yaln—Linkedin
企业数据科学家面临的五大问题
行业笔记
以及克服它们的策略…
皮沙贝
从笔记本电脑上学习数据科学提出了一些挑战,这些挑战是理解数据科学工具如何工作的基础。然而,从笔记本电脑转移到企业,带来了学习数据科学家从未真正接触过的几个新挑战。当我在第一份数据科学工作中遇到一个常见的数据科学问题时,我肯定经历过这种情况:“请为我们的客户群开发微细分,以便我们可以更精确地向他们营销。”我的计划很明确——对数据进行一些特征工程,对这些特征进行一些数据简化,然后聚集成一个解决方案。不幸的是,当我开始为如何访问数据而绞尽脑汁时,问题马上就出现了。
当然,我让同事们分享了一些代码片段,这些代码片段包含数据所在数据库的连接参数。一切都很好,但是,这些相同的代码片段并没有解决我的问题,因为它们首先假设我可以访问数据。因此,我面临着企业数据科学家处理的最普遍的问题之一,安全性,甚至在我有机会展示我的企业数据科学肌肉之前。
在本文中,我将研究企业数据科学家面临的 5 大挑战,并提供一些克服这些挑战的技巧。
皮沙贝
挑战#1:理解安全的角色
正如我在上面的轶事中提到的,大多数数据科学家没有接触过企业安全协议。更糟糕的是,安全性通常是分层实现的,这意味着要访问数据通常需要通过许多关卡和关卡,尤其是当这些数据位于不同的服务器上时。
请记住,企业安全的目标包括 1。保护静态和传输中的数据,2。建立身份和访问管理(IAM)控制,3。灾难恢复,4。关于脆弱性和社会工程的教育。监控服务器端点的奇怪流量(了解更多细节)。
数据科学家最大的担忧是什么?我是。数据科学家最常面临的是 IAM 控件,这些控件在试图访问数据以履行职责时很难遍历。这里有一个简单的例子来说明这在企业环境中是如何操作的。每位员工都有一个唯一的用户身份(ID)。这些 id 然后被分配给不同的角色。最基本的是,角色允许用户做某些事情,比如读、写和/或更新数据库。个人还被放在不同的组中,这些组允许将对多个数据源的访问权限安全地分组给一组具有相似工作职能的个人。
处理安全问题的技巧:克服这一挑战的最佳方式是与您的安全团队会面。没有人会这样做,大多数人会因为你主动学习他们的安全协议是如何工作的而感到非常兴奋。最相关的是通过了解已经到位的系统(例如,角色和组以及识别它们的方法)来了解如何请求访问。此外,与安全部门会面将开始建立信任,并进一步提供作为开发人员如何负责任地学习访问数据的适当渠道的背景。当人们信任你的时候,他们会更愿意让你接触到一些东西😊
皮沙贝
挑战#2:选择*;了解大数据
对于学习数据科学技术来说,笔记本电脑的计算资源和较小的固定数据集非常有用,但新雇佣的企业数据科学家无法很好地处理企业规模的海量数据。因此,我看到年轻数据科学家面临的另一个常见挑战是如何将庞大的数据集适当地采样成更小、更易于管理的子集,以便进行更有效的实验和发现。
处理大数据的技巧:即使是大公司,在可用于执行数据科学任务的计算资源方面也是有限的,理解这一点很重要。因此,我们需要战略性地划分数据子集,以确定允许进行实验的较小集合。对大型数据集进行子集划分的一些常见变量包括日期范围、业务线或客户细分等。通过在较小的数据集上训练模型来测试模型的可行性,看看在较大的数据上执行是否值得。例如,如果您发现您在分类模型上的准确率只有 60%,但业务要求接近 90%,那么简单地利用更多数据不太可能让您达到这一水平,因此需要另一种方法。
皮沙贝
挑战#3:使用版本控制
尽管随着越来越多的数据科学学生接触到 GitHub 等服务以访问他们教育中的编码示例,趋势正在发生变化,但仍有相当数量的初露头角的数据科学家不完全理解我们如何或为什么在企业环境中使用 Git 等版本控制系统。关于 Git 对数据科学的更详细的处理,请参见这里的,但简而言之,Git 在与其他开发人员合作时非常强大,并提供了一种共享代码和对代码进行高效且可追踪的更新的方式。
处理版本控制的技巧:最快的技巧是学习如何使用 GitHub。在学习 GitHub 时,我最大的挑战是理解我的本地存储库(位于您的笔记本电脑上或您自己的个人开发环境中的存储库)和远程存储库之间的区别,远程存储库代表特定解决方案的最新和最棒的代码集。除非我们执行特定的 Git 操作来更新远程数据库(例如 git commit ),否则本地所做的任何更改都不会出现在远程数据库中。显然,还有很多东西需要学习,但是你越早开始在 GitHub 上存储你自己的代码,你就越早开始理解 Git 是如何工作的。
皮沙贝
挑战#4:了解如何扩展
基于大多数学习数据科学家面临的计算限制,随之而来的是企业对如何为生产扩展数据科学解决方案的担忧。比方说,我们对 200,000 个客户训练一个模型,它可以识别任何一个客户取消订阅的可能性。现在,该企业希望在所有 1200 万订户上运行您的模型,每次数据每小时刷新一次。当看到这个场景时,你的额头开始冒汗,要知道这是一个重大的企业问题,有几种不同的解决方案。此外,了解可用的解决方案有助于为您的开发工作提供大量信息,这也是在您的数据科学职业生涯早期考虑这一挑战的重要原因。
处理规模的技巧:有许多不同的可扩展数据科学框架,每一个都适合略有不同的用例,有些重叠。我考虑规模的方式是考虑您的生产解决方案是否需要是事务性的,在这种情况下,您对单个客户的数据进行实时评分,因为它可用于模型,而在批处理中,您一次对数百万个客户进行评分(就像我在本节前面介绍的场景)。事务数据科学产品对于创建智能应用程序非常有用,因为这些应用程序拥有用户,所以它们需要对用户体验做出响应。这意味着事务性数据科学产品需要轻量级和快速。或者,批量数据科学产品不需要很快产生结果,但是我们也不希望它们需要连续几天才能完成。这种区分有点过于简单,因为有许多用例介于两者之间,但是每个用例的框架都是不同的,并且可以在这些实例中进行组合。
为了克服这一挑战,请理解事务数据科学通常涉及可以使用 Kubernetes、云中的弹性容器服务或云功能等服务进行水平扩展的容器(运行在轻量级机器上,随着需求的增加可以添加更多机器)。批量数据科学需要框架来管理和协调跨多个核心(垂直)和多个机器(水平)的大型数据集的分割。处理这些超大型数据集的框架包括 Spark、Dask 和 Ray。后面这些框架特别适合数据科学家学习,因为它们还允许分布式模型训练,并且可以打包在容器中,以进一步提高对事务数据进行操作的复杂模型的可伸缩性。
皮沙贝
挑战#5:向业务利益相关者传达数据科学
我经常看到的年轻数据科学家面临的最后一个挑战是与业务利益相关者打交道。作为数据科学家,我们谈论概率、特异性、精确度和 ROC 曲线,而业务利益相关者考虑的是关键性能指标(KPI)、业务规则和财务影响。换句话说,数据科学的语言和使用我们的产品来通知他们的业务决策的业务利益相关者的语言之间存在脱节。
克服这一挑战的技巧:克服这一挑战的最好方法是了解你的企业的关键绩效指标。请确保您正在努力协调您的数据科学工作与这些业务 KPI 的关系。从业务决策的角度交付数据科学成果,并讲述该业务决策结果的业务故事。模拟使用您的产品如何导致 KPI 发生变化,比不使用您的产品时更好。
额外提示:如果我能提供最后一条建议,那就是衡量标准是激励性的,移动衡量标准更是激励性的。因此,通过可视化展示业务指标如何与您的数据科学工作相关联,可以确保您的业务消费者专注于您的价值,而不是试图不显得愚蠢,因为他们不知道您的模型在做什么。
比如参与学习更多关于数据科学的知识?加入我这里
五大 Python 数据可视化库
每个都有例子。
费德里卡·坎帕纳罗在 Unsplash 上的照片
数据可视化是数据科学的重要组成部分。可视化为数据提供了有价值的洞察力。在许多情况下,它们比简单的数字更有效。
数据可视化有助于探索和理解数据中的底层结构以及变量之间的关系。我们还利用它们向利益相关者通报我们的发现并交付成果。
在本文中,我们将介绍排名前五的 Python 数据可视化库。我们将创建相同的可视化效果,以便了解它们之间的异同。
我们将使用 Kaggle 上的墨尔本房产数据集来创建地块。第一步是将数据集读入熊猫数据帧。
import numpy as np
import pandas as pddf = pd.read_csv(
"/content/melb_data.csv",
usecols = ['Price','Landsize','Type'],
nrows = 1000
)df = df[df.Landsize < 1000]df.head()
(图片由作者提供)
我们仅通过读取墨尔本住房数据集的 3 列和前 1000 个观察值(即行)创建了数据框架。然后,我们过滤掉了与土地面积相关的异常值。
Matplotlib
Matplotlib 由三个主要层组成,分别称为后端、艺术家和脚本。
我们主要处理脚本层。就是 matplotlib.pyplot 接口。脚本层自动化了将所有东西放在一起的过程。因此,它比其他层更容易使用。
第一个例子是散点图。主要用于可视化两个连续变量之间的关系。它们概述了变量之间的相关性。
我们可以用价格和距离列创建一个散点图。
import matplotlib.pyplot as pltplt.figure(figsize=(10,6))
plt.scatter(x=df.Price, y=df.Landsize)
plt.xlabel("Price", fontsize=13)
plt.ylabel("Landsize", fontsize=13)
(图片由作者提供)
我们观察到价格和土地面积之间有轻微的正相关关系。
另一种常用的可视化类型是直方图。它将连续变量的值范围划分为离散的箱,并计算每个箱中数据点(即行)的数量。因此,我们得到了分布的概况。
让我们创建一个 price 列的直方图。
plt.figure(figsize=(10,6))
plt.hist(x=df.Price)
plt.xlabel("Price", fontsize=13)
(图片由作者提供)
海生的
Seaborn 是一个基于 Matplotlib 构建的统计数据可视化库。与 Matplotlib 相比,Seaborn 是一个高级库。它的语法更简单,但是在某些情况下,您对定制可视化的控制更少。
import seaborn as snssns.relplot(data=df, x='Price', y='Landsize', kind='scatter',
height=5, aspect=1.6)
(图片由作者提供)
高度和纵横比参数用于自定义绘图的大小。
以下代码将创建 price 列的直方图。
sns.displot(data=df, x='Price', kind='hist', height=5, aspect=1.6)
(图片由作者提供)
阿尔泰尔
Altair 是一个用于 Python 的声明式统计可视化库。Altair 在数据转换方面非常灵活。在创建可视化时,我们可以应用许多不同种类的转换。它使得库对于探索性数据分析更加有效。
以下是我们如何用 Altair 创建散点图。
alt.Chart(df).mark_circle().encode(
x='Price', y='Landsize'
).properties(height=300, width=500)
(图片由作者提供)
语法从我们用来传递数据的顶级图表对象开始。下一部分定义了绘图的类型。encode 函数指定要绘制的列。最后,属性功能用于在各个方面定制情节。
创建直方图的语法结构是相同的。我们只是改变了定义绘图类型的函数。有两种方法可以指定要绘制的列。第一种方法是将列名作为字符串传递给 x 或 y 参数。第二个是使用 X 和 Y 编码。在转换或使用附加功能的情况下,编码是首选。
alt.Chart(df).mark_bar().encode(
alt.X('Price', bin=True), y='count()'
).properties(height=300, width=500)
(图片由作者提供)
Plotly
Plotly Python (plotly.py)是一个基于 plotly javascript (plotly.js)构建的开源绘图库。Plotly 提供了一个高级 API ( plotly express )和一个低级 API ( graph objects )来创建可视化。
Plotly express 使语法更加简单。另一方面,graph 对象的语法稍微复杂一些,但是我们可以更好地控制我们所创建的内容。
我们将使用 plotly express 接口来创建散点图和直方图。
import plotly.express as pxpx.scatter(df, x='Price', y='Landsize', height=500, width=700)
(图片由作者提供)
px.histogram(df, x='Price', height=500, width=700)
(图片由作者提供)
散景
Bokeh 是一个用于现代网络浏览器的交互式可视化库。因此,除了生成基本的绘图,散景也可以用来创建仪表板和数据应用程序。
在创建散点图和直方图之前,让我们导入所需的依赖关系。
from bokeh.io import output_notebook, show
from bokeh.plotting import figureoutput_notebook()
下面是我们如何用散景创建一个基本的散点图。
p = figure(plot_height=400, plot_width=600)
p.circle(df.Price, df.Landsize)
show(p)
(图片由作者提供)
我们需要 NumPy 的一点帮助来创建直方图。我们使用 NumPy 的直方图函数来计算价格列的直方图。然后,转换后的数据将被传递给散景的 quad 函数。
hist, edges = np.histogram(df.Price, bins = 10)p = figure(plot_height=400, plot_width=600)
p.quad(top=hist, bottom=0, left=edges[:-1], right=edges[1:])
show(p)
(图片由作者提供)
结论
我们已经介绍了 Python 的 5 个不同的数据可视化库。我们已经创建了非常基本的情节,以获得它们之间的差异和相似性的概述。
所有这些工具都能够创建更复杂的可视化效果,并对其进行定制。我真的不能说一个优于另一个,但我有一些偏好。例如,与 Matplotlib 相比,我更喜欢 Seaborn,因为它的语法更简单。我还喜欢 Altair 先进的数据转换和过滤功能。
感谢您的阅读。如果您有任何反馈,请告诉我。
2021 年前 5 篇单细胞基因组学论文
回顾今年大数据时代的一些激动人心的论文
在生物学的大数据时代,数据科学和机器学习蓬勃发展,并受益于它们在生物学中的跨学科应用。特别是 2021 年对于单细胞基因组学来说是伟大的一年,单细胞基因组学是一个仍处于萌芽状态的领域,它应用数据科学的概念,以单细胞的分辨率理解高维生物数据。作为这个学科的研究生,我阅读了大量的论文来了解最新的文献(并且仍然有大量的阅读清单要赶!),我想分享一下我今年读过的一些最好的论文。
1.单细胞基因组学似是而非的艺术
【https://www.biorxiv.org/content/10.1101/2021.08.25.457696v3
在你会遇到的大约 80-90%的单细胞论文中,根据研究问题,至少会有一两个 tSNE 或 UMAP 图来可视化他们收集的数据,通常是单细胞 RNA 测序(scRNA-seq)数据,其中单个细胞的 RNA 丰度在整个基因组中得到描述。这些无监督的降维方法或多或少已经被接受为单细胞基因组学世界中数据可视化的现状,所以今年夏天当一份新的预印本大胆挑战这一规范时,它在学术推特上引起了轩然大波,认为这些方法无助于保留它试图传达给我们 3D 思维的数据的潜在结构。利用在高维空间中保持等距细胞的极端例子,后来将其放宽到近等距,他们展示了 tSNE 和 UMAP 如何扭曲原始空间中具有近等距间隔的细胞群的方向,将它们与均匀分布的细胞群聚集在一起。然后,他们继续演示半监督降维方法,该方法可以将数据拟合到预定义的形状(例如大象),同时似乎在将数据映射到低维嵌入方面表现更好。由于其大胆而令人信服的论点,它在 Twitter 上引起了很多积极的讨论,被转发了大约一千多次,资深作者 Lior Pachter 也积极参与。
2.在单细胞分辨率下量化实验扰动的影响
来自生产 PHATE 的同一个实验室的一种新方法,可以确定实验处理如何影响单细胞分辨率的高维数据结构。这是医学中的一个重要问题,例如当研究一种新的癌症疗法或新冠肺炎治疗方法的效果时。使用单细胞方法(如 scRNA-seq)有助于在很大程度上无偏见地了解目标组织如何受到这些治疗的影响,但当您考虑到批次效应、样品的生物异质性、条件数量的增加(例如,样品 A 接受药物 X,样品 B 接受药物 Y,样品 C 接受安慰剂等)以及样品暴露于药物/治疗的时间长度时,这些方法可能会受到阻碍。作者用一种叫做 MELD 的算法来解决这个问题,这种算法使用图形信号处理来确定细胞受实验扰动影响的可能性。然后,他们扩展了这种方法,导出了一种称为顶点频率聚类(VFC)的聚类算法,该算法在对细胞分组时不仅考虑了转录相似性,还考虑了上述受到相同处理影响的可能性。在另一项工作中(在下面的荣誉奖中讨论),他们将 MELD 应用于来自新冠肺炎患者的单细胞数据。
3.人类扩展多能干细胞对猴胚胎的体外嵌合贡献
https://pubmed.ncbi.nlm.nih.gov/33861963/
像第一个条目一样,这是另一篇有争议的论文,尽管其原因对普通读者来说可能更清楚。在这里,作者展示了他们如何能够将人类干细胞移植到猴子的胚胎中,在那里它们能够生长和分化,创造出嵌合体——一种具有来自一种或多种不同生物体的细胞的生物体,其灵感来自希腊神话中的野兽。然后,他们进行了 scRNA-seq,使用 tSNE 将这些嵌合胚胎与纯人类和猴子胚胎进行比较和对比。这听起来像是科幻小说里的东西,比如《人猿星球》,但是你为什么要这么做呢?再生医学的一个令人兴奋的途径是能够产生细胞和器官来替代人体受损的组织或器官,模拟疾病,并测试治疗所述疾病的药物。希望利用病人自己的细胞创造出一个嵌合体,这个嵌合体带有一个专门为该病人生长的人体器官,从而支持再生医学领域。我们的目标不是创造一个人/猴混血儿,甚至不是从猴子身上获取人体器官,因为这牵涉到伦理问题。相反,由于我们在进化上的相似性,科学家们希望以此为模型来研究宿主胚胎细胞和外来细胞之间的串扰,然后可以推广到进化上更遥远的物种中生长的人体器官,如猪,在这些物种中,伦理没有那么模糊。
4.使用大规模数据注释和深度学习的具有人类水平性能的组织图像的全细胞分割
我的实验室为我们的研究做了很多荧光显微镜检查。在这样的实验室工作,我最喜欢的一件事就是看到显微镜中荧光标记下的单个细胞发光。这就像在看迷你星系,但是是细胞而不是恒星和行星。与 scRNA-seq 不同,您不必破坏样本来提取生物信息,这使其有助于重新访问样本以进行额外的测量,以及获得空间信息,从而为这些细胞作为一个整体的基本功能提供更多信息。然而,该领域中反复出现的挑战之一是在这些显微图像中自动分割细胞,即分离和定位单个细胞。有许多工具旨在解决这些挑战,但它们往往在更大、更复杂的数据集和组织类型中表现不佳,在这些情况下自动化尤为重要。为了解决这个问题,一组研究人员构建了一个名为 TissueNet 的大规模数据集,其中包含来自几个成像平台和器官的超过 100 万个人工标记的细胞,包括正常和患病组织。然后,他们在这个数据集上训练了一个名为梅斯麦的深度学习模型,以分割单个细胞。由于组织样本的多样性和巨大的样本量,这是一个很有希望的资源,可以用作您感兴趣的数据集的迁移学习的预训练模型,并且我可能会在新的一年中自己进行实验。
5.原肠胚的单细胞转录组特征
这篇最后的论文为我们理解人类发展提供了一个新的视角。我们都是从一个没有意识的单细胞开始,然后迅速扩展成一大堆细胞,形成一个胚胎。一旦它附着在我们母亲的子宫上(这一过程称为着床),我们的主要组织和器官就开始发育。在过去的几十年里,我们已经了解了许多关于胚胎植入前早期发育机制的知识,但我们对植入后的知识仍有许多不足之处。由于显而易见的伦理考虑,可能很难阐明人类这一过程的完整机制,我们只能从体外(即在培养皿中)模型中确定这么多。这篇论文的作者通过对受精后 16-19 天自愿捐赠的男性胚胎进行单细胞 RNA 测序来阐明这些机制。在这个阶段,胚胎正在形成最初的层,这些层产生发育中的人类的主要组织和器官。对这一过程的彻底理解可以收集对先天性疾病以及妊娠并发症如何发生的见解,这可以为预期的治疗和干预措施提供信息。使用扩散图和 RNA 速度等计算方法,作者确定了发育“轨迹”——通过计算推断的发育时间线中的细胞排列——从而深入了解诱导胚胎中新生干细胞向更成熟的组织特异性细胞(如早期血细胞)过渡的转录网络,以及这些事件的时间。这项工作提供了一个令人兴奋的资源,可以与着床后发育的体外模型的数据进行比较(正如这篇伟大的论文所做的:【https://www.ncbi.nlm.nih.gov/pmc/articles/PMC8185470/】),也是发育生物学领域的一个重大飞跃。
荣誉奖:新型冠状病毒数据的多尺度 PHATE 探索揭示了疾病的多模态特征
https://www.biorxiv.org/content/10.1101/2020.11.15.383661v1
虽然 Krishnaswamy 实验室的预印本在 2020 年底才出版,但我是在今年发现它的,并有机会在今年秋天参加了 Smita Krishnaswamy 博士的虚拟研讨会,她详细地讲述了这项工作。顾名思义,这是她实验室的 PHATE 算法的扩展,PHATE 算法是另一种降维算法(你可以在原始出版物以及我的博客文章中读到更多关于它的内容)。多尺度 PHATE 的关键在于它可以以多种分辨率或尺度可视化高维数据,因此有了“多尺度”这个词。就分辨率、粒度或规模而言,我指的是流形中呈现的细节层次。例如,在粗粒度的嵌入中,我们获得所讨论数据的高级摘要,重点是全局结构和附近单元折叠成奇点。相比之下,更细粒度的流形可以洞察单元与单元之间的差异(或者更一般地说,附近的数据点如何彼此不同)。在几乎每一种降维算法中——PCA、tSNE、UMAP,甚至 PHATE——默认情况下,我们只能看到底层流形的一种分辨率或粒度级别。然而,考虑数据中所有层次的细节可能是有用的,例如,在预测疾病严重程度时。在正在进行的新冠肺炎疫情中,有大量的论文和预印本使用患者细胞的单细胞基因组学来了解新型冠状病毒病毒对我们细胞的影响,这可以让我们深入了解死亡率结果。然而,仅从一个尺度来看数据,我们可能会错过一些细节,而这些细节可以通过仅考虑患者样本中存在多少免疫细胞来区分有效的免疫反应。这就是多尺度 phat 的动机所在,他们将其应用于来自新冠肺炎患者的真实世界单细胞数据。使用上述 MELD 算法,他们可以根据疾病的严重程度对样本进行分类。这种方法背后的数学,受时间非齐次马尔可夫过程的启发,令人着迷,其应用与正在进行的疫情非常相关,值得一读。
今年你最喜欢的数据科学相关论文有哪些?你看过上面的论文吗?欢迎在下面的评论中分享你的想法。
感谢阅读这篇文章。如果你是一个媒体新手,想要无限制地阅读这些文章,同时支持像我这样的作者,考虑通过下面我的推荐链接成为一个媒体会员。我会赚取你的一部分会员费,不需要你额外付费。
https://medium.com/@jashahir/membership
可解释人工智能的五大技巧
不是 1,不是 2,而是 5 种可解释人工智能的技术
想象一下,你是一名医学专业人士,你正在使用人工智能进行中风预测。人工智能已经为你的一个病人预测了中风。当你将这些告诉你的病人时,他会感到恐慌。有两个明显的问题,他会问。
- 首先,你能解释一下为什么中风会被预测到吗?
- 第二,怎么做才能避免?
为了回答这些问题,你需要可解释的人工智能。这种情况适用于各种领域,如医疗保健、信用风险、产品推荐等。
所以在本文中,我们将通过中风预测的例子来理解可解释的人工智能。我将使用这些技术演示可解释的人工智能
- 用数据可视化解释
- 用逻辑回归机器学习模型解释
- 用决策树机器学习模型解释
- 用神经网络机器学习模型解释
- 和 SHAP 一起解释
这不是一个详尽的列表,因为还有许多其他技术。不过以上都是常用的。
病人情况
让我们从了解预测中风的患者的情况开始。患者为男性,67 岁。他有心脏病病史,平均血糖水平为 228,体重指数为 37。人工智能预测这个病人将会中风。
现在,作为一名医学专业人士,你必须准备好解释这个预测,让我们从不同的技术开始,这将帮助你做到这一点。
用数据可视化解释
这里我们不会使用任何复杂的方法,而是简单的数据可视化技术。这个想法很简单。
- 首先,以用于训练人工智能的数据为例。训练数据将包括患有中风的患者和没有中风的患者。
- 使用可视化技术,分析中风患者和非中风患者之间的区别。这将有助于你了解导致中风的因素。
- 然后你可以把它与病人的情况进行比较。这将有助于你理解为什么病人有危险。
用视觉化的方法解释(图片由作者提供)
分析两个不同群体的最好方法之一是使用雷达图。下面显示的是用于训练人工智能进行中风预测的数据的雷达图。蓝色区域对应的是未患中风的患者。橙色区域对应患有中风的患者。这两个区域的差异让我们深入了解中风的原因。
用于训练人工智能的数据的雷达图(图片由作者提供)
我们观察到患有中风的患者血糖水平高、患有心脏病、高血压、年龄相对较大且以前吸烟。这让我们很好的理解了中风的原因。
现在我们可以将这与我们的病人情况进行比较。我们看到病人满足了大多数导致中风的条件。这可以帮助我们解释为什么病人有危险。
患者的情况与导致中风的因素相比(图片由作者提供)
虽然这是一种非常简单有效的技术,但我们不知道哪些导致中风的因素比其他因素更重要。
现在让我们研究第二种技术,它将帮助我们解决这个问题。
用机器学习模型解释
预测中风的人工智能是基于机器学习模型的。你可以用这些模型来解释中风预测。有各种各样的机器学习模型,我将演示以下三个模型。
- 逻辑回归
- 决策图表
- 神经网络
让我们从逻辑回归模型开始
逻辑回归模型
这里显示了逻辑回归模型的结果。在 Y 轴上,你有不同的因素,而在 X 轴上,你可以看到这些因素对于中风的重要性。
使用逻辑回归解释(图片由作者提供)
蓝色柱表示导致中风的因素,红色柱表示有助于避免中风的因素。例如,年龄、为私营公司工作、高血糖、心脏病和高血压都可能导致中风。已婚、个体经营、生活在农村地区可以降低患中风的概率。
患者的情况显示为灰色条。我们认为,患者年龄、个人工作、血糖水平和心脏状况是解释他有中风风险的因素。他的身体质量指数(体重指数)很低,不是潜在中风的原因。
与早期的雷达绘图技术相比,这种方法更加精确。我们现在能够精确确定哪些是导致潜在中风的首要因素。
逻辑回归模型是解释任何预测的绝佳方式,因为它有助于我们识别哪些因素比其他因素更重要。例如,这里我们知道患者的血糖水平比患者的体重指数更重要。
然而,到底是什么样的葡萄糖水平导致了患者潜在的中风?让我们用决策树模型来回答这个问题。
决策树模型
这里显示的是决策树模型的结果。这个模型有不同的决策节点,显示为黑点。这些决策节点指示字段和阈值。最后一个节点是患者是否会中风。患者的决策路径以绿色显示。
使用决策树的说明(图片由作者提供)
通过决策树模型,我们知道了导致中风的因素以及阈值。例如,我们看到患者的决策路径经过标记为平均葡萄糖水平和阈值 104.47 的节点。所以,我们现在知道,超过 104.47 的葡萄糖水平将会导致我们的患者潜在的中风。
这比之前显示的逻辑回归模型更精确。这也有助于建议患者的葡萄糖水平,并采取必要的措施将其降低到 104.47 以下
因此,我们不仅解释了潜在中风的原因,还建议患者采取措施降低风险。
神经网络模型
现在让我们转向神经网络机器学习模型。下图是一个用于中风预测的神经网络。它由输入神经元、中间神经元和输出预测组成。每个神经元向其他神经元发送一个正信号和一个负信号。灰线表示正信号,红线表示负信号。
绿色圆圈表示在对患者进行预测的过程中激活的神经元。
你可以看到神经元 1_4 被强烈激活,这里用一个粗绿圈表示。这个节点正在向非中风神经元发送负信号。这意味着患者中风的可能性很高。
现在让我们“窥视”神经元 1_4 的内部,看看这个神经元“内部”是什么。神经元的“内部”显示为雷达图。雷达图基于输入神经元和从它们接收的信号。蓝色表示来自输入神经元的正信号,红色表示来自输入神经元的负信号。
神经元内部 1_4(图片由作者提供)
我们看到来自输入神经元的葡萄糖水平、心脏病和年龄的非常高的信号。这意味着对于患者来说,血糖水平、心脏病和年龄是导致中风预测的条件。这些解释类似于我们使用早期模型所获得的结果。
SHAP
现在,以上三个模型给出了相似的解释,然而,解释模型的方式却大不相同。因此,SHAP 出现了,它代表着沙普利附加解释。它能够解释任何模型。
无论使用何种机器学习模型,SHAP 都有助于用单一的方法来理解预测
我们中风预测的 SHAP 如下所示。无论使用何种机器学习模型,可视化都是相同的。
用于患者中风预测的 SHAP
你会看到两条垂直的虚线。左边的灰色虚线对应于数据中任何患者发生中风的预期概率。我们看到这大约是 50%。这是因为在用于机器学习的数据中,大约 50%的患者患有中风,50%的患者没有中风。右边的红色虚线对应我们的病人。这条线是 74.8%,因为我们的病人有 74.8%的中风概率。横条代表不同的因素,以及它们如何将患者中风的可能性从 50%增加到 74.8%。
SHAP 这个名字也来自于这种分析的性质,这种分析显示了不同的因素如何叠加起来导致预测的结果。下面显示的是每个因素对中风预测的贡献。
每个因素对中风预测的贡献(图片由作者提供)
我们看到年龄对中风概率的贡献为 15%,血糖水平对中风概率的贡献为 10%,身体质量指数(体重指数)对中风概率的贡献为 4.4%。
现在,因为我们知道每个因素对中风概率的贡献,我们也可以使用这种分析对病人提出任何建议。年龄不能改变,但如果平均葡萄糖水平和体重指数可以降低,那么中风的风险可以从 74.8%下降到 60%。
有助于降低中风风险的因素(作者图片)
因此,我们能够解释这些预测,以及关于可以做些什么来降低风险以及降低多少的建议。
摘要
下面是本文中描述的技术的总结
技术总结(图片由作者提供)
正如你所看到的,所有这些可解释的人工智能技术都不是“有多好”,而是强制性的。使用这些技术将帮助你更好地与受人工智能决策影响的人沟通。在某些情况下,如中风预测的例子所示,理解这些技术可以帮助改善或挽救生命。
额外资源
网站(全球资讯网的主机站)
你可以访问我的网站进行零编码分析。https://experiencedatascience.com
请订阅每当我发布一个新的故事时,请及时通知我。
https://pranay-dave9.medium.com/subscribe
你也可以通过我的推荐链接加入 Medium。
https://pranay-dave9.medium.com/membership
https://www.youtube.com/c/DataScienceDemonstrated 的 YouTube 频道
这里是我的 Youtube 频道
的链接
前 5 名时间序列分析
了解时序数据的主要用例及技术
布莱斯·巴克在 Unsplash 上拍摄的照片
时间存在于我们周围的大部分数据中。从零售产品销售数据到金融股票价格,再到物联网传感器数据,都有时间的概念。因此,掌握时间序列分析将使你掌握数据科学世界
我将在此展示的 5 大分析是
- 季节性检测发现零售产品销售高峰
- 动态时间扭曲查找具有相似销售模式的产品
- 自相关识别上升趋势的金融股
- 变点检测,以更好地了解股票价格趋势的变化
- 快速傅立叶变换进行工作量规划
季节性检测
在本例中,我将使用零售产品销售数据来演示季节性检测。季节性意味着某些特定月份的销售额比其他月份高
数据由产品、日期和销售量组成
零售销售数据(图片由作者提供)
让我们以名为兔子夜灯的产品为例。这张图表显示了这种产品每月的销售情况
产品兔子夜灯的销售数据(图片由作者提供)
数据是 2019 年和 2020 年的。现在,我们看到这款产品在 2019 年 11 月达到销售峰值,然后这一峰值将在 2020 年 11 月重复出现。这意味着兔子夜灯的销售数据存在季节性
这种手动查看销售图表并确定季节性的方式很好,但是当您有数千种产品时,您需要一种自动化的方式来确定季节性。这就是季节性检测算法可以发挥作用的地方。
以下是应用于多种产品的季节性检测算法的结果
多种产品的季节性检测(图片由作者提供)
在 X 轴、上,你有销售高峰重演的时间。Y 轴给出了峰值的指示。所以我们的产品兔子夜灯在右上角。季节性检测估计销售高峰每 12 到 13 个月重复一次,这意味着一年中只有一个销售高峰
现在让我们看看其他一些产品,比如上面的可视化中的二战滑翔机。该产品每 6 个月有一个销售高峰。这意味着一年内会有两次销售高峰。
这是产品二战滑翔机 ASSTD 设计的销售趋势
产品 WW2 滑翔机的销售数据(图片由作者提供)
我们看到该产品在 2019 年 4 月和 2019 年 10 月达到销售高峰,销售高峰将在 2020 年 4 月和 10 月再次出现
因此,正如你所看到的,季节性检测是一种非常强大的方法,可以自动检测多个销售高峰,而无需查看每种产品的单独销售图表。它还有助于错误地计划产品的库存水平
动态时间扭曲(DTW)
该算法的名称可能听起来像一台时间机器,但我们将使用它来查找零售数据中具有相似销售模式的产品。
数据由产品、月份和当月销售额组成。此处显示的样本数据
零售数据示例(图片由作者提供)
这是应用于零售数据的动态时间扭曲的结果。每个点代表两种产品。如果圆点在更左边,意味着两种产品有相似的销售模式。与两个极端点相关的产品如下所示
DTW 多产品(图片由作者提供)
根据算法,产品 WOODLAND_CHARLOTTE_BAG 和 JUMBO_BAG_BAROQUE 具有相似的销售模式。如果我们移到右边,我们可以看到销售模式完全不同的产品。在这种情况下,我们有蛋糕盒和兔子夜灯,它们有完全不同的销售模式
现在让我们先看看伍德兰 _ 夏洛特 _ 包和珍宝 _ 包 _ 巴洛克的销售情况。这是伍德兰 _ 夏洛特 _ 包和珍宝 _ 包 _ 巴洛克的销售。
相似模式产品的销售(图片由作者提供)
这两种产品有相似的销售模式。这两种产品都在 3 月、6 月和 8 月达到峰值。然后销售减少。
现在,即使两种产品的销售数量不准确,DTW 算法也能够正确识别这两种具有相似销售模式的产品
现在让我们来看看蛋糕盒和兔子夜灯的销售情况,这两种产品已被算法识别为销售模式完全不同的产品。这里用灰色显示的兔子夜灯一年只有一次销售高峰,但是用橙色显示的蛋糕盒却有多次销售高峰
销售模式不相似的产品(图片由作者提供)
正如你所看到的,DTW 非常聪明,并且名副其实
自相关
在这一节中,我们将讨论自相关,让我们从一个概念性的例子开始。假设我们有一只股票,它的股价图看起来像这样。
股票图表(图片由作者提供)
现在你可以看到,第 9 天的价格上涨了,第 8 天的价格下降了。这意味着第 9 天和前一天之间存在负相关。现在如果你也能看到第 9 天的价格上涨了,第 7 天的价格也上涨了。这意味着在第 9 天和第 2 天之间存在正相关
现在让我们转向金融交易。在这个例子中,我们将从 CAC 40——法国股票市场——获取股票。这是应用于法国股票市场的一些股票的自相关结果。
自相关多股符号(图片由作者提供)
现在让我们取位于最顶端的深蓝色的点。它们对应于股票 ABIO。
任一期与前一期的相关值为 0.99。相关值接近 1 意味着存在正相关。这意味着如果某一天的价格上涨,前几天的价格也会上涨。这表明 ABIO 的价格总体上一直在上涨。一般来说,较高的股票在视觉上,意味着他们是上升趋势的股票
现在,在这种可视化中,底部越多,意味着股票不同时期之间的相关性越小。举个例子,如果你拿阿蒙来说。PA,它位于可视化的底部。相关值在 0.30 秒左右。这意味着股票价格在不同时期之间没有太大的相关性。这表明这只股票没有明显的趋势
现在让我们看看 ABIO 的价格趋势。这是 ABIO 的价格趋势。正如你所看到的,这是一只上升趋势的股票
ABIO 的股票图表。PA(图片由作者提供)
这里是阿蒙的价格。PA,正如你所看到的,这支股票已经上涨,然后下跌,再上涨。没有明确的趋势
AMUN 的股票图表。PA(图片由作者提供)
变化点检测
变点检测有助于检测时序数据的趋势变化。在这里你将展示我们如何用它来分析股票市场趋势的变化。
在这个例子中,我们将从 CAC 40——法国股票市场——获取股票。以下是股票代码 AMUN 在 2020 年 2 月至 2021 年 3 月之间的价格。我们可以看到这只股票先下跌,然后上涨,再下跌。使用变化点检测算法,您可以准确地绘制出趋势变化发生的位置
变化点检测(图片由作者提供)
该算法已经检测到 4 个变化点,并用这些垂直线表示。有了这些垂直线,我们可以很容易地确定每个趋势的时间周期。
我们可以看到改变点的时间。我们在 3 月有一个转变点,然后在 6 月左右有一个转变点,然后在 11 月左右有一个转变点。这意味着趋势的持续时间在 3 到 4 个月左右。随着最后一个转折点在 2020 年 11 月左右,我们应该预计未来一个月的趋势变化
快速傅立叶变换
快速傅立叶变换是世界上应用最广泛的算法之一。通过工作负载规划的一个用例来了解这一点。我们将以美国蒙哥马利县的 911 电话呼叫数据为例。该数据包含日期、时间和收到的电话数量。这是时间序列数据,因为呼叫次数取决于时间
这是样本数据
911 示例数据(图片由作者提供)
如果你画一条曲线,它会像这样。
911 数据的时间图(图片由作者提供)
在 X 轴上,我们用一小时来表示每天的时间。Y 轴表示收到的电话数量。现在,对于任何工作负载规划,我们都需要知道预期的峰值工作负载是什么时候,以便我们能够规划足够的资源
现在只看上面的图表,很难理解它,因为它不是很平滑,而且有很多变化
现在让我们谈谈应用快速傅立叶魔法。快速傅立叶变换有助于在时序数据中发现重复且平滑的信号。这是 FFT 的结果,显示了算法发现的重复信号。
FFT 信号(图片由作者提供)
重复信号在早上 6 点到 7 点开始,在 18 点到 19 点左右达到最大值,然后下降,然后在第二天早上 6 点到 7 点再次开始。
与原始数据相比,这个信号要平滑得多,我们可以使用它来制定工作负载计划。根据这个信号,我们应该有大约 5 到 7 人的最小数量,然后我们增加我们的容量,以达到 17 小时到 20 小时之间的最大容量。然后我们可以减少接听电话的人数,然后我们在早上 5 点到 7 点之间重新开始工作
因此,正如您所看到的,FFT 对于将噪声数据转换为易于解释和采取行动的平滑信号非常有用
这是一些顶级技术的概述,你可以在一些非常强大的应用和用例中使用时间序列数据
额外资源
网站(全球资讯网的主机站)
你可以访问我的网站进行零编码分析。【https://experiencedatascience.com
请订阅每当我发布一个新的故事时,请随时关注。
https://pranay-dave9.medium.com/subscribe
你也可以通过我的推荐链接加入 Medium。
https://pranay-dave9.medium.com/membership
Youtube 频道
这里是我的 Youtube 频道
https://www.youtube.com/c/DataScienceDemonstrated的链接
开始新的数据科学角色的 5 大技巧
初入一家公司可能会令人害怕,但也不一定如此
照片来自 Unsplash 上的 Prateek Katyal
本周早些时候,我在脸书的一个群里看到了一个第一次实习的学生发的帖子。当我读这篇文章时,它让我想起了我初入职场时的挣扎。她的帖子讨论了她在哪里工作,并继续说她觉得“没有指导,没有教学,没有教程。”看到这里,我想分享我的 5 个建议,当你刚开始工作或领域时,如何开始一个新的角色。
1.网络
以前在大学的时候经常听到有人反复说这句话,不明白它的重要性。人脉是巨大的,这是你认识你的团队和你工作的公司里的其他人的方式。当你在一家大公司工作时,建立关系网的一个关键优势是找到在同一领域和不同项目中工作的人。你可以从不同的角度体验在数据科学和工程领域可以做些什么。如果你的公司提供这些,加入实践社区,杂志/读书俱乐部,人工智能/人工智能论坛,等等!你将开始睁开你的眼睛去发现更多的东西。
2.拥有 1:1 的。
从一个新的角色开始,一件很棒的事情(类似于人际关系网)是主持 1:1。与你的经理、团队中的每个人以及你将与之共事的其他团队中的任何关键人物会面。利用每一次一对一的机会介绍自己,了解对方,并了解你们两个角色将如何互动。如果是你的经理或团队领导,确保你知道他们对你头 90 天的期望。他们希望你立即开始开发并拥有一个工作特性吗?他们想让你在项目的某个方面加快进度吗?这是你确定你知道你需要做什么的时间。
3.提问
提问是我至今仍遵循的最好建议。如果你对某事感到困惑,你正面临一个你无法克服的挑战,或者你想确保你正确理解了一个问题,就去问。你能为自己做的最糟糕的事情就是默默忍受。在我的上一份工作中,我从导师那里得到的最好的建议之一是:
没有愚蠢的问题。如果你被卡住了,可能不止你一个,那就去问,去学。
他这样对我说是因为我会在我所有的问题后面加上“那么,我有一个愚蠢的问题…”一旦他给我指出来,我停下来,但继续问我的问题。它极大地帮助了我向我的团队传达我的问题和顾虑。
4.研究和阅读。
开始一份新工作可能会令人害怕,主要是当讨论的事情超出你的理解范围时。当你坐在会议上听团队讨论时,写下使用的关键术语。这些可以包括特定类型的分析、函数/库、缩略语等等!当你积累这个列表时,研究一下正在讨论的内容,并仔细阅读。有时候,如果某个主题是公司内部的东西,你可能找不到,这没关系。这些是你可以在 1:1 会谈中提出或向你的同事询问的问题。
另一个做研究的好方法是询问你的团队是否读过发表的论文或书籍。我目前的团队经常分享发表的研究论文。他们分享的论文与我们正在做的工作密切相关。通常,它们是帮助做出决策的部分,或者是专注于我们想要实现的特定算法和数学概念的部分。联系你的队友,看看他们推荐你读什么。基于这些建议,你有了一个很好的研究起点和你可能感兴趣的其他领域。
5.教程和文档。
在我迄今为止担任的几乎每一个角色中,都没有多少关于做事的文档和指南。这似乎是科技工作的一个普遍趋势。如果你正在做的工作就是这种情况,那就主动写一些。为你如何克服一项任务创建文档或写一个教程是有益的,原因有二:(1)写下你学到的东西,确保你理解它,(2)你留下一些东西给下一个人在入职时使用。我喜欢文档和写作,所以这是我在工作中经常承担的任务。我试着让事情变得比我发现它们时更好。
最终想法
开始一个新的角色是很可怕的,当你觉得没有好的指导时,这种情况会更严重。不要坐等事情顺其自然,而是自己动手,通过以下方式寻找指导:
- 与公司中与你有相似兴趣的人建立联系。
- 与您的经理、团队领导、队友或其他人进行一对一的交流!1:1 是抓住某人的时间并进行集中讨论的好方法。
- 提问。与其保持沉默,忍受痛苦,不如提出问题。向你的同事寻求帮助,消除你的困惑或担忧。
- 研究和阅读。收集常用术语并进行研究。了解正在讨论的内容。是公司还是团队的缩写?问问吧。
- 教程和文档很棒,但是团队并不总是拥有它们。如果你的团队缺少文档,可以提议自己写。你有机会展示你学到的东西,提供给下一个人。
在你的角色中,你通过哪些方式寻求指导和帮助?有哪些小技巧帮助你适应了新工作? 如果你想保持更新,我将开始一个简讯!
帮助你完成日常任务的 5 大未知 ML 库
用这 5 个必备的库提高你的编码速度
https://unsplash.com/photos/Nj8pk8c8uI4
我一直注意到,任何领域的顶级专家都能够比普通人更快地创造出令人惊叹的东西,这不是因为他们更聪明,而是因为他们能够更快地重复自己的想法。快速迭代的一个基本要素是拥有一些代码片段和库,它们有助于更容易地构建复杂的模型。在这篇文章中,我想分享我的必备机器学习库,你可能还没有听说过。
PyTorch 预测
今天我名单上的第一位客人是一个令人敬畏的 PyTorch 预测 Python 库。在这个工具的帮助下,我能够在创建时间序列预测模型时测试更多的方法。该库包含多个模型,如 NBeats 和 TemporalFusionTransformer,正如作者坚持认为的那样,它们优于亚马逊 DeepAR 算法。要使用这些模型进行训练和预测,您必须首先准备数据集,然后才能使用新模型进入拟合/预测阶段。
**import** pytorch_lightning **as** pl
**from** pytorch_lightning.callbacks **import** EarlyStopping**,** LearningRateMonitor
**from** pytorch_forecasting **import** TimeSeriesDataSet**,** TemporalFusionTransformer
*# load data*
data **=** **...**
*# define dataset*
max_encode_length **=** **36**
max_prediction_length **=** **6**
training_cutoff **=** "YYYY-MM-DD" *# day for cutoff*
training **=** TimeSeriesDataSet**(**
data**[lambda** x**:** x**.**date **<** training_cutoff**],**
time_idx**=** **...,**
target**=** **...,**
*# weight="weight",*
group_ids**=[** **...** **],**
max_encode_length**=**max_encode_length**,**
max_prediction_length**=**max_prediction_length**,**
static_categoricals**=[** **...** **],**
static_reals**=[** **...** **],**
time_varying_known_categoricals**=[** **...** **],**
time_varying_known_reals**=[** **...** **],**
time_varying_unknown_categoricals**=[** **...** **],**
time_varying_unknown_reals**=[** **...** **],**
**)**
*# create validation and training dataset*
validation **=** TimeSeriesDataSet**.**from_dataset**(**training**,** data**,** min_prediction_idx**=**training**.**index**.**time**.**max**()** **+** **1,** stop_randomization**=True)**
batch_size **=** **128**
train_dataloader **=** training**.**to_dataloader**(**train**=True,** batch_size**=**batch_size**,** num_workers**=2)**
val_dataloader **=** validation**.**to_dataloader**(**train**=False,** batch_size**=**batch_size**,** num_workers**=2)**
*# define trainer with early stopping*
early_stop_callback **=** EarlyStopping**(**monitor**=**"val_loss"**,** min_delta**=1e-4,** patience**=1,** verbose**=False,** mode**=**"min"**)**
lr_logger **=** LearningRateMonitor**()**
trainer **=** pl**.**Trainer**(**
max_epochs**=100,**
gpus**=0,**
gradient_clip_val**=0.1,**
limit_train_batches**=30,**
callbacks**=[**lr_logger**,** early_stop_callback**],**
**)**
*# create the model*
tft **=** TemporalFusionTransformer**.**from_dataset**(**
training**,**
learning_rate**=0.03,**
hidden_size**=32,**
attention_head_size**=1,**
dropout**=0.1,**
hidden_continuous_size**=16,**
output_size**=7,**
loss**=**QuantileLoss**(),**
log_interval**=2,**
reduce_on_plateau_patience**=4**
**)**
print**(**f"Number of parameters in network: {tft**.**size**()/1e3**:.1f}k"**)**
*# find optimal learning rate (set limit_train_batches to 1.0 and log_interval = -1)*
res **=** trainer**.**tuner**.**lr_find**(**
tft**,** train_dataloader**=**train_dataloader**,** val_dataloaders**=**val_dataloader**,** early_stop_threshold**=1000.0,** max_lr**=0.3,**
**)**
print**(**f"suggested learning rate: {res**.**suggestion**()**}"**)**
fig **=** res**.**plot**(**show**=True,** suggest**=True)**
fig**.**show**()**
*# fit the model*
trainer**.**fit**(**
tft**,** train_dataloader**=**train_dataloader**,** val_dataloaders**=**val_dataloader**,**
**)**
此外,您可以在 PyTorch 预测的基础上轻松构建更复杂的东西。Pytorch 一如既往地出色,并且易于扩展。
TabNet
继论文之后 TabNet:专注的可解释表格学习 TabNet 模型已经成为许多表格数据任务的超级明星。例如,在最近的 Kaggle challenge 行动机制(MoA)预测中,TabNet 胜过了树相关模型。TabNet 肯定不能更好地处理任何类型的表格数据任务,但我肯定会尝试一下,尤其是因为它有一个非常非常简单的 API。
from pytorch_tabnet.tab_model import TabNetClassifier, TabNetRegressor
clf = TabNetClassifier() #TabNetRegressor()
clf.fit(
X_train, Y_train,
eval_set=[(X_valid, y_valid)]
)
preds = clf.predict(X_test)
如您所见,这与 PyTorch 默认 API 调用几乎没有任何区别。
Python 的媒体管道
谷歌的 Mediapipe 库可以大大节省你的时间,当你创建计算机视觉模型,如人脸检测,姿势估计,头发分割,等等!Mediapipe API 真的很简单。下面是通过 Python 脚本在桌面上运行姿态估计模型的完整代码。
import cv2
import mediapipe as mp
mp_drawing = mp.solutions.drawing_utils
mp_pose = mp.solutions.pose
# For webcam input:
pose = mp_pose.Pose(
min_detection_confidence=0.5, min_tracking_confidence=0.5)
cap = cv2.VideoCapture(0)
while cap.isOpened():
success, image = cap.read()
if not success:
print("Ignoring empty camera frame.")
continue
image = cv2.cvtColor(cv2.flip(image, 1), cv2.COLOR_BGR2RGB)
image.flags.writeable = False
results = pose.process(image)
image.flags.writeable = True
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
mp_drawing.draw_landmarks(
image, results.pose_landmarks, mp_pose.POSE_CONNECTIONS)
cv2.imshow('MediaPipe Pose', image)
if cv2.waitKey(5) & 0xFF == 27:
break
pose.close()
cap.release()
您不仅可以非常快速地创建和部署这些模型,而且它们比它们的类似物工作得更好。例如,iPhone 上的 MediaPipe hand landmark 模型比 iPhone 上可用但默认的相同模型运行得快得多。如果你想在 Python 上尝试这些模型,目前只有手界标、姿势界标、面部网格和整体模型可用。但是正如开发者所说,他们很快就会添加更多的 Python 模型。
急流
你有没有花几个小时训练一个 KNN 模特,然后失去耐心,停止训练?嗯,我做到了...好的一面是,你不会在一个令人敬畏的急流图书馆中再次体验到这一点。它允许在 GPU 或 GPU 集群上运行许多标准的 ML 算法。不仅如此,它还允许在 GPU 上运行熊猫数据帧的计算,这有时会很方便。模型拟合的 API 也非常简单,只需几行代码,就大功告成了!
model = NearestNeighbors(n_neighbors=KNN)
model.fit(X_train)
distances, indices = model.kneighbors(X_test)
你可以在这里看到完整的 KNN 试衣教程。
达斯克
我今天名单上的最后一个但绝对不是最不重要的是达斯克。我过去常常纠结于 PySpark API,并没有真正设法完全学会它。Dask 有类似的功能,但它更像默认的 Numpy/Pandas API,事实上,它甚至有类似名称的方法,我觉得这非常有用。
df[['x', 'y']].rolling(window='24h').mean().head()
你能猜到是 Dask 执行了这个操作吗?你看,和熊猫一样!
最后的话
感谢您抽出时间阅读本材料!我希望它能拓宽你的视野,甚至对你未来的项目有所帮助。我正计划写更多像那样有帮助的帖子,如果你喜欢,你可以关注我的个人资料,不要错过它们。
如果你对我是谁和我的项目感兴趣,你可以访问我的个人网站了解更多:artkulakov.com
成为优秀数据科学实习生的五大方法
实习期间值得关注的领域
在我的本科和研究生学位期间,我把暑假集中在获得实习和尽可能多的学习上。我用这些经历来发现我开始全职工作时想做什么。回顾过去,有五件事我希望在我的实习中做得更多,这是我在过去 1 年半的全职工作中做的。
提问
对提问持开放态度。如果你被困在某件事情上,对某个项目感到困惑,或者觉得你可能错过了什么,那么就去问。当我开始目前的工作时,我对问一些对别人来说似乎是常识的问题感到有些不安。
我工作大约三个月后,一位同事给了我一些很好的建议。他说,你问的问题没有一个是愚蠢的。这些都是你需要回答的有效问题。记下这些,我不再担心其他人会如何看待我的问题,而是敞开心扉去问他们。我发现澄清我对一个项目的任何疑问比等待并做出错误的假设要好。
如果我能很快将我的问题放进信息或电子邮件中,那么我会经常以这种方式联系他们。否则,如果我的所有问题都集中在我正在处理的特定项目或主题上,我发现与某人或一小群人快速通话以获得答案或解决我面临的挑战会更容易。有时候,一个简短的电话比通过短信或电子邮件解释一切更直接。如果这有助于共享我的屏幕,我可以浏览我正在处理的代码或数据,并突出显示我的问题区域,这将非常有帮助。
经常问更多的问题可以让我澄清任何误解,调整我正在做的工作,更快地解决问题。如果你的问题感觉太简单也不用担心。我们都在某个时候经历过。我特别发现提问至关重要的一个领域是入职。如果你对新团队的员工入职感到困惑,或者有什么不清楚的地方,尽早并经常询问。您的困惑有助于改进下一位员工的入职流程。
虚心学习
沿着员工入职到新团队的路线继续,你会希望在实习期间重点关注阅读和学习。你的入职是第一个面对新团队和许多新流程的地方。在短时间内尽可能多地开放阅读和学习。这是了解你的团队如何运作,设置你的电脑,并对公司和团队进行培训的时间。
随着实习的继续,尽可能多的吸收。数据科学是不断变化的领域之一,这意味着总有新的东西要学。在我的团队中,我经常阅读其他人的代码或查看他们共享的链接,以了解他们正在做什么以及我的工作如何与他们的工作相关联。我最喜欢做的两项任务之一是代码审查。这些会议允许您经常阅读他人的代码,与他们讨论他们的设计决策,并更加熟悉不同的库。如果你在实习期间有机会参与代码评审,那么就好好利用这个机会吧!
另一个我可以学习和喜欢参加的领域是午餐和学习,一群人讨论一个特定的话题。这是一个很好的机会,可以听到其他人在做什么,看到他们工作的影响,并提出问题。我经常参加午餐并听取团队以外的个人介绍,这让我对数据科学在公司内的应用有了更广阔的视野。如果你能参加这样的电话会议,这将是了解同一家公司内不同团队如何利用数据科学技术的绝佳方式。
不管你在什么团队,什么公司,都要坚持阅读和学习。您可以通过多种方式了解数据科学以及它在您的行业和公司中的应用。
介入
另一个不断了解你的行业或公司的方法是更多地参与你的社区。自从担任目前的职位以来,有两件事帮助我对这个行业和我所从事的产品有了更多的了解:要求接受培训和加入不同的团体。
要求培训材料和团队产品概述不仅仅是前面提到的员工入职培训。主题专家在现场介绍了这些会议,他们讲述了我们公司制造的产品。我参加的第一次训练感觉像是一大堆材料同时扔向我。一开始可能会让人不知所措,但是你从中学到的越多,问的问题越多,你就会越明白。
参加完培训后,我不得不后退一步,根据我从培训中学到的东西来确定我需要填补哪些空白。一开始可能会觉得力不从心,但是如果你一步一步来,你可以从你参加的材料和培训中学到很多。如果你的公司不提供任何特定的培训,搜索适合你的行业的网络研讨会和会议。这些让你了解这个领域是什么样子的,以及你的公司如何融入其中。
我做的第二件事是加入公司内外的不同团体。这些小组分别专注于航空航天的各个方面。例如,我通过 SAE 加入了集成车辆健康管理标准委员会,以了解航空航天领域的标准是如何编写和开发的。此外,我还在公司的人工智能社区做志愿者。这让我看到了不同团队如何使用数据科学技术。加入这样的各种团体帮助我对航空航天领域的数据科学有了更全面的了解。
有很多选择可以让你更好地了解你工作的公司和行业。要想更多地参与进来,先弄清楚有什么是你感兴趣的。加入一个项目或者志愿加入一个团体,这将会让你探索这些兴趣。
网络
你可能经常听到这句话,我知道我是这样做的,但是知道如何交际是一项有价值的技能,即使你已经有了一份工作。在我的第一次实习中,我对结识新朋友和与他们交谈感到犹豫,但现在我看到了这种技能的价值。目前,我经常与当前公司内外的个人建立联系。
能够与不同的个人建立关系网帮助我在公司内找到了我感兴趣的团队,并与他们一起开展项目。我也遇到了不同层次的人,我可以和他们谈论他们的职业生涯以及他们是如何到达那里的。进行这些对话帮助我了解了未来五年我想要什么,以及如何实现这样的目标。
当你开始实习的时候,敞开心扉与公司内部的个人建立联系。假设你在电话中或通过电子邮件链认识了某个人,你想和他多谈谈,给他们发一个会议邀请。我发现大多数人都愿意见面并回答问题。与我自己公司内部的人建立关系网帮助我了解了公司的不同方面。我可以看到其他团队在做什么,以及我的工作如何与他们的工作以及他们的工作与我的工作相关联。
人际关系网也是结识可以成为你导师的人的好方法。通过人际关系网,我能够找到我的三位导师,他们都在事业上取得了不同程度的成功,而我也努力在自己的事业上取得成功。拥有这些联系对我更深入地参与我的领域、做出职业决策和寻求反馈都很有价值。
分享你的想法
最后,开放地分享你的想法。如果你有一个想法,不管多小,都要分享出来。许多团队乐于分享想法、新概念和改进工作的想法。请不要觉得你不能分享你的想法,你的团队可以做得更好。你被邀请加入团队实习,所以好好利用这个职位。
我的一些实习经历让我觉得我不能分享我对所见流程的想法以及如何改进它们,但我没有让这阻止我。我至少可以提供我的意见,讨论为什么或为什么这可能是一个好主意,并让团队决定如何处理这些信息。
最后的想法
作为一名数据科学实习生,怎样做才能出类拔萃?这是一个有很多可能答案的问题。我希望在实习中更加关注的事情包括:
- 问更多的问题。
- 尽可能多地阅读和了解公司、行业和团队。
- 参加不同的团体和活动。
- 继续与公司内部的人交往,了解他们的工作。
- 不管多小,分享你的想法。
你从实习中学到了什么?
如果你想阅读更多,看看我下面的其他文章吧!
保持技能和知识相关性的五大方法
在办公室内外保持学习的不同方法
很难找到时间来保持技能的相关性,尤其是那些我们在工作中没有积极使用的技能。作为人,我们在工作之外还有其他需要我们关注的义务和承诺。我最近在 Carrie 写的另一篇帖子上收到了一个评论,说:“ 同意,我感到羡慕,并经常问他们如何以及何时腾出时间来保持他们的技能“新鲜”并与他们的行业相关。她指的是我写的一句话,我嫉妒那些在职业生涯中很晚才开始的人,想知道他们是如何做到这一点的。当我读她的评论时,它激发了我写一篇关于我如何保持我的技能和知识与我的行业相关的帖子的想法。
1.加入你所在领域的委员会或组织。
在 STEM 中,您可以加入各种委员会和组织,这些委员会和组织由一群来自不同背景的人组成,他们聚在一起履行特定的职能。委员会或组织是与和你有相似兴趣的人联系和交往的好方法。
有些委员会可能是公司内部的。这些都是参与和你的行业相关但不同于日常工作的事情的好方法。在我的最后一份工作中,我志愿加入 AI/ML 指导委员会,与在该领域工作的整个组织的个人建立联系。这个机会让我更多地了解了我工作的公司,并让我看到不同的部门如何利用类似的技术。
其他委员会和组织在贵公司之外。去年,我加入了 SAE 下属的一个委员会,该委员会专注于制定综合车辆健康管理标准( HM-1 IVHM )。我通过与我上一个组织中的个人建立关系网,建立了这个委员会。我喜欢这种类型的委员会,因为它专注于我感兴趣的主题。不过,这也让我能够向来自不同国际、文化和行业的人学习。虽然每个人都对 IVHM 感兴趣,但这些人从世界各地赶来讨论和编写标准。
委员会和组织是一个很好的方式,可以让你参与到与你的行业相关但又不同于你今天所做的事情中。
2.参加会议。
这可能看起来像是一个给定的,但参加会议。不只是大牌会议,寻找更小的,更亲密的聚会。我发现更专注于学术研究的小社区是了解大学里正在做的事情的好方法。在那里,你可以与学生和教授互动,在演讲后参与关于他们工作的对话,并与个人建立联系。
有时,大型会议可能会人山人海,或者你无法获得更多一对一的时间与人们就某个主题进行更深入的讨论。同样,公司赞助的会谈也可以,但通常都是高层次的。他们不能透露自己公司的知识产权,而学术讨论可以深入到他们所展示的工作背后的理论和方法的本质。听别人讨论他们的研究可以激发伟大的想法!
3.阅读学术论文或加入读书俱乐部。
我发现自己跟上潮流的另一个方法是阅读。无论你是阅读书籍、论文还是博客,这些都可以帮助你了解正在发生的事情,了解该领域正在发生的变化,并知道你可能需要提高哪些技能。我经常阅读学术论文来激发我工作的灵感。
- 他们在研究中使用了什么技术?
- 他们是如何收集数据的?
- 他们在处理和清理数据时做了哪些考虑?
这些都是值得寻找和理解的伟大事物。你和你的团队可能用一种方式做一些事情,还有很多其他的方法。
我工作过的一份工作有一个程序员读书俱乐部。每周我们都讨论这本书的一章,并讨论我们学到的东西。这个俱乐部里我最喜欢的书是罗伯特·C·马丁的《干净的代码》。在这些讨论中,个人会提出他们如何看待实践中使用的技术,以及它如何可能是或可能不是最好的做事方法。听起来很有趣,因为这些人来自不同的背景。有前端开发人员、后端开发人员、数据科学家、数据工程师等等。像这样的俱乐部是我最喜欢的阅读和学习方式之一,因为它们可以让各种各样的人聚集在一起,表达他们对这个主题的不同观点。
4.教!
无论是在公司内部的会议、午餐和学习上,还是在大学校园里,你都可以找到很多方法来教别人你学到的课程和技能。教学是一种很好的方式来练习一项技能,并找出如何将你所学到的知识传授给下一个人。它还可以帮助巩固你已经获得的知识。
如果你在工作之外没有时间,我最喜欢的方法之一是举办一次公司或团队午餐,学习一下。在我上一个组织中,这些活动每月举办一次,人们会选择一个话题进行讨论。通常,在每次一小时的会议中,我们有 2-3 个人发言。在这种形式下,你可以展示你已经完成的工作或研究,讨论分析结果,或者展示你正在学习的新的 ML 技能。
我享受了午餐,学习了数据科学。这些会议可以让你在分析过程中获得一些关于不同事物的反馈。有时人们会引用你可能没有意识到的其他数据集,或者你可以尝试的新技术。进行这些对话不仅是对他们的学习经历,也是对你自己的学习经历!
5.要求加入你资历较浅的项目。
我们经常会在工作中接到适合我们技能的项目。有时候,它们可能对我们来说根本不是挑战,甚至是乏味的。如果你开始觉得自己每天都在做同样的事情,问问是否有你目前技能范围之外的工作可以参与,或者看看是否有你可以跟踪的人,以便更好地了解他们在做什么。当我想接触新事物时,这是我发现自己在做的两件事。问一问也无妨,他们最多只能说不,然后你决定下一步怎么继续你的技能和知识发展。
最终想法
无论你是想在工作时间专注于你的职业发展,还是在工作之外有额外的时间可以消耗,这些都是保持你的技能和知识相关的好方法。
- 加入你所在领域的委员会或组织。如果你在一个更大的组织中,他们可能会加入一些委员会并积极参与工作。
- 参加会议。无论大小,会议都有很多值得学习的地方。这些也是建立关系网的好地方!
- 阅读学术论文或加入读书俱乐部。如果你没有太多的时间专注于阅读,那就找一些与工作密切相关的研究论文或书籍。
- 教!无论你是坚持参加公司活动还是向外拓展你的教学,在教育别人的同时,利用这个机会巩固你所学的知识和技能。
- 要求加入你资历较浅的项目。向工作影子询问。你可以在工作时间使用这两种技巧来保持你的技能,并学习业务或团队的新方面。
你最喜欢用什么方式来保持你的技能和知识的相关性?你会给这个列表添加什么吗?
本文包含附属链接。如果你想了解更多,可以看看我下面的其他文章!
寻找数据科学自由职业的 7 大网站
自由职业是一个很好的选择,尤其是在今天
7 照片由 Bram Naus 在 Unsplash 上拍摄
作为今天的专业或有抱负的数据科学家,我们面临着如此多的挑战:学习新技能、提高现有技能、建立强大的专业网络、求职和获得角色。从分析师到深度学习专家,数据科学是目前最有魅力的技术领域之一。要学习的资源很多,感兴趣的候选人也在那里,但工作机会并不总是匹配的。
为了在你的职业生涯中继续前进,尤其是在数据科学领域,你需要建立更多的项目,磨练你的技能,并证明你作为数据科学家的价值。但是,如果你找不到工作,或者你没有机会运用你的知识并证明你能正确运用它,你将如何去做呢?
自由职业是提高你的技能、获得经验、加强你的投资组合并获得收入的一个很好的选择。就我个人而言,我是自由职业者的忠实粉丝;尽管我充分意识到作为一名自由职业者取得成功并不容易,但这是非常可行的。作为一名自由职业的数据科学家,你可以选择你觉得有趣并且真正想从事的项目。你也可以设定你的时薪,最重要的是,你可以自己当老板。
也许作为一名自由职业者,我最喜欢的是时间的自由。你可以选择什么时候工作,什么时候休息,这在朝九晚五的工作中并不总是一个选项。所以现在,你可能有一些问题,比如,我如何开始自由职业?我在哪里可以找到一个自由职业者的角色?外面有什么样的演出?
</7-types-of-gigs-you-can-do-as-a-freelance-data-scientist-5b81f3c203af>
我在另一篇文章中回答了后一个问题,我将在本月晚些时候写一篇文章回答第一个问题。但是今天,让我们关注中间的问题,“我在哪里可以找到和浏览可用的数据科学自由职业者的工作?”因此,我今天将重点介绍你可以用来寻找自由职业数据科学职位的 7 大网站。
№1: LinkedIn 求职者
我将从一个经常被忽视的伟大网站开始,尤其是在寻找 LinkedIn 自由职业者的时候。当然,我们都知道职业社交网站,我们中的一些人已经在 LinkedIn 上找到了自己的全职工作。但是,如果你正在寻找一个自由职业项目,LinkedIn 可能不会出现在你的脑海中。
LinkedIn 可以用来找自由职业者的工作;诀窍是将角色类型过滤为“合同工”或“临时工”,以便只查看自由职业者的角色。使用 LinkedIn 寻找自由职业者的另一个好处是,你可以设置你的经验水平,只查看符合你技能的工作。
№2:天使
接下来是一个非常受初创公司欢迎的网站, AngelList 。AngelList 是寻找自由职业技术职位,尤其是数据科学职位的顶级网站之一。所以,你需要做的就是建立一个强有力的档案,并开始浏览可用的角色。
在 AngelList 上,你可以找到每个经验层次的角色。无论你是应届毕业生,自学者,还是专业人士,你都为你的经历找到了高薪的角色。该网站有许多角色,既有远程的,也有在特定位置的,还有远程的可能性。
</9-free-quality-resources-to-learn-and-expand-your-python-skills-44e0fe920cf4>
№3:柠檬. io
我的下一个网站不是你典型的自由职业者网站;这是一个开发者和创业公司的社区, Lemon.io 。我们都明白社区的重要性,归属感,尤其是在自由职业者的世界里。但是,做自由职业者可能会觉得孤独;Lemon 试图通过建立一个专属社区来克服这个问题。
在 Lemon,你可以找到所有技术专业的不同自由职业者角色,从纯 Python 到 web 开发到数据科学,时薪从 35 美元到 55 美元不等。为了保证质量,你需要通过一个简单的英语测试和一个 Lemon 开发者的技术面试才能加入 Lemon。
№4:顶部
当你请一位经验丰富的自由职业数据科学家为你推荐一个寻找角色的网站时,你会经常听到的一个网站是 Toptal 。Toptal 是一家远程人才公司,旨在为技术人员匹配与其技能相匹配的项目。
Toptal 不仅仅是一个招聘网站;它提供了许多资源和活动来提高你的技能,并了解更多关于工作的未来。一旦你通过了初步筛选,根据你的经验和技能水平,你可以有一个从 20 美元到 100 美元+的时薪。
</6-lesser-known-data-science-blogs-that-are-worth-following-cc42924abb13> [## 值得关注的 6 个鲜为人知的数据科学博客
towardsdatascience.com](/6-lesser-known-data-science-blogs-that-are-worth-following-cc42924abb13)
№5:向上工作
今天名单上的下一个网站以自由职业圣杯而闻名,不仅仅是技术自由职业者,而是任何自由职业者。创建一个档案,通过筛选,开始浏览可用的角色,或者只是等待客户与您联系。
在 Upwork 中,主要可以找到两种基于报酬的工作:固定报酬和灵活角色。固定价格有固定的价格和特定的小时数,而弹性工资的平均时薪从 20 美元起。
№6:科拉布特里
接下来是一个自由平台,上面有超过 20,000 名科学家和专家, Kolabtree 。Kolabtree 将各种经验水平的自由职业者与世界各地各种规模的企业联系起来,每个月都有数百个项目发布,你可以根据你想从事的确切主题进行筛选,如数据科学或更具体的主题领域。
Kolabtree 可以免费注册并开始申请数据分析、机器学习和统计分析项目,每小时收费 30 美元起。
№7: Outvise
名单上最后但同样重要的是比更有优势。Outsive 是一个很好的在线平台,可以找到各种与技术相关的自由职业者的工作。你现在就可以开始找工作,在网站上免费注册,探索数百种选择,并开始接收报价。
你可以在 Outsive 上找到不仅仅是数据科学相关的工作,例如,你可以寻找数字营销工作、项目管理以及技术和软件顾问。
最后的想法
作为一名数据科学家和计算机科学讲师,我完全理解申请了几十份工作,有时却没有任何回音的挫败感。我知道觉得自己不配,觉得自己不够,不够熟练,不够聪明,不够优秀是什么感觉。不幸的是,目前的求职方式往往会强化这种无价值感,让求职者精神疲惫。
但是,我能够克服失业感觉的方法之一是自由职业。所以,我决定离开求职的世界,走自己的路去证明自己,先证明给自己看,也证明给外面的雇主看。我做了一个简介,开始做自由职业项目。我从小处着手,随着时间的推移,我的项目规模和技能都在增长。
</5-python-books-to-transfer-your-code-to-the-next-level-a5af0981e204> [## 5 本 Python 书籍,让你的代码更上一层楼
towardsdatascience.com](/5-python-books-to-transfer-your-code-to-the-next-level-a5af0981e204)
所以,如果你在你的学习旅程中达到了一个好的点,或者厌倦了你的公司,正在寻找新的东西,一些有挑战性和有回报的东西,我建议你尝试一下自由职业。查看一下我在这篇文章中建议的网站,也许你会找到一份与你的技能相匹配的工作,并且你会对此感到兴奋。
毕竟,你建立了自己的成功之路。
每个 NLP 数据科学家都应该知道的前 5 个单词分词器
使用 NLTK 包在 NLP 中进行单词标记
作者图片
什么是标记化?
标记化是将文本分割成称为标记的小块的过程。这些小片段可以是句子、单词或子单词。例如,句子“我赢了”可以标记为两个单词——标记“我”和“赢了”。
根据语言学,记号的正式定义是“一个语言单位在演讲或写作中的个别出现,相对于它作为实例的语言单位的类型或类别。”
传统的标记化方法包括空格、标点或正则表达式标记化。像伯特和 GPT 这样的新语言模型促进了高级标记化方法的发展,如字节对编码、单词块和句子块。
为什么标记化有用?
标记化允许机器阅读文本。自然语言处理领域的传统和深度学习方法都严重依赖于标记化。在大多数自然语言处理应用程序中,这通常是一个预处理步骤。例如,为了计算文本中的单词数,使用分词器将文本拆分。在深度学习和传统方法中,标记化用于特征工程。例如,输入文本在输入到 BERT 的神经网络体系结构之前,使用单词片段子单词标记化进行处理。
什么是单词分词器?
单词分词器是一类将文本拆分成单词的分词器。这些记号化器可以用来创建文本的单词包表示,它可以用于下游任务,如构建 word2vec 或 TF-IDF 模型。
NLTK 中的单词分词器
(本练习的 Jupyter 笔记本可在此处获得)
NLTK 是自然语言处理应用程序的常用包。nltk.tokenize 模块为记号赋予器提供了几个选项。在本文中,我们将研究单词标记化的五个选项。
在我们继续之前,让我们从包中导入相关的函数
空白标记化
这是最简单也是最常用的记号化形式。每当发现空白字符时,它就分割文本。
这是有利的,因为这是一种快速且容易理解的记号化方法。然而,由于其简单性,它没有考虑特殊情况。在这个例子中,“Jones”比“Jones!”更有用。
基于标点符号的标记化
基于标点符号的标记化比基于空白符号的标记化稍微高级一些,因为它可以拆分空白符号和标点符号,并且还可以保留标点符号。
基于标点符号的记号化克服了上述问题,并提供了一个有意义的“琼斯”记号。然而,在类似" Ms . "的情况下,保留标点符号以区分" Ms . "和" Ms"/"MS"/"mS "可能是有用的,因为它们在不同的上下文中可能表示不同的意思。
默认/treebankwodtokenizer
NLTK 中的默认标记化方法包括使用 Penn Treebank 中定义的正则表达式进行标记化(基于英文文本)。它假设文本已经被分成句子。
这是一种非常有用的标记化形式,因为它结合了几个语言学规则来将句子分割成最佳的标记。
TweetTokenizer
像 Twitter tweets 这样的特殊文本具有独特的结构,上面提到的通用标记器在应用于这些数据集时无法产生可行的标记。NLTK 为 tweets 提供了一个特殊记号赋予器来帮助解决这个问题。这是一个基于规则的标记器,可以删除 HTML 代码,删除有问题的字符,删除 Twitter 句柄,并通过减少重复字母的出现来规范化文本长度。
姆韦托肯纳
多词表达式标记器是 NLTK 提供的基于规则的“附加”标记器。一旦文本被选择的标记化器标记化,一些标记可以被重新分组为多单词表达式。
例如,姓名 Martha Jones 被组合成一个标记,而不是分成两个标记。这个记号赋予器非常灵活,因为它不知道用于生成记号的基础记号赋予器。
结论
标记化是自然语言处理的一个组成部分。这是教会机器如何达到的第一步,随着该领域向深度学习发展,这一步仍然很重要。有三种类型的标记化——句子、单词和子单词。
在本文中,我们深入探讨了单词标记化的五个选项。下表总结了调查结果:
黑仔人工智能应用需要掌握的 6 大深度学习模型
深度学习案例研究
用 6 个强大的神经网络架构解决有监督的、无监督的和生成的人工智能问题(有案例研究的例子)
图一。查尔斯·德鲁维奥在 Unsplash 上拍摄的照片
随着可用处理能力、存储空间和大数据的增加,深度学习领域越来越受欢迎。人工智能工程师不再使用传统的机器学习模型,而是逐渐转向深度学习模型。在有丰富数据的地方,深度学习模型几乎总是优于传统的机器学习模型。这种关系可以想象如下:
图二。准确性与数据量的关系图(作者提供的数据)
因此,随着我们每年收集更多的数据,使用深度学习模型是有意义的。此外,深度学习领域也在快速发展。许多研究人员投入了大量精力来开发针对特定问题的伟大的深度学习模型。尽管有数百种可供选择的深度学习模型,但它们可以根据主要类别进行分组。这些类别(以下称为型号)可列举如下:
表 1。流行的深度学习模型列表(按作者排序)(工作进行中)
尽管数字超过 20–30,但一些模型被证明对现实生活中的问题更有效。在本文中,我们将重点介绍这些模型,即:
1 —前馈神经网络模型或 MLP
2 —卷积神经网络模型
3 —递归神经网络模型
4 —变压器型号
5 —自动编码器
6 —生成性对抗网络模型
让我们逐一介绍这些型号:
FYI: The below terms are often used interchangeably:
- Deep Learning Models
- Artificial Neural Networks
- Neural Network Architectures
- Neural Network Models
So, don't get confused along the way :)
前馈神经网络(FfNN)或多层感知器(MLP)
前馈神经网络(FfNN) ( 有时也称为规则神经网络或规则网)是一种人工神经网络,其中各层之间的连接不形成循环。这是使前馈神经网络不同于递归神经网络的主要特征。前馈神经网络(或多层感知)是第一个也是最简单类型的人工神经网络架构。
在这个网络中,信息只从输入层向前移动,通过隐藏层,到达输出层。FfNN 中没有循环或回路。
我们今天遇到的前馈神经网络是原始简单多层感知器(MLP)的改进版本。这些术语经常互换使用。在现代 FfNN 中,我们通常使用比阶跃函数(0 或 1)更复杂的激活函数,如 ReLU、Sigmoid、TanH 和 Softmax。现代深度神经网络通常利用一种梯度下降方法进行优化。下图显示了现代前馈神经网络的一个示例:
图 3。一个现代前馈神经网络的例子(图片由作者提供)
但是多层感知器这个名字是怎么来的呢?
感知器是一种用于监督学习的二元分类算法,由一层线性阈值单元(LTU) 组成。在感知器中,ltu 使用相同的事件输出作为输入。感知器算法可以调整权重,以校正经过训练的神经网络的行为。此外,可以添加偏置项来提高网络的精度性能。
当只有一层感知器时,称为单层感知器。有一个输出层和一个接收输入的输入层。当隐藏层被添加到单层感知器时,我们最终得到一个多层感知器(MLP)。我们为日常问题建立的前馈神经网络是 MLP 的复杂版本。
为什么前馈神经网络对初学者友好
前馈神经网络是开始学习深度学习模型的优秀架构。尽管它们有缺点,前馈神经网络可以用来构建语音识别、图像识别和机器翻译软件。但是,他们在数据分析问题上是最强大的。这是前馈神经网络的另一种可视化:
数字添加
这里有一个前馈神经网络案例研究,您可以用它来提高您的 FfNN 技能:
卷积神经网络
最强大的监督深度学习模型之一是卷积神经网络(CNN)。CNN 的最终结构实际上非常类似于前馈神经网络(FfNNs),其中有具有权重和偏差的神经元。除此之外,就像在 FfNNs 中一样,在 CNN中有一个损失函数(如 crossentropy 或 softmax)和一个优化器(如 adam optimizer)。此外,尽管在 CNN 中,也有卷积层、汇集层和平坦层。CNN 主要用于计算机视觉任务,如图像分类,尽管您可能会发现其他应用领域,如自然语言处理和时间序列预测。
卷积神经网络中的层
我们能够在卷积神经网络中使用许多不同的层。但是,卷积、池化和全连接层是最重要的。因此,我将在实现它们之前快速介绍这些层。
卷积层— 卷积层是我们从数据集图像中提取特征的第一层。由于像素只与相邻和接近的像素相关,卷积允许我们保留图像不同部分之间的关系。卷积基本上是用较小的像素过滤器过滤图像,以减小图像的大小,而不丢失像素之间的关系。当我们使用步长为 1x1(每步移动 1 个像素)的 3x3 滤波器对 5x5 图像应用卷积时,我们将获得 3x3 输出(复杂度降低 64%)。
图 4。一个卷积运算的例子(5×5 的图像,3×3 的滤波器,1×1 的步长)(图由作者提供)
池层— 在构建 CNN 时,通常在每个卷积层后插入池层,以减小表示的空间大小,从而减少参数数量,从而降低计算复杂度。此外,合并层也有助于解决过度拟合问题。基本上,我们通过选择这些像素内的最大值、平均值或和值来选择池大小以减少参数的数量。最大池化是最常见的池化技术之一,可演示如下:
图 5。最大池化操作示例(4 x 4 图像,2 x 2 池化)(图由作者提供)
一组完全连接的层— 一个完全连接的网络是我们的 FfNN,其中每个参数相互链接,以确定每个参数的真实关系和对标签的影响。
包含卷积图层、池化图层和一组全连接图层的最终网络如下所示:
图 6。为图像分类设计的卷积神经网络示例(图片由作者提供)
这里有一个卷积神经网络案例研究,你可以用它来提高你的 CNN 技能:
[## 使用 MNIST 数据集在 10 分钟内完成图像分类
towardsdatascience.com](/image-classification-in-10-minutes-with-mnist-dataset-54c35b77a38d)
递归神经网络
递归神经网络(RNN)是一类人工神经网络,其中神经元之间的连接形成时间序列。能够捕获动态时间信息(时间记忆)的 rnn。递归神经网络源自前馈神经网络,但是它们提供了更多。
RNN 通过将以前的信息保存在内存中来使用它们,这些信息以“状态”的形式保存在 RNN 神经元中。有几种类型的 RNN,如香草 RNN,GRU 和 LSTM。
RNN 类型
RNNs 有许多不同的变体。我们经常遇到的三种 RNN 类型是
- 香草(简单)RNN;
- 长短期记忆(LSTM)网络;和
- 门控循环单元(GRU)网络。
您可以在图 7 中找到这些备选 RNN 单元的可视化效果:
图 7。递归神经网络的三大流行变体:香草 RNN、GRU、LSTM
尤其是 LSTM 和 GRU 节点被如此广泛地使用,你经常在一些博客帖子中看到它们作为单独的深度学习模型类型。
这里有一个递归神经网络案例研究,你可以用它来提高你的 CNN 技能:
变压器网络
图 8。变压器模型架构(图由 Vaswani 等人
变压器网络是 2017 年推出的深度学习模型。Transformer 网络主要用于自然语言处理(NLP)任务。
变压器是为了应对 RNNs 的计算复杂性和缓慢性而设计的。转换器可以处理顺序数据任务,如机器翻译、时间序列预测或文本摘要。
Transformers 的主要优势在于,与 rnn 不同,它们不需要按顺序处理顺序数据。如果输入数据是时间序列中的销售数字,则转换器不需要处理较晚日期之前的较早日期。因此,转换器允许比 RNNs 更多的并行化,因此减少了训练时间。
由于它们在训练速度方面更有效,变压器已经成为 NLP 研究人员的选择,并取代了 RNN 的替代品。例如,流行的预训练 NLP 模型,如伯特和 GPT-3 是转换模型,您可以使用迁移学习来完成 NLP 任务。
这里有一个变形金刚网络案例研究,你可以用它来提高你的变形金刚技能:
自动编码器
什么是自动编码器?
自动编码器是由两个子网络组成的神经网络架构,即编码器和解码器网络,它们通过潜在空间相互联系。自动编码器最初是由人工智能界最受尊敬的科学家之一 Geoffrey Hinton 和 PDP 小组在 20 世纪 80 年代开发的。Hinton 和 PDP 小组旨在解决“没有老师的反向传播”问题,也就是无监督学习,使用输入作为老师。换句话说,他们将要素数据用作要素数据和标签数据。
让我们仔细看看自动编码器是如何工作的!
图 9。具有编码器和解码器网络的自动编码器网络
自动编码器架构
自动编码器由一个编码器网络和一个解码器网络组成,编码器网络获取特征数据并对其进行编码以适应潜在空间。解码器使用该编码数据(,即代码,并将其转换回特征数据。在编码器中,模型学习如何有效地编码数据,以便解码器可以将其转换回原始数据。因此,自动编码器训练的基本部分是生成优化的潜在空间。
现在,我们知道,在大多数情况下,潜在空间中的神经元数量比输入和输出层要少得多,但也不一定是这样。有不同类型的自动编码器,如欠完整、过完整、稀疏、去噪、收缩和变化自动编码器。
自动编码器中的图层
当构建自动编码器时,标准做法是设计一个编码器,并创建该网络的反向版本作为该自动编码器的解码器。因此,只要编码器和解码器网络之间存在反向关系,您就可以自由地向这些子网添加任何层。例如,如果您正在处理图像数据,您肯定会需要卷积和池层。另一方面,如果您正在处理序列数据,您可能需要 LSTM、GRU 或 RNN 单位。这里重要的一点是,你可以自由地建造任何你想要的东西。以下是构建自动编码器网络的常用方法:
图 10。欠完整自动编码器中的潜在空间通常比其他层窄
这里有一个 Autoencoder 网络案例研究,您可以用它来提高您的 Autoencoder 技能:
生成对抗网络
生成对抗网络提供了革命性的生成解决方案,可用于各种领域,如蛋白质建模和艺术生成。GANs 的发明发生得相当意外。著名的人工智能研究人员,当时是蒙特利尔大学的博士研究员,伊恩·古德费勒,当他和他的朋友——在一个朋友的告别派对上——讨论其他生成算法的缺陷时,偶然想到了这个想法。聚会结束后,他满怀希望地回家,并实现了他心中的想法。令人惊讶的是,在第一次审判中一切都如他所愿,他成功地创建了生成性对抗网络(简而言之,GANs)。根据脸书人工智能研究主任、纽约大学教授 Yann Lecun 的说法,GANs 是“过去 10 年机器学习中最有趣的想法”。
GANs 的大致结构如下所示:
图 11。一个为图像生成而设计的生成性对抗网络的例子(图片由作者提供)
在一个普通的 GAN 结构中有两个相互竞争的代理:一个生成器和一个鉴别器。它们可以使用不同的网络来设计(例如,卷积神经网络( CNNs )、递归神经网络( RNNs ),或者只是前馈神经网络( FfNN 或正则网络))。基于 CNN 的 GAN 可以如下所示:
图 12。为图像生成而设计的生成性对抗网络的另一个例子(图片由作者提供)
我们的 GAN 模型是如何运作的?
例如,对于一个图像生成任务,我们要求生成器生成图像,而不给它任何额外的数据。同时,我们从数据集获取真实图像到鉴别器,并要求它判断生成器生成的图像是否是真实的。首先,发生器输出的噪声会立即被鉴别器标记为假的。在从鉴别器获得足够的反馈后,生成器最终学会欺骗鉴别器。因此,我们获得了一个优秀的生成模型,可以给我们非常现实的输出。
这里有一个生成性对抗性网络案例研究,你可以用它来提高你的 GAN 技能:
最后的话
这篇文章涵盖了 6 个流行的深度学习模型,你可以用它们来构建伟大的人工智能应用。通过使用相应的案例研究,您可以为以下项目构建人工智能应用程序:
- 使用 FfNN 的预测分析;
- 使用 CNN 的图像分类:
- 使用 RNN 的时间序列价格预测:
- 使用变压器的情感分析;
- 使用自动编码器降低噪音:和
- 利用 GAN 产生图像。
所以,开始工作,在成为一名伟大的深度学习专家的路上打磨你的技能吧!
订阅邮件列表获取完整代码
如果你想获得我在 Google Colab 上的其他教程文章的代码,并尽早获得我的最新内容,可以考虑订阅:✉️的邮件列表
如果你对深度学习感兴趣,也可以看看我的人工智能内容指南:
https://oyalcin.medium.com/a-guide-to-my-content-on-artificial-intelligence-c70c9b4a3b17
既然您正在阅读这篇文章,我相信我们有着相似的兴趣,并且现在/将来会从事相似的行业。那么我们就通过Linkedin来连线吧!请不要犹豫发送联系请求!Orhan g . Yal n—Linkedin
数据科学家的 6 大 Python 技巧
来自我日常分析项目的实用技巧和诀窍
编码现在是,并将继续是数据科学的重要组成部分!据说数据科学家接近 70%的时间都花在了编码上,我也不例外。在本文中,我将分享 6 个最有用和实用的 Python 片段,它们是我在日常工作中解决实际分析问题时收集的。
现在,让我们开始吧!
- 使用 exec()动态执行
动态执行(图像源)
场景:你从一个同事那里继承了一个 Python 项目,并且立即注意到那些脚本都有 5000 多行代码。相同的代码块被多次复制和粘贴!那么,有没有更有效的方法来实现代码的可重用性呢?
让我们来探索一下 Python 中的 **exec()**
函数。简单地说,它接受一个字符串或目标代码,并执行它,如下例所示,
a = 4 and b = 5
a+b = 9
更加得心应手?我们可以使用**exec(open().read())**
在 Python 解释器中调用和执行文件。举个例子,
有了这个强大的一行程序,数据科学家可以保存将作为独立文件重用的程序,并在需要时在主程序中执行它们。再也不用复制和粘贴代码了!
作为 Python 中一个很酷的功能, **exec()**
有一个需要避免的缺陷——它不返回任何值,
a = 4 and b = 5
a+b = 9
** Is the return from exec() is None? True **
我们可以看到,**exec()**
函数的输出是None;因此,它不能用来存储任何值,这相当于 r 中的[**sounce()**](https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/source)
函数
**** * 加入我们的 YouTube 社区🎦** 【数据说话带吉】 😄
2。使用{os}和{shutil}的操作系统命令
场景:从我们之前的技巧继续,现在你想在执行之前检查脚本。不要一路双击鼠标来打开文件?没问题,你可以直接用 Python 轻松实现这个,不打断你的思路。
在这里,**os.startfile()**
功能允许用户打开任何类型的文件,包括 MS 文档、电子表格、R 和 SQL 脚本。
同样,我们也可以使用**os.remove(“myFullFileName.ANYFORMAT”)**
删除文件
或者使用**shutil.rmtree(“folderToBeRemoved”)**
删除整个目录。其中{shutil}是一个 Python 模块,提供了许多高级文件操作,尤其是文件复制和删除操作。
因此,如果你没有使用过除了**os.getcwd()**
或**os.chdir()**
之外的{ os ,或者如果{ shutil }听起来很陌生,那么是时候检查一下他们的文档了。您肯定会找到有用的命令或文件系统方法,使您的编码更容易。这里列出了一些我最喜欢的,
**os.listdir()**
或**os.listdir(“someDirectory”)**
—分别列出当前工作目录或任意用户指定目录下的所有文件;**os.path.join()**
—自动创建一个包含参数元素的路径,以备后用,例如**os.path.join(‘D’, ‘Medium’, ‘New Folder’)**
将返回
‘D\\Medium\\New Folder’
**os.makedirs()**
—创建目录;**shutil.copy2(“sourcePath”, “destinationPath”)**
或**shutil.move(“sourcePath”, “destinationPath”)**
—分别复制或剪切一个文件。
3。一行程序:嵌套列表理解以摆脱 for 循环
场景:我们遇到的这个“简单”的任务是将几个列表合并成一个大的长列表,
当然,我们可以为循环编写五个嵌套的来将每个子列表添加到最终的输出列表中。但是更聪明的做法是以最简洁的方式理解嵌套列表,
4。计时器被包装成装饰器
计时器作为装饰器(图像源)
场景:虽然 Python 被公认为最有效的编程语言之一,但数据科学家仍然需要检查我们程序的运行时。
如果我们只是为想要监控的每个函数实现一个基本的 Python 定时器,这并不是最难的事情。然而,如果我们把它编码成一个装饰器,我们会使我们的定时器更容易被版本控制和重用!
这里是如何,
在这个片段中,
- 计时器被包装在一个
**timerWrapper**
函数中,该函数被用作在 main 函数之前调用的装饰器; - 示例的主要功能是返回一个连接到 URL 的请求,这是我以前的博客之一。
运行这段代码可以得到经过的时间,
Current function: getArtile
Run Time: 1.6542516000008618Out[101]: <Response [200]>
现在,为了给另一个函数计时,我们需要做的就是把***@timeWrapper***
放在函数前面,
getMultiplication(3)
10
10000000000
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Current function: getMultiplication
Run Time: 0.00014700000065204222
5。利用 **options**
系统定制您的显示器
场景:作为数据科学家,我们每天用{pandas}和{numpy}分析数据。当我第一次学习 Python 编码时,在将我的数据读入 IDE 后,我很沮丧地看到了这一点,
显然,数据显示在行方向和列方向都被截断了,下面的代码可以修复这个问题,
这里,我们明确地设置了在控制台中显示/打印的最大列数、行数和列宽。{pandas}中有很多可定制的选项和设置,类似的操作在 {numpy} 中也有,针对数组和矩阵,
6。重现你的机器学习模型结果?设定种子!
场景:由于机器学习建模过程的随机性,我们都遇到过机器学习的不确定性。这种随机性导致我们很难在不同的运行中重现相同的结果。因此,很难确定性能指标的改进是成功的模型调整的结果,还是仅仅是不同的随机训练/测试样本。
幸运的是,只要你做得正确,通过在整个模型管道中设置随机种子,就可以实现再现性!你见过多少次堆栈溢出时弹出“尽管定义了随机种子,但得到了不同的结果”这样的问题?嗯,如何恰当地设置种子应该在文档的第一页,但我花了一些时间来挖掘它。
我发现在{numpy}、{sklearn}、{tensorflow}或{torch}中,并不是每个种子的定义都一样。因此,最好的做法是使用一个明确的函数,为所有的框架设置所有的种子。举个例子,
将这种战术性的**reset_random_seed()**
功能添加到你工作流程的所有必要步骤中,比如训练-测试分割、模型编译/训练和解释,将会使你达到完全的可再现性。对你的实验更详细的了解将会完成后半部分!
希望你已经学到了一些新的功能,或者重新发现了一些你以前可能忽略的功能。如果您受到启发,想在自己的代码中使用其中的一个或几个,那就太棒了!如果你知道 Python 的其他隐藏的瑰宝,请在下面留下评论。😃
想要更多的数据科学和编程技巧?使用 我的链接 注册 Medium,获得我所有内容的完全访问权限。
还订阅我新创建的 YouTube 频道 【数据谈吉】
进一步阅读
*💔-common-sql-errors-to-spot-an-inexperienced-data-scientist-310b3e98842f> https://levelup.gitconnected.com/6-hilarious-programmers-data-scientists-jokes-to-kick-start-2021-187f86dd6a4c *
下一次面试时你应该知道的 7 大数据结构
数据结构—第 1 部分
掌握这些数据结构,为你的下一份数据科学工作打下基础
数据结构是用于构建程序的基本构造。每种数据结构都有自己组织数据的方式,这在特定的用例中可能很有效。数据结构有其特殊的结构,为数据组织、管理、存储、访问和修改任务提供了可供选择的解决方案。
不管你是在建立一个机器学习模型还是一个移动应用程序;在处理项目时,您必须依赖数据结构。因此,你未来的雇主也会希望确保你很好地掌握了数据结构。
在本帖中,我们将涵盖你在下一次工作面试中必须知道的七种基本数据结构。
1.数组
数组是最简单和最广泛使用的数据结构。它们被构造为按特定顺序排列的元素的集合。数组通常具有固定的大小,它们保存相同数据类型的项。您可以从字符串、整数、对象甚至数组的集合中创建数组。因为数组是有索引的,所以你可以随机访问任何数组元素。
图二。数组可视化示例(作者提供的图片)
数组类型:您可能遇到的两种最常见的数组类型是
- 一维数组
- 多维数组
数组的基本操作:您可以对数组进行的最常见的基本操作有insert
、get
、delete
和size
操作。
**Insert**
: 在给定的索引处插入一个新元素**Get**
: 返回给定索引处的元素**Delete**
: 删除给定索引处的元素**Size**
: 返回数组中元素的总数
还可以对数组进行遍历、搜索和更新操作。
数组的实现:
- 数组通常被用作更复杂的数据结构的构建块,如
arrays
、lists
、heaps
、matrices
。 - 在数据科学中,数组用于高效的数据操作。我们经常提供
NumPy
的数组对象给机器学习模型进行训练。
2.大量
栈是基于 LIFO ( 后进先出 )的数据结构。在基于 LIFO 的数据结构中,放在最后的数据首先被访问。现实生活中的一个堆栈示例可以是一堆垂直放置的岩石,如图 2 所示。
图 3。由 Samrat Khadka 在 Unsplash 上拍摄的照片
栈上的基本操作:栈上最常见的基本操作有push
、top
、pop
、isEmpty
和isFull
操作。
**Push**
: 在顶部插入新元素;**Top**
:返回顶部的元素,但不从堆栈中移除;**Pop**
:从堆栈中移除一个元素后,返回其顶部;和**isEmpty**
: 检查堆栈是否有元素。**isFull**
:检查堆栈是否已满。
这是堆栈结构的可视化:
图 4。书库可视化示例(作者提供的图片)
关于书库的常见面试问题
- 使用堆栈(例如,反向波兰符号(RPN)或抽象语法树(AST))评估后缀表达式;
- 对堆栈中的值进行排序;和
- 检查表达式中的平衡括号。
3.行列
队列在结构上非常类似于堆栈。唯一的区别是队列是基于后进先出法的。在队列中,我们可以在末尾添加一个新元素,也可以从前面删除一个元素。现实生活中队列的一个例子可能是在杂货店排队等候的人群,如图 4 所示。
图 5。 Adrien Delforge 在 Unsplash 上拍摄的照片
队列基本操作:您可以对队列进行的最常见的基本操作有enqueue
、dequeue
、top
和isEmpty
操作。
**Enqueue**
: 在队列末尾插入一个新元素;**Dequeue**
:从队列前面移除元素;**Top**
:返回队列的第一个元素;和**isEmpty**
: 检查队列是否为空。
以下是队列结构的可视化:
图 6。队列可视化示例(作者提供图片)
队列和常见面试问题的实现
- 使用堆栈实现队列;
- 检索给定队列的前 n 个元素;和
- 生成从 1 到 n 的二进制数。
4.链接列表
链表的结构是元素的线性集合(即节点)。每个节点包含两个信息:
Data
:元素的值Pointer
:链表中下一个节点的指针。
由于链表是顺序结构,随机访问元素是不可能的。
链表的类型:我们遇到了两种主要类型的链表,
- 单链表:我们只能使用下一个节点之前的节点来访问它。
- 双向链表:我们可以正向和反向访问数据。
下面是一个链表结构的可视化:
图 8。单链表可视化示例(作者图)
链表的基本操作:链表最常见的基本操作有insertAtEnd
、insertAtHead
、DeleteAtHead
、Delete
、isEmpty
操作。
**InsertAtEnd**
: 在链表的末尾插入新元素**InsertAtHead**
: 在链表的头部插入新元素**DeleteAtHead**
: 删除链表的第一个元素**Delete**
: 从链表中删除给定的元素**isEmpty**
: 检查链表是否为空。
链表面试常见问题:
- 一次找到单链表的中间元素;
- 无递归反转单个链表;和
- 移除未排序的链表中的重复节点。
5.树
树是由节点和边组成的分层数据结构。节点代表值,而边连接它们。树中节点之间的关系是单向或双向的,而不是循环的。树被广泛用于构建决策树和集成方法。
图 9。 Jazmin Quaynor 在 Unsplash 上的照片
虽然像二叉树和二分搜索法树这样的树类型是最常用的变体,但是不同树实现的总数达到数百种,其中它们可以被分组为:
Basic Tree Structures
Multi-Way Trees
Space-Partitioning trees
Application-Specific trees
图 10。单链表可视化示例(作者图)
常见的树面试问题:
6.图表
图由一组有限的节点(即顶点)和一组无序或有序的顶点对组成,这些顶点一起形成一个网络。这些对也被称为边(即,链接、线或箭头)。边可以包含权重或成本信息,以表示从 a 移动到 b 的成本。
图 11。图形可视化示例(作者提供的图形)
图的类型:图主要有两种类型:(I)有向图和(ii)无向图。
Directed Graphs
:如果一个图的所有边都有方向信息,如图 8 所示,那么我们称之为有向图;- 如果所有的边都没有方向信息,那么我们称之为无向图
图 12。有向图与无向图(作者提供的图)
图形的基本操作:您可以对图形进行的最常见的基本操作有adjacent
、neighbors
、add_vertex
、remove_vertex
、add_edge
、remove_edge
和get
操作。
adjacent
:检查从顶点 a 到顶点 b 是否有边;neighbors
:列出所有顶点 b ,使得从顶点 a 到顶点 b 有一条边;add_vertex
:增加顶点一个;remove_vertex
:删除顶点a;add_edge
:将顶点 a 的边加到顶点 b 上;remove_edge
:去除顶点 a 到顶点 b 的边,get
:返回与顶点和或边相关的值。
常见问图面试问题:
7.哈希表
哈希表是关联数据结构,它以具有唯一索引值的数组格式存储数据。在哈希表中,只要我们知道索引值,访问随机元素是非常高效和快速的。此外,无论哈希表的大小如何,在哈希表中插入、删除和搜索数据也非常快。哈希表使用哈希函数来生成有效的索引值,这为它们提供了效率方面的进一步优势。
散列法
哈希是一种将键值转换为数组索引范围的方法。散列的原因是为了降低密钥对的复杂性并创建有效的索引列表。
图 13。哈希表可视化示例(作者提供的图片)
散列数据结构的性能取决于(i) Hash Function
、( ii) Size of the Hash Table
和(iii) Collision Handling Method
。用于散列和冲突处理的组合方法之一是将模操作符与线性探测相结合,以便在确保唯一索引值的同时可以在更大程度上降低复杂性。
常见的面试问题:
- 在数组中寻找对称对;
- 追踪旅程的完整路径;
- 查找一个数组是否是另一个数组的子集;和
- 检查给定的数组是否不相交。
最后的想法
在这篇文章中,我们讨论了七种基本的数据结构类型。请注意,有数百种数据结构变体。在这篇文章中,我们讨论了通用结构。你可以在这个链接中找到大约 150 个数据结构面试问题。此外,您可能会发现使用这个链接的数据结构的 Big-O 复杂性备忘单。
既然你正在阅读这篇文章,我相信我们有着相似的兴趣,并且现在/将来会从事相似的行业。那么我们就通过 Linkedin 来连线吧!请不要犹豫发送联系请求!Orhan g . Yal gan—Linkedin。如果你喜欢我迄今为止分享的内容,可以考虑订阅简讯 !✉️
机器学习中的 7 大特征选择技术
选择最佳功能的流行策略
图片由 Pixabay 的穆罕默德·哈桑拍摄,使用 Pixlr 编辑
数据科学中的标准原则是,更多的训练数据会产生更好的机器学习模型。对于实例的数量来说是这样,但对于特征的数量来说不是这样。真实世界的数据集包含大量冗余要素,这可能会影响模型的性能。
数据科学家需要在他/她为建模选择的特征方面有所选择。数据集包含许多要素,有些有用,有些没用。选择所有可能的特征组合,然后继续选择最佳特征集,是一种多项式解决方案,需要多项式时间复杂度。在本文中,我们将讨论 7 种选择最佳特征来训练健壮的机器学习模型的方法。
1.领域知识:
数据科学家或分析师应该拥有关于问题陈述的领域知识,以及任何数据科学案例研究的功能集。拥有关于特性的领域知识或直觉将有助于数据科学家进行特性工程并选择最佳特性。
例如,对于一个汽车价格预测问题,一些特征如制造年份、奇特的牌照号码是决定汽车价格的关键因素。
2.缺少值:
(图片由作者提供),缺失值的可视化:白线表示缺失值的存在
由于数据损坏或记录失败,现实世界的数据集通常包含缺失值。有各种技术可以估算缺失值,但是估算缺失值可能与真实数据不匹配。因此,在具有大量缺失值的特征上训练的模型可能不是非常重要。
想法是丢弃缺失值大于确定阈值的列或要素。上面的图片是为泰坦尼克号数据生成的,显示“cabin”有很多缺失值,可以删除。
3.与目标类标签的相关性:
(图片由作者提供),相关矩阵的热图
目标分类标注和要素之间的相关性决定了每个要素相对于目标分类标注的相关程度。有各种相关技术,例如 Pearson、Spearman、Kendall 等来寻找两个特征之间的相关性。
**df.corr()**
返回与人物特征之间的相关系数。从上面的泰坦尼克号数据的关联热图来看,**‘sex’**
、**‘Pclass’**
、**‘fare’**
等特征与目标类别标签**‘Survived’**
的关联度高,因此是重要特征。而诸如**‘PassengerId’**
、**‘SibSp’**
的特征与目标类标签不相关,并且可能不作为建模的重要特征。因此,这些功能可以删除。
4.特征之间的相关性:
要素之间的相关性会导致共线性,这可能会影响模型的性能。如果一个特征与其他特征具有高相关系数,则称它们相关,因此一个特征的变化也会导致其他相关特征的变化。
从上述泰坦尼克号数据的相关热图来看,“Pclass”和“Fare”之间的皮尔逊相关系数,因此一个变量的变化会对另一个变量产生负面影响。
阅读下面提到的文章,深入了解皮尔逊和斯皮尔曼相关系数。
5.主成分分析(PCA):
PCA 是一种降维技术,用于从数据集中提取特征。PCA 通过使用矩阵分解将数据集的维度降低到较低的维度。它将数据集完全投影到一个较低的维度,保持方差。
当数据集的维数很高时,主成分分析可以用来减少特征,而分析去除冗余特征是一项繁琐的任务。PCA 可以将具有许多特征的数据集缩减为具有期望数量的特征的数据集,当然会损失一些方差。
(图片由作者提供),解释的方差百分比与维度数量的关系图
上面的 PCA 图是在来自 UCI 机器学习库的电离层数据集的数据集上训练的。
***Total number of dimensions:*** **34**Observation from the above plot,
**90%** ***of variance is preserved for* 15 *dimensions.***
**80%** ***of variance is preserved for* 9 *dimensions.***
因此,将维度减少到 15,保留 90%的方差,并选择最佳特征。
阅读下面提到的文章,深入了解 PCA 算法:
6.正向功能选择:
(来源
前向或后向特征选择技术用于为机器学习模型寻找最佳性能特征的子集。对于给定的数据集,如果有 n 个特征,则基于先前结果的推断来选择特征。正向特征选择技术如下:
- 使用 n 个特征中的每一个来训练模型,并评估性能。
- 最终确定具有最佳性能的特征或特征集。
- 重复步骤 1 和 2,直到获得所需数量的特征。
前向特征选择是一种包装器技术,用于选择特征的最佳子集。向后特征选择技术正好与向前特征选择相反,在向前特征选择中,最初选择所有特征,并且在每个步骤中移除最冗余的特征。
7.功能重要性:
(来源)
特征重要性是模型认为重要的特征的列表。它给出了每个特征的重要性分数,描述了该特征对于预测的重要性。特征重要性是许多机器学习模型的 Scikit-Learn 实现中的内置功能。
这些特征重要性分数可用于识别特征的最佳子集,然后继续用该特征子集训练健壮的模型。
结论:
特征选择是模型开发流程中的一个重要元素,因为它删除了可能影响模型性能的冗余特征。在本文中,我们讨论了从数据集中选择最佳特征子集的 7 种技术或技巧。人们可以在您的数据科学模型中使用这些方法来选择最佳的特征子集,并训练一个健壮的模型。
除了上面提到的,还有各种其他方法来移除冗余特征,例如,移除具有低方差的特征,卡方检验。
参考资料:
[1] 使用主成分分析法进行降维(2020 年 8 月 20 日)
[2]特征重要性与树的森林:https://sci kit-learn . org/stable/auto _ examples/ensemble/plot _ forest _ importances . html
感谢您的阅读
数据科学应用中断后的 7 大经验教训
了解失误并找到前进的道路
在设计和维护软件应用程序时,您肯定会遇到至少一次这种情况:计划外的软件中断。在过去的一年半时间里,我遇到过一些小问题,并帮助解决了它们,但最近的一次是我第一次不得不处理不容易解决的中断。这次中断是由软件库中几个较小的错误的累积、2TB 的数据变得太多而无法处理的数据过载以及 Spark 作业挂起造成的。随着停机的发生,问题变得越来越明显,我发现自己在一月的大部分时间里都在努力寻找一件又一件事情的解决方案。通过这次经历,我们从处理数据科学中的应用程序中断中获得了七条经验教训。
1.了解效率和生产力下降的风险
当应用程序中断时,最大的打击是效率和生产力。在使用该应用程序一年后,团队开始相信它会正常运行。该应用程序允许他们进行分析,以高效地获得所需的大部分数据。如果它没有覆盖它,那么他们可以继续进行更深入的调查。
一旦应用程序停止运行,团队成员不再能够在几分钟内分析问题。相反,他们必须找到自己生成信息的方法,使用多个来源收集正确的视觉效果,并处理其他工具提供给他们的数据差异。
总而言之,停机开始展示当问题出现时,团队的效率和生产力如何急剧下降。
2.开发可靠稳定的代码库
看到团队如何依赖这样一个应用程序,就明白了应用程序必须有一个可靠和稳定的代码库。当我回顾导致停机的原因时,最突出的问题是缺乏测试。与我们的其他软件库不同,这个特定的库缺乏健壮的单元和用户测试。代码库的个体贡献者将在数据的一个小的子集上本地测试他们的改变。但是,他们不确定这种变化会对应用程序的其他方面产生什么影响。
这导致了级联效应,引入了一些小错误,在几个拉请求内就使网站瘫痪了。这些错误需要几天的发现和测试,以确定它们来自哪里以及如何解决它们。我们可以发布一些新的拉请求,这些请求要么决定未解决的 bug,要么在我们的国际团队之间将代码恢复到原始状态,夜以继日地解决问题。这些修复解决了代码库的稳定性问题,但只是导致应用程序失败的三个问题之一。
3.不要忽视软件架构
随着代码库的稳定,另一个问题浮出了水面。我们开始面临数据过载,2TB 的数据变得越来越难以在应用程序中处理。并非每个工具都是为处理大数据而设计的,随着数据量的增加,工具的可靠性会下降。它不再能容纳我们扔给它的数据,反而会导致应用程序的主机崩溃。我们不再仅仅面对代码稳定性的问题,而是软件架构的失误。
这次中断证明我们不能像以前那样继续下去,我们需要几次会议来重新思考这个应用程序的架构。理解了这一点,我们回顾了该工具,并做了一些小的修改,以确保它在短期内继续工作。主要区别是将我们托管的数据量从 2TB 减少到 1TB 左右。这种减少仍然给了我们的团队他们需要的原始数据和可视化,同时允许我们稳定地前进。
如果您知道该工具无法处理大量数据,您可能会想,为什么要用它来托管您的应用程序呢?这是我们当时唯一的选择,但现在我们已经证明我们需要一些不同的东西,我们的视野向更多的东西敞开。有时你不得不试着用你所拥有的来凑合,直到你能得到你需要的支持来做得更好。
4.利用你的资源,在需要的时候寻求帮助
在解决了前两个问题之后,我们的代码库现在更加可靠,并且通过减少数据来稳定应用程序。尽管如此,我正在运行的分析所有数据的 Spark 工作还是被搁置了。我花了几个星期的时间,用尽我的国际团队的资源来解决上面的所有问题,但是我们离一个完全正常工作的应用程序还很远。有趣的是,我有 DevOps 的背景,我最后的想法是,我需要停止查看 Spark UI,开始查看集群,看看发生了什么。
当我调出一个显示集群利用率的各种可视化界面时,有一件事很突出。Spark 作业显示它正在 UI 中运行,但是集群显示什么也没有发生。任何查看群集利用率的人都会认为群集当时处于运行状态,但没有运行任何作业。
快速的谷歌搜索,然后和一个同事讨论,让我们两个回想起以前合作过的一个承包商。他曾提到,将我们的工作分成成千上万个分区会造成更大的伤害。简单地将我们的分区从 2000 切换到 200,然后重新运行就解决了我们的问题。像往常一样,这项工作已经启动并运行,没有任何迹象表明会持续几个小时。
5.作为一个团队胜利,作为一个团队失败,作为一个团队学习
总而言之,您可以看到当面临应用程序停机时,这是一个多么紧张的月份,但是要记住的重要一点是,这是一个看得见的结束。当这些类型的问题出现时,它们将会出现,您需要处理它们。这个月我首先分析手头的问题。我至少花了一天时间阅读所有的错误日志,查看我能找到的每个错误堆栈,并从代码库中一行行地重读代码。一旦我理解了手头的所有问题,我就开始给不同的人分配要解决的问题。我亲自处理了一些 bug,并与我的国际团队同事密切合作,连续两天每天 24 小时进行调查和测试。
当你在一个团队中成长和发展时,很明显,你作为一个团队庆祝你的胜利,你作为一个团队聚集在你的失败周围,努力解决它们。这个月让我们看到了这一点,我们密切合作,确定我们的弱点并加以解决。谁引起了什么错误并不重要。重要的是共同努力解决问题,让我们的应用程序重新上线。
6.不要缺少后备计划
如果我可以在上个月重新做这件事,我会专注于找出让应用程序启动并运行的最快途径,然后解决任何其他突出的错误。我们缺少一个备份计划,以便在发生故障时能够快速恢复应用程序,这导致了前面讨论过的生产力和效率损失。
除了改进测试和软件架构之外,我还会详细介绍我们的备份计划,以及如何在未来缓解此类问题。错误时有发生,应用程序中断,作业失败。我们并不是生活在一个完美的世界里,我也不想假装我们是。相反,我想制定一个计划,让我的团队即使在危机中也能有效地运作。
7.诚实并做好准备
在崩溃的最后,我的经理安排了一次与我(团队领导),一个应用程序的用户,和另外两个应用程序的主要开发人员的会议。一个小时的会议是对应用程序的性能审查,其当前的稳定性和可靠性问题,以及我们五个人之间的后续步骤。如果说我在过去的一年半中学到了什么,那就是不要对任何类型的绩效评估毫无准备。
相反,我在当天早些时候花了一个小时详细列出了事件的时间表。每一个拉取请求、每一个 bug、每一个修复及其结果,以及建议的后续步骤,并突出显示流程中的瓶颈。在所有人当中,我是唯一一个为这个电话做好准备的人。当我是第一个被邀请讨论当前问题的人时,我能够和我的经理一起讨论所有问题并回答他的问题。我坦诚地向他指出了弱点和瓶颈,展示了应用程序如何在下一个工作日结束时恢复正常工作。
参加一个准备强调问题的会议可能会很有挑战性,尤其是当你必须诚实地说出哪里出了问题以及为什么出了问题的时候。但是更好的办法是开诚布公地对待手头的问题,以及你是如何解决这些问题的。会议结束时,我知道我得到了老板的支持。他让我画出整个系统的过去、现在和未来的架构图,指出瓶颈并突出应用程序中任何其他明显的弱点。在他这样问的过程中,我意识到他理解了我为协调停机解决方案所做的工作,并认可了我对系统架构和工程的兴趣。
最后的想法
过去的一个月是 2021 年意想不到的开始。它没有按计划进行,出现了重大的应用程序中断,但这次经历的教训将伴随我一整年。
- 作为一个团队胜利,作为一个团队失败,作为一个团队学习。你们在一起,所以在各方面一起努力,从彼此犯下的错误中成长。
- 不管你在做什么项目,如果事情没有按预期进行,那就后退一步。查看正在发生的事情,并确定为什么会发生。从问题中吸取教训,并提出解决方案。
- 如果你正面临一个大问题,分析手头的问题,制定一个计划来解决它,并执行这个计划。
- 对你所面临的问题以及你如何解决这些问题要开诚布公。像这样的讨论可能很难与你的经理或任何上级进行,但他们也是人。这些讨论可以让你大开眼界,给团队或你自己带来积极的变化。当你结束这类会议时,确定你的主要收获以及你能从中学到什么。
您的数据科学团队是否遇到过任何重大问题?你是如何处理它们的?
如果你想阅读更多,看看我下面的其他文章吧!
</7-lessons-learned-from-7-months-of-remote-mentoring-b9cebf0cf222>
面向初学者的 8 大人工智能和机器学习框架
关于人工智能和人工智能算法你需要知道的一切
人工智能的概念从 20 世纪上半叶就有了。20 世纪 50 年代,年轻的数学家艾伦·图灵从数学上探索了人工智能存在的可能性。70 年后的今天,我们相信人工智能可以安全地驾驶我们,为我们预订餐馆,检测癌细胞的存在。
经过这些年的成功和挫折,艾蓬勃发展。对机器计算能力的大肆宣传爆炸了,其结果是我们现在生活的信息时代。
因此,如果你正在寻找一个人工智能框架,这个博客将涵盖流行的人工智能和 ML 框架让你开始。对框架、其用例、主要代码语言和特性的简要介绍。
1.张量流
初始发布:2015
开发者:谷歌大脑
编程语言:Python、C++、CUDA
TensorFlow 是谷歌用于机器学习和高性能数值计算的大脑孩子。简而言之,TensorFlow 是一个开源的人工智能框架,使用数据流图和机器学习来执行大量复杂的数值计算。TensorFlow 在深度神经网络上运行。
用例
我们都在使用 TensorFlow,甚至没有意识到它的存在:从谷歌照片到谷歌语音,这些应用程序运行在大型谷歌硬件集群上。
用 TensorFlow 可以做什么?
- 构建、训练和执行各种机器学习模型(甚至在移动应用程序上受支持)
- 利用内置数据集,只需几行代码就能探索隐含的见解
- 使用 TensorFlow 数据服务构建数据管道
- 使用 API 控制数据拆分,处理所有类型的非结构化数据,并使用用户数据重新训练已部署的模型,同时维护数据隐私
- 分类和回归算法、深度学习、神经网络、自然语言处理
2.PyTorch
初始发布时间:2016 年(Torch 发布时间:2002 年)
开发者:脸书人工智能研究实验室
Torch 开发者:Ronan Collobert、Koray Kavukcuoglu、Clement Farabet
编程语言:Python (C,Lua 代表 Torch)
Torch 是 2000 年初的一个开源框架,可以支持数值运算。PyTorch 使用 Python 中 Torch 的计算能力,为计算机视觉和自然语言处理应用程序创建了一个新颖的机器学习库。
它由脸书开发,在脸书和 Twitter 的人工智能实验室中被广泛使用,并已成为一个众所周知的工具。即使 TensorFlow 是一个非常受欢迎的框架,PyTorch 的简单性和易用性也比 TensorFlow 有更好的性能。
用例
- 脸书每天平均有超过 4000 名模特在 PyTorch 上奔跑。PyTorch 仍然是支持脸书所有人工智能工作负载的底层平台
- 自 2018 年以来,微软在其建模生态系统中有 Pytorch 用于多种用途(有消息称——微软可能在炒作 PyTorch)
- Pytorch 是 Airbnb 客服部门的核心。该公司建立了一个互动助手,通过智能回复与用户交流,提升他们的客户服务体验。
你能用 PyTorch 做什么?
- 在几分钟内部署新的人工智能模型,而不是几周
- 设计计算图形,并即时更改它们,而不是使用预定义的图形
- 实现网络架构,如递归神经网络(RNN),卷积神经网络(CNN),长期短期记忆(LSTM)等。
3.sci kit-学习
初始版本:2007
开发者:David Cournapeau
编程语言:Python、CUDA、C、C++
Scikit-Learn 本质上是一个支持监督和非监督学习的机器学习库。
如果你是一个机器学习奇才,你可能已经知道 Scikit-Learn。但是你不知道的是大约有 600,000 人使用 scikit-learn 月刊!(我忘了在哪里读到的,但我的笔记上写下来了😁)
PyTorch 是为深度学习设计的,而 Scikit-Learn (Sklearn)主要用于机器学习。定制相对比较难。
用例
- JP 摩根发现 Sklearn 在他们的基本机器学习任务中得到了使用,如分类和预测分析
- Spotify 使用 Sklearn 部署了一系列最先进的模型
- Booking.com 使用 Sklearn 实现标准算法,如酒店推荐、欺诈检测、客户服务改进
你能用 Scikit-Learn 做什么?
- 分类、回归、聚类、降维、模型选择、预处理、交叉验证等等…
- 实现现成的分类器来训练基线模型
- 可视化模型性能而不导入任何其他库
(为此我是 Sklearn 的大力推广者!!)
4.克拉斯
初始版本:2015
开发者:弗朗索瓦·乔莱
编程语言:Python
Keras 与众不同,我这么说是有原因的!
Keras 是一个神经网络库,就像 TensorFlow 一样,但与它们非常不同。Keras 实际上可以运行在 TensorFlow、Microsoft Cognitive Toolkit 或 Theano 之上,并支持模块化和全面表达。
Keras 不提供端到端的机器学习开发支持。更确切地说,它在使神经网络的配置变得简单方面发挥了作用,而不管它是基于什么样的框架(希望这能澄清 Keras 的工作)
使用 Keras,可以很容易地添加新模块,同时可以将神经层、成本函数和其他独立模块组合起来,以构建高级神经网络 API。
用例
网飞、优步、Yelp、Instacart、Zocdoc、Square,所有科技领域的大牌都使用 Keras 来满足他们的机器学习和人工智能需求。
Keras 在以深度学习为产品核心的初创公司中声名远扬。
你能用 Keras 做什么?
- 定义和训练神经网络模型
- 为神经网络构建自定义层
- 使用图像对模型进行内置预处理,并利用预先训练的权重
5.微软认知工具包
初始发布:2015
开发者:微软研究院
编程语言:C++、C#、Java、Python
我们讨论了谷歌为人工智能开发的 TensorFlow,以及微软怎么可能不参与竞争!?
微软认知工具包(CNTK)是另一个深度学习工具包。对于这一个,我将首先介绍用例,然后添加注释。
用例
- Skype 采用 Cortana(基本上是微软支持的产品)作为基于计算图的深度学习工具包,用于训练和评估深度神经网络
- 创建 Cortana 语音模型和网络排名
你能用 CNTK 做什么?
- 在内置组件上实现模型,如 CNN、RNN、增强、超参数调谐等。
- 同时使用多台服务器,加快学习过程
- 促进分布式培训,以有效地培训您的机器模型
注: 在发布的时候,CNTK 没有 Python API,也没有 C++之外的任何语言支持。多年来,微软推广了它的使用,直到今天,微软的内部团队仍然在运行旧的模型。
但是,CNTK 现在已被弃用。
微软已经停止添加新功能,但对不同的用户场景开放使用。
6.火花 MLib
初始版本:2012
开发者:加州大学伯克利分校 AMPLab 的 Matei Zaharia
编程语言:R、Scala、Java、Python
Apache Spark 将 MLib 视为他们的可扩展机器学习库。它很容易将 Spark 的 API 伪装成 NumPy (Python)和 R 库。它支持大量的 ML 算法、ML 工作流和其他实用程序。
用例
- 丰田使用 MLlib 对社交媒体互动进行实时分类和优先排序
- ING 在其数据分析管道中使用 Spark 决策树进行异常检测
- 该公司使用 Spark MLlib 支持向量机从万亿字节的媒体中预测有用的文件,并节省成本
你能用 MLib 做什么?
- 实施算法,如分类、回归、决策树、随机森林、交替最小二乘法(ALS)
- 聚类,高斯混合(GMMs),主题建模:潜在狄利克雷分配(LDA)
- 频繁项目集、关联规则和序列模式挖掘
- 特性转换:标准化、规范化、散列化……
- 构建机器学习管道
- 模型评估、超参数调整、分布式线性代数、奇异值分解、主成分分析
7.咖啡
初始发布:2013
开发者:伯克利视觉与学习中心
编程语言:C++,带命令行的 CUDA,Python,MATLAB 接口。
在这一点上,你可能已经猜对了——Caffe 是一个深度学习框架,但这个框架预装了一套经过训练的神经网络,因此,如果你是一个接近截止日期工作的人,Caffe 是你的选择!
Caffe 已被证明是一个很好的图像深度学习工具,但它不能像递归神经网络和序列建模那样实现收支平衡。
我几乎没有遇到一个框架扩展了对 MATLAB 的支持。因为 MATLAB 是我在开始机器学习时使用的代码的初始语言,我感谢 Caffe 为像我这样的人考虑问题!😆
用例
与其他框架一样,Caffe 广泛用于学术研究项目、创业原型,甚至是视觉、语音和多媒体领域的大规模工业应用。
雅虎!将 Caffe 与 Apache Spark 集成在一起,形成了一个分布式深度学习框架。
你能用咖啡做什么?
- 对 CNN(卷积神经网络)建模的全面支持
- 处理强大的图像视觉处理-使用一个 NVIDIA K40 GPU 每天处理超过 6000 万张图像
8.Theano
初始版本:2007
开发者:蒙特利尔大学
编程语言:Python
Theano 给予 TensorFlow 强有力的竞争。这种基于 Python 的人工智能支持深度学习研究,能够为需要高计算能力的网络提供准确性。
大规模计算密集型操作是 Theano 的 USP。到那时,Theano 本身可能实际上已经死亡,但建立在 Theano 之上的深度学习框架仍然在运行,并且做得很好。
虽然网上的每篇文章都说它是头条,但它仍然会排在我的优先列表的最后。我还是很难理解它围绕 CPU 和 GPU 的运算。
你能用它做什么?
- 定义、优化和评估涉及多维数组的数学表达式
- 即使手头只有极小的值,也能获得出色的准确率
- 自我验证代码,以便在部署的早期检测和诊断错误
这就是我的博客的结尾。感谢您的阅读!如果你需要在这个列表中添加更多的框架,请在评论中告诉我,我很乐意了解更多。
如果你喜欢阅读这样的故事,并想支持我成为一名作家,可以考虑使用这个链接注册成为一名媒体会员(我可以赚取一小笔佣金,不需要你额外付费!)
数据帐篷快乐!
Rashi 是一名来自芝加哥的数据奇才,他喜欢将数据可视化,并创造有见地的故事来传达隐含的见解。当她没有赶着赶上学校的最后期限时,她喜欢喝一杯好咖啡,写关于数据的博客…
顶级 AutoML 开源工具,实现深度学习应用的自动化
这两个计算机视觉工具会让你大吃一惊
照片由Philippe _ yeonathan bouaziz在 Unsplash 上拍摄
文章合著者 s 作者: @bonnefoypy 和@ emeric . chaize Olexya 的 CEO 们。
在任何数据科学项目中,构建最佳模型都是探索性数据分析和特征选择之后的关键步骤。在深度学习中,这个过程包括一层一层地构建适合数据的复杂神经网络(感知器、香草、卷积、递归)。
在大多数情况下,数据需要从图像、声音、视频、文本和数字处理成矩阵格式。用几行代码找到获得最佳模型和预测的创新方法是一个巨大的优势,特别是在对计算机视觉应用的图像进行分类时。图像数据集深度学习的自动化模型选择方法一般有 Autokeras 和 Azure studio 。
要成为独角兽数据科学家,掌握最新的自动化神经网络方法是一项必备技能。在本文中,我们将回顾两个最佳 Kaggle 获奖者的自动神经网络选择工具,它们可以以一种简单快速的方式实现。
- Autokeras
AutoKeras 是一个基于 Keras 的 AutoML 系统,由德州农工大学的数据实验室开发。这个框架可以建立一个具有复杂元素(嵌入、特征增强等)的模型..)自动预处理数据(文本、图像、数字、分类数据)并找到最佳神经架构(层数、辍学层百分比、优化器等)。
让我们尝试使用 MNIST 数据集,它由 60k 个从 0 到 9 的手写数字组成。
第一步是导入库:
***# Import libraries***!pip install autokerasimport numpy as npimport TensorFlow as tffrom tensorflow.keras.datasets import mnistimport autokeras as ak
第二步是加载数据:
***# Load the data*** (x_train, y_train), (x_test, y_test) = mnist.load_data()print(x_train.shape) *# (60000, 28, 28)*print(y_train.shape) *# (60000,)*print(y_train[:3]) *# array([7, 2, 1], dtype=uint8)*
输出
从https://storage . Google APIs . com/tensor flow/TF-keras-datasets/mnist . npz11493376/11490434[= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =-0s 0us/step(60000,28,28) (60000,)
第三步是初始化图像分类器,max_trials 参数指示所用模型的流水线数量,对于更复杂的数据集,max_trials 参数需要等于 1。
***# Initialize the image classifier***clf = ak.ImageClassifier(overwrite=True, max_trials=1)***# Input the training data***clf.fit(x_train, y_train, epochs=10)***# Make prediction with the best model on the test dataset***predicted_y = clf.predict(x_test)print(predicted_y)***# Evaluate the model on the test dataset***print(clf.evaluate(x_test, y_test))
AutoKeras 提供了一种简单的方法来使用卷积神经网络的元素,如卷积层、最大池和扁平化。而不需要定义神经网络的内部结构。让我们进行验证步骤:
***# With 85% training dataset and 15% validation dataset*** clf.fit(x_train, y_train,validation_split=0.15,epochs=10)
一些高级配置可以使用 automodel 的 ImageBlock 参数进行配置。该选项提供了块类型选项(resnet,vp16,..)、归一化和数据扩充参数。
***# Initialize AutoKeras input and output nodes***input_node = ak.ImageInput()output_node = ak.ImageBlock()***# Your neural network options, here we try Resnet***block_type="resnet",***# You can Normalize the dataset***normalize=True,***# You can add data augmentation***augment=False)(input_node)***# Build your output layer with the numbers of classes (in this example, 10 numbers 0-9)***output_node = ak.ClassificationHead()(output_node)***# Compile the input and output layers*** clf = ak.AutoModel(inputs=input_node, outputs=output_node, overwrite=True, max_trials=1)***# Train the model on the training dataset***clf.fit(x_train, y_train, epochs=10)
输出
您还可以将 tf.dataset 与 TPU 结合使用,以更快地获得结果:
***# Build your tensors from the train and test datasets*** train_set = tf.data.Dataset.from_tensor_slices(((x_train,), (y_train,)))test_set = tf.data.Dataset.from_tensor_slices(((x_test,), (y_test,)))***# Create your autokeras image classifier*** clf = ak.ImageClassifier(overwrite=True, max_trials=1)***# Train the model on the training dataset***clf.fit(train_set, epochs=1)***# Predict with the model with the test dataset***predicted_y = clf.predict(test_set)***# Evaluate the model with the test dataset*** print(clf.evaluate(test_set))
在测试数据集上的分类准确率为 97.5%。
2。蔚蓝工作室
微软的这款免费工具(无需注册信用卡)可以是一种模块化方法,使用带有完整数据导入选项的个性化数据工程管道,以简单快捷的方式自动创建功能。让我们来看同一个例子,MNIST 数据集由 0-9 的手写数字组成。
第一步是上传和创建 Mnsit 训练和测试数据集模块:
Azure 机器学习工作室的计算机视觉工作流(图片由作者提供)
第二步是选择多类神经网络:
带有 Azure 机器学习工作室的多类神经网络(图片由作者提供)
使用每个参数的指定范围,可以很容易地完全调整该神经网络:
Azure 机器学习工作室的神经网络最佳参数(图片由作者提供)
更多关于 Azure 神经网络的细节,参数点击这里。神经网络模块可以与您自己定制 Python 或 R 脚本一起使用:
使用 Azure Machine Learning studio 编写自己的脚本的计算机视觉(图片由作者提供)
下一步,用从训练数据集自动分离的训练和验证数据集来训练神经网络:
使用 Azure Machine Learning studio 自动训练定制神经网络(图片由作者提供)
最后,使用分类准确性对模型进行评分,并使用测试数据集进行评估,如下所示:
使用 Azure 机器学习工作室选择正确的评分方法(R-script )(图片由作者提供)
在测试数据集上的分类准确率为 98.8%。
测试数据集上的分类准确性(图片由作者提供)
关于 Azure studio(经典版)深度学习能力的更多细节点击这里。
这一简要概述提醒了使用 autoML 工具为图像分类选择正确的神经网络架构的重要性。这篇文章涵盖了快速简单的图像分类工具,并分享了有用的文档。
总结
请参考此链接,查看完整的 8 个 autoML 工具,并一步一步查看 python 代码:
https://www.datasciencemusthaveskills.com/home
希望你喜欢,继续探索!
照片由Philippe _ yeonathan bouaziz在 Unsplash 拍摄
影响媒体、广告和娱乐行业的顶级人工智能趋势和挑战
数据科学领导者参与进来
通过 Adobe Stock Photo 提供的图像
我最近采访了一些来自 Comcast/Freewheel、Condé Nast、ViacomCBS、Audoir、USA Today Network 和 Samba TV 的顶级数据科学领导者,探讨他们对媒体、广告和娱乐领域的 ML & AI 的最大趋势、挑战和机遇以及未来可能会如何。让我们开始吧!
娱乐和媒体行业将会采用哪些最大的趋势?
Comcast/FreeWheel,应用分析高级总监 Christopher Whitely 分享道:“在未来的几个月和几年里,我们将看到 M & E industries 采用一些领域,包括更多的上下文广告,广告创意资产通过算法与适当的节目内容相匹配。联邦学习也是一个新趋势,指的是在不共享数据集的情况下,使用机器学习进行建模。隐私很重要,所以我预计我们将继续使用聚合客户细分和净室进行营销和分析。此外,长相相似的模特将有助于广告商接触潜在客户,优化广告活动,以获得最大效果。”
Christopher 继续说道:“营销人员正在寻求提高针对性、效率和自动化,这将通过跨平台可寻址决策实现,包括线性可寻址在内的各种媒体渠道的统一广告活动规划、节奏和执行。”
“所有的媒体公司都开始意识到数据的力量,并想知道它能做什么,因为他们已经开始推动他们的流媒体业务。因此,如果你喜欢在娱乐行业工作,那么这是进入该领域的绝佳时机,因为他们都在用新人才扩大他们的数据科学团队,”ViacomCBS 的数据科学家 Jay Kachhadia 说。
Condé Nast 首席数据科学家 Vishal Juneja 表示:“越来越多的人采用 ML,不仅是在内容营销、推荐等更主要的用例中,也是在内容创作中作为一种辅助手段,为内容消费寻找新的媒介,从而提高用户参与度。此外,像联邦机器学习这样的解决方案在用户隐私方面更加合规。”
对于那些已经有专门的数据科学团队的人来说,最大的挑战是什么?
Audoir 的机器学习工程师 Wayne Cheng 预计,高质量数据集的数据收集和复杂数据集的数据工程是一项挑战;Christopher Whitely 预见到“关键将是决定如何组织项目以促进创新,然后让它被采用。团队需要平衡项目的特殊性和满足广泛需求的能力。”
桑巴电视台的首席数据科学家邦妮·马格努森-斯基尔斯认为,“随着隐私法的变化和可供收集的数据越来越少或不同,继续更新我们的方法是很重要的。在桑巴电视台,我们一直将隐私放在第一位,并在法规出台之前引入隐私保护,因此我们已经对我们收集的数据进行了有力的定位。”
对于 Gannett,USA Today Network 的数据科学主任易康来说,这归结为可解释性。“并非每个模型都需要它,但缺乏可解释性将使模型更难被采用,在某些行业还会与监管机构发生冲突。”
Vishal Juneja 看到了业务团队和目标一致性方面的挑战,“管理层对清晰数据战略路线图的支持将决定组织内数据科学计划的成败。”
在加入媒体、娱乐和广告行业之前,你希望自己了解哪些方面?
Wayne Cheng 指出,研究和行业之间的差距很大,只有少数几个组织试图弥合这一差距,而 Christopher Whitely 发现,行业可能比乍看起来更复杂,很容易迷失在杂草中。“出于这个原因,我认为在深入细节之前,了解全局是至关重要的。媒体是非常广泛的——所以我的建议是花时间和在这个行业的不同领域(电视、电影、广告技术等)履行不同职能的人交谈。)再决定自己的激情。”克里斯托弗分享。
Vishal Juneja 指出,广告不是一门精确的科学,由于技术限制和用户隐私问题,用户行为存在几个死角。“也许更好的方式是将其视为一项数据科学挑战,我们必须竭尽全力,拿出最合适的解决方案。”
你预计未来 5 年该行业会有什么样的变化?
韦恩·程(Wayne Cheng)预计人工智能技术将被用作内容创作工具,其中易康指出:“对于数字广告来说,这将是如何在后 cookie 世界中向消费者提供相关的广告体验。”
Jay Kachhadia 认为,媒体公司将在未来 5 年内更多地建立强大的数据科学团队,从构建 ML 模型到数据/ML 管道到为各种内部利益相关者构建数据产品,为数据科学家、ML 工程师和数据工程师成为同一团队的一部分提供更多机会。
我认为未来 5 年将会发生很多变化!Christopher Whitely 说:“我希望消费者能够向创作者提供即时反馈,并根据他们喜欢观看的内容获得即时的交互式推荐。“电视世界将有更多的电视广告数据,人工智能将发挥更大的作用——让更多的人成为创作者,让广告实验更加有效。”
Vishal Juneja 认为,越来越关注用户隐私和不断发展的 ML 前景,能够在新的限制内工作,并慢慢发展,以优化隐私问题和通过利用高质量的第一方数据通过个性化向消费者推荐有用的产品这两个目标,这是一个即将发生的变化。
作为这个领域的数据科学家,什么会让你的工作变得更容易?
Wayne Cheng 相信高质量数据集的可用性和更容易获得机器学习硬件加速器,而 Christopher Whitely 表示“我们需要更有效的方法来跟上该领域的学术研究,同时也深入了解重要的新发现——同时我们也在做工作本身。我们需要更好的方法来管理和简化这个越来越复杂的行业,包括更快的查询和建模工具,自动化数据质量检查和帮助解释复杂数据集中元数据的工具。”
邦妮·马格努森-斯基尔斯希望从美国人口普查局获得更详细的人口统计数据。她指出,一般来说,数据越细,它的用途就越多。Vishal Juneja 认为,来自数据工程的更多支持是数据科学家一直以来的愿望。
这是我们的演讲者将在下周即将举行的 DSS 虚拟:媒体、广告&娱乐上讨论的见解片段。涵盖的一些主题包括内容个性化和货币化、人工智能的大规模个性化、云自动化和机器学习、受众定位和细分(跨平台)、新兴平台的数据和人工智能、数据治理等。
顶级数据分析师技能
…根据事实,你同意吗?
伊利亚·巴甫洛夫在Unsplash【1】上的照片。
目录
- 介绍
- 结构化查询语言
- 电子表格
- 批判性思维
- 统计程序设计语言
- 数据可视化
- 摘要
- 参考
介绍
数据分析师可以期望能够执行几种不同的功能,从一小时内的快速任务到一个月内的任务。话虽如此,也有技术上不同的技能,以及一些软技能,如沟通,所有这些技能都非常重要。在这篇文章中,我将讨论我对这些由定义的五大数据分析师技能的看法,以及我发现特别有趣的一些其他技能。值得注意的是,本文面向那些希望成为数据分析师并想了解预期技能的人,以及那些通常对了解数据分析师的顶级技能感兴趣的人(如果你是一名经验丰富的数据分析师,你很可能已经了解所有这些技能)。如果你想了解更多关于 2021 年数据分析师的顶级技能,请继续阅读。
结构化查询语言
照片由卡斯帕·卡米尔·鲁宾在Unsplash【3】拍摄。
毫无疑问,这项技能是第一位的。对于数据分析师来说,这可能是最重要的技能,因为它表明数据分析师当然需要精通数据和分析数据,这通常以 SQL 查询的形式出现。利益相关者可能会请求一些查询以获得简单的报告,而一些查询可能会更复杂,与其他流程相关,例如用于训练机器学习算法的数据集。
以下是一些示例,说明如何将 SQL 用作数据分析工具:
- 连接、聚合、过滤数据库表中的数据
- 为利益相关者提取类似 CSV 的报告(原始数据)
- 根据 Tableau、Looker 等数据创建更全面的报告。
- 创建静态或动态连接(一次性请求,或在报告或仪表板中设置的重复请求)
如您所见,SQL 是一个强大的工具,一些数据分析师可能发现自己几乎每小时都在使用 SQL,这取决于公司和具体的工作描述。
电子表格
坦率地说,有时候,在使用 SQL 查询之后,在电子表格中管理、查看和操作数据会更容易。虽然它不是最有趣的技能,但它可能是你最常使用的技能之一。一些流行的电子表格平台是 Microsoft Excel 和 Google Sheets。我个人更喜欢 Google Sheets,因为你可以有协作的实时版本。在你开始回答工作中利益相关者提出的一些问题后,你可能会惊讶于你可以用电子表格做什么。
以下是数据分析师如何使用电子表格的一些示例:
- 快速可视化数据
- 快速共享数据
- 突出显示某些数据进行比较
- 排名数据
- 分组数据(透视表)
- 利用电子表格包含的过多功能(或一些你自制的计算)
- 条件格式
虽然电子表格可能不是最奇特的技能,但它可能是最基本的。你应该期望在电子表格中执行你的一些工作,因为这是大多数利益相关者都知道的事情。SQL 可能更具体,而电子表格是一种大多数人都知道的语言或交流形式。
批判性思维
Jason Strull 在Unsplash【5】上拍摄的照片。
当然,这种技能不仅仅是数据分析师所独有的,因为您可能要执行的任务,所以仍然需要注意这一点。很难给出所有数据分析师批判性思维的清晰示例,因为每份工作和每家公司都不尽相同,但我将讨论我遇到的一些你可能会在工作中遇到的场景:
- 创建仪表板时,请确保您分组的内容在该时间段内完成,这样您就不会显示部分数据,并确保向风险承担者说明这一点
- 注意什么时候有缺失的数据,以及这是否在您的分析中
- 与利益相关者合作时,你需要问正确的问题,这样你才能很好地理解他们的要求
很难说你将采取什么样的批判性思维步骤,但总的要点是,在你运用批判性思维之前,你需要在不知道如何立即提问或立即知道一项任务的确切要求的情况下感到舒适。
统计程序设计语言
克里斯里德在Unsplash【6】上的照片。
类似于电子表格,这个技能可能指的是 R 和 Python 两个具体的技能。但是,它也可以指或包含 SAS。无论哪种方式,所有这些技能都非常强大,可以让你作为数据分析师受益匪浅。一些数据分析师可能有很大一部分工作是围绕统计和数据科学展开的。这项技能对于以编程方式计算统计显著性以及 A/B 测试非常有用。
以下是数据分析师何时使用静态编程语言的一些例子:
- 编程计算统计显著性
- 使用使统计数据更容易访问和应用的库
- 进行实验和假设检验
- 利用常见的统计技术,如 ANOVA(方差分析)
- 产品比较的 A/B 测试
- 异常值分析
- 数据质量/数据分布
- 回归
- 特征/数据重要性
有许多不同的功能利用了统计方法,并且可以通过使用编程语言来有效地执行。并不是所有的数据分析师都应该具备这种技能,但是如果你具备这种技能,作为一名申请人,你可能会更有竞争力。然而,对于一些工作或公司来说,这可能是不必要的,所以这取决于你从工作描述中了解这些要求以确定无疑。
数据可视化
Stephen Dawson 在Unsplash【7】上拍摄的照片。
本文中的最后一项技能是上述所有技能的某种组合。因为您将与利益相关者进行大量协作,所以您将收到的任务或请求通常以数据开始,以可视化相同的数据结束。您可以通过各种方式来可视化数据,一些更常见的是简单的 CSV 报告、更复杂的带过滤器的 Tableau 报告、Looker 报告,还有一些是通过 R、SAS 和 Python 等统计编程语言。
以下是数据分析师何时使用数据可视化的一些示例:
- 以易于理解的格式表达复杂的数据(可视化)
- 轻松地与他人分享数据或结果
- 比较数据
- 在一个位置查看大量数据,而不必滚动或翻动其他位置
对数据分析师来说,可视化数据是最有益的技能之一,因为通过这种方式,您可以将您的数据、处理、查询和结果传递给非数据分析师的其他人,他们通常被称为风险承担者。
摘要
虽然其中一些技能对一些人来说可能是显而易见的,但我的希望是为那些对该领域感兴趣的人强调数据分析师的顶级技能。当然,还有更多的技能需要讨论,其中一些排名较低,如机器学习、公共演讲和项目管理。这三种排名较低的技能对数据分析师非常有益——最终取决于具体的工作,这就是为什么它们的排名可能不高。如果你是一名了解机器学习的数据分析师,你可能更适合数据科学家的职位。然而,公开演讲和项目管理是数据分析中更必要的技能,因为你必须知道如何处理一个请求或项目,管理它,并通过公开演讲将结果和见解传达给其他人。
总而言之,以下是数据分析师应该知道的一些关键技能:
* SQL* Spreadsheets* Critical Thinking* Statistical Programming Languages* Data Visualization
我希望你觉得我的文章既有趣又有用。如果您同意或不同意所讨论的这些技能,请随时在下面发表评论。为什么或为什么不?关于数据分析师的要求和期望,您认为还有哪些技能是必须指出的?这些当然可以进一步澄清,但我希望我能够为数据分析师阐明这些技能。
感谢您的阅读!
我与这些公司都没有关系。
请随时查看我的个人资料、 马特·普日比拉、和其他文章,并通过以下链接订阅接收我的博客的电子邮件通知,或通过点击屏幕上方的订阅图标 的 ,如果您有任何问题或意见,请在 LinkedIn 上联系我。
订阅链接:https://datascience2.medium.com/subscribe
参考
[1]Ilya Pavlov 在 Unsplash 上拍摄的照片,(2016)
[2]的确,数据分析师的 18 项关键技能,(2021)
[3]照片由 Caspar Camille Rubin 在 Unsplash 上拍摄,(2017)
[4]照片由米卡·鲍梅斯特在 Unsplash 上拍摄,(2018)
[5]Jason Strull 在 Unsplash 上拍摄的照片,(2017)
[6]克里斯·里德在 Unsplash 上拍摄的照片,(2018)
顶级数据科学业务指标
意见
…以及便于利益相关方协作的用例示例
目录
- 介绍
- 分时段单位范围
- 影响的变化
- 摘要
- 参考
介绍
虽然有大量的数据科学或特定的算法指标,如梅和 RMSE,知道这些很有用,但还有其他指标对利益相关者和你的业务整体来说更有意义。在学术界,这一点通常不会教得太多,但了解、实践和运用这一点同样重要。出于这些原因,我将研究三个用例,在这些用例中,您可以从利用业务指标与利益相关者(特别是那些不在数据科学领域的)进行协作中受益。
分时段单位范围
请记住,并非所有这些指标都适用于所有用例,这很重要,因此我给出了一个例子,以便您可以确定它是否适合您的情况。话虽如此,让我们首先讨论一个用例,其中您预测一个连续的目标,比如从 1 到 100 的数字。
在当前的空间中,你可以用梅或 RMSE 为例,来了解你的具体模型做得如何。然而,当与高管或其他利益相关者交谈时,您会希望从它如何影响业务的角度来解释错误。
用例的例子是预测一栋房子出售的价格。预期目标可以是 20 万到 30 万美元之间。建立要素和模型后,您将看到您的 MAE 为 10,000 美元,RMSE 为 30,000 美元。虽然这听起来很棒,并且对您的模型有用,但它可能不会帮助您的利益相关者做出进一步的业务决策。
您可以替代的一些业务指标如下——基本上来自分时段的美元金额范围:
- 比实际少 10,000 美元的预测百分比→
例如:40%的预测比实际少 10,000 美元以内,另一种看待这个业务指标的方式是,当与实际相比时,我们的预测有多少是低估的
- 预测值比实际值高出 10,000 美元的百分比→
例如:20%的预测值比实际值高出 10,000 美元以内,另一种看待这个业务指标的方式是,与实际值相比,我们的预测值有多少是高估了
您想要使用这种业务度量方法的原因是,利益相关者和您自己能够知道您在预测的任何一侧偏离了多少。例如,MAE 的局限性在于,它在总体水平上查看低于和高于实际值的预测值(如平均值误差所示的)。根据您的用例,您可能希望预测固有地高估或低估。
影响的变化
Gilles Lambert 在Unsplash【3】上拍摄的照片。
现在,我们已经了解了错误的不同解释,我们可以看看之前的指标对业务的影响。例如,当查看不同货币区间的预测数量时,我们会考虑这对企业意味着什么。
以下是一些关于影响业务指标变化的示例和讨论:
- 高估会导致销量下降
例句:当我们高估或不高估时,超过两周的销售占多大比例?
- 低估导致卖家的钱更少
例:有百分之多少的出价被低估了?
正如您所看到的,这个用例特定于房屋销售,但是它可以应用于不同的场景。比如汽车销售,任何产品销售等等。它甚至不需要与销售有关,它可以是当你看到某组预测时,你公司应用程序的登录次数。您的预测的影响通常集中在 A/B 测试上,或者比较当您提出某些预测时会发生什么,您的业务的哪些方面对您或您的利益相关者最重要,以及这些指标是否发生了重大变化。
摘要
有了这两个主要的商业度量类型的例子,我们可以看到如何讨论 MAE、MAPE、AUC 等。当将一个模型合并到一个商业的正式发布中时,这是不够的。从业务的角度来测试模型总是最好的,我们已经讨论了分时段的指标,以及它们对产品和用户行为的影响,可以更好地理解业务。
总而言之,这里有两个你应该知道的重要业务指标:
** Bucketed Unit Ranges* Change in Impact*
我希望你觉得我的文章既有趣又有用。如果您同意或不同意这些重要业务指标的例子,请随时在下面发表评论。为什么或为什么不?您认为您可以使用或重要的其他指标有哪些?这些当然可以进一步澄清,但我希望我能够为数据科学家和利益相关者阐明一些更独特和具体的业务指标。感谢您的阅读!
我不属于这些公司中的任何一家。
请随时查看我的个人资料、 Matt Przybyla 、和其他文章,并通过以下链接订阅接收我的博客的电子邮件通知,或通过点击屏幕顶部的订阅图标 点击订阅图标 ,如果您有任何问题或意见,请在 LinkedIn 上联系我。
订阅链接:https://datascience2.medium.com/subscribe
参考
[1]照片由路径数码在 Unsplash 上拍摄(2020)
[2]由卢卡斯·布拉塞克在 Unsplash 上拍摄的照片,(2017)
[3]Gilles Lambert 在 Unsplash 上拍摄的照片,(2015)
顶级数据科学认证
意见
…我认为目录中最好的是
安德烈·亨特在Unsplash【1】上拍摄的照片。
目录
- 介绍
- 谷歌认证专业数据工程师
- 谷歌数据机器学习工程师
- IBM 数据科学专业证书
- 微软认证 Azure 数据科学家助理
- 摘要
- 参考
介绍
与其参加 20 到 30 个数据科学认证,我将讨论我认为最重要的四个来自知名来源的认证。我评估的质量包括但不限于:涵盖的主题、wow 因素和品牌。作为过去几年的数据分析师和数据科学家,我不断意识到在数据科学领域取得成功的关键是什么。也就是说,我将讨论由决定的顶级数据科学认证,以及我认为的这些顶级认证中的前四项。
谷歌认证专业数据工程师
卡斯帕·卡米尔·鲁宾在Unsplash【3】上的照片。
第一个认证可能会让一些人感到惊讶,因为重点是在一个不同的领域。然而,我相信数据工程技能和功能与你作为数据科学家所需要的技能相似。我还认为你会有竞争优势,因为你不仅精通数据科学,还精通数据工程。
以下是专业数据工程师认证【4】考试将评估的一些内容:
- 设计数据处理系统
→存储技术、数据管道和其他工具,如 BigQuery、Dataflow、Apache Spark 和 Cloud Composer,以及迁移数据仓库
- 建立和运行数据处理系统
→云 Bigtable、具有存储成本和性能的云 SQL、数据清理、转换和集成数据源等工具
- 操作化机器学习模型
→使用预先构建的 ML 模型,如 Vision API、AutoML Vision、带 Dialogflow、带 AI 平台预测的再训练模型、使用 GPU、回归、分类、监督和非监督模型之间的差异,以及它们各自的评估指标
- 确保解决方案质量
→安全性和合规性,包括加密、数据丢失防护 API 以及云监控和应用程序可移植性
总的来说,这个证书会告诉雇主你是一个非常全面的数据科学家。在从各种教育平台学习了数据科学之后,我可以说,这个平台提供了对没有教授多少的技能的测试,因此你将是一个更有竞争力的申请人。最后,这个认证是来自谷歌,这是众所周知的技术行业。
以下是该认证的一些逻辑要点:
- 2 小时长
- $200
- 提供英语和日语
- 多选
- 在线监考或现场监考
- 推荐你有谷歌云经验
谷歌数据机器学习工程师
同样,另一个认证并不完全是数据科学本身,而是数据科学中更具体的主题,即机器学习。许多数据科学家只在 Jupyter 笔记本上工作会变得太舒服,所以当他们不得不在网站或移动应用程序中实现模型时,这可能会令人难以置信地令人生畏,因为许多教育程序确实知道教授这一概念。最好是学习机器学习操作这样你才能更全面更高效。
以下是这项认证将在谷歌专业机器学习工程师[6]中评估的一些内容:
框架 ML 问题
→使用 AutoML 等工具将业务挑战转化为 ML 用例,找出问题类型,如分类或聚类,并调查关键 ML 成功指标
构建 ML 解决方案
→使用 Kubeflow、功能工程、自动化、流程编排和监控等工具扩展 ML 解决方案
设计数据准备和处理系统
→探索性数据分析,也称为 EDA,以及可视化和统计基础知识,并通过数据验证、训练数据集、缺失值、异常值和数据泄漏来清理数据集
开发 ML 模型
→接受不同类型的培训,包括 CSV、JSON 或 parquet 和数据库,以及超参数调整等特定概念,此外还有分布式培训和集装箱式服务
自动化和编排 ML 管道
→设计培训渠道,m 使用诸如 Cloud Compose、Apache Airflow 等编排工具
监控、优化和维护 ML 解决方案
→记录模型策略、再训练和调整模型性能,以及优化这些训练管道
总的来说,这种认证更类似于数据科学本身,并且肯定会向雇主以及你自己表明,你不仅有能力创建你的模型,而且有能力将它们部署到生产环境中。
以下是该认证的一些逻辑要点:
- 2 小时长
- $200
- 英语
- 多选
- 在线保护或亲自监督
IBM 数据科学专业证书
照片由 Hitesh Choudhary 在Unsplash【7】拍摄。
对于这个认证,你不只是参加一个测试,而是实际学习材料,然后适当的测试。该认证也完全以数据科学本身为中心,这对于学习和测试数据科学当然非常有用。另一个好处是,这个项目是由 IBM 通过 Coursera 提供的,这两家公司都是声誉良好的公司。
以下是您将报名参加 IBM 数据科学专业证书【8】的 10 门课程:
- 什么是数据科学?
- 数据科学工具
- 数据科学方法论
- 用于数据科学、人工智能和开发的 Python
- 数据科学 Python 项目
- 使用 Python 开发用于数据科学的数据库和 SQL
- 使用 Python 进行数据分析
- 用 Python 实现数据可视化
- 用 Python 进行机器学习
- 应用数据科学顶点
正如你所看到的,这些课程包括很多 Python,这是我更喜欢的,但有些人可能更喜欢 R,所以如果这是你想在工作中做的,那么最好报名参加一个专注于 R 的项目。
以下是该计划和认证需要考虑的一些要点:
- 课程计划
- 百分之百在线
- 初级水平
- 灵活的时间表
- 通常需要 11 个月的时间来完成(所以这是一个较长的过程,但因为它侧重于学习
- 英语字幕,包括英语、阿拉伯语、法语、葡萄牙语(欧洲语)、意大利语、越南语、德语、俄语、西班牙语、波斯语、土耳其语
微软认证 Azure 数据科学家助理
Joshua Sortino 在Unsplash【9】上拍摄的照片。
正如你所看到的,我们包括了许多科技公司的主要参与者,微软也不例外。它也是另一家声誉良好的公司,学习、实践或测试这两者都是有益的。该计划在某种程度上融合了我们已经讨论过的所有上述认证。您主要参加认证考试,但也可以通过免费的在线学习路径进行准备,或者接受付费的讲师指导。
以下是微软认证 Azure 数据科学家助理 [10】的主要技能:
- 为机器学习管理 Azure 资源
→创建 Azure 机器学习工作场所,管理数据,管理实验计算,实施安全和访问控制,并设置开发环境
- 运行实验和训练模型
→使用设计器创建模型,运行模型训练脚本,生成指标,使用最佳模型实现自动化,并调整超参数
- 部署和实施机器学习解决方案
→选择用于模型部署的计算,将模型部署为服务,管理模型,创建用于批量推理的管道,将管道发布为 web 服务,以及应用 ML Ops 实践
- 实现负责任的机器学习
→使用模型解释器解释模型,描述模型的公平性和隐私考虑
对我来说,这个认证可能是最简单的——以一种好的方式。它很好地涵盖了机器学习操作过程的主要部分。尽管它被贴上了数据科学的标签,但它确实专注于机器学习操作。
摘要
总的来说,如果你能完成所有这些项目,我认为你完全有资格成为一名数据科学家。这些认证旨在涵盖流行的平台和工具,以及数据科学的流程,其中包括业务问题、数据分析、数据科学建模以及机器学习操作和部署。当然,如果你是直接申请这些公司,那么你会看起来更加匹配。请记住,我的确是根据我的观点从一份名单中挑选出来的,实际上还有很多你可以报名参加的。
简而言之,以下是来自 Indeed 更大目录的 2021 年四大数据科学认证:
* Google Certified Professional Data Engineer* Google Data Machine Learning Engineer* IBM Data Science Professional Certificate* Microsoft Certified Azure Data Scientist Associate
我希望你觉得我的文章既有趣又有用。如果您同意或不同意这些数据科学认证,请随时在下面发表评论。为什么或为什么不?关于认证,你认为还有哪些重要的因素需要指出?这些当然可以进一步澄清,但我希望我能够对数据科学家的顶级认证有所启发。
感谢您的阅读!
我不属于这些公司中的任何一家。
请随时查看我的个人资料、 Matt Przybyla 、和其他文章,并通过以下链接订阅接收我的博客的电子邮件通知,或通过点击屏幕顶部的订阅图标 点击订阅图标 ,如果您有任何问题或意见,请在 LinkedIn 上联系我。
订阅链接:https://datascience2.medium.com/subscribe
参考
[1]安德烈·亨特在 Unsplash 上拍摄的照片,(2018)
[2]果然(果然编辑团队), 18 项顶级数据科学认证,(2021)
[3]照片由卡斯帕·卡米尔·鲁宾在 Unsplash 上拍摄,(2017)
[4]谷歌,专业数据工程师, (2021)
[5]Pietro Jeng 在 Unsplash 上拍摄的照片,(2017)
[6]谷歌,专业机器学习工程师(2021)
[7]照片由 Hitesh Choudhary 在Unsplash(2018)上拍摄
[8] IBM 和 Coursera Inc ., IBM 数据科学专业证书,(2021)
[9]Joshua Sortino 在 Unsplash 上拍摄的照片,(2017)
[10]微软,微软认证 Azure 数据科学家助理,(2021)
顶级数据科学入门级工作
意见
…寻找第一份工作时需要寻找的特征
由un splash【1】上的 ConvertKit 拍摄的照片。
目录
- 介绍
- 商业案例
- 团队和同事
- 工具和技能
- 摘要
- 参考
介绍
虽然我不会讨论具体申请的公司,但我会讨论当你成为数据科学家时应该寻找的入门级工作的某些特征。这些品质也可以应用到当前和未来的数据科学家工作中。公司的名称可能是一个重要的因素,因为它可以散发出声誉和稳定性,但你不会希望将你的搜索仅限于这些公司,这就是为什么寻找具体的特征也同样重要。下面,我将更详细地介绍业务、您的团队以及当您作为数据科学家获得第一份工作时需要寻找的技能。
商业案例
当你第一次开始成为一名数据科学家时,你会希望确保你不一定只是在忙着工作,并有一个你可以立即专注的项目——首先学习数据和业务。商业案例的一个例子是,通过使用机器学习算法来提高流程的效率。您将与利益相关者、其他数据科学家(可能是软件工程师)以及产品经理合作,找出主要问题,创建时间表,启动数据采集流程,并最终应用可注入公司当前生态系统的算法。
知道自己将参与商业案例的好处:
- 与同事协作
- 有机地找出公司数据的来龙去脉
- 探索公司内部的常见问题
- 认识到数据科学对公司的帮助有多大
- 本质上,从头到尾完整体验数据科学流程,以便您知道未来每个流程的预期
正如您所看到的,了解您将从事的具体业务案例有许多优势,如果没有具体的业务案例,了解您将立即从事一个项目是您在申请第一份数据科学工作时要寻找的一种品质。
行业
同样需要注意的是你将要工作的行业。根据行业的不同,成为一名数据科学家可能是一种完全不同的独特经历,因此选择正确的经历至关重要。例如,成为医疗保健领域的数据科学家可能会有回报,但也会有更大的压力,因为人们的健康与你的工作有关。相反,一些数据科学工作可以专注于不像用例那样严肃的建议。最终,这取决于你想从事什么类型的行业,因为你将把数据科学模型应用到那些特定的用例中。同样,知道你将和谁一起工作也很重要,这是我接下来要讨论的。
团队和同事
了解你将要工作的团队是一件非常重要的事情。一个团队可以成就或毁灭你作为数据科学家的经历,不仅是因为工作本身,还因为你工作之外的生活质量。当你和同事相处融洽时,你们可以一起更好地工作。除了喜欢他们之外,在你的第一份工作中,拥有一个人数合适的团队是另一件事。例如,在您的团队中加入另一位数据科学家可能有助于激发想法,以及执行特定于数据科学的代码审查。除了另一名数据科学家之外,在您的团队中拥有一名特定的软件工程师、数据工程师或机器学习工程师也非常有益,因为当您想要将您的模型实施到生产中时,他们可以真正帮助您,并审查您的代码以确保它尽可能地高效和可伸缩。
关于你的团队和同事的考虑:
- 知道你将与谁合作
- 找出是否有数据工程师、机器学习工程师或软件工程师将和你一起工作
- 如果你有一个直接的数据科学经理,或者更确切地说,如果你有一个不懂数据科学的经理,在这两种不同的情况下,管理动态可能会有很大的不同
- 你多久会合作一次(你会有每日站立和代码回顾吗?)
知道你将和谁一起工作对于你和你的团队的成功都是至关重要的。数据科学在某种程度上可以是一种个人类型的角色,但当它需要扩展和改进时,您很可能需要团队的投入和帮助才能真正成功。接下来,我将讨论数据科学的“”以及要寻找什么。
工具和技能
当然,知道你在工作中需要哪些工具和技能是很重要的。然而,更重要的是,在开始工作之前,要确保自己具备正确的技能。在工作中学习有一些好处,但对于你的第一份工作来说,对编程语言有信心,会让你更专注于数据科学本身,而不是编程的含义。这就引出了我的下一个观点,在开始入门级工作之前,知道你是否必须主要用 R 或 Python 来编码是很重要的。虽然它们本质上可以执行相同的任务,但它们确实有一点差异,这可能会影响数据科学过程的其他部分。
以下是开始入门级工作时需要寻找的一些技能和工具:
- Python 与 R 编程语言
- Jupyter 笔记本
- 皮查姆
- 原子
- SQL 平台
- 生产环境
- 码头工人
- 达格的
- 气流
- 自动警报系统
- 检查员
- (舞台上由人扮的)静态画面
以上只是执行您的工作所需的一些技能和工具,之前精通它们将是一个竞争优势,并将允许您更多地关注最终将使您的数据科学模型化的机器学习算法。
摘要
开始你在数据科学领域的第一份工作可能会让人不知所措,但具备这些特征可以让你做好准备,并作为一名申请人脱颖而出。了解您的主要业务案例,无论是从图像分类到预测时间序列问题,这些用例都可能非常不同,因此即使您已经全部研究过,了解您需要专攻哪一个也是有益的。与你一起工作的团队和同事是你日常工作生活的重要组成部分,即使在工作之外也是如此,所以与他们相处融洽非常重要。此外,了解你的直属团队中有哪些类型的角色将让你知道你将拥有哪些资源。最后,工作所需的工具和技能在不同公司的数据科学职位之间可能会有很大差异,因此确保您的工具和技能保持一致非常有益。仅仅因为你不知道一种数据科学技能并不意味着你是一个糟糕的数据科学家,这可能意味着你可以在不同的公司和角色专注于你的优势。
总而言之,以下是入门级工作中最值得期待的几件事:
Business CaseTeam and CoworkersTools and Skills
我希望你觉得我的文章既有趣又有用。如果您之前在寻找入门级数据科学家工作或任何类型的数据科学家工作时关注这些特征,请随时在下面发表评论。这对你现在的数据科学事业有帮助吗?你同意还是不同意,为什么?
请随时查看我的个人资料和其他文章,也可以通过 LinkedIn 联系我。
如果你想了解更多关于数据分析以及它如何成为数据科学的重要先决条件,请点击这里查看我的另一篇文章[5]:
参考
[1]照片由 ConvertKit 在Unsplash(2020)上拍摄
[2]照片由 DocuSign 在Unsplash(2021)上拍摄
[3]照片由 DocuSign 在Unsplash(2021)上拍摄
[4]照片由布雷克·康纳利在Unsplash(2017)上拍摄
[5] M.Przybyla,在成为数据科学家之前,你应该首先掌握数据分析,(2021)
顶级数据科学面试准备
意见
基于我作为面试官的经验的一些见解
克里斯蒂娜@ wocintechchat.com 在Unsplash【1】上的照片。
目录
- 介绍
- 利益相关者协作
- 关键绩效指标
- 文化契合度
- 摘要
- 参考
介绍
网上有许多数据科学面试指南,但很少有人强调与同事互动的重要性以及数据科学对业务的影响,而不是只关注机器学习算法概念。当然,所有这些都是需要掌握的关键概念和技能,但是也值得关注数据科学中技术含量较低的方面。也就是说,我将在下面列出应该整合到您的数据科学面试准备中的三个实践领域。
利益相关者协作
通常情况下,数据科学家是一个团队的一部分,他们致力于实现企业的最终目标,无论是产品本身还是客户。这种利益相关者协作的概念通常不会在学校或数据科学教育计划中教授,如果你还没有数据科学工作,这很难实践。但是,你仍然可以用其他方式来呼应这个概念的主要思想。
首先,让我们定义什么是利益相关者。 以我的经验来看,是给你分配任务 的人,最终负责将一个模型推向生产,就批准还是不批准而言。涉众通常是产品经理,但也可以是任何人。甚至可能是你自己,在这种情况下,知道这些建议可能还是有用的。
这里有 3 种实践利益相关者协作的可行方法:
- 向没有数据科学背景的人解释数据科学
- 了解你可能与之互动的不同类型的利益相关者
- 了解数据科学对业务的影响
我想先强调这些,这样它们就容易看到和理解。现在,让我们更深入地了解每一个问题。
对于#1,尝试解释什么是决策树——这个概念是许多机器学习算法的一部分,如果你能解释这个,你已经获得了很多技能。当形象化时,这个分解的概念更容易理解。你也可以分解分类和回归之间的区别,并给出真实的例子。例如,根据特征对动物进行分类(名为),或者根据过去的数据预测连续的数字销售。
对于#2,正如我上面所说的,产品经理可能是最常见的利益相关者角色。我想说,大多数人都有技术经验,可能也知道 SQL。其他的例子包括软件工程师、数据分析师和高管或高层领导。
对于第三点,您构建的数据科学模型可能有 99%的准确性,但是如果它们没有通过帮助客户或节省资金等方式影响业务,那么实施起来就真的没有用。也就是说,最好理解定义成功的常见业务指标,这些通常被描述为关键绩效指标(KPI,我将在接下来更详细地讨论。
因此,在面试时,确保你概述了你与利益相关者合作的一些实践,即使这与工作经验没有直接关系,一个简单的例子可以是向家人或朋友阐述数据科学概念,向面试官提供例子。
关键绩效指标
数据科学算法有自己的成功指标,比如准确度、精确度、召回率、平均寿命、MAPE 和 RMSE,等等。但是,还有其他成功指标,即数据科学模型对业务的影响。这最终取决于你申请的是什么类型的公司,但一旦你了解了更重要的 KPI,你就可以将同样的思维应用于其他行业。
以下是一些关键绩效指标的示例:
- 每个客户的收入
- 每位客户的点击量
- 每个客户的成本
- 每件产品的收入
- 月收入
- 诸如此类…
这些 KPI 最重要的部分是,您的数据科学模型最有可能增加或减少它们,如果您可以执行 A/B 测试来正确评估它们的效果,那么您将更适合参加面试。这个概念不仅是数据科学家分析的东西,也是产品经理、数据分析师和其他人分析的东西。
文化契合度
伊恩·施耐德在Unsplash【4】上拍摄的照片。
最后,也许表面上与数据科学没有直接关系的是文化契合度。我仍然认为这个概念是任何面试中最重要的部分之一,我个人希望看到申请人不仅了解数据科学,而且能够很好地向他人解释,并与团队相处。
具体到数据科学就是准确性和误差。数据科学模型可能很难,其指标更是如此,而且它们可能每天都在变化,因此认识到这种可变性并向他人清楚地表达这一点而不是隐藏这一点非常重要。总的来说,诚实是最好的品质,数据科学家可以在面试中通过展示他们知道什么和不知道什么来展示这一点。什么都不知道并没有错。如果你能告诉别人你不知道某事,这比反过来更值得称赞。
以下是适合数据科学面试的文化的一些简单考虑事项:
- 当你不知道什么的时候,要诚实和开放
- 面试前研究一下公司的价值观
- 研究你的同事/公司,表现出兴趣(如果你对公司感兴趣)
总的来说,当你参加面试时,不要忘记你也是在面试公司和数据科学职位。你要确保你也很适合。
摘要
关于数据科学面试准备,你可以学习或准备无数的东西。许多这种文档都只围绕着技术材料。尽管这很重要,但通过实践更多的软技能和业务概念,并在数据科学面试中展示这些技能和概念,会有所帮助。
总而言之,在下次数据科学面试之前,有三个关键概念需要实践或运用:
* Stakeholder Collaboration* Key Performance Indicators* Culture Fit
我希望你觉得我的文章既有趣又有用。如果您同意或不同意这些数据科学面试的准备技巧,请随时在下面发表评论。为什么或为什么不?关于数据科学面试准备,您认为还有哪些重要因素需要指出?这些当然还可以进一步澄清,但我希望我能给你一些启发,告诉你如何准备面试。
感谢您的阅读!
我不属于这些公司中的任何一家。
请随时查看我的个人资料、 马特·普日比拉、和其他文章,并通过以下链接订阅接收我的博客的电子邮件通知,或通过点击屏幕上方的订阅图标 的 ,如果您有任何问题或意见,请在 LinkedIn 上联系我。
订阅链接:https://datascience2.medium.com/subscribe
参考
[1]照片由克里斯蒂娜@ wocintechchat.com在Unsplash(2019)上拍摄
[4]Ian Schneider 在 Unsplash 上拍摄的照片,(2016)
我在 2021 年了解到的顶级数据科学误解
意见
…可以在 2022 年为您提供帮助
伊莎贝尔·克朗恩伯格在Unsplash【1】上的照片。
目录
- 介绍
- AB 测试只是关于重要性
- 只关注模型误差和准确性
- 您不会使用 SQL
- 摘要
- 参考
介绍
数据科学家对公司和角色本身都有很多期望。有些我们期望的事情会变成对职位本身的误解,这会导致压力和困惑。在这篇文章中,我们将看看我亲身经历过的你可能也会经历的五个错误观念,以及你应该期待什么;面向从初级到高级的任何数据科学家。话虽如此,让我们更深入地探究 2021 年的五个错误观念,你可以在 2022 年的数据科学职业生涯中借鉴它们。
AB 测试只是关于重要性
数据科学家可能会沉迷于统计数据而忽略了公司的目标。AB 测试是数据科学家可能使用的领域之一。虽然理解和执行适当的统计数据通常是工作的一部分,也是意料之中的,但是,例如,过于关注 p 值本身可能会使您偏离总体目标。
不要做的事情:
- 当将测试组与对照组进行比较时,仅查看显著性/p 值
怎么办:
- 当将一个测试组与一个控制组进行比较时,要注意 p 值、样本量和测试的持续时间。这可能是你达到显著性(或不达到)的情况,但随着时间的推移,它不会保持稳定。
当您评估的不仅仅是 p 值时,您可以确保您的测试得到了充分的处理,并且经得起时间的考验。除了测试特性之外,您还需要关注度量标准是否对测试有意义。例如,如果您正在整合一个新产品,您会希望查看可以显示业务成功增加的指标,例如:
- 收入
- 保留
- 约会
您还需要确保不会因数据科学模型的产品变更而损害业务或给业务带来负面影响。
只关注模型误差和准确性
尼古拉斯·霍恩在 Unsplash 上拍摄的照片。
与上述观点类似,这种误解总结为,仅仅因为您有一个准确的模型,并不意味着您有一个有用的模型。
不该做的事情:
- A.该模型对好用户和坏用户的分类准确率为 94%
(识别用户是好是坏最不可能有用,因为你不能从中执行可操作的过程,并且它没有被很好地定义
- B.该模型对于公共汽车到达时间具有 4 分钟的平均误差
(MAE 可能较低,但如果它倾向于向一个方向摇摆,那么对于不想在公交车站站更久而希望早点到达车站的顾客来说,它就没那么有用了
怎么办:
- A.该模型对购买更多产品的客户与不购买产品或很少购买产品的客户进行分类的准确率为 94%
(通过这种方式,您可以识别花钱多的人的特征,并可以看到这些特征是否可以应用于花钱不多的用户,例如,如果人们倾向于点击 iPhone 通知而不是 Android 通知,那么用户界面体验可能会有所不同,这需要加以解决
- B.该模型具有 4 分钟的 MAE,但是现在该度量被优化为更多的值位于更早的一侧而不是更晚的一侧
(通过这种方式,模型总体上是一样准确的,但是它对真实世界中的用例有更多的帮助)
如您所见,除了准确性或误差之外,您还需要确定指标的方向,以及您所预测的是否可用于改进。
您不会使用 SQL
卡斯帕·卡米尔·鲁宾在Unsplash【4】上的照片。
因为数据科学方面的教育项目更多地关注数据科学本身以及机器学习,所以 SQL 经常会被忽略或根本不教。为了成为一名更全面的数据科学家,您需要学习 SQL,这样您就不必在职业生涯中当场学习。
什么不该做:
- 预计所有的 SQL 都将为您完成,或者您用于模型的数据已经创建
(您很可能需要使用 SQL 查询您的公司数据库,以获取您的培训数据
怎么办:
- 在学习数据科学的同时理解 SQL,并学习不止一门课程
(你可能还想学习 SQL 来查询你的模型结果,因为通常情况下,你的预测存储在一个可查询的表中
对于数据科学,有些工作不需要执行 SQL,但通常情况下,你会这样做,当你试图学习机器学习算法时,这并不是重点。随着时间的推移学习它,这样你就不必急于求成,尤其是在你的第一个数据科学职位上。
摘要
如您所见,对数据科学职业有一些误解。这一年,我在角色本身中学到了这些,而不是在进入角色之前学习。当然,还有很多,但是我希望这篇文章已经给了一些人机会来修正或改进您对数据科学的误解。
总而言之,以下是一些常见的数据科学误解,您也可以从中学习:
* AB Testing is Only About Significance* Only Looking at Model Error & Accuracy* You Won’t Use SQL
我希望你觉得我的文章既有趣又有用。如果您同意或不同意这些误解,请随时在下面发表评论。为什么或为什么不?你认为我们还可以包括哪些更重要的误解?这些当然可以进一步澄清,但我希望我能够阐明一些我个人经历过的更独特的误解。感谢您的阅读!
我与这些公司都没有关系。
请随时查看我的个人资料、 Matt Przybyla 、和其他文章,并通过以下链接订阅接收我的博客的电子邮件通知,或通过点击屏幕顶部的订阅图标 的 ,如果您有任何问题或意见,请在 LinkedIn 上联系我。
订阅链接:https://datascience2.medium.com/subscribe
引荐链接:https://datascience2.medium.com/membership
(如果你在 Medium 上注册会员,我会收到一笔佣金)
参考
[1]Isabela Kronemberger 在 Unsplash 上拍摄的照片,(2021)
[2]照片由马库斯·温克勒在Unsplash(2020)拍摄
[3]尼古拉斯·霍恩在 Unsplash 上拍摄的照片,(2021)
[4]照片由 Caspar Camille Rubin 在 Unsplash 上拍摄,(2017)
顶级数据科学技能
…根据事实,你同意吗?
目录
- 介绍
- 云计算
- 机器学习
- 查询语言
- Python 编码
- 数据争论
- 摘要
- 参考
介绍
本文面向那些希望成为数据科学家的人,或者对作为数据科学家最具市场价值的技能感兴趣的人。这些信息是由收集的,实际上是 [2]作为数据科学家的 12 项市场技能,我从中挑选了 5 项我认为特别重要的技能。数据科学家的工作可能需要多种技能,从电子表格到公开演讲再到开发工作。话虽如此,仍有一些关键技能是每个数据科学家都应该了解或运用的。有些技能可以自学,有些可以在更正式的学术环境中练习,比如研究生院或训练营。下面,我将讨论数据科学家的 12 项顶级技能中的 5 项,并提供与数据科学工作相关的每项技能的示例。
云计算
弗拉基米尔·阿尼奇耶夫在Unsplash【3】上拍摄的照片。
在看过一些列表和文章之后,包括我自己的一些,我认为这个特殊的技能可能是这里最新和最独特的。服务器、数据库、分析和存储都包含在云计算的定义中。好处包括可扩展性、效率、安全性和成本。
因此,让我们举一些与数据科学相关的云计算示例:
- Amazon Web Services 或 AWS 包括用于数据仓库的 Amazon RedShift 和 Amazon SageMaker 等工具。借助这些工具,您可以查询数据进行预处理,然后为您的机器学习算法实施培训,然后将端点部署到您的生产环境中。
- 微软 Azure 允许类似的处理和数据科学用例,如带有 Apache Spark 的 Azure Databricks,以及利用他们的数据湖和 SQL 数据库。
- Google Cloud 是另一个受欢迎的云计算工具,包括用于数据查询的 BigQuery、用于轻松可视化数据或数据科学模型结果的 Google Data Studio 以及用于工作流、Dag 和任务的 Google Cloud Comoser,以便您处理数据科学管道。
正如您所看到的,云计算领域的所有这些主要参与者都提供了类似的好处,这些好处通常包括存储和处理数据,以及数据科学模型的自动部署。具体选择哪一项技能,取决于你对什么感兴趣,以及你申请的公司已经在使用什么,也有兴趣使用什么。
机器学习
Patrick Schneider 在Unsplash【4】上拍摄的照片。
也许你应该知道和使用的最明显的技能是机器学习。然而,你可能会惊讶地发现当你开始申请某些数据科学职位时,机器学习实际上并不需要。虽然我认为大多数数据科学工作需要机器学习,但一些数据科学职位以数据分析和统计为中心,而不使用算法。
然而,话虽如此,让我们更深入地研究一些机器学习在数据科学中的应用:
- 使用随机森林算法通过监督学习对产品的用户进行分类
- 使用聚类算法将用户分类到新的、不太明显的人群中,以进行营销活动
- 使用 XGBoost 预测一个数值,如房价
- 当您希望停止使用一次性编码,而对分类要素使用目标编码时,使用 CatBoost 可以更好地预测相同用例的分类要素,如房屋类型、城市、邮政编码等
我认为机器学习在数据科学方面是一种主要的技能或工具,可以让你推动数据科学过程,在这一过程中,你可以制定业务问题,收集数据,用算法进行预测,然后将上述所有内容与结果、可视化和讨论结合起来,形成整体的数据科学过程。
查询语言
卡斯帕·卡米尔·鲁宾在Unsplash【5】上的照片。
当学习数据科学时,这种技能在学术环境中可能不太明显,因为有些时候,为了立即了解机器学习算法如何工作,你会得到一个数据集。然而,现实生活中的数据科学应用并非如此。你必须精通查询语言,我认为主要的查询语言是 SQL。
以下是一些与数据科学相关的查询语言示例:
- 使用 SQL 查询您的数据库表,以获得您可以在数据科学模型中使用的功能
- 为您的模型创建主训练数据集查询,该查询可以基于天/周/月等时间特征频繁更新。
- 创建一个返回模型结果的 SQL 查询,如 MAE/RMSE/Accuracy 等。
SQL ( 查询语言)是一个强大的工具,可以探索你的数据,创建你的数据集,并返回有用的结果。它可能是那些通常不是数据科学中首先学习的工具之一,因为首先主要关注的是学习统计学和机器学习算法,有时当你成为专业数据科学家时,可能会被忽略。
Python 编码
关于 Python 和 r 哪种编程语言更好还存在一些争论。我通常会说学习 Python 总是更好的选择。主要原因是,作为数据科学家,你通常必须与机器学习操作工程师或软件工程师一起工作,有时是每天,他们很可能比 R 更熟悉 Python。然而,对于更多面向统计的数据科学家来说,R 仍然是一种很好的语言。
以下是一些面向数据科学家的 Python 编码示例:
- 为您的数据科学管道创建完整的 GitHub 代码库,包括数据预处理、培训和部署等常见步骤
- 由于面向对象编程( OOP )的好处,在 Python 中执行这个管道会更容易( ish )
- 使用 Python 与可能已经熟悉这种特定语言的其他工程师进行协作
- 总的来说,自动化您的数据科学过程,并获得流行的 Python 库(如 sklearn、NumPy)和存储流行的机器学习算法(如 Random Forest)的一系列库的好处
Python 编码可以让你成为一名更全面、更高效的数据科学家,如果你不使用 Python,很可能会使用 R 或 SAS,这两者都不太受欢迎。然而,它们通常还是有用的,如果你是一个统计驱动的数据科学家,或者基于研究的数据科学家(像 A/B 测试、显著性测试、离群点检测、ANOVA 等,它们可能比 Python 更有用。
数据争论
数据争论听起来更像是一个时髦词,而不是实际有用的东西,然而,尽管这个术语很常见,但它仍然是一个非常重要的技能,需要了解和使用。该定义也是如此简单明了,但它本质上意味着通过清理原始数据、移除异常值、移除空值(如果它们不是预期值,则为,或者在某些其他情况下为)以及创建特征来处理原始数据。
以下是数据科学家争论数据的一些例子:
- 当执行自然语言处理( NLP )时,通过删除停用词或对您正在使用的文本值不重要的词
- 删除无用的文本标点符号(像停用词一样
- 确认和更改特征/列的数据类型(整数、字符串、浮点、日期时间等)。)
- 移除异常值
- 删除空值,或输入空值(例如: fillna(mean) )
- 从现有的列创建新的特性,例如:从收入和客户字段,您可以创建
revenue/customer
各种工具都可以处理数据争论,比如 Python、R、SAS,更常见的工具是 Microsoft Excel 或 Google Sheets。数据科学过程的这一部分通常发生在开始,但是当您查询结果并想要显示特定的数据组等时,这些概念也可以应用到最后。
摘要
数据科学家必须精通多种技能,这就是为什么首先专注于关键技能非常重要,这样才不会分散精力。我给你的最大建议是,看看这些文章和工作描述,列出你的重要技能,先学习这些,然后再拓展,这样你就可以成为一名高效而重要的数据科学家。
总而言之,以下是数据科学家最重要的一些技能:
* Cloud Computing* Machine Learning* Query Languages* Python Coding* Data Wrangling
我希望你觉得我的文章既有趣又有用。如果您同意或不同意所讨论的这些技能,请随时在下面发表评论。为什么或为什么不?就数据科学家的要求和期望而言,您认为还有哪些技能是必须指出的?这些当然可以进一步澄清,但我希望我能够为数据科学家提供一些关于这些技能的信息。
感谢您的阅读!
我与这些公司都没有关系。
请随时查看我的个人资料、 马特·普日比拉 、等文章,并通过以下链接订阅接收我的博客的电子邮件通知,或通过点击屏幕上方的 图标的 点击订阅图标,如果您有任何问题或意见,请在 LinkedIn 上联系我。
订阅链接:https://datascience2.medium.com/subscribe
参考
[1]照片由艾迪尔·华在Unsplash(2020/2021)上拍摄
[2]事实上,数据科学家的 12 项适销技能,(2021)
[3]Vladimir Anikeev 在 Unsplash 上拍摄的照片,(2017)
[4]Patrick Schneider 在 Unsplash 上拍摄的照片,(2018)
[5]卡斯帕·卡米尔·鲁宾在 Unsplash 上拍摄的照片,(2017 年)
[6]照片由大卫·克洛德在Unsplash(2018)上拍摄
[7]shah adat Rahman 在 Unsplash 上拍摄的照片,(2019)
负责任地使用人工智能的自上而下和端到端治理
走向负责任的人工智能(第三部分)
人工智能治理的三道防线
负责任的人工智能是一个广泛的话题,涵盖了被称为人工智能的社会技术系统的多个维度。我们在这里将人工智能称为一个社会技术系统,因为它捕捉了人类之间的交互以及我们如何与人工智能交互。在本系列的第一部分中,我们从五个方面来看人工智能的风险。在本系列的第二部分,我们来看看企业负责任人工智能的十大原则。
在这篇文章中,我们深入探讨了人工智能治理——我们所说的治理到底是什么意思?人工智能治理需要什么?治理过程是什么,公司应该如何着手建立他们的人工智能治理?
什么是治理?
治理的字典定义是“治理或监督某物(如一个国家或组织)的控制和方向的行为或过程”。治理不同于管理。管理层制定决策,而治理监督这些决策是如何制定的。
将相同的定义应用于人工智能治理,我们得出了以下公司人工智能治理的定义
人工智能治理是监督负责任的人工智能应用及其对所有相关利益主体(如个人、社会团体、国家)的影响的过程。
组织内的数据、分析和人工智能小组通常遵循人工智能模型开发流程,该流程从决定构建(或至少试验)人工智能开始,然后是设计、构建、部署和监控人工智能模型。这是 AI 组的核心管理功能。人工智能治理是关于谁监督核心人工智能功能,他们监督什么决策或行动,以及监督如何工作?
在决定某件事情是否属于人工智能治理的预览范围或者是关键管理功能时,考虑以下问题是有用的:
- 它大吗? —人工智能的社会或客户影响越大,人工智能监管就越自然。这里的规模可能由它产生的总收入或利润、它节省的成本或它影响的客户或员工数量决定。
- 是战略性的吗? —决策越具有战略性,例如,要采用的人工智能原则、行为准则、道德政策或领先的人工智能实践,人工智能治理小组参与其中就越好。
- 红旗在飘扬吗? —人工智能应用的风险越大(参见人工智能风险,了解其中一些风险的分类),它就越与人工智能治理相关。一些关键的“红旗”人工智能应用包括面部识别、招聘人工智能、基于人工智能的决策和建议中的偏见。
- 我是看门狗吗? —如果人工智能受到任何现有法规或独立自治专业团体的监管,对主要开发和批准流程进行监督会更好。
- 是小说吗? —如果没有先例可循,那么可能会有没有考虑到的额外风险。
这些关键治理问题改编自董事会的六个关键问题,并针对人工智能治理进行了修改。
三线模式
治理和风险管理在企业界并不新鲜。有广为接受的标准、指导方针和法规来确保公司的顺利运作。三道防线模型由欧洲风险管理协会联合会(FERMA)和欧洲内部审计协会联合会(ECIIA)于 2008-2010 年开发,作为第 8 号欧盟公司法指令第 41 条的指南。这是内部审计师协会(IIA)在 2013 年采用的,他们的立场文件是关于有效风险管理和控制的三道防线。从那时起,它们已经成为评估和管理风险以及执行治理的标准方法。
2020 年 6 月,IIA 更新了指南,发布了关于 IIA 三线模式的立场文件。该文档描述了治理的六个关键原则、三线模式中的关键角色、角色之间的关系以及如何应用三线模式。它明确阐述了管理层、内部审计职能部门和理事机构的责任(见下图)。
图 1:三线模式(来源:IIA 三线模式)
三线模型已在许多组织中广泛使用,并已应用于各种风险,包括金融服务组织中的技术风险和模型风险。银行中的信用风险、市场风险和操作风险模型通常基于这三道防线进行管理。我们没有发明一个全新的治理结构、流程、角色和职责,而是将这个模型应用于人工智能治理。
- 第一道防线——创建者、执行者和操作者:那些指定、设计、构建、部署和操作数据、AI/ML 模型、自动化和软件的人;第一线还包括参与操作和监控数据、软件和模型的操作团队。
- 第二道防线——经理、主管和质量保证:评估数据、AI/ML 模型、自动化和软件风险的人,以及负责制定战略的人。第二道防线也对正在进行的监控进行审查。此外,第二条线还负责检查第一条线是否按照预期的实践建立了他们的系统。
- 第三道防线——审计员和伦理学家:监督其他两道防线的人员,以确保遵守法律、政策和组织的战略,以及合乎道德和负责任地使用技术。
- 道德委员会:道德委员会是一个由组织内的高管和员工组成的多元化、包容性团体。一些组织也可能选择任命外部成员进入董事会。
除了组织内的这些角色之外,公司还将与外部审计师、认证机构或其他保证提供者以及监管机构进行互动。下图概述了不同角色的详细信息以及每个角色的主要职责。
图 2:人工智能治理的三条线模型(来源:普华永道分析)
端到端治理
除了“三线模式”规定的自上而下的治理,我们还需要从摇篮到坟墓或从模型和人工智能嵌入式系统的开始到退休的端到端治理。治理的起点不是开始构建模型的时间,而是在生命周期中更早的时候。
它应该真正从战略开始——公司整体的企业或业务战略,特别是负责数据、自动化、分析和人工智能战略的团队(见我关于这个无敌四重奏的文章)。每家公司,尤其是每家消费或生成数据和见解的公司,都应该有一个关于道德的政策,以及适应、采用和实践道德行为的内部政策和程序。这一阶段不可或缺的组成部分还包括了解任何法规以及行业机构或专业协会的最佳实践或指南。例如,数据科学协会的数据科学专业行为准则和牛津-慕尼黑专业数据科学行为准则是数据科学家行为准则的良好起点。同样值得关注的是 IEEE 正在开发的标准,尤其是IEEE 自主智能系统伦理全球倡议。
下一阶段是策划。数据、自动化、分析和人工智能这四者应该是规划阶段的一部分。正如我们在别处讨论过的,软件和人工智能模型需要区别对待(见我关于的文章,数据科学家来自火星,软件开发人员来自金星)。人工智能模型的实验性质需要投资组合方法。在任何时间点,在采用和推广人工智能方面成熟的组织都有一系列处于不同发展阶段的模型——概念、实验、部署、生产或退役。ROI 需要根据整个投资组合来衡量,并且依赖于为业务用例、效率与有效性计划等的正确组合而调整的整体策略。(有关这方面的更多详细信息,请参见关于十种人类能力和四种智能以开发以人为中心的人工智能的文章)。数据、软件和人工智能模型的融合需要仔细关注交付方法。瀑布和敏捷软件开发方法需要修改和交错,以交付 AI 嵌入式软件或软件 2.0(参见文章结合敏捷编程和敏捷数据科学的时间)。具体的交付方法将决定应该报告和监控的关键指标,以便进行监督。
端到端治理的下一个阶段是整体的生态系统。这里我们指的是人工智能模型将被嵌入的生态系统,以及它将被公司内外的其他人使用的环境。公司正在发布的人工智能的更广泛的社会影响应该在这里进行评估。IEEE 的幸福指标在这里是一个强有力的竞争者。生态系统还必须涵盖人工智能嵌入式软件的使用环境。例如,系统是否具有自动、辅助、增强或自主智能将决定所需的治理和升级级别。对将使用人工智能系统的人的变更管理是成功采用和持续改进人-人工智能结合生态系统的关键因素。最后,鉴于开源和基于厂商的人工智能工具和技术的可用性,很好地理解采购人工智能模型的最低采购标准是绝对必要的。虽然目标是公共部门组织,但世界经济论坛与英国人工智能办公室共同开发的人工智能采购系统是一个很好的起点。
接下来,我们进入核心模型开发和部署阶段。此时,治理的焦点从更广泛的涉众转移到开发团队。这个团队不仅包括数据科学家、数据工程师、技术人员、产品经理、运营团队——技术团队,还包括业务领域专家和伦理学家。治理监督涉及价值范围(包括业务和数据理解、解决方案设计)、价值发现(包括数据提取、预处理和模型构建)、价值交付(模型部署、转换和执行)以及最终价值管理(包括持续的监控和评估&检入)的阶段(参见我的文章模型生命周期:从想法到价值以获得关于底层 9 步过程的更多细节)。
端到端治理流程的最后一个阶段是操作和监控阶段。这里的治理分为两个层次。一个层面是特定模型的治理,以及数据、决策、使用、算法和人工智能模型使用的环境在多大程度上发生了变化。另一个是在投资组合层面——监控人工智能模型或人工智能嵌入式软件提供的价值,并淘汰模型或启动新的模型,这可以追溯到模型开发的价值范围阶段,甚至可以追溯到公司的整体战略。除了这种运营和战略支持,还需要定期进行合规性和内部审计评估。正如我们在上一节中所讨论的,这些属于第二道防线和第三道防线。
图 3:负责任的人工智能的端到端治理(来源:普华永道分析)
结论
我们在本文中描述的是管理和减轻关键人工智能风险所需的自上而下和端到端的治理,这些风险在本系列的第 1 部分中概述,并遵循本系列的第 2 部分中概述的负责任的人工智能的十项原则。在以后的文章中,我们将深入研究九步过程的细节以及端到端治理的不同阶段。我们将检查三条线需要生产的关键工件或交付物,以确保负责任和有益地使用人工智能。
作者: Anand S. Rao 和 Ilana Golbin
相关内容
表格编辑器 3 中的顶级特性可促进您的 Power BI 开发
希望推动您的 Power BI 开发?查看最新版本的表格编辑器如何帮助您成为真正的强力 Bi 英雄
作者图片
从今年开始,微软关于读/写 XMLA 端点的正式发布的公告,为许多外部工具打开了大门,这些外部工具旨在提供由分析服务引擎支持的、但在 Power BI Desktop 中不支持的额外建模功能。
在众多伟大的工具中,由 Daniel Otykier 创建的表格编辑器可能是最受欢迎的一个,另外还有 DAX Studio 。根据定义,TE 是 SSAS 表格模型的轻量级编辑器(因此,它也可以在 Power BI 范围之外使用),使您能够构建、维护和管理表格模型。直到最近,Tabular Editor 还是完全免费使用的,它仍然可以在这里免费下载。在撰写本文时,最新的版本是 2.16.1,Daniel 承诺将来也会提供对免费版本的支持。
然而,从这个月开始,我们终于得到了许多 Power BI 开发人员最喜欢的工具的新版本——表格编辑器 3!这个版本不再是免费的(你可以在这里找到许可选项),但是请继续阅读,因为我向你保证,如果你每天都在使用 Power BI,获得 TE 3 的许可将是你最好的投资之一。
表格编辑器 Power BI 开发的最佳工具!
我坚决支持上面标题中的声明。在本文的剩余部分,我将分享我在 TE 3 中的 6 大特性,以及为什么我认为如果不使用这个工具,我的 Power BI 开发效率会更低。
特性没有按照重要性排序,我只是列出了它们,没有任何特别的偏好…
头号高级脚本
我喜欢强力 BI,真的。但是,有一些默认设置让我很恼火。其中之一是这样一个事实,无论何时你有一个数字列,Power BI 都会自动在它上面应用摘要,这是默认的。现在,当您拥有“真正的”数值列时,这可能会非常方便,但是如果您将 id 作为维度表的外键会怎么样呢?典型的例子是日期维度表:
按作者分类的图像:默认情况下,不是每个列都应该聚合
如上图所示,Power BI 自动对列应用聚合(在本例中,它是 Count),即使这是一种违反直觉的、不可取的显示这些列中数据的方式。
然而,如果我从 TE 3 连接到数据模型,我有两个选择来解决这个挑战:
- 我可以执行以下命令从选定的列中删除默认汇总:
作者图片
foreach(var c in Selected.Columns)
{
c.SummarizeBy = AggregateFunction.None;
}
- 我可以执行一个命令来删除数据模型中所有列的默认汇总!
foreach(var c in Model.AllColumns)
{
c.SummarizeBy = AggregateFunction.None;
}
#2 从选定的列创建度量
在之前的一篇文章中,我解释了为什么您应该总是创建显式的而不是隐式的度量。而且,当您处理一个简单的数据模型时,这不是一个问题,不需要创建许多度量。然而,一旦您的模型变得更加复杂,并且您需要构建多个相似但仍然不同的度量,创建显式度量的任务就会变得繁琐。
表格编辑器为您提供了一种自动化该任务的优雅方式,因为您可以在一次运行中选择多个列并创建所需的度量!
// Creates a SUM measure for every currently selected column and hide the column.
foreach(var c in Selected.Columns)
{
var newMeasure = c.Table.AddMeasure(
"Sum of " + c.Name, // Name
"SUM(" + c.DaxObjectFullName + ")", // DAX expression
c.DisplayFolder // Display Folder
);
// Set the format string on the new measure:
newMeasure.FormatString = "0.00";
// Provide some documentation:
newMeasure.Description = "This measure is the sum of column " + c.DaxObjectFullName;
// Hide the base column:
c.IsHidden = true;
}
这个脚本将在您选择的所有列上创建基本的 SUM,适当地格式化它们,同时确保最佳实践建议从数据模型中隐藏原始列!
作者图片
在我执行了上面的脚本之后,您会注意到创建了新的度量,而原来的列被隐藏了。
有一堆非常有用的代码片段可以自动完成 Power BI 报告开发中一些最常见的任务,比如创建时间智能计算。你可以在这里找到所有这些片段。
#3“如果没有格式化,就不是 DAX…”
这是阿尔贝托·法拉利的传奇句子!而且,我敢打赌你已经看过上百次这样的事情了:
作者图片
不要生气,当我们还是 Power BI 新手时,我们都是这样编写我们的度量:)
同样,我将只放一行代码来使我的所有 DAX 公式格式正确:
Model.AllMeasures.FormatDax();
作者图片
这个看起来好多了,对吧?
#4 DAX 脚本
这个也和达克斯有关。我们都知道 CALCULATE 是如何工作的,以及它接受哪些参数(至少,我希望我们都知道)。但是,当您需要使用一些不经常出现在“菜单”上的 DAX 函数时,会发生什么呢?没错,你可能会忘记正确的语法和/或它的工作方式。
TE 3 凭借其令人敬畏的 DAX 智能感知拯救了我们!
作者图片
一旦我开始编写函数,TE 3 并没有提供完整的函数名,但它也“告诉”我函数做了什么——在这种情况下,我可以看到 COUNTROWS() 将计算表中的行数。如果这还不够,我还想更详细地研究这个函数,我可以点击函数链接(上图中的蓝色链接),我将直接导航到 dax.guide 的这个公式参考:
作者图片
这多酷啊!
这里有一个与 DAX 调试相关的额外提示。当您调试一个复杂的 DAX 计算时,很容易发生计算包含不止一个,而是多个不同的错误(听起来很熟悉,是吧?).有了常规的 DAX 编辑器,你可以一个一个的看到你的错误,然后一个一个的解决。另一方面,TE 3 从您的 DAX“杰作”中捕获所有的错误,指出发现错误的行,以及抛出错误的原因:
作者图片
不用说这个特性如何帮助您更有效地调试 DAX 代码。
#5 数据预览
我不知道您怎么想,但是我遇到过“百万”次这样的情况,我想快速检查我的数据模型中的一个表的数据。我做了什么?将可视表格拖到我的报告画布上,在其中放置一些列,然后分析其中的内容…
现在,有了 TE 3,我可以做一件简单的事情:
作者图片
只需右键点击表格,选择预览数据,就可以了!你可以立即看到里面有什么…
与此类似,还有一个非常酷的功能叫做 透视表网格 ,类似 Excel 中的透视表。这样,您可以快速评估您的计算结果。
作者图片
#6 衡量依赖性
我发现这对于有许多度量的大型模型非常有用。在大多数情况下,您的度量标准将相互“链接”,相互引用。而且,在一个包含数百个度量的模型中,很难确定度量之间的依赖关系。
正如你所想,TE 3 也为这个挑战提供了一个解决方案…
作者图片
如果右键单击度量并选择显示相关性,则可以看到哪些度量依赖于所选度量,以及所选度量依赖于哪些对象:
作者图片
结论
这只是表格编辑器 3 为支持 Power BI 开发而提供的特性的一个简短列表。TE 3 中有很多更高级的功能,比如记录宏、定制和保存工作空间,或者包括最佳实践分析工具。更不用说一些极其重要的功能,如计算组或对象级安全,甚至不可能从 Power BI 桌面执行,而只能从 TE 执行!
是的,还有一个黑暗模式:)
作者图片
严肃地说——如果你认为自己是 Power BI 专业人士,并且你真的想促进你的 Power BI 发展,这是你腰带下的“必备”工具。
如果你有兴趣了解更多关于表格编辑器 3 的特性,或者更好地下载并开始使用它,你可以参考官方 TE 3 页面。
感谢阅读!
数据科学面试中你应该知道的五大 SQL 窗口函数
关注数据科学家的重要概念。
SQL 是数据世界中的通用语言,也是数据专业人员需要掌握的最重要的技能。
SQL 如此重要的原因是,它是数据争论阶段所需的主要技能。大量的数据探索、数据操作、管道开发和仪表板创建都是通过 SQL 完成的。
伟大的数据科学家与优秀的数据科学家的区别在于,伟大的数据科学家可以在 SQL 功能允许的情况下尽可能多地争论数据。能够充分利用 SQL 提供的所有功能,很大一部分是因为知道如何使用窗口函数。
说了这么多,让我们开始吧!
1)具有超前()和滞后()的增量
LEAD()和 LAG()主要用于比较给定指标的一段时间和前一段时间。举几个例子…
- 你可以得到每年销售额和前一年销售额之间的差值
- 你可以得到每月注册/转换/网站访问量的增量
- 您可以按月比较用户流失情况
示例:
以下查询显示了如何查询每月的成本变化百分比
with monthly_costs as (
SELECT
date
, monthlycosts
, LEAD(monthlycosts) OVER (ORDER BY date) as
previousCosts
FROM
costs
)SELECT
date
, (monthlycosts - previousCosts) / previousCosts * 100 AS
costPercentChange
FROM monthly_costs
SUM()或 COUNT()的累积和
通过一个以 SUM()或 COUNT()开始的 windows 函数可以简单地计算运行总数。当您想要显示特定指标随时间的增长时,这是一个强大的工具。更具体地说,它在以下情况下很有用:
- 获得一段时间内的总收入和总成本
- 获得每个用户在应用上花费的总时间
- 获得一段时间内的累计转化率
示例:
以下示例显示了如何包含每月成本的累计和列:
SELECT
date
, monthlycosts
, SUM(monthlycosts) OVER (ORDER BY date) as cumCosts
FROM
cost_table
3)AVG 的移动平均线()
AVG()在 windows 函数中非常强大,因为它允许你计算一段时间内的移动平均值。
移动平均线是一种简单而有效的短期预测方法。它们在平滑图形上不稳定的曲线时也非常有用。一般来说,移动平均线用于衡量事物运动的大致方向。
更具体地说…
- 它们可用于获得每周销售的总体趋势(平均值是否会随着时间的推移而上升?).这将表明公司的成长。
- 他们同样可以用来获得每周转换或网站访问的一般趋势。
示例:
以下查询是获取 10 天移动平均值进行转换的示例。
SELECT
Date
, dailyConversions
, AVG(dailyConversions) OVER (ORDER BY Date ROWS 10 PRECEDING) AS
10_dayMovingAverage
FROM
conversions
4)行号()
当您想要获取第一条或最后一条记录时,ROW_NUMBER()特别有用。例如,如果您有一个健身房会员何时来到健身房的表,并且您想获得他们第一天来到健身房的日期,您可以按客户(姓名/id)进行分区,并按购买日期进行排序。然后,为了获得第一行,您可以简单地筛选 rowNumber 等于 1 的行。
示例:
这个示例展示了如何使用 ROW_NUMBER()获取每个成员(用户)第一次访问的日期。
with numbered_visits as (
SELECT
memberId
, visitDate
, ROW_NUMBER() OVER (PARTITION BY customerId ORDER BY
purchaseDate) as rowNumber
FROM
gym_visits
)SELECT
*
FROM
numbered_visits
WHERE
rowNumber = 1
总的来说,如果您需要获取第一条或最后一条记录,ROW_NUMBER()是实现这一点的好方法。
5)用 DENSE_RANK()记录排名
DENSE_RANK()类似于 ROW_NUMBER(),只是它对相等的值返回相同的等级。在检索顶级记录时,密集排名非常有用,例如:
- 如果你想找出本周十大最受关注的网飞节目
- 如果您想根据花费的金额获得前 100 名用户
- 如果您想查看 1000 个最不活跃的用户的行为
示例:
如果您想按总销售额对顶级客户进行排名,DENSE_RANK()是一个合适的函数。
SELECT
customerId
, totalSales
, DENSE_RANK() OVER (ORDER BY totalSales DESC) as rank
FROM
customers
感谢阅读!
仅此而已!我希望这能对你的面试准备有所帮助——我确信如果你对这 5 个概念了如指掌,你会在大多数 SQL 窗口函数问题上做得很好。
一如既往,我祝你学习一切顺利!
不确定接下来要读什么?我为你挑选了另一篇文章:
又一个!
特伦斯·申
顶级 Jupyter 扩展:2021 版
将您的 Jupyter 环境转变为成熟的 IDE
哈维·卡夫雷拉在 Unsplash 上的照片
Jupyter 笔记本一直是软件思想增量开发的工具。就像 Donald Knuth 一样,文化编程概念背后的思想说,“把一个程序当作一篇文学作品,写给人类而不是计算机。”
JupyterLab 是为了解决 Jupyter 笔记本的一些缺点而开发的。除了新的文件浏览器和类似 ide 的体验,JupyterLab 还集成了许多优秀的扩展,丰富了您的工作环境。
然而,当我搜索可以融入我的日常编码程序的伟大扩展的列表时,大多数文章都是过时的,或者以死亡或休眠的项目为特色(例如,超过六个月不活动的项目)。此外,几乎每个列表的顶部都有 目录 扩展,这个扩展现在是核心 JupyterLab 3.0 版本的一部分。
因此,我决定编制自己的清单。在这个 2021 JupyterLab 扩展版本中,我只考虑活跃的、高质量的项目。为此,对于每个项目,我将记录 GitHub 星的数量,自上次提交以来的日期,以及其他细节,如 PyPi 下载和贡献者计数。我将使用以下图标使一切更简洁:
- ⭐ : GitHub 明星
- 📅:上次提交
- 👷:贡献者人数
- 📥:下载次数
开始吧!
学习率是为那些对 AI 和 MLOps 的世界感到好奇的人准备的时事通讯。你会在每周五收到我关于最新人工智能新闻和文章的更新和想法。在这里订阅!
扩展ˌ扩张
首先,让我们深入了解一下值得安装的 JupyterLab 扩展。然后,我们将看看其他好东西,如渲染器和主题。
jupyterlab-git(⭐813📅5 天前👷 52 📥15K/月):
一个使用 Git 进行版本控制的 JupyterLab 扩展。
调试器 (⭐ 476📅三个月前👷 11 📥63K/月):
一个 JupyterLab 调试器 UI 扩展。如果你想了解更多关于这个项目的信息,请查看下面的文章:
jupyterlab-LSP(⭐803📅23 小时前👷 21 📥20K/月):
JupyterLab 的编码辅助(代码导航+悬停建议+ linters +自动补全+重命名)使用语言服务器协议。
【jupyterlab】-variable inspector(⭐748📅两个月前👷 13 📥15K/月):Jupyterlab 扩展,显示当前使用的变量及其值。****
jupyterlab _ code _ formatter(⭐413📅9 天前👷 25 📥12K/月):JupyterLab 的通用代码格式化程序。
https://github.com/jpmorganchase/jupyterlab_templates(⭐223📅上个月👷 9 📥4.5K/月):支持 jupyterlab 中的 jupyter 笔记本模板。********
【jupyterlab _ tensor board(⭐245📅29 天前👷 6 📥5.7K/月):
jupyterlab 的 Tensorboard 扩展。****
【jupyterlab-系统-监视器】 (⭐ 154📅26 天前👷5📥8.3K/月):JupyterLab 扩展,用于显示系统指标。
【jupyterlab】执行时间 (⭐ 113📅上个月👷七📥8.4K/月):Jupyter 实验室的执行时间插件。
可折叠 _ 标题 (⭐ 108📅两个月前👷四📥6.9K/月):为 Jupyter 实验室笔记本实现可折叠标题。
拼写检查 (⭐ 105📅23 天前👷5📥5.3K/月):JupyterLab 笔记本降价单元格和文件编辑器的拼写检查器。
另外,我想特别提一下 idom 这个项目,我认为它是 Jupyter widgets 的下一个级别。它不完全是 JupyterLab 的扩展,但它是一个很好的工具。请在下面的文章中阅读更多信息:
****
渲染器:
在本节中,我们将能够呈现和显示特定 MIME 类型文件的扩展进行分组。
jupyterlab-latex(⭐350📅两个月前👷 15 📥3.5K/月):JupyterLab 扩展,用于 LaTeX 文档的实时编辑。
https://github.com/QuantStack/jupyterlab-drawio(⭐450📅7 天前👷 15 📥6K/月):将 FOSS drawio / mxgraph 包独立嵌入到 jupyterlab 中。
【jupyterlab】-电子表格 (⭐ 95📅两个月前👷四📥3.9K/月):JupyterLab 插件,用于查看电子表格,如 Excel .xls
/ .xlsx
工作簿和 OpenOffice .ods
文件。
主题
在这最后一节中,我们将从可以定制 JupyterLab 外观的扩展中获得一些乐趣。
【jupyterlab】-霓虹-主题 (⭐ 81📅16 天前👷3📥1.1K/月):一个平面,80 年代的霓虹启发的 JupyterLab 主题。
【jupyterlab】-主题-曝光-黑暗 (⭐ 33📅12 天前👷2📥5.7K/月):JupyterLab 2.x 日晒黑暗扩展。
结论
JupyterLab 不是传统意义上的 IDE。然而,对于热爱文化编程的数据科学家和工程师来说,这是一个昂贵的项目。除了许多内置工具,JupyterLab 还提供了一系列扩展,可以丰富您的工作环境,改变我们开发代码的方式。
这篇文章提供了一份最新的 JupyterLab 扩展列表,供您今天使用。如果你认为ι遗漏了什么或者有一个新的扩展完全改变了你使用 Jupyter 的方式,请在评论区留下它!
看看我的其他笔记本故事,用这个优秀的工具提升你的游戏:
- Jupyter 现在是一个成熟的 IDE
- Jupyter 已做好生产准备;原样
- Jupyter 在 VS 代码:利弊
- Jupyter 有一个完美的代码编辑器
- Jupyter widgets 的新时代
关于作者
我叫 Dimitris Poulopoulos ,是一名为 Arrikto 工作的机器学习工程师。我曾为欧洲委员会、欧盟统计局、国际货币基金组织、欧洲央行、经合组织和宜家等主要客户设计和实施过人工智能和软件解决方案。
如果你有兴趣阅读更多关于机器学习、深度学习、数据科学和数据运算的帖子,请在 Twitter 上关注我的 Medium 、 LinkedIn 或 @james2pl 。此外,请访问我的网站上的资源页面,这里有很多好书和顶级课程,开始构建您自己的数据科学课程吧!****
2022 年顶级机器学习算法和 Python 库
意见
…以及它们给数据科学家带来的主要好处
Moritz kn ringer 在Unsplash【1】上拍摄的照片。
目录
- 介绍
- CatBoost
- 深度预测
- PyCaret
- 摘要
- 参考
介绍
新算法很难出现,2022 年可能也不会例外。然而,仍然有一些机器学习算法和 python 库会越来越受欢迎。这些算法之所以与众不同,是因为它们包含了在其他算法中不常见的一些好处,我将对此进行更详细的讨论。无论是能够在您的模型中使用不同的数据类型的好处,还是将内置算法纳入您当前的公司基础架构,甚至是在一个地方比较几种算法的成功指标,您都可以预期这些在明年会因为各种原因变得更加流行。下面让我们更深入地探讨一下这些 2022 年的新兴算法和库。
CatBoost
也许最新的,随着越来越受欢迎而频繁更新的,是 CatBoost。这种机器学习算法对于处理分类数据的数据科学家来说尤其有用。您可以考虑随机森林和 XGBoost 算法的好处,并将其中的大部分应用于 CatBoost,同时还可以获得更多好处。
以下是 CatBoost 的主要优势:
- 不需要担心参数调整 —默认通常是正确的,手动调整可能不值得,除非您通过手动更改值来针对特定的误差分布
- 更准确 —更少的过度拟合,当您使用更多的分类特征时,往往会得到更准确的结果
- 快速 — 这种算法往往比其他基于树的算法更快,因为它不必担心大型稀疏数据集,例如应用了一键编码,因为它使用了一种目标编码
- 预测更快 —就像你如何训练得更快一样,你也可以使用你的 CatBoost 模型预测得更快
- SHAP —该库被集成,以便于解释整体模型上的特征重要性,以及具体的预测
总的来说,CatBoost 很棒,因为它易于使用,功能强大,在算法领域很有竞争力,也是可以放在简历上的东西。它可以帮助您创建更好的模型,最终使您的公司项目更好。
CatBoost 文档此处【3】。
深度预测
这种算法内置于流行的平台 Amazon SageMaker 中,如果你的公司目前在 AWS 堆栈中或愿意使用它,这可能是一个好消息。在递归神经网络的帮助下,它被用于预测/时间序列应用中的监督学习。
以下是使用此算法时可能出现的输入文件字段的一些示例:
- 开始
- 目标
- 动态 _ 专长
- 猫
以下是使用这种算法/架构的一些好处:
- 简单建模 —在同一个地方快速构建/培训/部署
- 简单的架构 —专注于更少的编码,更多地关注您需要解决的数据和业务问题
当然,这个算法还有更多的内容,所以我限制了信息量,因为不是每个读者都在使用 AWS。
DeepAR 预测算法文档此处【5】。
PyCaret
Jonathan Pielmayer 在Unsplash【6】上拍摄的照片。
因为没有那么多新算法要讨论,所以我想包括一个能够比较几种算法的库,其中一些算法可能会更新,因此是新的。这个 Python 库被称为开源和低代码。当我开始比较并最终为我的数据科学模型选择最终算法时,它让我更加了解新的和即将到来的机器学习算法。
以下是使用这个充满算法的库的一些好处:
- 更少的编码时间 —您不需要导入库并设置每个算法特有的每个预处理步骤,相反,您可以填充一些参数,从而可以并排比较几乎所有您听说过的算法
- 易于使用 —随着库的发展,它们的易用性也在发展。
- 端到端处理 —可以研究从转换数据到预测结果的数据科学问题
- 集成良好 —可以在 Power BI 中使用 AutoML
- 混合和堆叠 —可以加入不同的算法以获得更多好处
- 校准和优化模型
- 关联规则挖掘
- 最重要的是,一次比较 20 多种算法
总的来说,这个库不直接是一个新算法,但它最有可能包括一个将在 2022 年出现的新算法,或者至少是最近的算法,甚至像上面提到的 CatBoost 这样的算法也包括在这个库中——这就是我如何发现它的。也就是说,我认为包含这个库很重要,这样你不仅可以随时了解 2022 年的最新情况,还可以了解你以前可能没有听说过或错过的旧算法,因为你可以将它们与简单的用户界面进行对比。
PyCaret 文档此处【7】。
摘要
如果你认为这个列表很短,那么你会意识到,并不是每年都有一组新的机器学习算法。我希望这里提到的这三个将增加他们的文档(或同行文档)和受欢迎程度,因为他们太棒了,并且不同于通常的逻辑回归/决策树等。
综上所述,以下是 2022 年值得期待的一些新的机器学习算法:
* CatBoost - algorithm* DeepAR Forecasting - algorithm/package* PyCaret - library including new algorithms
我希望你觉得我的文章既有趣又有用。如果你同意或不同意这些,请在下面随意评论。为什么或为什么不?你认为我们还可以包含哪些更重要的算法或包/库?这些当然可以进一步澄清,但我希望我能够揭示一些更独特的机器学习算法和库。感谢您的阅读!
我与这些公司都没有关系。
请随时查看我的个人资料、 马特·普日比拉、和其他文章,并通过以下链接订阅接收我的博客的电子邮件通知,或通过点击屏幕上方的订阅图标 的 ,如果您有任何问题或意见,请在 LinkedIn 上联系我。
订阅链接:https://datascience2.medium.com/subscribe
引荐链接:https://datascience2.medium.com/membership
(如果你在上注册会员,我会收到一笔佣金)
参考
[1]Moritz kn ringer 在 Unsplash 上拍摄的照片,(2021)
[2]照片由 Michael Sum 在 Unsplash 上拍摄,(2018)
[3] Yandex, CatBoost 主页,(2021)
[4]NOAA 在 Unsplash 上拍摄的照片,(2020)
[5]亚马逊网络服务公司或其附属公司, DeepAR 预测算法,(2021)
[6]Jonathan piel Mayer 在 Unsplash 上拍摄的照片,(2015)
[7] Moez Ali , PyCaret 主页,(2021)
用于计算机视觉中图像增强的顶级 Python 库
为您的下一个计算机视觉项目提供最好的增强库(以及示例代码)
Amy Shamblen 在 Unsplash 上的照片
像计算机视觉这样的深度学习任务高度依赖于大量的图像来进行训练。
虽然像迁移学习这样的技术已经减少了所需的数据量,但是良好的模型性能仍然需要足够质量、数量和种类的数据集。
在本文中,我们来看看最流行和最强大的 Python 库,它们可以显著提升您的影像数据集。
内容
关于图像增强
图像增强的目标是通过生成原始图像的修改副本来人为增加训练图像数据集的大小。
一些标准的图像增强技术包括:
- 顺时针或逆时针旋转图像给定角度
- 垂直或水平翻转图像
- 亮度通过增加或减少图像亮度进行调整
- 噪声通过应用模糊效果(例如,高斯模糊)进行添加
- 缩放图像向内或向外进行不同程度的缩放
根据使用情况,可以使用更复杂的技术,如颜色量化、直方图均衡化和粗略剔除。
在麻省理工学院许可下使用的来自 imgaug 的单一图像|图像的各种放大示例
图像增强包
理解了图像增强背后的动机后,让我们来看看让我们将这些概念付诸行动的软件包。
以下套餐是根据 GitHub repo 星数递增来排列的★。请注意,这些星级仅反映受欢迎程度,不应将而非视为质量的精确衡量标准。
在我看来,这些库都非常有能力执行增强来满足我们的大部分需求。说完了,我们开始吧。
(6) scikit-image
★4.4KGitHub星辰**
scikit-image 是一个开源库,包含一系列易于使用的图像处理算法。它建立在 scipy.ndimage 之上,旨在成为科学图像分析和图像处理的参考库。
高质量的代码是由活跃的志愿者社区编写和同行评审的。
作者在 scikit-image | Image 中实现旋转的示例代码
(5) 增强器
★4.5KGitHub星辰
根据麻省理工学院许可使用图像
Augmentor 是 Python 中用于机器学习的图像增强库。它的目标是成为一个独立于平台和框架的独立库,允许对增强进行方便和细粒度的控制。
它最终允许用户对他们的图像数据集执行最相关和真实世界的增强技术。
****增强器中水平翻转的示例代码实现|图片由作者提供
(4) 白蛋白
★8.4KGitHub星辰
在 MIT 许可下使用的图像
albuminations是一个 Python 库,用于快速灵活的图像增强。它有效地为不同的计算机视觉任务实现各种图像变换,包括对象分类和检测。
它还能够与流行的深度学习框架集成,如 PyTorch 和 Keras 。
作者在相册** |图片中随机亮度调整的示例代码实现**
火炬接力
★9.5KGitHub星辰
在 BSD 许可下使用的图像
Torchvision 包是 PyTorch 项目的一部分,py torch 项目是一个流行的开源 Python 机器学习框架。它由许多样本数据集、模型架构和计算机视觉的典型图像转换组成。
由脸书人工智能团队开发,这个包有意地与 PyTorch 分开,以保持它的精简和轻量级,同时仍然与 PyTorch 无缝地工作。
****火炬视觉中随机裁剪的示例代码实现|图片由作者提供
(2) 伊姆高格
★11.5kGitHub星辰
imgaug 是一个用于机器学习实验中图像增强的库。它支持各种增强技术,允许用户以随机顺序或在多个 CPU 核心上轻松组合和执行它们。
它有一个简单而强大的随机界面,可以增加图像,地标,边界框,热图和分割图。
作者在 imgaug |图片中高斯噪声添加的示例代码实现
(1) OpenCV
★55.8kGitHub星辰
OpenCV 图片用于维基共享资源 | Adi Shavit,公共领域
OpenCV (开源计算机视觉)可能是最著名的用于计算机视觉任务的开源库。
它专注于图像处理、视频捕捉和分析(包括人脸检测和对象检测等功能),还有助于为计算机视觉应用提供一个通用的基础架构。
OpenCV 中翻译的示例代码实现|图片由作者提供
示例实现代码
要访问上面显示的库的示例 Python starter 代码,请随意查看 GitHub repo中的 Jupyter 笔记本。
包装它
图像增强是一种丰富训练数据集以提高计算机视觉算法性能的工具技术。列出的 Python 工具使得在实践中实现这些扩充变得很容易。
以下是所涉及的库的概述:
scikit-image
augment
albumations
torch vision
imgaug
OpenCV
我的偏好曾经是 Torchvision(因为我倾向于在我的项目中使用 PyTorch),但后来我切换到了 imgaug ,因为有更多可用的增强选项。
在所有的增强中,确保增强图像看起来逼真并反映实际环境是至关重要的。****
否则,看起来不真实的图像会让你的深度学习模型学习到看起来与实际不同的东西,这反过来会对模型准确性产生负面影响。
在你走之前
欢迎您加入我的数据科学学习之旅!关注此媒体页面以了解更多数据科学内容,或者在 LinkedIn 上联系我。享受充实你的图像的乐趣吧!****
***** *****
2021 年最新的机器学习库
包含在您的 ML 项目中的最广泛使用和最有用的 ML 库的集合
在 Unsplash 上由 Waldemar Brandt 拍照
库是允许我们快速实现网络和开发成功应用程序的主要使能工具之一。ML 库一直在快速变化,我认为给最好的新库一个概述是个好主意。有许多流行的库已经存在了很长时间,我不打算回顾它们,因为你可能对它们很熟悉;这些是:
- Pytorch & Tensorflow/Keras
- 熊猫和 Matplotlib
- 数字与科学工具包学习
到目前为止,这些都是顶级的图书馆,没有必要去回顾它们。我将回顾我遇到的其他库,并看到许多其他人在 Kaggle 比赛中使用它们。
1。timm —监督图像学习
有大量的 SOTA 监督图像模型,每次我想实现一个新的模型,你都必须研究一段时间,直到你找到一个可以在 Keras / Pytorch 中适应的简单实现。Timm 提供超过 347 种型号,包括从 ResNet 到 ResNext 到 EfficientNet 等等。它支持的网络数量给我留下了很深的印象,而且实现起来也很容易,你只需要输入并加载网络名称就可以了。我很喜欢图书馆的概念,它把所有的东西都“收集”在一个地方,这样你就可以省去很多研究。如果您想查看受支持型号的列表,您只需做以下事情:
import
supported_models = timm.list_models()
# You will then get a list of more than 347 models (they might be more)
如果您没有在 timm 中找到您正在寻找的模型,您很可能会在 Pretrainedmodels 中找到它。您甚至可以在 timm 中找到它,但不是权重,这就是 Pretrainedmodels 的用途。
2. MMDetection —物体检测
MMDetection 在某种意义上类似于 timm,它是一个“集合库”,但用于对象检测模型,而不是监督图像模型。它支持 30 多种物体检测模型,你可以点击这里查看。关于这个库最好的事情是,它对构建一个 End 2 End 对象检测管道有很大的帮助。因为对象检测比监督图像分类任务稍微复杂一些,所以这个库非常有用。
3.细分 _ 车型(既有py torch&Keras
这是我将要提到的最后一个“收藏图书馆”。一个给喀拉斯,一个给 Pytorch。它基本上包括了所有的图像分割模型,并为图像分割任务提供了许多有用的实用函数。我提到所有这些“集合”库的原因是,我发现它们在 Kaggle 比赛中非常有用,当你正在寻找快速原型时。这在许多机器学习项目中是非常需要的,在这些项目中,您想要测试几个模型并比较它们的性能。
4. Pytorch 闪电
Pytorch 闪电之于 Pytorch 就像 Keras 之于 Tensorflow。Pytorch 的一个重要问题是它的实现相当长(就代码行而言)。Pytorch Lightning 更像是一个高级 API,构建在 Pytorch 之上,使编写神经网络代码变得更简单、更快速(因此有了 Lightning)。它还提供了一个非常有用的特性,称为“ Grid ”,这是一个大型云监视器,用于监视您正在运行的模型。
5。 相册
图像增强不再是可选功能。这是迄今为止使用最广泛的库之一,也是易于实现的图像扩充的首选。它很容易使用,并且有大量的教程和资源。它还提供了对大量不同扩展的支持,您可以使用这些扩展(超过 30 种不同的扩展)。
6。拥抱脸
Huggingface 在 NLP 方面做得非常好。该库提供了对大量 SOTA 变压器和 NLP 模型的支持。它们提供了一些函数来帮助完成传统的 NLP 任务,并帮助您用很少的几行代码构建端到端的 NLP 项目。他们拥有迄今为止最大的 SOTA 变形金刚和 NLP 模型收藏。我想他们最近正在开发一个 Auto-ML NLP 工具包,它基本上为你正在尝试做的 NLP 任务选择最好的转换器。
最终想法
我希望这篇文章对你有用。这些图书馆为我和许多人节省了大量的时间和精力。我认为用 Python 这样的语言编写的一个主要优势是有大量有用且易于使用的库(尤其是在机器学习方面)。如果你知道一个好的 ML 库,你认为它应该在这个列表中,请在评论中写下它。
如果你想定期收到关于人工智能和机器学习的最新论文的评论,请在这里添加你的电子邮件并订阅!
【https://artisanal-motivator-8249.ck.page/5524b8f934 号
应对每一个 SQL 面试问题的顶级技巧
理解并练习连接、聚合函数和子查询是你在编码面试中成功的关键
在任何面向数据的职位的面试中,几乎都有 SQL 部分。无论你面试的是分析师、工程人员还是数据科学人员,SQL 总是会悄悄进入流程的编码部分。
一旦你掌握了一些关键概念,通过大量的练习,你就可以回答任何问题。从这些概念的基础开始,逐步解决更困难的问题。
要想在 SQL 面试中取得成功,以下是你必须彻底了解的 3 个关键概念:
连接
你不会发现一个不涉及连接的问题。了解常规连接、内部连接和左连接之间的区别。当你能够区分这些并在正确的场景中使用它们时,你将会是黄金。
(图片由作者提供)
当您只希望两个表中都有值时,可以使用内部连接。它将比较您正在联接的任何列中的值,以便只有在这些列中具有匹配值的行才会出现在结果表中。
比方说,你想找目前正在影院上映的恐怖电影。ScaryMovies 表包含了影院中所有的恐怖电影。NowPlaying 表包含影院中当前播放的所有电影。
SELECT
ScaryMovies.name
FROM NowPlaying
INNER JOIN ScaryMovies
ON NowPlaying.movie_id = ScaryMovies.movie_id
使用内部联接来联接这些表将只选择当前正在影院上映的电影和恐怖电影表中的电影(或者两个表之间的重叠部分)。
左连接用于当您想要连接的第一个表中的值以及第二个表中的匹配值时。我喜欢问自己,我实际上想要最终表中的什么数据?如果我要查找一个表中的所有数据加上另一个表中的一列,那么我通常使用左连接。原始数据与第一个表非常相似,只是多了几列。
请记住,当您使用左连接时,如果第一个表和第二个表中没有匹配项,那么您从第一个表中提取的列将只是 null。
让我们再用一次现在播放的桌子。这个表只包含一个 movieId 来区分它是什么电影。关于每部电影的所有其他信息,如名称、类型和分级,都在 MovieDetails 表中。我们希望找到当前正在上映的所有电影的详细信息。
SELECT
NowPlaying.movie_id,
Movies.name,
Movies.type,
Movies.rating
FROM NowPlaying
LEFT JOIN Movies
ON NowPlaying.movie_id = Movies.movie_id
这里,我们只需要 NowPlaying 表中关于电影的电影细节,以及我们可以从 movies 表中利用的一些进一步的细节。使用左连接将导致 NowPlaying 表中的所有 movieIds 出现在结果表中,如果 Movies 表中存在名称、类型和分级,也会出现在结果表中。如果左边的 movie_id 在右边不存在,那么该行的 name、type 和 rating 列将为 null。
最后是加入,这是最基本的。您还会看到这被称为完全外部连接,但最简单的方法是在代码中编写连接。当您需要两个表中的所有值时,可以使用这种方法。这在 id 或日期列中查找连续值时特别有用。
例如:假设您想查找连续播放两天的所有电影。
SELECT
DISTINCT a.name
FROM Movies a
JOIN Movies b
ON a.play_date + 1 = b.play_date
在这里,我连接相同的表,但是基于 play_date 连接它们,以便只有连续播放 2 天的电影才会被填充到表中。连续两天没放的电影不会加入。
聚合函数
就像连接一样,你会发现在几乎每个面试问题中都需要使用某种类型的聚合函数。这些都是不言自明的,但是这里的关键是知道如何正确地使用 GROUP BY 函数。
MIN() 和 MAX() 正是它们听起来的样子。它们会给出一个组(或整个表)中指定列的最小值或最大值。如果没有指定 GROUP BY 函数,那么这些函数肯定只返回一个值。
SELECT
Name,
MAX(Revenue) AS Max_revenue
FROM MOVIES
GROUP BY Genre
这将返回每个电影类型中收入最高的电影,显示其名称和收入金额。
COUNT() 计算在函数中指定的任何条件下出现的行数。请记住,这与 SUM() 不同,后者实际上将您指定的列中的值相加。
SELECT
Name,
SUM(Revenue) AS Total_revenue,
COUNT(*) AS Times_played
FROM Movies
GROUP BY Name
让我们使用这个示例代码来看看 SUM()和 COUNT()之间的区别。这里,SUM(Revenue)函数将把每部电影获得的所有收入加在一起(注意 GROUP BY Name 函数)。相反,COUNT(*)将简单地计算每个电影名称的行数。您也可以执行 COUNT(Revenue)并获得相同的结果,但是计算所有行比计算收入更有意义。
AVG() 在计算某一组的平均列时,会让你的生活轻松很多。它基本上与 SUM(Revenue)/COUNT(Revenue)做同样的事情,因为平均值就是总和除以计数。
SELECT
date_played,
AVG(revenue)
FROM Movies
GROUP BY date_played
这将为您提供该影院在开放和播放电影的每个日期的所有电影之间的平均收入。
子查询
这一条可能是最需要练习的。很多时候,公司会要求您解决一个问题,而这个问题很容易用多个表来解决,只需要一个子查询。
实践这一点的一个好方法是首先用最简单的方法解决一个问题,也许是用多个表。一旦得到正确答案,尝试重构代码,这样就可以使用一个子查询而不是多个表来解决问题。
让我们来看看这到底是什么样子:
原件:
WITH MarchMovies AS (
SELECT
movie,
genre,
date_played
FROM Movies
WHERE date_played BETWEEN '03-01-2018' AND '03-31-2018'
),MayMovies AS (
SELECT
movie,
genre,
date_played
FROM Movies
WHERE date_played BETWEEN '05-01-2018' AND '05-31-2018'
)SELECT
MayMovies.movie
FROM MayMovies
INNER JOIN MarchMovies
ON MayMovies.movie = MarchMovies.movie
在这里,我们找到了三月播放的所有电影和五月播放的所有电影,并使用内部连接将它们连接到电影标题上,从而只获得两个月播放的电影。
使用一个子查询:
SELECT
movie
FROM Movies
WHERE movie IN (SELECT movie FROM Movies WHERE date_played BETWEEN '03-01-2018' AND '03-31-2018')
AND date_played BETWEEN '05-01-2018' AND '05-31-2018'
在这里,我们使用运算符中的 WHERE 和找到了三月份播放的所有电影标题。如果该电影标题出现在为三月电影创建的临时表中,并在五月播放,则它将出现在输出表中。
结论
一旦你理解了这三个基本概念,接下来就是实践了。每天至少花 15 分钟尝试新问题。如果你想不出一个,看看解决方案,第二天再试一次。 LeetCode 和 HackerRank 提供了大量利用所有这些技能的问题。你没有理由不通过 SQL 面试!
练习,练习,练习!
热门 SQL 面试问题
来源: Unsplash
这里有十几个最常见的 SQL 面试问题,你会在数据专业人员的面试中看到。我强烈建议你尝试回答这些问题,并为每个问题写下预期的问题,然后在文章结尾将你的答案与我的进行比较。为了回答这些问题,我创建了一个假数据集和一个模式来运行查询。数据库模式就在问题的下面。那会让你开始。完成问题后,您可以滚动数据表查看答案。
问题
- 确定表格中重复项的数量。
- 查找两列的所有唯一组合。
- 计算列中非空条目的数量。
- 什么时候使用分组还是不同?举个例子。
- 为什么使用 coalesce vs. case 语句?
- 什么时候你会选择左连接而不是内连接?举个例子。
- 在什么情况下子查询是个坏主意?
- 为什么临时表是个好主意还是坏主意?
- 工会什么时候有用?举个例子。
- 如何使用连接进行筛选?举个例子。
- 何时使用 having vs. where?举个例子。
- 常用表表达式如何帮助分析师?举个例子。
本文未涉及的其他话题:
Sum。日期时间操作。字符串格式。子串。窗口功能类似于秩和行。滞后和领先。理解索引。累计总数。最大和最小。
数据库模式设置
您可以使用下面的 SQL 代码在 SQLFiddle 设置模式,或者转到这个直接链接来运行 MySQL 中的代码,或者转到这个直接链接来运行 PostgreSQL。除了下面的代码,还有两个表直观地表示了 2019_Sales 和 Store_Info 表。在表格下方,您会找到解决方案部分。
注意:该模式在 MySQL 中有效,但可能在其他 SQL 数据库中无效。其他 SQL 数据库管理系统可能对表名和双引号与单引号的使用有更严格的规则。
CREATE TABLE 2019_Sales (
sales_id INT NOT NULL,
year INT NOT NULL,
country VARCHAR(40) NOT NULL,
store_id INT NOT NULL,
sales INT NOT NULL,
PRIMARY KEY (sales_id)
);
INSERT INTO 2019_Sales
(sales_id, year, country, store_id, sales)
VALUES
(1,2019,"Canada",1111,1000),
(2,2019,"Canada",1112,5000),
(3,2019,"Canada",1113,700),
(4,2019,"Mexico",1114,8000),
(5,2019,"Mexico",1115,100),
(6,2019,"United States",1116,2000),
(7,2019,"United States",1117,150),
(8,2019,"Canada",1111,1000),
(9,2019,"United States",1116,500),
(10,2019,"Mexico",1114,8000),
(11,2019,"Mexico",1115,500),
(12,2019,"Mexico",1115,500);
CREATE TABLE Store_Info (
store_id INT NOT NULL,
store_name VARCHAR(40) NOT NULL,
size INT,
PRIMARY KEY (store_id)
);
INSERT INTO Store_Info
(store_id, store_name, size)
VALUES
(1111,"Red Store",1000),
(1112,"Blue Store",3000),
(1113,"Green Store",2000),
(1114,"Pink Store",NULL),
(1115,"Yellow Store",NULL),
(1116,"Brown Store",500),
(1117,"Black Store",1000);
SQLFiddle 的屏幕截图—作者提供的图片
2019 _ 销售表
商店信息表
*******解决方案在此之下 * * * * * * *
解决方法
问题 1:确定表中重复项的数量
这可以有两种不同的解释。查找包括比较中所有列的重复项的数量,或者查找列子集的重复项的数量。如果有一个主键,那么应该不可能有一整行是重复的,但是它们仍然会发生。下面是我的代码,用于查找该表中仅包含{"year "," country"}的子集中的重复项数量。
/* Year and Country combination duplicates */
SELECT year, country, COUNT(*)
FROM 2019_Sales
GROUP BY year, country
HAVING COUNT(*)>1
问题 2:找出两列的所有唯一组合
/* Find all unique combinations of two columns*/
SELECT DISTINCT country, store_id
FROM 2019_Sales
问题 3:计算一列中非空条目的数量
/* Count the number of non-null entries in a column*/
SELECT COUNT(size)
FROM Store_Info
问题 4:什么时候使用 group-by 和 distinct?
分组依据是一种类似于 Excel 中数据透视表的技术。当值在一列中出现多次时,这对于汇总或聚合信息很有用。例如,我们可以在 2019_Sales 表上使用 group-by 按国家汇总销售额。
/* Aggregate sales by country using group-by*/
SELECT country, sum(sales)
FROM 2019_Sales
GROUP BY country
当您需要一组唯一的记录或一组唯一的记录的计数时,“distinct”字段非常有用。在问题 2 中,我们找到了两列之间所有组合的唯一集合的计数。
问题 5:为什么使用 coalesce vs. case 语句?
大多数编程语言中都有 Case 语句。在有大量条件语句的情况下,它们很有用。与写一堆 if/then 语句相比,它们是一种更有条理、更容易解释的方法。一个常见的例子是分配顺序排名。联合语句是 case 语句的简写。因为它们需要较少的代码,所以对于非程序员来说,它们不如 case 语句那样易读。
当程序员希望减少代码或者当用户定期访问查询时,最好使用 Coalesce 语句。因为它更难解释,所以您不希望不经常使用的用户通读多行合并语句。
另一方面,case 语句因为易读性更适合不经常使用的用户。这个特性也使得 case 语句更容易调试 SQL 语句。
问题 6:什么时候你会选择左连接而不是内连接?
当您有一个要与不完整数据集合并的主数据集时,左连接是很常见的。我们的目标是添加一些新信息,而不是覆盖原始数据集中的任何内容。在下面的示例中,我们使用左连接将 Store_Info 表添加到 2019_Sales 表中。因为 store_id 1117 没有 Store_Info 记录,所以内部连接会在连接的表中忽略该记录。如果您运行下面的“Inner Join”代码并将其与“Left Join”输出进行比较,就会看到这一点。
/* Left join two tables - Includes Store_ID 1117*/
SELECT 2019_Sales.sales_id, 2019_Sales.year, 2019_Sales.country, 2019_Sales.store_id, 2019_Sales.sales, Store_Info.store_id, Store_Info.store_name, Store_Info.size
FROM 2019_Sales
LEFT JOIN Store_Info ON 2019_Sales.store_id=Store_Info.store_id;/* Inner join two tables - Doesnt include Store_ID 1117*/
SELECT 2019_Sales.sales_id, 2019_Sales.year, 2019_Sales.country, 2019_Sales.store_id, 2019_Sales.sales, Store_Info.store_id, Store_Info.store_name, Store_Info.size
FROM 2019_Sales
INNER JOIN Store_Info ON 2019_Sales.store_id=Store_Info.store_id;
问题 7:在什么情况下子查询是个坏主意?
子查询或嵌套查询,通常用于一些计算或条件逻辑,提供在查询的主要部分使用的数据。一些子查询被称为相关子查询。当子查询包含主查询中的列时,就会出现这种情况。因为相关子查询依赖于主查询,所以它们不能独立运行。因此,它们更难调试。常见问题包括对表或别名的不正确引用(来源)。
问题 8:为什么临时表是个好主意还是坏主意?
在批处理或流程中处理数据时,如果需要存储和查看中间结果,临时表非常有用。这将有助于调试或检查过程是否按预期运行。然而,在存储过程中使用临时表会导致负面影响,比如多次重新编译、使用事务日志和并发开销(来源)。这会导致负面的性能影响。
问题 9:工会什么时候有用?
联合对于组合列或数据集很有用;然而,它们并不像连接那样将它们组合在一起,而是像字符串的串联。将一个记录集合追加到另一个记录集合中。虽然联接基于特定的 id 进行匹配,但是联合只是将一个部分添加到另一个部分的末尾。在下面的示例中,我们可以通过使用 union 合并两个表中的 store_id 列来确认我们拥有所有的 store _ id。union 函数会对数据集进行重复数据删除,而 union all 不会。
/* Combine all store_ids from both tables into one column*/
SELECT store_id FROM 2019_Sales
UNION
SELECT store_id FROM Store_Info
ORDER BY store_id;
- 注意:Python 的 Pandas 库中类似的函数是 concat( ) 。
问题 10:如何使用连接进行筛选?
自连接是指一个表与自身连接。这些函数对于筛选单个表中的记录非常有用。在下面的情况中,我们可以在同一个国家中找到所有的 store _ ids 对。输出为每对产生两行,因为在这种情况下顺序很重要。
/* Find all pairs of store_ids in the same country*/
SELECT A.store_id AS Store_ID1, B.store_id AS Store_ID2, A.country AS Country
FROM 2019_Sales A, 2019_Sales B
WHERE A.store_id <> B.store_id
AND A.Country = B.Country
ORDER BY A.Country;
问题 11:何时使用 having vs. where?
Where 和 having 语句都用于筛选查询结果;但是,它们出现在脚本顺序的不同位置。这种排序是有目的的,因为“where”语句筛选非聚合列。“Having”语句用于筛选聚合列或 group by 子句中包含的列。请参见下面的示例,我们希望根据每个国家的总和进行筛选。因为这是一个聚合,所以我们不能使用 where 子句。此查询的输出不包括美国的销售总额 2650,它小于 2800。
-- Using the having clauses
SELECT country, sum(sales)
FROM 2019_Sales
GROUP BY country
HAVING sum(sales) > 2800
注意:很多数据库管理系统不支持 having 子句中的别名用法。
问题 12:常用表表达式如何帮助分析师?
公用表表达式(CTE)本质上是定义一个只为一个查询而存在的临时表。CTE 在主查询之前声明。它们类似于子查询,比复杂查询更具可读性。cte 开头附有一个“WITH”语句。它们为复杂的查询提供了额外的灵活性,包括在 CTE 中为字段命名以及在后面的表达式中使用它们的能力。例如,您可以对一个聚合进行聚合。盗梦空间?!在下面的代码中,我在一个查询中取一个总和的平均值。
-- Using CTEs and the WITH statement
WITH sum_store_id_sale AS
(
SELECT store_id, country, SUM(sales) AS sum_sales
FROM Sales_2019
Group By store_id, country
)
SELECT AVG(sum_sales) AS avg_sales
FROM sum_store_id_sale;
这段代码的输出是 sum_sales 列的平均值,它得到了 store _ ids 的销售额总和。因此,输出为 3921.43。
注意:上面的代码没有在 MySQL 的 SQLfiddle 中运行。我在 PostgreSQL 中重建了模式。这需要将 2019_Sales 表的名称更改为 Sales_2019,并将所有双引号替换为单引号,以满足 PostgreSQL 的规则。
反馈
- 这些问题有很大的难度。有些是初级水平,而有些则处理更复杂的主题,如临时表或子查询。比较了你的答案后,你的和我的有什么不同?对于不同的答案,我会深入探究。我们对这个问题有不同的解释吗?是我的解释遗漏了什么,还是你的解释不完整?在面试中,理想的候选人能够以清晰、简洁的方式解释最复杂的 SQL 主题。
- 数据通才
PS :这里列出了一些额外的 SQL 资源。
顶级 SQL 面试测试问题和技巧(第 1 部分)
数据科学家招聘流程中一些最常见的 SQL 测试问题的解决方案和解释!
丹尼尔·伊德里在 Unsplash 上的照片
点击这里查看第二部!
简介
如果你申请的是数据科学、商业分析或任何与数据相关的领域的职位,你很有可能会被要求参加包含 SQL 组件的编码测试。该测试通常在 Codility 或 HackerRank 等平台上进行,通常是对申请数据导向角色的候选人进行初步筛选。
尽管在这些测试平台上有许多可能的场景和案例,但是在这些 SQL 测试中还是会重复出现某些任务。这些任务并不总是以完全相同的格式出现,有时是最终解决方案的中间步骤的一部分。不,我说的不是像“显示最大值”或“计算不同值的数量”这样的基本查询。例如,我们正在谈论你将在中等难度的 LeetCode 上找到的那种任务。
在我看来,你可以花上几个小时甚至几天的时间来尝试 LeetCode 和 HackerRank 上所有不同的挑战,但最终这些挑战并不能代表这类招聘测试中的实际测试问题。更多的时候,测试任务是面向实际的商业应用的;进行足够多的测试,你很快就会注意到某些任务的重复。
这篇文章的目标正是概述这些任务并提出解决方案,以便您可以更好地准备这些测试。在这篇文章的第一部分,我将分享两种非常常见的任务:
- 选择每个类别的前 N 个值
- 选择满足条件的连续行数最少的行
注意 : 根据您使用的 SQL 版本,可以使用的子句和函数之间可能会有一些差异,但一般来说应该不会有太多差异。有太多的细微差别需要讨论,所以如果你对任何功能不确定,只需做简单的搜索,通常会有人找到答案!
准确性和效率
一般来说,评估 SQL 解决方案有两个关键方法:准确性和效率。在下面的例子中,我主要关注准确性,以展示 SQL 中某些技术或函数的用法和应用。然而,我也认识到效率在 SQL 中非常重要,尤其是在查询大量数据时。在我的解决方案中,我确保在给定基础-中级 SQL 学习者的假定知识的情况下实现非常合理的效率水平,并尽最大努力提供尽可能减少冗余的解决方案。如果你想了解更多关于效率的知识,可以考虑看看这个网站或者这本书来了解更多。
事不宜迟,我们来深入提问吧!
Q1:选出每个类别的前 N 名
对于这种类型的问题,您需要选择包含某个类别中前 N 个值的行。
任务:提取学校每个班级的前 2 名考试成绩的姓名和班级,先按班级排序,再按分数排序。如果有任何平局,使用较低的学生 id 来打破平局。
分数数据集包含学校所有学生的分数。每个学生都有一个唯一的 student_id ,这是主键。班级数据集包含学校中所有学生的班级。这里的外键是 student_id ,它匹配来自 scores 的主键。类似地, names 数据集包含所有以 student_id 作为外键的学生的姓名。
注意:一个外键是一个表中的一个字段,它引用了另一个表中的一个主键。
**scores**| student_id | scores |
+------------+--------+
| 1 | 90 |
| 2 | 83 |
| 3 | 79 |
| 4 | 97 |
| 5 | 90 |
| 6 | 92 |
| 7 | 94 |
...**classes**| student_id | class |
+------------+--------+
| 1 | A |
| 2 | B |
| 3 | A |
| 4 | B |
| 5 | D |
| 6 | B |
| 7 | A |
...**names**| student_id | name |
+------------+----------+
| 1 | James |
| 2 | Michael |
| 3 | Valarie |
| 4 | Jessie |
| 5 | Douglas |
| 6 | Shin |
| 7 | Joanne |
...
因此,预期的结果应该是这样的:
**EXPECTED RESULT:**| class | name | score |
+-------+--------+-------+
| A | Joanne | 94 |
| A | James | 90 |
| B | Jessie | 97 |
| B | Shin | 92 |
...
解决方案
WITH class_ranking AS (
SELECT
c.class, n.name, s.score,
ROW_NUMBER() OVER (PARTITION BY c.class ORDER BY s.score DESC, s.student_id) AS rank
FROM scores s
JOIN classes c ON s.student_id = c.student_id
JOIN names n ON s.student_id = c.student_id
)
SELECT class, name, score
FROM class_ranking
WHERE rank <= 2
ORDER BY class ASC, score DESC;
这项任务的难点在于,不是为整个数据集而是为每个类别选择最高分。如果任务是针对整个数据集的,我们可以只使用组合 ORDER BY 和 LIMIT 来获得最高分。
为了帮助我们以高效和简洁的方式解决这个任务,我们可以使用公共表表达式(CTE) 来创建一个临时结果,该结果可以被类似于 SELECT 和 INSERT 、 UPDATE 或 DELETE 的子句引用。
首先,我们使用分数、班级和姓名之间的一个连接来获得一个完整的数据集,其中每一行都包含每个人的所有相关数据。然后,除了选择这三个数据点之外,我们使用 PARTITION BY 子句根据 c.class 划分结果集,并根据 ORDER BY 之后的字段从 1 开始分配一个 ROW_NUMER() 。在这种情况下,在 c 类的每个分区中,我们首先按照 s.score 在 DESC 中进行排序,将每个类中的最高分排序为 1,第二高的排序为 2,以此类推。此外,我们使用 s.student_id 作为排序依据的辅助字段,从而实现任务的目标,即使用较低的 student_id 消除联系。
有关如何使用子句的分区的更多详细信息,请点击此处链接查看。
接下来,我们利用 CTE 将这个划分的排名存储为一个临时结果集,称为 class_ranking。一般来说,CTE 的用法如下:
WITH temp_table AS (
SELECT ...
)
SELECT _ FROM temp_table
你也可以用一个 cte 链来解决问题。这在解决方案需要对中间 CTE 进行连续处理以获得实际结果的最终 CTE 的情况下非常有用。格式如下所示:
WITH temp_table AS (
SELECT ...
),WITH temp_table_2 AS (
SELECT ...
),SELECT _ FROM temp_table_2
关于使用多个 cte 的示例,敬请关注未来的帖子!
对于这个问题,CTE class_ranking 基本上是原始三重连接的扩展,增加了一个字段 rank 来表示每个分区或类中每个学生的等级。
有了这个 CTE,我们就可以选择相关的字段 class、name、score 并使用 WHERE 子句对 rank ≤ 2、的行进行子集化,从而有效地给出每个类的前 2 名分数,其平局被较低的 student_id 打破。我们在最终解决方案中省略了等级,因为这不是必需的。我们也按类别 ASC 进行排序,首先按字母顺序对类别进行评分,以获得想要的排序,分数较高的排在最上面。
变体:ROW_NUMBER()的替代方法
在这个特定的任务中,使用 student_id 来打破平局,这可以通过为每个分区分配 ROW_NUMBER()并首先按分数然后按 student_id 排序来简单地实现。这将确保只有一个学生排名 1,一个学生排名 2。
但是,如果问题指定:让 s1 和 s2 是每个班级取得的前 2 名成绩,会怎么样呢?如果有一个以上的学生获得了 s1 和/或一个以上的学生获得了 s2,只要他们获得了前两个分数中的一个,就包括所有的名字。
实际上,这意味着修改后的结果集可能类似于:
**MODIFIED RESULT:**| class | name | score |
+-------+--------+-------+
| A | Joanne | 94 |
| A | James | 90 |
| A | Caleb | 90 |
| B | Jessie | 97 |
| B | Shin | 92 |
...
为了说明这种变化,我们只需将 ROW_NUMBER() 窗口函数更改为 DENSE_RANK() 。假设 James 的 student_id 比 Caleb 小,ROW_NUMBER()会将 rank=2 分配给 James,将 rank=3 分配给 Caleb。但是,DENSE_RANK()会将 rank=2 分配给 James 和 Caleb。此外,DENSE_RANK()和 RANK()之间的差异也值得注意——DENSE _ RANK()是“密集的”,因为它不会在相同的排名后跳过排名,但 RANK()会。因此,Caleb 之后的下一个最高分在 DENSE_rank()下将被排序为 rank=3,但在 RANK()下将被排序为 rank=4。根据应用程序的情况,应该知道这些窗口应用程序之间的差异。
对于那些想知道什么是窗口函数以及它与其他函数如聚合函数的关系的人来说, PostgreSQL 提供了一个很好的解释 :
一个 窗口函数 对一组与当前行有某种关系的表格行执行计算。这与聚合函数可以完成的计算类型相当。但是与常规的聚合函数不同,窗口函数的使用不会导致行被组合成一个输出行——这些行保持它们各自的身份。在后台,窗口函数能够访问的不仅仅是查询结果的当前行。
如果您的 SQL 方言不支持 ROW_NUMBER() 函数或 PARTITION BY 子句,我们可以在一个相关子查询中使用等价连接和非等价连接逻辑的组合来获得想要的结果:
SELECT c.class, n.name, s.score
FROM scores s
JOIN classes c ON s.student_id = c.student_id
JOIN names n ON s.student_id = n.student_it
WHERE
(
SELECT COUNT(DISTINCT s.score)
FROM scores s2 JOIN classes c2 ON s2.student_id = c2.student_id
WHERE s2.score > s.score
AND c2.class = c.class) < 2
一个等价连接是一个根据列中匹配值连接表的连接。非等价连接是一个条件不等于的连接。
子查询是嵌套在另一个查询中的查询。相关子查询是使用外部查询中的值的子查询。
在这种情况下,子查询使用外部查询中的 s.score 和 c.class 与来自同一个表 scores 的值进行比较,但现在使用别名 s2,并计算比原始表 scores s 中的每一行都大的分数的数量。条件是选择具有少于 2 个对应匹配的那些,因为最高分数将具有 0 个匹配,第二高分数将具有 1 个匹配。
仅此而已!进入下一个问题…
Q2:条件连续选择
选择满足条件的连续行数最少的行
SQL 访谈中的一个常见任务是选择不仅满足特定标准,而且满足最少数量的行的行,通常按日期排序。这里我们将看一个例子,它解释了在给定我们要寻找的连续行之间的关系的情况下,我们如何使用交叉连接来过滤这种情况。
表格病例包含每个日期的新 COVID 病例数。
任务:显示包含连续 3 天或以上的 100 例以上的行。
**cases**+------+------------+-----------+
| id | date | new |
+------+------------+-----------+
| 1 | 2021-01-01 | 20 |
| 2 | 2021-01-02 | 149 |
| 3 | 2021-01-03 | 150 |
| 4 | 2021-01-04 | 99 |
| 5 | 2021-01-05 | 145 |
| 6 | 2021-01-06 | 200 |
| 7 | 2021-01-07 | 199 |
| 8 | 2021-01-08 | 188 |
| 9 | 2021-01-09 | 88 |
+------+------------+-----------+
...
预期的结果将类似于:
**EXPECTED RESULT**+------+------------+-----------+
| id | date | new |
+------+------------+-----------+
| 5 | 2021-01-05 | 145 |
| 6 | 2021-01-06 | 200 |
| 7 | 2021-01-07 | 199 |
| 8 | 2021-01-08 | 188 |
+------+------------+-----------+
解决方案
WITH cases_over_hundred AS (
SELECT * FROM cases WHERE new > 100
)SELECT DISTINCT c1.*
FROM cases_over_hundred as c1,
FROM cases_over_hundred as c3,
FROM cases_over_hundred as c2,
WHERE (c1.id = c2.id - 1 AND c1.id = c3.id - 2)
OR (c1.id = c2.id + 1 AND c1.id = c3.id - 1)
OR (c1.id = c2.id + 2 AND c1.id = c3.id + 1)
ORDER BY c1.id;
为了提高效率,我们首先创建一个 CTE 来选择超过 100 个案例的行。我们称这种 CTE 案例超过 100 例。
接下来,我们使用一个条件交叉连接来查找所有连续 3 天或以上超过 100 个案例的行。交叉联接,也称为笛卡尔积,其中一个表中的每一行都与另一个表中的每一行相结合。
作者图片
在本例中,我们交叉连接三个表,因为我们想要比较三个日期的不同组合的日期,以检查它们是否连续。但是,我们将使用条件来确保只联接属于以下三个类别之一的日期,而不是完全交叉联接:
- c1 日期比 c2 日期早一天,比 c3 日期早两天
- c1 日期比 c2 日期晚一天,比 c3 日期早一天
- c1 日期比 c2 日期晚两天,比 c3 日期晚一天
注意:对于这些条件中的任何一个,用 c3 替换 c2 都无关紧要,因为这里我们使用的是交叉连接,所以无论如何都要考虑所有的排列
这三种可能性分别由以下三个条件捕获:
WHERE (c1.id = c2.id - 1 AND c1.id = c3.id - 2)
OR (c1.id = c2.id + 1 AND c1.id = c3.id - 1)
OR (c1.id = c2.id + 2 AND c1.id = c3.id + 1)
通过这种条件交叉连接,我们成功地选择了所有的日期组合,这样,当排列正确时,行中的所有三个日期都是连续的,并且它们都有大于等于 100 的事例。
最后,我们需要使用选择(DISTINCT (c1。*)) 删除所有重复。对于每个子集化的行,由于有条件的交叉连接,将会有两个重复,因此我们需要做的只是从 c1 中选择不同的日期值,以获得连续 3 天或更多天超过 100 个案例的日期序列。
替代方案
事实上,还有另一种方法可以解决这个问题,那就是使用窗口函数(再次)!对于这种情况,我们可以使用窗口函数 LAG() 和 LEAD() 。正如您可能已经预料到的, LAG() 允许我们获得给定字段的先前值,其中顺序由另一个字段决定。在这种情况下,我们根据 id 的顺序得到 new 的前几个值。同样, LEAD() 返回引用中当前行前面的 us 值。
标准语法如下:
LAG(return_value ,offset [,default])
OVER ([PARTITION BY partition_expression, ... ]
ORDER BY sort_expression [ASC | DESC], ... )
这个语法与我们在问题 1 中使用的非常相似,使用 ROW_NUMBER()窗口函数。
对于这个问题,我们首先使用 LAG()和 LEAD()窗口函数构造一个 CTE,其中包含每行日期前后 1、2 天的值。随后,对于连续三天超过 100 个案例的条件得到满足的行,我们引用此 CTE 和条件。'
WITH interval_cases AS (
SELECT *,
LAG(new, 2) OVER (ORDER BY id) AS before_2,
LAG(new, 1) OVER (ORDER BY id) AS before_1,
LEAD(new, 1) OVER (ORDER BY id) AS after_1,
LEAD(new, 2) OVER (ORDER BY id) AS after_2
FROM cases
)
SELECT id, date, new
FROM cases
WHERE new > 100
AND ((before_2 > 100 AND before_1 > 100)
OR (before_1 > 100 AND after_1 > 100)
OR (after_1 > 100 AND after_2 > 100))
ORDER BY id;
让我们来看看查询逻辑:
首先,CTE interval_cases 将为每一行生成一个如下所示的结果集:
+----+------------+-----+----------+----------+---------+---------+
| id | date | new | before_2 | before_1 | after_1 | after_2 |
+----+------------+-----+----------+----------+---------+---------+
| 5 | 2021-01-05 | 145 | 150 | 99 | 200 | 199 |
...
随后,我们筛选出那些 new 大于 100 并且属于连续三天都大于 300 的行。这可能以三种方式之一发生,这就是为什么伴随新的> 100 条件有三种可选条件。这将得到与上一个解决方案相同的结果。
结论
我希望这两个问题在演示如何处理 SQL 编码测试中最常见的问题时有用。如果你喜欢我分享的内容,请给我一个掌声并分享这篇文章!
如果有足够的兴趣,我还会在第 2 部分提出更多问题,如果您对如何解决这些问题有任何意见或建议(特别是从效率的角度),请随时联系或发表评论!
更新:点击这里查看第二部!
顶级 SQL 面试测试问题和技巧(第 2 部分)
在数据科学家招聘过程中,您将会发现一些最常见的 SQL 测试问题的更多解决方案和解释!
卡斯珀·鲁宾在 unsplash 上的图片
点击这里查看第一部分!
简介
在 SQL 面试问题的第 2 部分中,我们将了解如何计算变量随时间的移动平均值。这被认为是数据科学家/分析师角色的 SQL 测试中可能遇到的最难的问题之一,但这是介绍窗口函数的扩展概念以及使用它们可能产生的可能性的一种非常好的方式!
感谢 StrataScratch 为这个问题提供灵感!如果你想在准备面试时获得一系列问题,那就去看看吧!
也请查看我的本系列第 1 部分中关于 SQL 编码测试的其他问题!
表格
**transaction**+---------+--------------------+----------+----------+
|user_id |created_at |item_id |item_count|
+---------+--------------------+----------+----------+
|000001 |2020-01-01 02:03:04 |23 |20 |
|000002 |2020-01-01 03:11:22 |41 |30 |
|000002 |2020-01-02 05:01:23 |64 |5 |
...**item_details**+---------+-----------------+--------+
|item_id |item_mame |price |
+---------+-----------------+--------+
|23 |Toilet Paper |0.90 |
|41 |Hairband |0.30 |
|64 |Hand Soap |2.20 |
...
交易包含每笔交易的一行,包含用户标识、交易日期时间、项目标识和项目计数(购买数量)。用户、他们的购买金额和购买日期。退货时将显示负的 item_count。
item_details 包含每个项目的 item_id、item_name 和价格。
任务:收入滚动平均
在给定的名为交易和项目 _ 详细信息的表格中,找出采购总收入的三个月滚动平均值。不要包括由负 item_count 表示的退货。输出收入的月份和 3 个月的滚动平均值,从最早的月份到最晚的月份排序。
3 个月滚动平均是通过计算当月和前两个月所有用户购买的平均总收入来定义的。前两个月不会是真正的 3 个月滚动平均值,因为我们没有去年的数据。
预期产出
+-----------+---------------+
|month |avg_revenue |
+-----------+---------------+
|2020-01 |82910 |
|2020-02 |91840 |
|2020-03 |63702 |
|2020-04 |74839 |
...
任务 1 解决方案
SELECT t2.month,
AVG(t2.monthly_revenue) OVER (ORDER BY
t2.month ROWS BETWEEN 2 PRECEDING AND CURRENT ROW)
AS avg_revenueFROM
(SELECT to_char(created_at::date, 'YYYY-MM') AS month,
sum(purchase_amt) AS monthly_revenue FROM
(SELECT transaction.created_at,
item_count * item_price AS purchase_amt
FROM transactions
LEFT JOIN item_details ON transactions.item_id = item_details.item_id) t1 WHERE purchase_amt > 0
GROUP BY month
ORDER BY month) t2GROUP BY month
ORDER BY month ASC
为了解决这一任务,我们将以循序渐进的方式接近目标,最终获得收入的滚动平均值。自然,第一步是计算每笔交易的总花费。为此,我们必须在事务和项目详细信息之间进行左连接。请注意,我们只需要一个左连接,因为我们只希望获得包含事务的行。很可能会有一些商品出现在 item_details 中,但我们却没有与之交易。
作者原创图片
本质上,left join 返回左表中的所有行,同时返回右表中的所有匹配行,这是基于在 ON 子句之后出现的匹配条件。通过左连接表,我们使用子查询获得表 t1 的中间结果,其中包含每笔交易的 created_at date 和purchase _ amount,后者是 item_count 和 item_price 的乘积。
当顺序求解时,它有助于将中间结果可视化,如下所示:
**t1**+--------------------+--------------+
|created_at |purchase_amt |
+--------------------+--------------+
|2020-01-01 02:03:04 |18.0 |
|2020-01-01 03:11:22 |9.0 |
|2020-01-02 05:01:23 |11.0 |
...
下一步是合计每个月的所有 purchase_amt。为此,我们需要根据月份对所有的 created_at 值进行分类。有很多方法可以做到这一点,但是对于我们当前的解决方案,我们将使用 :: 作为转换语法。这里,我们使用下面的代码行提取月份,并将其转换为格式为“YYYY-MM”的 VARCHAR 数据类型,如下所述。
to_char(created_at::date, 'YYYY-MM') AS month
:: 用于将值转换为特定类型,在本例中是日期类型。我们这样做的原因是为了确保在使用 to_char 创建‘YYYY-MM’VARCHAR数据类型之前,我们正在处理一个日期类型。类似地,我们可以使用 CAST() 来实现同样的事情:
CAST(created_at AS date) AS month
有了这个月别名,我们就可以根据月实现一个组,同时还可以过滤 purchase_amt > 0,这样我们就可以排除项目。(回想一下,负 item_count 表示返回的项目不应包含在我们的表格中)。附带的聚合函数将对每个月的所有采购金额进行 SUM() ,以获得月度收入,这构成了临时结果 t2 的基础。
最后,我们要计算月收入的三个月移动平均值,使用当月和过去两个月的收入。为了做到这一点,我们可以应用 AVG( )聚合函数来计算三行连续数据的平均收入。要了解更多关于条款的的信息,我推荐在这里查看详细的文档
为了指定我们希望聚合三行数据,我们使用以下子句:
ORDER BY <变量>前一行< n >和当前行之间的行
在这里,
**ROWS BETWEEN <n> PRECEDING AND CURRENT ROW**============= is the same as ============**ROWS <n> PRECEDING**
有兴趣的也可以根据问题用无界代替整数< n >。如你所料,使用 UNBOUNDED 基本上意味着一个扩展的窗口,例如,当我们关心查找运行总数时,这是很有用的。
现在,让我们仔细看看这个子句的每个组成部分。这里,行指定我们将根据它们的行顺序来考虑观察值。另一种规范是使用 RANGE 来代替,它本质上看起来是相同的行,但也是具有匹配值的行。要了解更多细节和示例,请查看这个链接。对于我们目前的目的,我们使用行是因为我们不关心值的范围,而只关心每一行之前的两行月收入值,因此我们只能对一组三行进行平均。
此外,您可以在按排序的之前包含按变量<变量>划分的,以便为由<变量>指定的每个唯一类别执行这些计算。关于如何使用 partition 子句的例子,请查看我以前的文章!
SELECT t2.month,
AVG(t2.monthly_revenue) OVER (ORDER BY
t2.month ROWS BETWEEN 2 PRECEDING AND CURRENT ROW)
AS avg_revenueFROM (...) t2GROUP BY month
ORDER BY month ASC
最后,我们可以包含 GROUP BY 子句来指定我们希望基于月份执行聚合函数。但是,这里需要注意的是,您可以省略这个组,实际上仍然可以获得聚合值。
将所有这些放在一起,我们可以应用每个月及其前两行的月收入平均值来获得 3 个月的移动平均值。我们在最后通过应用命令,以确保我们按顺序得到报告的月份。
语法差异 CTE vs 子查询:真的有差异吗?
对于那些读过我之前的文章的人来说,你可能已经注意到在这个解决方案中,我使用了子查询,而不是公共表表达式(CTE)。
总的来说,使用 cte 的优势在于封装,这意味着我不必每次使用它时都声明子查询,我可以只定义一次并多次引用它。
然而,这是否意味着我使用 CTE 执行 SQL 查询会更有效呢?看起来似乎是这样,但实际上使用 CTE 并不一定意味着 CTE 只执行一次。事实上,如果多次引用该查询,就有可能多次执行该查询。实际上,查询优化器最终决定如何以最有效的方式解释 CTE。
结论
我希望这篇文章已经教会了您一些关于使用 SQL 查询的可能性的新知识。请继续关注第 3 部分,如果您喜欢这篇文章,请鼓掌!如果你对如何解决这个问题有什么想说的,请随意评论!
点击这里查看第 1 部分!
最令人惊讶的数据科学趋势
意见
…您可以在 Kaggle 上学习相关教程
目录
- 介绍
- 艺术和娱乐
- 实用程序脚本
- 地球和自然
- 摘要
- 参考
介绍
本文将概述最流行的数据科学趋势,这些趋势被指定为Kaggle【2】上的标签。从那些流行的标签中,我挑选了三个我认为最令人惊讶的。
了解数据科学的趋势在很多方面都有帮助。一种方法是有大量的文档。第二个好处是,你可以关注并完成他们的相关教程,以便为面试或当前工作实践数据科学。最后,了解一个不断发展的领域中的趋势是有益的,这样您就可以成为社区中最具竞争力、最新和参与度最高的数据科学家。也就是说,我不想只是讨论我们所期待的最流行的标签的教程,我想看看更令人惊讶的趋势。不足为奇的趋势的例子有 pandas、matplotlib 和 numpy ( 它们分别占据了第二、第三和第四的位置)。记住这一点,让我们来讨论 Kaggle 的这些趋势标签及其各自的教程,它们可以让作为数据科学家的你受益(以及你将学到的)。
艺术和娱乐
由 Felix Mooneeram 在Unsplash【3】上拍摄的照片。
首先,如果你不知道 Kaggle 是什么,它是一个数据科学社区,有数据集、竞赛、课程和教程。这是一个伟大的免费网站,面向从初学者到高级数据科学家的所有级别的数据科学家。
第一个令人惊讶的流行趋势是艺术和娱乐——具体来说,在本文发表时,这个标签有大约29,513
个实例,是所有这些趋势中最突出的。当点击标签时,你会看到比赛、数据集和教程。
最上面的教程,在这种情况下,被命名为' 袋字遇上袋爆米花'【4】。本教程涵盖了电影评论。本教程还将关注数据科学的 NLP ( 自然语言处理)方面。
你会学到什么?
- 情感分析
- 谷歌的 Word2Vec
- 深度学习
- 一袋单词
- 词向量
- 比较深度和非深度学习方法
您将学习如何清理数据和执行文本处理,以及从一堆单词中创建特征(使用 scikit 的-learn)。然后,您将使用随机森林算法。接下来,您将使用 word2vec 转向分布式单词向量,训练并保存您的模型,并理解其结果。在下一节中,您将了解单词的数字表示、向量平均和聚类。
总的来说,本教程将侧重于自然语言处理,以艺术和娱乐为标签,使学习变得更愉快,更容易理解。
实用程序脚本
照片由 Matteo Grassi 在Unsplash【5】上拍摄。
这个标签让我非常惊讶,因为它非常独特,但仍然很重要。更难找到一个有用的教程来包含这个标签。
与其说是一个教程,不如说是一个例子。这个代码示例主要涵盖了pytorch
,以及utils
。
以下是您将通过示例了解到的内容:
- 常用工具(参考本例)
- 推理工具(评估和预测
- torch.utils 库和模块
- gcs_utils
这组令人惊叹的代码并不是一个充实的笔记本或教程,也不像上面那样有单独的章节,但是知道如何将 utils ( 以及它在数据科学的代码库中的具体示例中是什么样子的)仍然是有趣和有益的。
地球和自然
杰里米·毕晓普在Unsplash【7】上拍摄的照片。
在下一个流行标签中,我们有一个名为 ' 国家数据科学碗'【8】的例子。它通过图像分析揭示了不同类型的浮游生物。本教程中包含了一些我从未听说过的非常独特的 Python 库和模块,如skimage
、watershed
、meaure
、morphology
和peak_local_max
。总的来说,本教程揭示了处理自然和图像的数据科学。
以下是您将在本教程中学到的内容:
- 导入数据和唯一库及其各自的模块
- 示例图像特征开发
- 图像准备(像素、区域、比率、属性)
- 准备训练数据(将像素值添加到分类器、固定长度特征向量,并重新缩放
- 宽长比等级分离
- 随机森林分类
总的来说,本教程展示了一个重要的用例,它在earth and nature
标签中非常令人惊讶。该描述包括对浮游生物的重要性、全球碳循环以及世界海洋和生态系统健康的介绍。在本教程中,你会学到很多东西,这将是一个独特而重要的话题。
摘要
数据科学的趋势会随着时间的推移而改变,但在目前,有一些是由 Kaggle 指定的。这些主题中的大多数都是众所周知的,比如 numpy。然而,有一些独特的趋势就像我们上面讨论的,包括艺术和娱乐,实用脚本,以及地球和自然。了解最新趋势以及研究独特的趋势非常重要,因为学习这些不仅有助于数据科学实践,还能让你成为一名数据科学家。此外,您可以从不同的角度学习数据科学,学习您以前可能没有想到的主题。
总而言之,以下是 Kaggle 上令人惊讶的数据科学趋势:
* Arts and Entertainment* Utility Script* Earth and Nature
我希望你觉得我的文章既有趣又有用。如果你认为这些趋势令人惊讶,请在下面随意评论。为什么或为什么不?你知道你可以在 Kaggle 上搜索最受欢迎的标签吗?你听说过 Kaggle 吗?你认为还有哪些标签或趋势会更受欢迎?这些教程对你有用吗?感谢您的阅读!
请随时查看我的个人资料、 Matt Przybyla 和其他文章,也可以在 LinkedIn 上联系我。
我与这些公司都没有关系。
参考
[1]照片由爱德华·豪威尔在Unsplash(2020)上拍摄
[2] Kaggle, Kaggle 顶级标签搜索,(2021)
[3]Felix Mooneeram 在 Unsplash 上拍摄的照片,(2017)
[4]安德鲁·马斯、雷蒙德·戴利、彼得·范、黄丹、安德鲁·吴和克里斯托弗·波茨。(2011)."学习用于情感分析的词向量."计算语言学协会第 49 届年会(ACL 2011) 。(链接),该教程是由安吉拉·查普曼在 Kaggle 上开发的,文字袋遇上爆米花袋,(2021 年访问)
[5]照片由 Matteo Grassi 在Unsplash(2018)上拍摄
[6][he . ai]ka ggle 上的 soul machine,jigsaw-utils-ka ggle,(2021 年访问)
[7]杰里米·毕晓普在 Unsplash 上拍摄的照片,(2016)
[8] Aaron Sander,数据科学家,Booz Allen Hamilton on Kaggle —以及来自哈特菲尔德海洋科学中心 、 国家数据科学碗(2021 年访问)的数据
通过数据科学领域的导师学习领导力的三大经验
了解积极倾听和有针对性的问题如何帮助你的学员
在 Unsplash 上由 Mohammad Metri 拍摄的照片
我最近参加了一个演讲会的会议,并发表了一篇关于通过指导培养领导力的演讲,以及我在之前的工作中无意中得到的指导。在更早的角色中,我无意中成为了我一个同事的导师,姑且称她为简吧。她和我经常就职业目标、期望、建议和项目工作进行交谈。在接下来的一年里,我开始发展我作为导师的技能,并从这次经历中学到了三个重要的教训,我想与你们分享。
发展你的倾听技巧
当我刚开始和简一起工作时,我注意到她对自己的技能和能力缺乏信心。我从我们的谈话中后退一步,听听她在说什么,从而发现了这一点。我经常发现自己静静地倾听,吸收来自他人的信息,而不是把讨论的焦点放在自己身上。在我的导师生涯中,我发现沉默是一个强有力的工具,因为其他人更愿意敞开心扉,分享他们的想法。Lennox Morrison 有一篇很棒的文章讨论了对话中沉默的微妙力量。
当我听 Jane 说话时,我听到了一些常见的说法,说她如何将自己与团队中其他人的工作进行比较,觉得她没有提供足够的商业价值,并且落后了。在我们早期的谈话中,我同情她,因为我有时也有同样的想法。冒名顶替综合症可能会影响我们科技行业和数据科学领域的许多人。
通过我们的对话,我了解到从对话中抽身出来,倾听团队中个人的担忧是多么重要。我能够更好地理解他们的感受,并决定我们如何解决问题。
问有针对性的问题
随着师徒关系的继续,我越来越善于倾听我的团队和 Jane 的意见,我发现当我直言不讳时,提出有针对性的问题有助于引导对话。我对有针对性的问题的定义是一个措辞谨慎的问题,你可以在谈话的关键点或过渡点提出这个问题,这需要对方进行一些思考。有时候,在一对一或团队会议中,你不能当场回答这些问题,但你与之交谈的人可以收回这些问题。这个问题让他们从现在到下一次会议之间有所思考。
根据与学员或队友 1:1 谈话的主题,你提出的问题会有所不同。尽管存在差异,但在提问时,你可以坚持使用 5 W 和 H。谁,什么,哪里,何时,如何,为什么。简和我在会议中关注的一点是为你的工作提供商业价值。在这样的对话中,我可能会用 5 W 和 H 来问一些问题:
在提供商业价值时,你分析的目标受众是谁?你是否期望错误的一群人欣赏你的努力?你的演讲是为合适的观众量身定做的吗?
你觉得哪些 会帮助你为团队提供更高的商业价值?你能为此采取什么行动吗?如果有行动,考虑定义一些聪明的目标来帮助你实现它。
哪里 你看到 3 个月/ 6 个月/ 1 年后的自己?你是想继续做你现在正在做的事情,还是应该把你的注意力转移到与你的目标一致的项目上?在这种情况下,我们谈到了流程的后端自动化,而不是更面向客户的分析和分析。了解你目前所处的位置和你想要达到的位置可以帮助你调整你的目标,以适应你想要增加的商业价值。
你认为这种变化会在什么时候发生?如果你想对你已经采取的任何行动采取行动,确定这样做的最佳时间表。
你如何定义团队内部和自己的商业价值?为你的团队提供价值对不同的人有不同的意义。就我自己而言,我关注团队之间更好的沟通、对路线图的清晰理解,以及关键数据科学流程的自动化/简化。但对其他人来说,他们提供的价值可能有所不同。我的一些队友专注于向客户提供正确的分析,在出现问题时提供最佳客户支持意味着什么,以及如何改进前端面向客户的工具。您需要为自己定义商业价值,并理解它如何符合您团队的目标。
为什么 你觉得自己的工作没有提供足够的商业价值?你这样想是因为你的工作是后端而不是面向客户的吗?有些项目可能不是正面的,对每个团队成员来说都是必不可少的,但这并不意味着这项工作没有价值。正如我之前所说,冒名顶替综合症影响了我们很多人。我经常有这样的感觉,我的工作没有提供价值,不够好,或者有人做得比我好。在与简交谈时,我意识到她也有同感。她看不到自己的工作对他人有什么帮助。在我们的谈话中,我经常问她为什么会有这种感觉。在我们的导师项目结束时,她开始看到她为团队提供的价值,在更多人面前展示她的工作,并对自己所做的事情感觉更好。
通过认真倾听和有针对性的提问,我对简和她对未来的愿景有了更多的了解。通过我们的多次交谈,我见证了她作为一名数据科学工程师的成长,并培养了她的技能和对工作的信心。她开始承担更重要的项目,并看到了她给团队带来的价值。
反思和回顾
在每次谈话和指导结束时,你不能就这样走开。如果你花时间反思和回顾哪些事情做得好,哪些事情做得不好,以及哪些地方可以改进,这将会有所帮助。当与不同的团队或个人一起工作时,我喜欢采取的最佳行动是定期征求反馈。当我寻求这种反馈时,我希望了解他们对参与度的看法,以及如何进一步改进。与我在指导期间的针对性问题类似,我会问他们一些与他们的经历相关的问题。如果和你一起工作的人不想给出反馈,那也没关系。你仍然应该花时间反思你的经历,记下你对自己和与他人合作的了解。
最后的想法
领导力通常可以被视为工作中的职位变化,例如成为团队领导或过渡到更高的管理级别。但是领导力不仅仅是头衔的问题。正如本·戴维斯所说,领导力是“激励一群人朝着共同目标行动的艺术。”作为一名导师和团队领导,我学到了三条重要的经验:
- 发展你的倾听技巧,让寂静充满房间。如果你给一个人表达自己的空间,你可以从他身上学到很多东西。
- 学会根据对方所说的问有针对性的问题。了解他们来自哪里,问他们一些能让他们思考的问题。他们可能并不总是有答案,但现在这给了他们在接下来的对话之前思考的东西。
- 讨论结束后,花点时间反思和回顾你所学到的东西。从这些谈话中,你总能学到一些东西,无论是关于你的学员、你的团队还是你自己。把这作为一个提高的机会。
在你自己的指导经历中,你最大的收获是什么?
申请数据科学实习的顶级技巧
审查 100 多份实习生申请的经验教训
安妮·斯普拉特在 Unsplash 上的照片
范围
从 100 多份数据科学实习生申请中总结经验教训,其中大多数候选人都没有被选中参加面试。这篇文章的重点是什么和如何沟通,而不是获得什么技术技能。
内容
- 介绍
- 阅读实习生广告的重要性
- 附信
- 简历/履历
- 人的能力发展
- 摘要
数据科学指南作者阿什拉夫·米亚 |图片作者
介绍
本指南包含关于申请流程的建议,即提交申请、求职信和/或简历 (CV)/ 简历用于数据科学实习。它是基于 100 多份申请,从超过 92%的没有得到面试机会的申请人和 97%的没有得到职位的申请人身上吸取了经验教训。
虽然有一些关于如何申请科技公司或初创公司的数据科学实习的文章,但它们并没有解决一些更“传统”业务的具体问题,因为数据科学职位向人力资源【人力资源】财务甚至制造公司的专门部门开放。
鉴于数据科学的准入门槛较低,大多数申请人很难评估他们的能力及其适合性,因为他们未能有效沟通或未能展示他们对自我发展的承诺。
我们还需要考虑到文化和国家的差异。例如,在英国,我们传统上没有简历,而是有 CVs ( 简历),这在拉丁语中是“人生历程”的意思;这些差异在本网站中进行了说明:
对于自荐信的长度(1 页、2 页或更多页)以及需求和目的也有不同的期望。
这些建议是基于提交简历和写求职信的,这与典型的申请表格中要求的内容相同,因此适用于大多数情况。
读,读,读!
…职位安排/实习细节!大量的努力都花在了撰写植入广告上,包括技术技能类型、个人技能和任何预期的经验。申请流程通常是一份电子表格、一份简历或一份附函和简历的组合。大多数招聘人员会很乐意回答任何问题,而不是猜测是否有页数限制,所以不要害怕直接问他们。
附信
什么是求职信?
一封求职信的主要目的是陈述为什么你适合这个角色,应该用来让招聘人员容易理解你申请的关键要素,以及你如何满足招聘广告中规定的要求。它还应包括以下细节:
- 您的姓名和联系方式(地址、电话和电子邮件)
- 通信日期
- 你申请的职位
- 个性化内容(见下文)
包括这些细节的主要原因是接收申请(如人力资源)和管理行政的人不太可能是评估申请的人。因此,我们需要使应用程序在组织中运行时尽可能地不受人为错误的影响。
你的联系方式是必需的,因为一旦你的简历被放到公司的共享硬盘上,你就很容易把信放错位置,自然你希望招聘人员联系你。同样,雇主可能有多个职位需要填补,这样可以帮助他们对你的申请进行分类。
信函结构和格式
虽然信的内容很重要,但这种格式是一种简单的方法,可以展示你在简历中提到的那些先进的“办公室技能”,从而给未来的雇主留下深刻印象😏)并有助于展示你的专业沟通技巧。请记住,对于大多数公司来说,数据科学家被期望与业务的其余部分进行有效的沟通,他们不太可能说 Slack (或者你选择的基于聊天的沟通)。事实上,那些未能恰当地格式化文档,却自称是高级“办公软件”用户的人,很可能会遭受信誉打击。
格式化一封信要传达很多信息,然而,80-90%的申请人没能通过让未来的雇主更容易,因为格式不合适,所以这是你的申请脱颖而出的一个简单方法。
以下示例针对英国,但显示了主要元素:
求职信的结构和格式由 Ashraf Miah |图片由作者提供
上图展示了构成求职信的 11 个关键要素:
- 左手边应该以招聘人员的名字(如果知道的话)和该组织的完整地址开始。
- 右侧应包含您的全名、地址和首选联系方式(如电话和/或电子邮件地址);后者,如果你通过电子邮件发送你的申请。注意文本是左对齐的——这可以在任何使用带有不可见边框的表格的文字处理软件中实现(或 python-docx 😃).
- 信的日期应该在两个地址(你的或公司的)之下一行。这三项在很大程度上是国家特有的,所以值得找出你申请的地方的标准。
- 开头的称呼或问候应该基于你是否知道招聘者的名字。“亲爱的先生/女士”有点老套但被接受,但根据行业不同有时“亲爱的招聘团队”也是被接受的。请注意,第 9 项取决于您在此处陈述的内容。
- 主题行应该是粗体和/或下划线的组合,其功能与电子邮件的主题行相同。在这种情况下,它应该清楚地说明你申请的是一个数据科学实习生职位。
- 开头一行是简单的一句话,简洁地抓住了信的意图。对于大多数申请大学的实习生来说,类似于“我目前正在罗瑟勒姆大学攻读四年制机械工程硕士学位”。
- 正文的内容将在下一节讨论。
- 结束语是强调信函目的的一句话,在这种情况下,这是你希望招聘人员考虑的实习申请。
- 在信的结尾,如果信不是写给某个特定的名字,通常用“你忠实的”,如果是写给某个特定的名字,则用“你真诚的”。同样,这是特定于国家和行业的。
- 对于电子邮件提交或电子申请,不需要添加扫描签名,但有些人会这样做。
- 由于附信伴随着简历或履历表,通常的做法是通过放置“Enc”来提醒读者有相当于附件或的附信在页脚。
这些项目适用于大多数角色,而不仅仅是那些在数据科学的角色。对于每一个项目,它不仅是一个交流内容(这一点很重要)的机会,也是一个展示办公软件技能的机会,一个了解专业环境中所期望的能力的机会,同时也传达了一定程度的尊重,即你遵守了既定的协议。
求职信内容
如果实习或安置广告是考题,那么求职信就是你的答案。这是一个挑战,如何做到简洁,同时传达出你的申请中最积极的方面。内容(比如简历)应该根据每个未来雇主和角色进行调整。当然,对于大多数英国申请来说,一页纸(A4 或美国信纸大小)就足够了。如果你选择写得更多,那么你需要确保增加的长度对你的应用程序有不成比例的影响。我当然会建议坚持使用一页纸。
简历和附信应被同时考虑,以尽量减少重复内容。简历将规定某些事实,但受到结构的限制,其中一些事实必须在求职信中重复,但总的来说,有更多的自由来说明你的情况。
对于您需要提供的内容,没有通用答案;你必须看看广告,并尝试解决具体问题。概括地说,它应该传达三件事:
- 你对这个角色的热情
- 你的经验、技能和其他适合该职位的衡量标准
- 你以人为本的关键技能
当然,你应该突出你申请中的积极因素(“推销自己”),但这并不意味着捏造事实或不诚实。对于招聘人员来说,最糟糕的事情莫过于邀请一个人去面试,却发现申请的很多内容都被夸大了。例如,假设你在团队中工作得不好,然后指出你有上进心,可以独自有效地工作——这突出了你申请的积极方面。
通过git
库(例如 Github )或类似 Kaggle 的东西引用在线数据科学简介的趋势也在增长。这既有积极的影响,也有消极的影响。如果您选择共享您的个人资料,请确保有一些最近的内容。我去过很多 GitHub 的简介,要么没有数据科学的内容,要么不容易理解,要么已经超过六个月没有更新了。这些会对您的应用程序产生负面影响。
同样,一个维护良好、易于遵循的存储库或配置文件,加上代码和良好的注释,可以对您的应用程序产生非常好的影响。与求职信、在线简介和简历的心态是一样的:你必须充分利用你申请的每一厘米/像素/英寸!
基础知识
很难低估在提交之前没有经过拼写检查、校对或其他检查的申请数量。如果有人说他们擅长注意细节,然后犯了简单的拼写或语法错误,这可能会有很大的破坏性。
这同样适用于“狂野”字体选择或非常小的字体大小;大多数教育机构通常会为报告或论文写作设定一个基本标准,这个标准在这里同样适用,或者使用谷歌进行明智的选择。
求职信反馈
在这篇文章的开头,我总结了从大量申请人身上学到的经验教训,这些人在申请过程中没有获得面试机会(> 92%)。总的来说,这些申请人无法交流为什么他们的候选资格值得邀请他们参加面试。
很少有信件的格式恰当,因此易于阅读。绝大多数人将简历中的内容复制到求职信中,而没有将其放入该职位的背景中。或者换句话说,这封信不是专门针对这种应用的。一些候选人充满了令人不快的奉承(“你是世界上最好的公司”),一些人努力突出他们申请中的任何积极因素,一些人不幸误解了公司的工作。
成功的候选人(总体而言)遵循了上述提示。
简历/履历
安妮·斯普拉特在 Unsplash 上拍摄的照片
什么是简历?
术语简历,在拉丁语中的意思是“生命的历程”,根据地理位置的不同有不同的含义。在美国,它有一个与简历不同的特殊结构。在英国,除了学术角色和申请之外,简历和简历的目的和内容非常相似。所以如果你在网上看这些差异,请记住这一点。
出于我们的目的,简历包含个人的一些事实,如姓名、联系方式、简要教育背景、工作经历、兴趣、爱好和推荐人(尽管现在经常根据要求提供)。虽然结构是固定的,但是内容的级别可以并且应该根据应用程序而变化。
以下建议是基于许多不成功的实习申请,并被总结为一系列该做和不该做的事情。
提供完整的时间表
许多候选人在简历中省略了某些时间段,要么是因为他们在做他们认为不相关的工作,要么是为了掩盖全职工作。后者是由于一些申请实习的候选人已经完成了学业。
你可能会认为空白让你看起来很神秘,但招聘人员可以很容易地想象你在监狱里!更好的方法是提供完整的时间表,但根据角色调整内容。
通过 Ashraf Miah 缩放给定应用的 CV 内容|图片由作者提供
上图显示提供了一个完整的时间表,但是针对正在制作的角色或应用程序对内容进行了调整或缩放。应该可以从每个角色中突出或提取一些东西,例如关于健康和安全或处理财务或与不同客户交谈的经验。不一定都是关于 Python 或者 R 的。
避免技能评级
避免自我评价|作者图片
技能丸是展示编程知识的一种流行趋势,但是初级 / 中级 / 高级之类的自我评分并不能增加多少价值。我有超过 10 年的统计绘图经验,并且有将近一半的时间是使用seaborn
的,我不认为自己是这个库的一个“高级”用户。这样的评级对不同的人有不同的意义。不如把空间省下来,更有效地用在别的地方。
避免不完整的课程
另一个趋势是宣传哪些额外的课程目前正在进行通常在 Python 、 R、数据科学和/或机器学习。虽然一方面很高兴看到这种主动性,但另一方面也有一种趋势,即课程没有完成,或者引用他们从课程中学到的东西或他们如何应用这些东西。这通常会在面试中暴露出来;请记住,你在简历中陈述的一切都可以构成一个问题的基础,因此需要得到证实,否则,它将影响你的可信度。
提供实际学习的证据
迈克尔·里维拉·🇵🇭在 Unsplash 上拍摄的照片
完成一门关于机器学习的课程和理解机器学习是不一样的,所有课程都是如此。可悲的是,许多大学生仍然没有意识到这个事实。
更好的测试是当候选人将他们的知识应用到最初课程没有涉及的领域。这可能是使用来自 Kaggle 的替代数据集,如 口袋妖怪数据集 或在他们感兴趣的领域应用相同的技术。这显示了主动性、兴趣和热情。
如果你能举出的所有例子都是大学或教育机构课程的一部分,那么你不太可能与其他候选人竞争。
展示计算技能
图片来自 Pixabay 的 planet_fox
许多候选人对他们的数据科学技能没有激发太多的信心,因为很明显他们缺乏基本的计算机知识。这可以通过了解一些相关技术来解决,例如基本网络、web 技术等等。这可以简单到使用一个虚拟机或者安装一个技术栈。相比之下,拥有和管理物联网(物联网)类型设备,如 Raspberry Pis 的候选人表现出很高的可信度,因为他们知道收集、存储和传输数据需要什么。
许多候选人不确定他们能否在自己的笔记本电脑上安装数据科学环境🙈。这并没有激发他们对整体技能的信心。
只分享在线档案,如果它增加了价值
Pankaj Patel 在 Unsplash 上拍摄的照片
共享 GitHub 个人资料是很常见的做法,我的意思是公共库几乎是一种身份的象征。许多是作为大学课程的一部分创建的,因此在 CVs 上共享。如前所述,如果你选择分享在线个人资料,那么它必须通过突出你的技能,展示良好的实践和/或课外活动来增加价值。
如果概要文件是空的、过时的、损坏的、混乱的或者展示了坏习惯,那么它将损害你的应用程序。
个人生产力
许多简历列出了爱好和兴趣,但没有规定候选人如何保持个人生产力或照顾他们的心理健康。专业人士的一个标志或特征是,他们通过定期休息来管理时间,以保持个人生产力和/或通过锻炼(如散步、跑步或体育运动)来保持健康和精神健康。骄傲地宣称自己有能力连续坐在电脑前 10 个小时,表明自己不够成熟。
由于疫情仍然影响着世界各地的许多公司,大多数简历都没有提到候选人如何应对远程学习。在讨论大学课程或以前的就业时,这些方面很容易交织在一起。
CV 反馈
关注了从未被邀请参加面试的候选人身上学到的经验教训后,积极的方面是什么?
绝大多数人拥有上面列出的大部分(但不是全部)要点。最佳应用展示了自我发展和将他们的知识应用于个人项目的例子。这些很容易阅读,理解和联系。
人的能力发展
其他学科如航空或机械工程需要获得专业知识和设施,这些只能在专业公司或大学获得。这些领域的“进入壁垒”很高,即花费大量资金在国内复制是不可能的。
数据科学另一方面可以接近免费或者至少低成本。例如,对于空气动力学来说,人们需要查阅专业教科书,但是对于最新的发现,付费订阅科学期刊服务每年可能要花费 2000-4000 英镑。相比之下,许多关于数据操作和机器学习的关键教科书都是免费的 Jupyter 笔记本。网上有很多关于 Python 和 R 语言的资源。关于机器学习的大部分(如果不是全部)关键论文也可以通过 arxiv 免费下载。
与其他领域不同,用于数据科学的大多数工具都是免费的,而且大部分都是开源的。鉴于入学门槛较低,人们的期望是,候选人将花一些自己的时间,用自己的学习来补充大学课程。这种自我发展和学以致用的愿望可能是数据科学实习生追求的最重要的品质。
摘要
从超过 100 份数据科学领域的实习生申请中获得的经验已经被提炼为他们的核心元素。虽然不是每个人都会结合使用求职信和 CV/简历,但是关键的原则已经被强调出来,即使一个人如何格式化一封信也可能传达关于候选人的有用信息。
如果你有任何进一步的建议,甚至对比经验,那么请在评论中分享。
属性
所有gists
、笔记本、终端演员表均为作者所有。所有的艺术作品都明确基于 CC0、公共领域许可或 SIL OFL 的资产,因此不侵权。主题灵感来自并基于我最喜欢的vim
主题:grubbox。
数据面试准备的热门 YouTube 渠道
由 envato elements 的 alexacrib 使用图像创建(经许可)。
学习资源
获得数据科学家、数据分析师或数据工程师的工作
无论是作为数据科学家、数据分析师还是数据工程师,你都在为数据面试做准备吗?YouTube 是一个很好的起点,因为它有大量免费的教育内容可以帮助你踏上数据之旅。伴随着巨大的丰富,也带来了从成百上千的渠道中选择渠道的巨大负担。我已经探索了整个 YouTube 空间,并整理了一个顶级 YouTube 频道列表,我认为这些频道是你在准备成为数据专业人员时可以考虑的很好的起点。
尽管本文中提到的大多数 YouTube 内容创作者都是我的朋友,但他们在 YouTube 领域非常出名,因为他们通过提供职业建议和数据面试准备方面的信息内容为观众带来了价值,这是本文的重点。
肯·吉
Ken Jee 目前是 Scouts Consulting Group 的数据科学主管,他将数据科学应用于体育分析。他还是惠普和英伟达的数据科学大使。他拥有从初创公司到财富 100 强企业的数据科学工作经验。Ken 在他的 YouTube 频道上分享了他的经验,以帮助其他人进入数据科学和体育分析领域。值得注意的是,Ken 启动了 66 天数据计划,该计划有助于养成学习数据科学的习惯,同时也促进了一致性和问责制的发展。
YouTube 频道
- 主频道(肯吉):https://www.youtube.com/channel/UCiT9RITQ9PW6BhXK0y2jaeg
- 第二频道(肯最近的邻居):
https://www.youtube.com/channel/UCpEJMMRoTIHJ8vG8q_EwqCg
播放列表
克里斯·纳伊克
Krish 是首席数据科学家,也是 iNeuron 的联合创始人。他在机器学习、深度学习和数据科学的各个方面都有丰富的知识,是一位多产的教育家,在 YouTube 上创建了 1000 多个教育视频。除了下面提到的与数据面试准备相关的播放列表之外,Krish 还创建了一个其他视频播放列表的大集合,这些视频教授与数据科学和数据工程相关的各种尖端工具和软件。
YouTube 频道
播放列表
代码基础
codebasics YouTube 频道是由曾在英伟达和彭博工作过的软件工程师达瓦尔·帕特尔创办的。Dhaval 非常热衷于教学,这可以从他广泛收集的各种主题的教程中看出,如编程、数据科学、数据分析人工智能、机器学习等。
YouTube 频道
播放列表
黄婷婷
Tina 目前在一家 FANG 公司工作,担任数据科学家。她的本科培训是药理学,她向数据科学的过渡始于她在宾夕法尼亚大学获得的计算机和信息技术硕士学位。在她的 YouTube 频道上,她提供 SQL 教程视频、职业建议以及关于如何进入数据科学以及如何编码的实用建议。她还有一个现场的“跟我学”环节,在课间休息时,她会学习并主持一个问答环节。
YouTube 频道
播放列表
分析师亚历克斯
亚历克斯·弗雷伯格是一名数据分析师,他在 YouTube 频道上分享了他的经验,以帮助新人获得成为数据分析师的知识和技能。他提供从初学者到中级和高级的所有难度级别的 SQL 教程。他还分享了准备简历的技巧,通过回答一些面试问题来帮助你准备面试,并主持问答环节来回答任何与进入数据分析领域有关的问题。
YouTube 频道
播放列表
- 数据分析师面试问题
- 数据分析师简历
- 数据分析师 Q & A
- 分析师 Alex 展示 — Alex 对数据分析各种主题的观点和提示
数据科学杰伊
Jay Feng 在硅谷做了 5 年的数据科学家,然后开始了 Interview Query,帮助有抱负的数据科学家准备面试。他的频道谈论全栈数据科学、数据科学面试技巧以及如何获得梦想中的数据科学工作。他也是一位多产的媒体和采访查询博主(他写的一篇有趣的报告是2021 年数据科学采访报告)。
YouTube 频道
播放列表
斯特拉斯克拉特的内特
Nate 在数据科学领域有 10 年的经验,他的频道面向有抱负的数据专业人士。在他的 YouTube 频道上,他涵盖了与招聘、面试准备、职业建议和技巧以及提升你的技术技能相关的话题。Nate 是 StrataScratch 平台的创始人,该平台有 500 多个来自真实公司的数据科学问题,用于编写面试准备或提升你的技术技能。
YouTube 频道
播放列表
如何获得一份分析工作
John David 是 YouTube 频道How to Get a Analytics Job的主持人,他提供 Tableau 和 Power BI 教程,并分享他的经验、面试技巧和讲座,以帮助指导你成为数据分析师。
YouTube 频道
播放列表
- 分析讲座(面试技巧)
- 分析职业战术周四
- 如何获得分析工作播客
数据面试专家
Emma Ding 是 Airbnb 的数据科学家/数据工程师。在业余时间,她在 YouTube 上制作教育视频,并在 Medium 上写博客,帮助有抱负的数据专业人士获得他们梦想中的数据科学/数据工程工作。Emma 提供了大量的教育视频,涵盖了可以帮助破解数据科学采访的重要主题,这也是她 YouTube 频道上的播放列表。她很擅长将困难的话题分解成容易理解的部分。
YouTube 频道
播放列表
西雅图数据公司的人
Benjamin 是一家 FANG 公司的数据工程师,因其 YouTube 频道和媒体博客“西雅图数据人”而闻名。在他的 YouTube 频道上,他收集了大量视频,分享了成为数据工程师的教育视频以及面试技巧和诀窍。他还策划了一个关于数据科学和数据工程面试技巧的视频播放列表。
YouTube 频道
播放列表
霍马理工大学
张克帆·马(又名霍马理工大学)是一名杰出的优步用户,他曾是一名数据科学家,后来转型为软件工程师。霍马有讲故事的天赋,从他的视频中可以看出,他既能以娱乐的方式提供教育内容。他的 8 个视频播放列表(下面提供了链接)包括关于什么是数据科学的介绍性视频、数据科学面试问题的类型、获得数据科学工作的提示、生活中的一天是什么样子,以及关于数据科学和数据工程的比较视频。
YouTube 频道
播放列表
数据教授
好吧,一个不要脸的塞我自己的内容。我白天是生物信息学副教授,晚上是 YouTube 内容创建者和媒体博客作者,在那里我创建关于数据科学和生物信息学教程的教育内容。除此之外,我还回顾了数据工具和资源以及数据专业人士的播客,了解他们进入数据科学以及为数据科学职业生涯做准备的提示和技巧。近期内容包括如何使用 GitHub 页面免费创建数据科学作品集网站。
YouTube 频道
播放列表
结论
我希望这些精选的 YouTube 频道列表对你的数据面试准备有所帮助。有抱负的数据专业人士可以从浏览霍马理工大学关于面试问题类型的介绍视频开始。接下来,通过浏览涵盖数据科学面试主题的视频播放列表,继续学习基础知识(查看来自 StrataScratch 的 Data Interview Pro、Data Science Jay 和 Nate 的播放列表)。然后,还建议进行一些模拟面试(如数据科学杰伊和克里斯·纳伊克),以掌握实际面试中的情况。祝您的数据之旅好运!
✉️ 订阅我的邮件列表,获取我在数据科学方面的最佳更新(偶尔还有免费赠品)!
关于我
我是泰国一所研究型大学的生物信息学副教授和数据挖掘和生物医学信息学负责人。在我下班后的时间里,我是一名 YouTuber(又名数据教授)制作关于数据科学的在线视频。在我做的所有教程视频里,我也分享 GitHub 上的 Jupyter 笔记本(数据教授 GitHub page )。
https://www.youtube.com/dataprofessor
在社交网络上与我联系
YouTube:【http://YouTube . com/data proper/
网站:【http://data proper . org/【正在建设】
LinkedIn:【https://www . LinkedIn . com/company/data proper/
基于主题模型的推荐系统
约书亚·阿拉贡在 Unsplash 上拍摄的照片
对基于主题模型的推荐系统中涉及的直觉(和非常低级的数学)的一个非常快速和(希望)容易跟随的介绍。
看看我的 GitHub 基于主题建模的简单推荐系统。
在当今世界,有时我们会被永无止境的决策所困扰。无论是周五晚上的电影还是让人们在 NYE 派对上继续跳舞的下一首歌。
那么推荐系统实际上是如何工作的呢?在这篇文章中,我将解释一种使用潜在狄利克雷分配(LDA)的基于主题建模的方法。
主题建模
在我们讨论如何为主题建模之前,我们需要首先了解主题实际上是什么。
这不是一个直观的想法,所以我们将根据单词集合来描述它。
如果我们有一个从数据库中随机选择的文档集合,我们可以想象这些文档中包含的一些单词可能在语义上相似,或者与相同的区域相关。
例如,如果这些文档是电影评论的集合。我们可以想象,我们也许能够根据评论中包含的单词来形成正面和负面的评论组。或者,我们可能希望形成与科幻、喜剧、爱情等相关的文档集合。
因此,当我们开始将这个文档集合重新组织成许多更小的集合时。与此同时,我们开始看到有许多层的可能性。其中每种可能性都是一个主题选择。
你可能会问这样一个问题,我们如何让计算机把这些文件组织成主题,我们如何知道它会选择什么主题?为了回答这个问题,我们要在稍微深一点的层次上思考…
不太普遍的想法
在这篇文章中,我将描述如何让计算机执行主题建模的一个选项。然而,在野外还有许多其他的算法、方法和方法论。
回到我们的文档集,坚持查看其中包含的单词的方法,我们可以建立一个包含数据库中所有独特单词的词汇表。
假设我们在 4 个文档中有 1000 个不同的唯一单词,我们希望根据每个文档中包含的单词来描述每个文档的特征(以及每个单词的数量)。
尼斯·姆舒蒂在 Unsplash 上的照片
所以现在我们可以想象,对于每个文档,我们有一个维数为 1000 的向量(每个唯一的单词有一个维数)。并且在每个向量中的每个位置,存在该位置对应的单词在文档中出现的次数的计数。
比如向量中的第一个位置对应的是词汇表中的第一个单词,我们会说是“机器人”。第一个文档是一个关于《终结者 23》的影评(或者我们现在的数字……),所以“机器人”这个词被提到了 19 次。因此,在对应于第一个文档的向量的第一个位置,我们有(19,…)。
显示文档和词汇之间联系的图表。
第二个位置对应于单词“Sport ”,在终结者评论中被零次提及,给出了(19,0,…)等等…
第二个文档恰好是一部网球纪录片的评论,因此对于这个文档,我们有向量(0,10,…),因为“机器人”被提到了 0 次。
话题太多?
是的,太多了。我同意,你的电脑也会同意。
显示传说中的“中间地带”的图表。
目前,我们已经为词汇表中的每个单词定义了一个“主题”。这显然是不理想的,也不会给我们提供许多明确分开的主题,供我们以后讨论。
下一步是找到一个中间地带,我们的每个评论都属于一个更广泛的主题,这个主题是由词汇表中的一些单词定义的。
潜在狄利克雷分配
我们现在希望通过在词汇表中的单个单词之间引入一个隐藏的主题层来减少来自每个文档的连接数量。
这正是我们要使用潜在狄利克雷分配(LDA)的目的。
LDA 要求我们定义所需数量的主题。这就是我们所说的超参数(在算法运行之前定义的参数)。
在现实世界中,我们可以想象扫描许多主题来寻找最佳结果(恰当地称为超参数扫描)。
假设我们正在寻找 10 个主题。这意味着我们希望在之前的连接之间添加一个包含 10 个节点的隐藏层。将文档和单词联系起来,记住我们的大向量(19,0,…)和(0,10,…)。
从数学上和计算上来说,这是我们非常希望的,因为我们可以用大小为 10 的新向量(或者您选择的任何主题)来替换这些描述每个文档的巨大向量。
为了描述 LDA 试图达到的目标,最简单的方法是看下面的矩阵公式…
LDA 试图实现的目标的矩阵公式。
所以在我们最初对文档的完美描述中,我们有矩阵 s。这个矩阵是我们能拥有的所有文档中最完整的图片。没有信息丢失,因为每个单词都有自己的主题,如果我们忽略单词的顺序,我们可以完美地重建每个文档。
但是,有些信息太细了。比如“机器人”和“安卓”,我们其实并不需要单独的话题。这些可以组合成一个更粗糙的“科幻”或任何你想命名的话题。
在这种情况下,我们可以看到我们牺牲了一些信息。因此,如果我们要重新创建文档,不能保证我们会得到单词“Robot ”,因为我们只有来自同一主题的类似单词被提及的信息。
图表显示了 LDA 的最终目标,单词连接到主题,主题再连接到文档。
这就是矩阵 M 和 N 正在做的。潜在维度 K 是我们隐藏的话题层(即 10 个话题)。并且给定这个维度 K,LDA 正在学习矩阵 M 和 N,试图最好地重建矩阵 s
你不一定要懂这里的数学才能知道发生了什么,要点是:
- LDA 基于提供给它的文档创建粗粒度的主题。
- 由于 LDA 模型这样做,我们丢失了关于单个文档的特定信息。
如果你考虑如何将影评分成 10 个主题,这将有望开始变得有意义。想象一下,如果我让你总结一个你创造的话题。你不可能背出每个文档的每个单词,但是你可能能够给出几个描述整个主题的最常用的单词。因此,你丢失了信息。
我们为什么要丢失信息?
丢失信息听起来可能是一件坏事,但它实际上有助于机器学习模型在数据中找到他们否则会错过的模式。
诀窍是不要丢失有用的信息,在某些情况下,这些信息可以通过算法来学习,或者必须通过超参数来控制(对于具有主题数量的 LDA)。
让我们看一个例子…假设我们有一组嘈杂的数据点,粗略地描述了一个二次函数(图 A)。
丢失信息是件好事的例子。基本上是在不同的背景下过度适应和欠适应。
在图 B 中,我们试图保留描述数据点的所有信息,但是这样做对吗?大概不是,我们的模型太具体,没有真正抓住大势。
在 C 区,我们失去了太多的信息。这个模型对数据来说太简单了。
在图 D 中,我们对数据进行了很好的描述。我们找到了一个好的超参数,能够丢掉不太有用的信息,保留重要的部分。
这听起来可能很熟悉,因为它正是在 NLP 和主题建模的上下文中对欠拟合和过拟合数据的描述。
返回主题…
显示 LDA 最终目标的图表。
希望这短暂的插曲是有用的。如果没有,很抱歉,但我们现在又回到正轨了!
因此,我们有 LDA 模型,它将所有这些文档分类到主题分布中。请注意,这些不是硬集群主题,它们是分发版。因此,如果我们的 10 个主题中有 3 个是科幻、纪录片和技术,我们可以对一部关于宇航员的纪录片进行电影评论,其分布为(0.2,0.4,0.3,…)。
在上图中,这对应于文档和主题之间的顶层连接。
这些分布实际上被称为嵌入。因为我们已经将有关文档的信息嵌入到可用的数学格式中。
以我们之前的嵌入为例,a = (0.2,0.4,0.3,…)。现在,如果我们有另外两个嵌入了 b = (0.1,0.5,0.2,…)和 c = (0.8,0,0.1,…)的文档。是 b 还是 c 更类似于嵌入 a?
有几种方法可以回答这个问题,但是我们将选择简单的(并且非常有效的)余弦相似度。你可能还记得学校或大学的数学课。这基本上计算了两个嵌入之间的距离,如果它们离得更近,它们就更相似。
在这种情况下,a 和 b 比 a 和 c 更相似,所以如果我们问计算机,在给定 a 的情况下,它会推荐 b 和 c 中的哪一个。
这就是我们如何使用主题建模来创建推荐。
围捕
我们已经看了什么是主题,然后看了 LDA 算法给了我们什么,最后我们如何使用这些数学对象来产生推荐。
基于相似性的主题建模中推荐的关键点是我们评估每个文档的编码信息有多相似。正如我们所讨论的,这些建议可能完全糟糕,这取决于我们的主题是如何被发现和分布的(来自前面粗略解释的情节 B 或情节 C)。或者他们可能很棒,并击中了最佳点(情节 D)。
需要注意的另一点是,虽然我们可以控制主题的数量,但我们对这些主题的内容控制较少。这是由数据决定的,我们可以通过删除不重要的词来处理这些数据。但是,如果我们的数据库中没有科幻电影评论的代表性样本,那么这个话题就可能不存在。
数据是一切的另一个原因…
这是一个真正的短期和低层次的见解,如何这些类型的算法可以用来提供建议。有很多更广泛的描述,所以我鼓励你去阅读。
如果你感兴趣,我的 GitHub 上有一个工作推荐系统代码。
参考
[1]d .布莱等人。艾尔。,潜在的狄利克雷分配(2003)
使用 pyLDAvis 的主题模型可视化
创建交互式主题模型可视化
来源:作者
主题建模是机器学习的一部分,其中自动模型分析文本数据,并从数据集或文档组合中创建词的聚类。它致力于找出文本中的主题,并找出与这些主题相关的单词之间的隐藏模式。
通过使用主题建模,我们可以创建相关文档的集群,例如,它可以在招聘行业中用于创建具有相似技能集的工作和求职者的集群。有几种方法可以从模型中获得主题,但在本文中,我们将讨论 LDA-潜在 Dirichlet 分配。
LDA 使用矩阵分解技术,它假设 a 是主题的混合,并回溯计算哪些主题创建了这些文档。重要的是,在这篇文章中,我们将创建可视化,我们可以分析由 LDA 创建的集群。
pyLDAvis 是一个开源 python 库,它帮助分析和创建由 LDA 创建的集群的高度交互式可视化。在本文中,我们将看到如何使用 LDA 和 pyLDAvis 来创建主题建模集群可视化。
让我们开始吧…
安装所需的库
本文将主要关注 pyLDAvis 的可视化,为了安装它,我们将使用 pip 安装,下面给出的命令将执行安装。
pip install pyldavis
导入所需的库
在本文中,我们将从使用来自 sklearn 的预定义数据集创建模型开始。为了完成所有这些步骤,我们需要导入所有需要的库。
from __future__ import print_function
import pyLDAvis
import pyLDAvis.sklearn
pyLDAvis.enable_notebook()from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.decomposition import LatentDirichletAllocation
因为这篇文章的主要焦点是创建可视化,你可以查看这个链接来更好地理解如何创建主题模型。
加载数据集
现在,我们将加载已经导入的数据集。新闻组是一个文本数据集,因此它将对本文和理解使用 LDA 的集群结构有所帮助。
newsgroups = fetch_20newsgroups(remove=('headers', 'footers', 'quotes'))
docs_raw = newsgroups.data
print(len(docs_raw))
在这里,我们将看到数据集包含 11314 行数据。接下来,我们将应用计数矢量器、TFID 等。,并创建我们将可视化的模型。
预处理数据
tf_vectorizer = CountVectorizer(strip_accents = 'unicode',
stop_words = 'english',
lowercase = True,
token_pattern = r'\b[a-zA-Z]{3,}\b',
max_df = 0.5,
min_df = 10)
dtm_tf = tf_vectorizer.fit_transform(docs_raw)tfidf_vectorizer = TfidfVectorizer(**tf_vectorizer.get_params())
dtm_tfidf = tfidf_vectorizer.fit_transform(docs_raw)
创建模型
在这一步中,我们将创建当前数据集的主题模型,以便我们可以使用 pyLDAvis 对其进行可视化。
# for TF DTM
lda_tf = LatentDirichletAllocation(n_components=20, random_state=0)
lda_tf.fit(dtm_tf)
# for TFIDF DTM
lda_tfidf = LatentDirichletAllocation(n_components=20, random_state=0)
lda_tfidf.fit(dtm_tfidf)
模型(来源:作者)
创建可视化
这是最后一步,我们将创建主题集群的可视化。pyLDAvis 最大的优点是易于使用,并且只用一行代码就可以创建可视化。
pyLDAvis.sklearn.prepare(lda_tf, dtm_tf, tf_vectorizer)
集群可视化(来源:作者
看看下面的视频,它展示了 pyLDAvis 是如何创造出具有交互性和视觉吸引力的可视化效果的。
来源:作者
类似地,你也可以为 TF-IDF 矢量器等创建可视化。试试这个,让我知道你的评论或者你在评论区遇到的任何困难。
这篇文章是与皮尤什·英加尔合作的。
在你走之前
感谢 的阅读!如果你想与我取得联系,请随时通过 hmix13@gmail.com 联系我或我的 LinkedIn 个人资料 。可以查看我的Github*简介针对不同的数据科学项目和包教程。还有,随意探索* 我的简介 ,阅读我写过的与数据科学相关的不同文章。
面向小型企业的主题建模分析
Pennslyvania doyles town alto Monte 的意大利市场(使用经业主批准的图片)。
介绍
机器学习正在小企业食品行业发展,并已显示出为提高企业生产率提供了成果。今天的分析源于我的调查的第一部分,包括对位于宾夕法尼亚州费城附近的阿尔托蒙特的意大利市场的在线评论。使用自然语言处理帮助这家规模虽小但呈指数级增长的食品行业企业更深入地了解了客户对 Altomonte 及其运营的看法。
自然语言处理
自然语言处理是机器学习的一个领域,旨在揭示文本数据中隐藏的意义和情感。如果你想了解更多,Dan Juurafsky 和 James H. Martin 有一本免费的教科书,它很好地深入研究了 NLP 的理论和过程。在这次分析中主要使用的技术是 主题模型分析 。主题建模分析是自然语言处理中的一种无监督的机器学习技术,可以揭示文本语料库的潜在意义。主题建模分析可以用于小型企业的评论,以帮助揭示客户对企业的集体看法和感受,从而使企业更好地塑造其声誉。
分析
分析过程中使用的各种软件包列表:
import pandas as pd
import numpy as np
import nltk
from nltk import FreqDist, PorterStemmer
from nltk.corpus import stopwords
stop_words = stopwords.words('english')
import re
import matplotlib.pyplot as plt
import seaborn as sns
from nltk.tokenize import word_tokenize,sent_tokenize
from wordcloud import WordCloud
from gensim import corpora
import gensim
import spacy
from gensim.models.coherencemodel import CoherenceModel
from gensim.models import LdaMulticore
from gensim import models
import pprint
import tqdm
资料组
使用的数据集是一个语料库,其中包含从 Yelp、猫途鹰和谷歌评论中收集的关于 Altomonte 意大利市场的评论。这些评论可以追溯到 10 年前。有些评论甚至可以追溯到更早以前;然而,我觉得 10 年后的任何评论都不太适用于 Altomonte,因为过去 10 年该公司的业务增长迅猛。这些评论被清理并分类到一个熊猫数据框中。数据框的列是“月”、“年”、“回顾”、“评级”和“平台”。
图:数据帧中前 5 个条目的示例。
数据集统计
在深入主题建模分析之前,提取了关于数据集的各种统计数据。
print("Average Rating for All Online Reviews :" ,df['Rating'].mean())
所有评论的平均评分为 4.23 分(满分 5 分)。
print("Number of each Rating for all of the reviews")
df['Rating'].value_counts()
按评级分列的审查细目如下:
图:按评级分列的评论数量
图:评级在全部语料库中所占的百分比
词频
提取单词的频率,看看是否可以从语料库中最频繁出现的单词中获得任何意义。
# function to plot most frequent terms
def frequent_words(x, terms = 20):
totalwords = ' '.join([text for text in x])
totalwords = totalwords.split()fdist = FreqDist(allwords)
words_df = pd.DataFrame({'word':list(fdist.keys()), 'count':list(fdist.values())})# selecting top 20 most frequent words
d = words_df.nlargest(columns="count", n = terms)
plt.figure(figsize=(20,5))
ax = sns.barplot(data=d, x= "word", y = "count")
ax.set(ylabel = 'Count')
plt.show()
首先,创建一个函数,找出 20 个最常用的单词,并将它们的频率绘制成条形图。然后,删除所有不需要的符号、数字和字符。
# remove unwanted characters, numbers and symbols
df['Review'] = df['Review'].str.replace("[^a-zA-Z#]", " ")
最后,从数据集中删除停用词,并对整个数据集进行小写规范化。
def remove_stopwords(onl_rev):
new_review = " ".join([i for i in onl_rev if i not in stop_words])
return new_review# remove short words (length < 3)
df['Review'] = df['Review'].apply(lambda x: ' '.join([w for w in x.split() if len(w)>2]))# remove stopwords from the text
Reviews = [remove_stopwords(r.split()) for r in df['Review']]# make entire text lowercase
Reviews = [r.lower() for r in Reviews]
词汇化
在评论被清理之后,数据集被词条化。 词汇化 就是把一个词分解到它的基础的过程。
nlp =spacy.load('en_core_web_sm',disable=['parser','ner'])
def lemmatization(texts, tags=['NOUN', 'ADJ']): # filter noun and adjective
output = []
for sent in texts:
doc = nlp(" ".join(sent))
output.append([token.lemma_ for token in doc if token.pos_ in tags])
return output
然后将该函数应用于数据集。
Lem_reviews = lemmatization(tokenized_Reviews)
print(Lem_reviews[1])
图:词汇化函数的输出
标记化
记号化是将语料库和句子分解成单独的“记号”的过程这里,我们想把句子分开,这样我们就可以单独检查语料库中的每个单词。
#Tokenization
tokenized_Reviews = pd.Series(Reviews).apply(lambda x: x.split())
print(tokenized_Reviews[1])
图:Altomonte 评论数据集的符号化输出示例
最终清洁
reviews_cleaned = []
for i in range(len(Lem_reviews)):
reviews_cleaned.append(' '.join(Lem_reviews[i]))df['Reviews'] = reviews_cleanedfrequent_words(df['Reviews'], 20)
对数据集进行最后一次清理,并绘制词频。
图:20 个最常见的单词
此外,一个单词云是由最常用的单词组成的
full_text = ' '.join(df['Review'])
cloud_no_stopword = WordCloud(background_color='white', stopwords=stop_words).generate(full_text)
plt.imshow(cloud_no_stopword, interpolation='bilinear')
plt.axis('off')
plt.show()
图:最常用的 20 个单词
词频表中出现频率最高的五个词是食物、意大利菜、好、棒极了、和三明治。从词频中,我们可以获得一些洞察力,并得出结论:顾客认为 Altomonte 的意大利市场是一个不错的,甚至是很棒的意大利市场,供应各种三明治(在费城,我们称之为三明治三明治!强烈推荐顺道买一个!).
虽然词频可以为客户在评论企业时使用的词提供很好的洞察力,但将词频与主题建模分析相结合可以帮助创建客户对企业的真实感受和观点的具体结论。
主题建模分析
对于主题建模分析,我使用了 Genism Python 包中的线性狄利克雷分配模型。LDA 模型试图揭示评论集的潜在主题,这些主题在顶级分析中可能不明显。
首先,创建一个词条化评论的字典。
overall_dictionary = corpora.Dictionary(Lem_reviews)#Converting reviews into a Document Term Matrix
overall_doctermtx = [overall_dictionary.doc2bow(review) for review in Lem_reviews]
决定你要代表多少个话题的语料库,取决于话题的连贯性评分。一个连贯性分数是主题的质量以及当它们被组合在一起时的相关程度。
def compute_c_values(dictionary, corpus, texts, limit, start=2, step=1):
"""
Compute c_v coherence for various number of topicsParameters:
----------
dictionary : Gensim dictionary
corpus : Gensim corpus
texts : List of input texts
limit : Max num of topicsReturns:
-------
model_list : List of LDA topic models
coherence_values : Coherence values corresponding to the LDA model with respective number of topics
"""
coherence_values = []
model_list = []
for num_topics in range(start, limit, step):
model=LDA(corpus=corpus, id2word=dictionary, num_topics=num_topics,)
model_list.append(model)
coherencemodel = CoherenceModel(model=model, texts=texts, dictionary=dictionary, coherence='c_v')
coherence_values.append(coherencemodel.get_coherence())return model_list, coherence_values
图:前 10 个一致性分数
上面的函数将计算语料库的一致性分数。对于这个语料库, 7 个主题被观察到具有最高的连贯性分数. 400。然后使用 7 个主题进行主题模型分析,以提取数据集中的潜在主题。
LDA = gensim.models.ldamodel.LdaModel
LDA_overall_Model = LDA(corpus=overall_doctermtx, id2word=overall_dictionary, num_topics=7)
LDA_overall_Model.print_topics( num_topics=7,num_words=5)
7 个主题中的每一个都提取了 5 个最重要的单词。如下所示,LDA 模型对单词的重要性进行了分级评分。
图:阿洛蒙特在线评论的潜在话题
现在,我们可以将代表 Altomonte 在线评论数据集的 7 个主题归为一类。这些主题是(按以上顺序排列):
- 美味的意大利披萨
- 各种新鲜食物
- 多种三明治选择
- 各式各样的意大利食物
- 意大利商品/美食/等的好去处。
- 美味的三明治
- 高品质的意大利食物
我们做到了!这些话题有助于解释顾客对 Altomonte 意大利市场的看法!阿尔托蒙特可以被称为一个独特的食品店,有各种各样的比萨饼、三明治和食物。无论您是去商店购买食材在家制作食谱,还是在室内热吧、三明治柜台或披萨柜台随便吃点东西,您都会非常享受您的 Alomonte 意大利市场之旅并享受美食!这个话题很有意义,因为 Altomonte's 除了新鲜制作的意大利食品外,还提供各种其他产品。最近,R&D 部门不知疲倦地在商店里扩展产品线。这些评论的潜在含义表明,客户已经注意到了这种业务扩张,因此 Altomonte 的领导团队应该继续扩大其产品线。
结论
主题建模分析用于表明食品行业的小企业可以更深入地了解客户对他们提供的商品和服务的看法。对 Altomonte's 来说,顾客对该公司提供的食物、比萨饼、三明治和独特的选择有一种渴望。此外,企业主不断努力扩大商店中商品和服务的种类,这一点并没有被顾客所忽视,而且正在引起消费者的注意。这一知识有助于 Altomonte's 继续开发和投资用于增加商店产品和顾客体验的流程,同时继续为大费城地区的人们服务。感谢您的阅读!
来源
- Gé ron,A.: 用 Scikit-Learn 和 TensorFlow 实践机器学习:构建智能系统的概念、工具和技术。加利福尼亚州塞瓦斯托波尔奥莱利媒体公司(2017 年)。
- 瓦西里耶夫尤利。用 Python 和 Spacy 进行自然语言处理:实用介绍。旧金山:不上浆,2020。打印。
- 图片的使用得到了 Altomonte 的意大利市场公司的批准。
- https://www . analyticsvidhya . com/blog/2018/10/mining-online-reviews-topic-modeling-LDA/
- https://realpython.com/sentiment-analysis-python/
- https://Neptune . ai/blog/pyl Davis-topic-modeling-exploration-tool-that-every-NLP-data-scientist-should-know
- https://towards data science . com/evaluate-topic-model-in-python-latent-Dirichlet-allocation-LDA-7d 57484 bb5d 0
- https://IQ . open genus . org/Topic-modeling-techniques/#:~:text = Topic % 20 modeling % 20 can % 20 be % 20 used % 20 in % 20 graph % 20 based,time % 20 and % 20 helps % 20 students % 20 get % 20 their % 20 results % 20 fast。