我将如何向一个 5 岁的孩子解释构建“LightFM 混合推荐器”!
构建用户/项目功能以解决冷启动问题并预测新用户评级的示例。
注意:5 岁的孩子必须掌握 Python 的工作知识!
来源:作者在 imgflip 上创建
为什么对冷启动问题大惊小怪?
在推荐系统中,冷启动问题指的是将项目推荐给一个完全**新* 用户的问题,即一个没有与你的数据库中的任何现有项目进行过交互的用户。换句话说,如果您从初始训练数据创建用户-项目矩阵,您将找不到这个新用户的行。类似的类比可用于解释在全新项目的情况下的冷启动问题。*
作为应用程序开发人员,这可能会给你带来很大的不便,例如,当听众试图寻找新的播客建议来听时,你得到的是——zip,zilch,nada,什么都没有。这正是我们播客应用程序 Podurama 最初开发阶段的问题。让我们看看 LightFM 是如何帮助我们解决这个问题的…
LightFM 如何帮助解决冷启动问题?
LightFM 的一个优点是,该模型不会遭受冷启动问题,无论是用户还是项目冷启动。原因是 LightFM 允许构建一个混合推荐系统。
混合推荐器是一种特殊的推荐器,它使用协同过滤和基于内容的过滤来进行推荐。
简而言之,LightFM 可以使用普通的用户-项目交互来为已知的**用户做出预测。在 n 个电子战用户的情况下,如果它知道关于这些新用户的一些附加信息,它可以做出预测。这些附加信息可以是性别、年龄、种族等特征,并且在训练期间必须将**输入到算法中。****
让我们直接进入编码
我将使用(非常)小的虚拟评级数据和特征数据,因为我希望能够显示每个阶段的中间输出。如果你想跟着去,这里有一本 Jupyter 笔记本。
评级数据框架
它包含来自三个用户(u1、u2、u3)和四个项目(i1、i2、i3、i4)的数据。
**# create dummy dataset
data = {'user': ['u1','u1','u2','u2', 'u3', 'u3', 'u3'],
'item': ['i1', 'i3', 'i2', 'i3', 'i1', 'i4', 'i2'],
'r': [1,2,1,3,4,5,2]
}
df = pd.DataFrame(data, columns = ['user', 'item', 'r'])**
用户特征数据框架
我们有关于每个用户的四条附加信息——三个布尔特征——f1、f2、f3,以及一个位置特征——loc,现在可以取两个值——德里或孟买。
***#dummy user features*
data = {'user': ['u1','u2','u3', 'loc'],
'f1': [1, 0, 1, 'del'],
'f2': [1, 1, 1, 'mum'],
'f3': [0, 0, 1, 'del']
}
features = pd.DataFrame(data, columns = ['user', 'f1', 'f2', 'f3', 'loc'])**
创建符合 LightFM 的数据集
如果您浏览过 LightFM 文档,就会知道它喜欢特定格式的输入数据。因此,我们必须服从。
**from lightfm.data import Dataset
dataset1 = Dataset()**
调用 fit 方法
我们需要调用 fit 方法来告诉 LightFM 用户是谁,我们正在处理什么项目,以及任何用户/项目特性。
我们将向 fit 方法传递三个输入:
users
:所有用户列表items
:列出所有项目user_features
:附加用户功能列表
传递用户和项目列表非常简单——只需使用df
中的“用户”和“项目”列。
当谈到传递user_features
时,我会强烈推荐传递一个列表,其中每个元素都是类似于'feature_name:feature_value'
的格式(我保证我会解释为什么我更喜欢这样做,以及是否有其他选择,但是现在,请耐心等待)。
这意味着我们的user_features
应该是这样的:
['f1:1', 'f1:0', 'f2:1', 'f3:0', 'f3:1', 'loc:mum', 'loc:del']
。
正如你所猜测的,这个列表是通过考虑在训练集中可能遇到的所有可能的对来生成的。例如,对于等于loc
的feature_name
,可以有两个feature_values
,即mum
和del
。
我写了一小段代码,让我生成这样一个列表(我称之为uf
):
**uf = []
col = ['f1']*len(features.f1.unique()) + ['f2']*len(features.f2.unique()) + ['f3']*len(features.f3.unique()) + ['loc']*len(features['loc'].unique())
unique_f1 = list(features.f1.unique()) + list(features.f2.unique()) + list(features.f3.unique()) + list(features['loc'].unique())
#print('f1:', unique_f1)
for x,y in zip(col, unique_f1):
res = str(x)+ ":" +str(y)
uf.append(res)
print(res)**
最后,有了所有可用的部分,让我们对数据集调用 fit 方法:
***# we call fit to supply userid, item id and user/item features*
dataset1.fit(
df['user'].unique(), *# all the users*
df['item'].unique(), *# all the items*
user_features = uf *# additional user features*
)**
既然我们已经准备好了框架数据集,我们就可以将实际的交互和评级插入其中了。
建立互动
build_interactions
方法的输入是交互的 iterable,其中每个交互是一个包含三个元素的元组:
- 用户
- 项目
- 交互权重(可选)
交互权重仅仅意味着如果用户‘u’与项目‘I’交互,那么这个交互有多重要。从我们示例的角度来看,权重是我们对每个(用户、商品)对的评级。
插入权重可能有用的另一个例子是,如果我们正在处理(用户、歌曲)交互数据。在这种情况下,我可以给那些用户听了超过 3/4 歌曲的交互分配一个较高的权重。
***# plugging in the interactions and their weights*
(interactions, weights) = dataset1.build_interactions([(x[0], x[1], x[2]) for x in df.values ])**
总之,
interactions
矩阵告诉我们用户是否与某个项目进行了交互,而weights
矩阵量化了特定的交互。
我们可以看看这两个输出矩阵是什么样的。由于这些是稀疏矩阵,我们可以使用.todense()
方法。在这两个矩阵中,行是用户,列是项目。
如果你现在还和我在一起,我向你致敬。理解下一部分非常重要,这样你也可以为你自己的推荐系统实现它。(有趣的事实:LightFM Github 页面上的许多公开问题都与构建用户/物品特性主题有关)。
构建用户特征
build_user_features
方法需要以下格式的输入:
[
(用户 1,[特征 1,特征 2,特征 3,…。]),
(用户 2,[功能 1,功能 2,功能 3,…。]),
(用户 3,[功能 1,功能 2,功能 3,…。]),
。
。
这里需要记住的一件超级重要的事情是,
feature1
、feature2
、feature3
等应该是我们一开始传递给fit
方法的user_features
列表中的项目之一。
只是重申一下,这是我们的user_features
列表目前的样子:
['f1:1', 'f1:0', 'f2:1', 'f3:0', 'f3:1', 'loc:mum', 'loc:del']
。
因此,对于我们特定的虚拟数据,build_user_features
的输入应该是这样的:
**[
('u1', ['f1:1', 'f2:1', 'f3:0', 'loc:del']),
('u2', ['f1:0', 'f2:1', 'f3:0', 'loc:mum']),
('u3', ['f1:1', 'f2:1', 'f3:1', 'loc:del'])
]**
同样,我已经编写了一个(不那么小的)代码片段,让我生成这样一个列表:
*****# Helper function that takes the user features and converts them into the proper "feature:value" format***
def feature_colon_value(my_list):
"""
Takes as input a list and prepends the columns names to respective values in the list.
For example: if my_list = [1,1,0,'del'],
resultant output = ['f1:1', 'f2:1', 'f3:0', 'loc:del']
"""
result = []
ll = ['f1:','f2:', 'f3:', 'loc:']
aa = my_list
for x,y in zip(ll,aa):
res = str(x) +""+ str(y)
result.append(res)
return result***# Using the helper function to generate user features in proper format for ALL users*** ad_subset = features[["f1", 'f2','f3', 'loc']]
ad_list = [list(x) for x in ad_subset.values]
feature_list = []
for item in ad_list:
feature_list.append(feature_colon_value(item))
print(f'Final output: {feature_list}')**
最后,我们必须将feature_list
的每个元素与相应的用户 id 相关联。
**user_tuple = list(zip(features.user, feature_list))**
瞧,我们有了build_user_features
方法所需的输入。让我们继续称之为:
**user_features = dataset1.build_user_features(user_tuple, normalize= False)**
图 1
在上面的user_features
矩阵中,行是用户,列是用户特征。每当用户在训练数据中具有该特定用户特征时,就存在 1。
我们可以看到总共有 10 列,这意味着存在 10 个用户特性。但是为什么你问,让我们看看!
**user_id_map, user_feature_map, item_id_map, item_feature_map = dataset1.mapping()
user_feature_map**
如果你看看上面的输出,就会明白为什么我们有 10 个用户特性。默认情况下,用户 id 本身也是一个特性,所以我们有三个。剩下的七个一定很熟悉,因为我们在一开始就创建了它们。
是时候建立模型了
这一步非常简单,也非常通用。当然,您可以遵循文档并尝试不同的loss
值或learning_schedule
选项。
**model = LightFM(loss='warp')
model.fit(interactions,
user_features= user_features,
sample_weight= weights,
epochs=10)**
打印 AUC 分数
**from lightfm.evaluation import auc_score
train_auc = auc_score(model,
interactions,
user_features=user_features
).mean()
print('Hybrid training set AUC: %s' % train_auc)**Output: Hybrid training set AUC: 0.9166667****
我再说一遍,不要对高 AUC 过于兴奋。记住这只是虚拟数据。
为已知用户做预测
predict
方法有两个输入:
- 用户 id 映射(例如:要获得对“u1”的预测,必须传递 0;对于‘U2’,传递 1,以此类推。).这些映射可从
user_id_map
字典中访问。 - 条目 id 的列表(同样不是 i1、i2,而是映射;可从
item_id_map
获得您想要的推荐。
***# predict for existing user*
user_x = user_id_map['u3']
n_users, n_items = interactions.shape *# no of users * no of items*
model.predict(user_x, np.arange(n_items)) *# means predict for all* **Output: array([-0.18600112, -0.91691172, -0.295421 , -0.06632421])****
为未知用户做预测
这就是我们最初构建混合推荐器的原因。
对于一个新用户,这是我们所知道的- (s)他有 f1,f2,f3 的值,分别为 1,1 和 0。此外,他们的位置是德里。
**user_feature_list = ['f1:1', 'f2:1', 'f3:0', 'loc:del']**
现在,我们不能将它直接提供给predict
方法。我们必须将这种输入转换成 lightFM 模型可以理解的形式。
理想情况下,输入应该类似于user_features
矩阵中的一行(见上面的图 1)。
我在 Stackoverflow 上找到了一段代码,它就是这样做的——将user_feature_list
转换成所需的格式(在我们的例子中是一个有 10 列的稀疏矩阵)。我只是稍微修改了原始代码,并将其封装在一个可重用的函数format_newuser_input
中,如下所示:
**from scipy import sparsedef format_newuser_input(user_feature_map, user_feature_list):
num_features = len(user_feature_list)
normalised_val = 1.0
target_indices = []
for feature in user_feature_list:
try:
target_indices.append(user_feature_map[feature])
except KeyError:
print("new user feature encountered '{}'".format(feature))
pass
new_user_features = np.zeros(len(user_feature_map.keys()))
for i in target_indices:
new_user_features[i] = normalised_val
new_user_features = sparse.csr_matrix(new_user_features)
return(new_user_features)**
最后,我们可以开始预测新用户:
**new_user_features = format_newuser_input(user_feature_map, user_feature_list)
model.predict(0, np.arange(n_items), user_features=new_user_features)**
这里,第一个参数(即 0)不再指用户 u1 的映射 id。相反,它的意思是——选择new_user_features
稀疏矩阵的第一行。传递除 0 以外的任何值都会引发一个错误,这是理所当然的,因为在new_user_features
中没有超过 row0 的行。
万岁!!我们做到了。我们的虚拟混合推荐系统已经准备好了。
创建用户/项目特征的其它方式
回到我在开始时所做的承诺,除了构建user_features
矩阵,还有其他选择,假设 你的数据是一种特定的格式。
例如,考虑如下所示的用户特征数据帧:
来源:https://github.com/lyst/lightfm/issues/372
如果你仔细观察,这三个特征——种族、性别、30 岁以下,每一个都有不重叠的值。换句话说,种族列中的可能值不同于性别列中的可能值,性别列中的可能值又不同于 under_30yo 列中的可能值。
如果是这种情况,我们可以简单地将表单[Asian, Hispanic, Female, Male, no, yes]
的user_features
列表传递给fit
。随后,我们必须也更新我们构建用户特性的方式,因此.build_user_features()
的输入应该是这样的:
**[
('u1', ['Asian', 'Female', 'No']),
('u2', ['Hispanic', 'Male', 'Yes']),
('u3', ['Hispanic', 'Male', 'No'])
]**
这看起来很棒。但是现在回答这个?
当我有一个关于每个用户的额外信息时,比如一个新列“height_under_5ft”可以取值 yes 或 no,会发生什么?
在这种情况下,可能很难从年龄和身高来区分是/否。因此,为了避免歧义,最好使用我们在开始时谈到的feature:value
格式,并将user_features = ['eth:Asian', 'eth:Hispanic', 'gender:Male', 'gender:Female', 'age:yes', 'age:no', 'height:yes', 'height:no]
传递给fit
,并将以下输入传递给.build_usear_features()
**[
('u1', ['eth:Asian', 'gender:Female', 'age:No', 'height:yes']),
('u2', ['eth:Hispanic', 'gender:Male', 'age:No', 'height:no'])
('u3', ['eth:Asian', 'gender:Female', 'age:No', 'height:yes'])
]**
结尾注释
有很多不同的方法可以推进这个教程。首先,尝试插入真实数据集而不是虚拟数据,看看你的推荐系统表现如何。您甚至可以尝试使用我们在本教程中讨论的类似方法来创建item_features
。
我没有过多地讨论过模型调优、模型评估、交叉验证等等,但那是以后的事了。我希望你喜欢阅读,并随时在 Github 上分享我的代码,以满足你的需求。一如既往,我很想知道是否有更好的方法来做我提到的一些事情。
直到下次:)
哦,我差点忘了,“如果你喜欢这篇文章,你可能也会喜欢”😜)
我喜欢写循序渐进的初学者指南、操作指南、面试问题、ML/AI 中使用的解码术语等。如果你想完全访问我的所有文章(以及其他文章),那么你可以注册使用 我的链接这里 。
** [## 如何在 VSCode 中充分利用你的 python 调试器?
观察变量,使用条件断点,调用堆栈,异常断点等——当在大型项目中工作时
towardsdatascience.com](/how-to-make-most-of-your-python-debugger-in-vscode-9e05dfce533f) [## 了解 Python 导入,init。py 和 pythonpath —一劳永逸
了解如何导入包和模块(以及两者之间的区别)
towardsdatascience.com](/understanding-python-imports-init-py-and-pythonpath-once-and-for-all-4c5249ab6355) [## 使用 Python 中的 Pandas 进行时间序列分析
对季节性、趋势、自相关等关键词的额外介绍。
towardsdatascience.com](/time-series-analysis-using-pandas-in-python-f726d87a97d8) [## 使用 FLASK 将 H2o 模型部署为 API
模型训练、调优和创建简单 API 的端到端示例(没有技术术语)。
towardsdatascience.com](/deploying-h2o-models-as-apis-using-flask-42065a4fa567)**
我将如何学习数据科学(如果我必须重新开始的话)
从我的数据科学之旅中学到的经验
我会说我的数据科学学习之路相当传统。我读的是经济学本科,并获得了全球商务和计算机科学(专注于机器学习和人工智能)的硕士学位。我从商学学位期间的课程中学到了我的商业头脑,并从我的计算机科学硕士学位中获得了大部分技术元素。我有一个数据科学实习,我在路上。
回想起来,我的道路没有错,但知道我现在做什么,我会改变我的学习旅程吗?这个问题对于这个领域的新手来说尤其重要。自从我开始以来,许多事情都变了。职位竞争更加激烈,学习选择也多得多。我希望我的经历可以帮助其他人更快、更全面地学习数据科学,并给他们更好的工作机会。
图片由 VisionPic 提供。来自的网像素
我将告诫这篇文章说,学习是每个人都有点不同。我的话不是真理,你很有可能会找到对你更好的东西。尽管如此,我还是希望这是一个良好的基础。我希望它能灌输给你在学习这个领域时相关的大局优先。
这篇文章更关注如何学习,而不是从哪里学习(课程、训练营、学位等等)。).对于学习该领域的具体课程和在线资源,我推荐这两篇文章。
- 如果我必须重新开始学习数据科学,我会怎么做? ( 圣地亚哥·维克斯·塞古拉)
- 我自创的人工智能硕士学位(丹尼尔·伯克)
对于那些喜欢视频版本的人:
第一课:分解
当我第一次开始学习数据科学时,我被这个领域的规模所淹没。我不得不从统计学、线性代数、微积分等方面学习编程语言和概念。当我面对这么多选择时,我不知道从哪里开始。
幸运的是,我有课程来指导我的学习。我所做的学位将许多概念分解成更小的块(类),以便它们易于理解。虽然这对我很有效,但我发现学校对此有一种一刀切的方法。它们还包括许多你实际上并不需要的无关类。如果我可以回到过去,我一定会将我的数据科学学习之旅分成更适合我的几个部分。
在深入研究数据科学之前,了解该领域中使用的组件是有意义的。您可以将数据科学分成更小、更容易理解的块,而不是将事情分成“课程”。
我通常将数据科学分为编程和数学。
编程—熟悉 Python 和/或 R
- 变量
- 环
- 功能
- 目标
- 包(熊猫,numpy,matplotlib,sklearn,tensorflow,pytorch 等。)
数学
统计
- 概率论
- 回归(线性、多元线性、岭、套索、随机森林、svm 等。)
- 分类(朴素贝叶斯,knn,决策树,随机森林,svm 等。)
- 聚类(k 均值,分层)
线性代数
微积分
通过将数据科学分解成各个组成部分,您可以将它从抽象的概念转化为具体的步骤。
第二课:从某处开始
当我刚开始的时候,我痴迷于按照“正确”的顺序学习东西。进入这个领域后,我发现许多数据科学家学习技能的顺序截然不同。我遇到了先学习数学的博士,在参加训练营后才学习编程概念。我也遇到了软件工程师,他们是不可思议的程序员,后来通过自学和应用学会了数学。
我现在意识到从某个地方开始是最重要的,最好是从你感兴趣的话题开始。我发现学习是相加的。如果你学习一件事,你并没有放弃学习另一个概念。
如果让我回到过去,我会从当时我最感兴趣的概念开始。一旦你学会了一个概念,你就可以在此基础上理解他人。例如,如果你学习一个简单的线性回归,多元线性回归是一个相当容易的步骤。
尽管如此,我可能不会马上开始深度学习。从小而简单开始并在此基础上进行构建会有所帮助。
第三课:建立最低限度的可行知识(MVK)
随着时间的推移,我对你需要多少基础知识的看法发生了变化。在我自己经历了许多不同类型的学习后,我相信通过做真实世界的项目来学习是掌握一个领域最有效的方法。我认为你应该理解足够多的这些概念,以便能够开始探索你自己的项目。
这就是最小可行知识发挥作用的地方。你应该从能够边做边学开始。这个阶段很难确定。一般来说,当你刚到这里的时候,你会觉得你还没有准备好。这是一件好事,这意味着你正在把自己推出舒适区。
你可以相当容易地达到这个阶段。我认为你可以通过非常入门的在线课程达到这种知识水平,我一般推荐 kaggle.com 的微型课程。
为了达到这一步,您真正需要理解的是 python 或 R 的基础知识,并且熟悉所使用的包。您可以稍后通过将一些算法应用到真实世界的数据来开始学习数学。
第四课:弄脏你的手
以你的基础知识,我建议尽快进入项目。同样,这听起来很可怕,但是项目就是你如何定义它。
在早期阶段,一个项目可能只是简单地试验一个 for 循环。随着您的进步,您可以使用 kaggle 上的数据,并最终使用您已经收集的数据来进行项目。
我非常相信学习数据科学的最好方法是做数据科学。我认为这个理论非常重要,但是没有人说在你开始应用它之前你必须理解它。理论是在你对算法有了功能性的理解之后,你可以回头去看的东西。对我来说,现实世界的例子总是让事情变得更好。如果你通过项目从真实世界的例子开始,我认为当你开始学习理论时,事情有更高的机会“点击”。
项目也有能力让数据科学变得更小。我认为新学习者面临的最大挑战之一是,数据科学领域可能会势不可挡。将你所学的东西限制在一个小项目的范围内,比你在第一课中所做的更能让你把事情分解得更细。
项目提供了一个额外的好处。他们会给你即时的反馈,告诉你哪里需要改进。如果您正在进行一个项目,并且遇到了使用什么包、算法或可视化的障碍,您现在知道您可能应该进一步研究该领域。
第五课:从别人的代码中学习
虽然做自己的项目很棒,但有时你不知道自己不知道什么。我强烈建议阅读更有经验的数据科学家的代码,以获得关于下一步学习什么的想法,并更好地理解逻辑或语法。
在 Kaggle 和 GitHub 上,有成千上万(也许上百万)的内核,人们在那里分享他们用来分析数据集的代码。浏览这些是补充你的项目的好方法。
我建议列出你看到的正在使用的软件包、算法和视觉效果。您应该查阅软件包的文档,并在那里扩展您的知识。他们几乎总是在文档中有例子来说明如何使用它们。同样,这个列表可以用来帮助你思考新的项目想法和实验。
第 6 课:从头开始构建算法
这是大多数数据科学家的必经之路。在你应用了一个算法并理解了它在实践中是如何工作的之后,我建议你试着从头开始编码。这有助于您更好地理解底层数学和其他使其工作的机制。这样做的时候,你无疑也必须学习它背后的理论。
我个人认为,这个方向的学习远比试图掌握理论再去应用要直观的多。这是 fastai 在他们的免费 mooc 中采用的方法。如果你对深度学习感兴趣,我强烈推荐它。
对此,我一般建议从线性回归开始。这将帮助你更好地理解梯度下降,这是一个非常重要的概念。
随着你的数据科学事业的进一步发展,我认为理论变得越来越重要。您通过将正确的算法与问题相匹配来带来价值。与算法相关的理论极大地促进了这一过程。
第七课:永远不要停止学习
数据科学之旅的美妙之处在于它永无止境。你将需要不断学习保持在新的软件包和领域的进步的顶端。我建议通过(你猜对了)更多的项目来做到这一点。我还建议继续进行代码审查,阅读已经发表的新研究。
这更多的是一种心态上的建议,而不是什么实际的建议。如果你认为有一个顶峰,你会大吃一惊!
我如何写数据科学博客
撰写数据科学(或任何其他主题)的顶级技巧
两年来,我几乎一直在媒体上专门写关于数据科学的文章。我最初打算只是偶尔写点东西来帮助其他人学习数据科学,并作为我自己发展的学习工具(我是费曼技术的超级粉丝)。
然而,自那以后,它已经发展得远远不止于此。我写作是为了放松,是我思想和想法的一个出口,仍然是一个强大的学习和发展工具。如果我正在学习一种新的工具或技术,我可能会写一篇关于它的文章。
我现在已经写了 60 多篇博文,在我写媒体的两周年纪念日即将到来之际,我想分享一些我迄今为止写博客的经验和收获。
如果你正在考虑开始写作,或者想要改进或发展你自己的博客,这里是我在 Medium 上写关于数据科学(或任何其他主题)的顶级技巧。
为你写作
许多人从事博客写作是为了赚钱或者获得大量的读者或追随者。写作可以导致这两者,这是千真万确的,但现实是,要达到这一点需要花费大量的时间和精力。
当我第一次开始在 Medium 上写作时,我的浏览量很少,如果我一个月能赚 10 美元,那我就很幸运了。然而,我坚持写作,因为我从中获得了巨大的个人价值。写作帮助我学习数据科学的技术方面,帮助我提高我的沟通和思维排序技能,给我满足感,因为我可能正在帮助某人,在某个地方学习新的东西,并把我介绍给一大群新的有趣的人。
“我写作是为了发现我所知道的东西。”,弗兰纳里·奥康纳
金钱和声望是表面的激励因素。
要想在博客上取得成功,无论是媒体还是其他方式,你需要在一个相对较长的时期内坚持写作,即使没有人阅读你的作品。为了在最初的几个月里坚持下去,你需要更深层次的写作动机。
我读过很多关于写作的文章,这些文章关注的是你应该为你的读者提供的价值。就你的帖子的实际内容而言,这是绝对正确的。
然而,要真正坚持一个有规律的写作习惯,你很可能会在工作、学习或家庭等其他事情上左右为难。你需要写作,因为它为你个人提供了一些好处或价值(除了经济上的)。
穿上你的运动服
写字的习惯有点像锻炼。正如他们所说,开始健身的一半是穿上你的运动服。简单地打开你的笔记本电脑,开始写作,就完成了你故事写作的一半。重要的是不要拖延太久,而是开始写。
通常,我的故事初稿只是一些想法和笔记。我的目标是尽快记下这些想法,不要太担心写作风格、语法或结构。之后,我回去编辑这个故事并重组它。我发现,这使我能够以最有效的方式写文章。
“把它拿下来。抓住机会。这可能不好,但这是你能做任何真正好的事情的唯一方法。”威廉·福克纳
我有一个相对固定的写作时间表。我试着每天至少写 30 分钟。全职工作,带着两个孩子,我通常没有时间一次花几个小时写一个故事,所以我的文章通常要写几天。
我再次认为这就像间歇训练。当我每天做其他事情的时候,我会思考,获得想法——有时候我在每天散步的时候在脑子里组织我的文章。然后,当我有 30 分钟的写作时间时(通常是在我的孩子睡觉后),我准备冲刺,并发现我可以很快写完我博客的一部分。
我还会利用任何空闲时间来写或编辑故事。我在任何地方和任何地方写作,我甚至可以在手机上写作。
灵感
我坚持每周写一到两篇文章,大多是关于数据科学或密切相关的主题。有人好几次问我,我是如何不断想出文章的新点子的。我使用灵感的来源有很多。
广泛阅读,而不仅仅是技术书籍。很多新文章的想法来自我读过的书或文章。非技术书籍常常是我灵感的来源。例如,我可能会读到一种学习技术,它可以以不同的方式应用于数据科学。我最近读了一本关于超学习的书,这是我几周前写的一个故事的灵感来源。
“思想就像兔子。你得到一对夫妇,并学会如何处理他们,很快你就有一打了。”,约翰·斯坦贝克
作为一名数据科学家,随着该领域的快速发展,您永远不会停止学习或发现新的工具和技术。因此,我的日常工作是我灵感的另一个来源。如果我在日常工作中学习了一项新技术,我会写一篇关于它的文章,这也有助于确保我正确地掌握了概念,并能在必要时向利益相关者解释它们。
我也经常使用社交媒体。我在 Twitter、Linkedin 上关注了很多优秀的人和项目,也在 Quora 上关注了一些帖子。Quora 是一个发现人们有兴趣知道答案的问题类型的好地方,这有助于我定制对读者最有用的内容。
我试着为博客积累一些想法,当我遇到它们的时候就可以写下来。这样,当我有时间写作时,我总是有灵感的来源,而不会浪费时间去想出一个新文章的想法。
如果你觉得这篇文章有用,我之前写过一篇关于我为什么写数据科学博客的文章,这篇文章提供了更多关于我从写作中获得的个人价值的细节。
写博客加速了我在数据科学方面的学习,原因如下
towardsdatascience.com](/why-i-write-a-data-science-blog-7726c3c7d3d9)
感谢阅读!
我每月都会发一份简讯,如果你想加入,请点击此链接注册。期待成为您学习旅程的一部分!
我如何为 AWS Lambda 函数编写有意义的测试
让世界永远摆脱“断言真=真”的尝试。
作者图片
残酷的事实
如果你要编写无意义的单元测试,更有可能掩盖错误而不是暴露错误,你最好干脆跳过这个练习。
好了,我说了。
您的时间是宝贵的,可以用在比实现空洞的覆盖率更好的事情上。
有效的代码测试一直是编程中的一个挑战性问题,AWS Lambda 等新工具似乎让开发人员在编写测试时表现最差。
我认为这主要是因为在本地镜像 Lambda 生产环境更加困难(或者至少不太直观)。结果,一些开发人员完全放弃了测试。
我知道是因为我自己做过,甚至是生产中的项目。相反,只有在代码已经部署到云中之后,测试才以集成的方式进行。
这是极其手工的,并且从长远来看浪费时间。
我在测试中看到的另一种方法的结果如下:
这是一个有测试覆盖需求但缺乏责任感的工程团队的明显标志。不需要解释以上是不允许的。
那么,我们如何着手将上面这个悲伤的文件转化成有意义的东西呢?
在我们开始测试 Lambda 代码之前,还有几个障碍。我们将逐一讨论这些问题,并确定如何最好地处理它们。一旦处理完毕,我们就可以随心所欲地测试 Lambdas 了!
注意:为了清晰起见,我将在整篇文章中加入一些代码片段。但最后会有一个完整的工作代码示例可供参考。
障碍# 1:Lambda 触发事件
每个 Lambda 函数都被调用以响应一个预定义的触发器,该触发器将特定的event
数据传递给默认的lambda_handler()
方法。有效测试 Lambda 函数的首要任务是创建一个真实的输入事件进行测试。
此事件的格式取决于触发器的类型。截至撰写本文时,有 16 种不同的 AWS 服务可以充当 Lambda 的调用触发器。
下面是我最常用的几个输入示例的代码片段:
将 test_sqs_event 传递给 lambda_handler。
样本输入事件的完整列表可在 AWS 文档中找到。或者,您也可以在部署后在 lambda_handler 代码中打印事件变量,并在 CloudWatch 日志中查看有效负载:
CloudWatch 日志中由 Kinesis 触发的 Lambda 事件示例|图片由作者提供
一旦你有了这个例子,简单地把它硬编码到你的测试文件中,如上所示,我们就有了一个奇妙的开始!
接下来…
障碍#2: AWS 服务交互
Lambda 函数几乎不可避免地会与其他 AWS 服务交互。也许您正在将数据写入 DynamoDB 表。或者向 SNS 主题发布消息。或者只是向 CloudWatch 发送一个指标。或者三者结合!
测试时,发送数据或改变生产中使用的实际 AWS 资源并不是一个好主意。为了解决这个问题,一种方法是建立并在以后拆除单独的测试资源。
一个更干净的方法是模仿与 AWS 服务的交互。因为这是一个常见的问题,所以开发了一个包来解决这个特定的问题。更好的是,它以一种超级优雅的方式做到了这一点。
它的名字叫 moto (模仿& boto 的组合词),它的优雅源自两个主要特征:
- 它在测试中自动修补和模仿 boto 客户端。
- 它维护伪 AWS 资源的状态。
这看起来像什么?所有需要的是一些装饰魔术和一点设置!
假设我们从 S3 的 Lambda 中读取数据。我们可以不用在 S3 创建和填充一个测试桶,而是使用 moto 创建一个假的 S3 桶——一个看起来和行为完全像真桶的桶——而不用实际接触 AWS。
最棒的是,我们可以使用标准的 boto3 语法来做到这一点,如下面的示例所示,调用create_bucket
和put_object
方法:
使用@mock_s3 装饰器来修补 boto s3 客户端。
类似地,如果我们将数据写入 DynamoDB,我们可以通过首先创建一个假的 Dynamo 表来设置我们的测试:
使用@mock_dynamodb2 decorator 来修补 boto dynamo 资源。
这需要一点信任,但是如果测试通过,您可以确信您的代码也将在生产中工作。
好吧,但不是所有的都由 moto 负责…
没错,moto 并不是每一个 AWS API 都和保持平价。例如,如果你的 Lambda 函数与 AWS Glue 交互,moto很可能会让你陷入困境,因为 Glue 服务只实现了 5%。
这就是我们需要卷起袖子,通过恶作剧来嘲笑我们自己的肮脏工作的地方。无论我们谈论的是与 AWS 相关的调用,还是你的 Lambda 可能触及的任何外部服务,比如向 Slack 发布消息,都是如此。
不可否认,这方面的术语和概念非常密集,所以最好通过一个例子来解释。让我们坚持使用 AWS Glue,并说我们迫切希望用以下代码列出我们帐户的 Glue 爬虫:
session = boto3.session.Session()
glue_client = session.client("glue", region_name='us-east-1')
glue_client.list_crawlers()['CrawlerNames']
# {“CrawlerNames”: [“crawler1”, "crawler2",...]}
如果我们不想让我们出色的测试的成功或失败依赖于list_crawlers()
响应,我们可以像这样硬编码一个返回值:
monkey 修补 boto3 会话
通过利用 pytestmonkey patchfixture 的setattr
方法,我们允许lambda_handler
中的胶合客户端代码在运行时动态访问来自MockBotoSession
类的硬编码list_clusters
响应。
这个解决方案的好处在于它足够灵活,可以为任何 boto 客户端工作。
用固定装置整理
我们已经讨论了如何在 Lambda 测试中处理事件输入和外部依赖。我想分享的另一个技巧是使用 pytest fixtures 来维护一个有组织的测试文件。
到目前为止,代码示例已经显示了直接在test_lambda_handler
方法本身中设置代码。然而,更好的模式是创建一个单独的set_up
函数作为 pytest fixture,传递给任何需要使用它的测试方法。
对于最后的代码片段,让我们展示一个使用@pytest.fixture
装饰器的 fixture 结构的例子,并结合所有内容:
用 fixtures、moto 和 monkeypatching 测试 Lambda 文件!
我们已经从文章开头的空测试文件走了很长一段路,不是吗?
提醒一下,这段代码测试了一个 Lambda 函数:
- 触发 sqs 消息事件
- 将消息写入发电机表
- 列出可用的胶水爬虫
- 最后读回写入 Dynamo 的数据,并断言最终值与输入匹配。
通过采用这些策略,你应该对测试一个从任何事件类型触发的 Lambda,以及一个与任何 T21 AWS 服务交互的 Lambda 充满信心。
最后的想法
如果你一直在努力测试你的 Lambda 函数,我希望这篇文章向你展示了一些有用的技巧来帮助你这样做。
虽然我们花了很多时间讨论常见问题以及如何不应该测试 Lambda,但我们没有机会讨论这个主题的相反但同样重要的方面——即应该测试什么,以及如何构建 Lambda 函数的代码以使其更容易测试。
我期待收到您的来信,并讨论您如何测试 Lambda 函数!
感谢 Vamshi Rapolu 对本文的启发和反馈。
其他参考文献
[## 用于更好的 Python 测试的 Pytest 技巧
Pytest 是我选择的 Python 测试框架。非常容易使用,并使测试看起来更好。在本文中…
阿尔瓦雷斯.我](https://aalvarez.me/posts/pytest-tricks-for-better-python-tests/) [## 使用 Moto 进行无服务器单元测试
无服务器开发通过将基础设施的责任转移给…
www.fernandomc.com](https://www.fernandomc.com/posts/serverless-testing-with-moto/) [## Python - Semaphore 教程中的模仿和恶作剧
在这篇文章中,我将研究测试的基本部分——模拟。首先,我想在这里完成的是…
semaphoreci.com](https://semaphoreci.com/community/tutorials/mocks-and-monkeypatching-in-python) [## 建议请求:monkey patch vs . mock . patch 问题#4576 pytest-dev/pytest
解散 GitHub 是超过 5000 万开发者的家园,他们一起工作来托管和审查代码,管理项目,以及…
github.com](https://github.com/pytest-dev/pytest/issues/4576#issuecomment-449864333)
如果我可以重新开始,我会如何学习数据科学(两年内)
尽可能有效地学习数据科学的指南
由 Unsplash 上的 Element5 数码拍摄
目录
- 前言
- 介绍
- 数学和统计学
- 编程基础
- 机器学习算法和概念
- 数据科学项目
一定要 订阅 千万不要错过另一篇关于数据科学指南、诀窍和技巧、生活经验等的文章!
前言
来自非技术背景,我或多或少是靠自己。
当我第一次开始我的数据科学之旅时,我花了大量时间来弄清楚从哪里开始,我应该首先学习什么,以及我应该使用什么资源。
在过去的两年里,我学到了一些我希望有人能告诉我的事情,比如是先专注于编程还是统计,我应该使用什么资源来学习新技能,我应该如何学习新技能,等等…
因此,本文旨在为正在学习数据科学的人提供一些方向和见解。
介绍
我的假设是,作为一名有抱负的数据科学家,你会希望完全 理解各种机器学习算法、数据科学概念等等的概念和细节。
因此,我建议您在查看机器学习算法或数据科学应用程序之前,先从构建模块开始。如果你对微积分&积分、线性代数和统计学没有基本的了解,你将很难理解各种算法背后的机制。同样,如果你对 Python 没有基本的了解,你将很难在现实生活中应用你的知识。
以下是我建议您浏览的主题顺序:
- 数学和统计学
- 编程基础
- 机器学习算法和概念
1.数学和统计学
像其他任何事情一样,你必须先学习基础知识,然后才能接触有趣的东西。相信我,如果我在进入任何机器学习算法之前开始学习数学和统计学,我会轻松得多。
我推荐你复习的三个通用主题是微积分/积分、统计学和线性代数(排名不分先后)。
a.积分
当涉及到概率分布和假设检验时,积分是必不可少的。虽然你不需要成为一名专家,但学习积分的基础知识对你最有利。
前两篇文章是给那些想知道积分是什么的人,或者那些仅仅需要复习的人。如果你对积分一无所知,我建议你完成可汗学院的课程。最后,我提供了一些练习题的链接来磨练你的技能。
b.统计数字
如果有一个话题是你应该花大部分时间关注的,那就是统计学。毕竟,数据科学家实际上是现代统计学家,机器学习是统计学的现代术语。
如果你有时间,我建议你去乔治亚理工学院学习名为“统计方法的课程,它涵盖了概率基础、随机变量、概率分布、假设检验等等。
如果你没有时间参加上面的课程,我绝对推荐你去看看可汗学院关于统计学的视频。
c.线性代数
如果你想进入深度学习,线性代数尤其重要,但即使如此,了解其他基本的机器学习概念也是很好的,如主成分分析和推荐系统。
对于线性代数,我也推荐可汗学院!
一定要 订阅 千万不要错过另一篇关于数据科学的指南、诀窍和技巧、生活经验等文章!
2.编程基础
正如对数学和统计学有一个基本的理解很重要一样,对编程有一个基本的理解会让你的生活变得容易得多,尤其是在实现的时候。因此,我建议您在深入研究机器学习算法之前,先花时间学习基本的 SQL 和 Python。
a.结构化查询语言
你想先学习 Python 还是 SQL 完全取决于你,但是如果你问我,我会从 SQL 开始。为什么?即使你不是数据科学家,了解你是否在一家处理数据的公司工作也是很容易学习和有用的。
如果你完全不熟悉 SQL,我建议你去浏览一下 Mode 的 SQL 教程,因为它非常简洁和全面。如果你想学习更高级的概念,我会查看我的资源列表,在那里你可以学习高级 SQL 。
更重要的是,下面是一些你可以用来练习 SQL 的资源。
b.计算机编程语言
我是从 Python 开始的,我可能会一辈子都坚持使用 Python。就开源贡献而言,它遥遥领先,而且学习起来很简单。如果你想的话,请随意使用 R,但是我没有关于 R 的意见或建议。
我个人发现,通过‘做’来学习 Python,帮助要大得多。话虽如此,在经历了几个 Python 速成班后,我发现这个是最全面的(而且是免费的!).
c.熊猫
可以说 Python 中最重要的库是 Pandas,它专门用于数据操作和分析。
下面是两个资源,应该可以让你很快上手。第一个链接是关于如何使用熊猫的教程,第二个链接提供了许多练习题,你可以用它们来巩固你的知识。
3.机器学习算法和概念
如果你已经到了这一步,这意味着你已经建立了基础,你已经准备好学习有趣的东西。这部分分为两部分:机器学习算法和机器学习概念。
a.机器学习算法
下一步是了解各种机器学习算法,它们如何工作,以及何时使用它们。下面是各种机器学习算法和资源的非穷尽列表,您可以使用它们来学习每一种算法。
- 线性回归(佐治亚理工, StatQuest )
- 逻辑回归( StatQuest
- k-最近邻( MIT )
- 决策树( StatQuest
- 朴素贝叶斯(特伦斯·申,路易斯·塞拉诺)
- 支持向量机(教程,爱丽丝赵)
- 神经网络(特伦斯·申
- 随机森林(统计任务)
- AdaBoost ( 特伦斯·申, StatQuest )
- 梯度提升( StatQuest )
- XGBoost ( StatQuest
- 主成分分析( StatQuest
b.机器学习概念
类似地,还有几个基本的机器学习概念,你也想了解一下。下面是我强烈推荐你阅读的(非详尽的)概念列表。很多面试问题都是基于这些话题的!
4.数据科学项目
至此,你不仅已经打下了坚实的基础,而且对机器学习的基础有了坚实的理解。现在是时候做一些个人的兼职项目了,就像程序员也有他们自己的兼职项目一样。
如果您想查看一些简单的数据科学项目示例,请查看下面我的一些项目:
这里有一个数据科学项目的列表,你可以看看它来产生想法,并想出一个你自己的有趣的附带项目。
感谢阅读!
如果您喜欢这篇文章,请务必点击 订阅此处 千万不要错过另一篇关于数据科学指南、技巧和提示、生活经验等的文章!
不确定接下来要读什么?我为你挑选了另一篇文章:
来自亚马逊、谷歌、脸书、微软等公司的面试问题!
towardsdatascience.com](/over-100-data-scientist-interview-questions-and-answers-c5a66186769a)
或者你可以查看我的中页:
阅读特伦斯·申在媒体上的文章。数据科学@ KOHO,SaturnCloud |理学硕士,MBA |…
terenceshin.medium.com](https://terenceshin.medium.com/)
特伦斯·申
我如何重新开始学习机器学习(3 年后)
将工程师放回机器学习工程师
未管理的电缆,未修剪的颈毛——经典的“必须是工程师”给出。是的,这是一个 Colab 笔记本,屏幕中间有一张牛排的图片(即将到来的项目的一部分)。感谢山姆·伯克的照片。
我在地下,回到一切开始的地方。坐在我第一次遇见迈克的隐蔽咖啡馆里。在过去的 9 个月里,我一直在我的卧室里学习,并决定走出洞穴。我一半担心早餐要付 19 美元(除非是圣诞节,周末开车去优步不是很赚钱),另一半担心我在网上做的这项研究是否有意义。
2017 年,我离开了苹果,试图建立一家网络创业公司,失败了,发现了机器学习,恋爱了,报名参加了一个零编码经验的深度学习课程,给支持团队发邮件询问退款政策是什么,没有获得退款,接下来的 3 个月,晚交了 4 到 6 天的作业,不知何故通过了,决定继续前进,并创建了自己的 AI 硕士学位。
获得人工智能硕士学位 9 个月后,我遇到了迈克,我们一起喝咖啡,我告诉他我的宏伟计划;使用人工智能来帮助世界移动更多,吃得更好,他告诉我我应该见见 Cam,我见了 Cam,我告诉 Cam 我要去美国,他说为什么不留在这里,周四来,好的,周四去实习一周一天,两周后在 Max Kelsen 获得初级机器学习工程师的职位。
在担任机器学习工程师 14 个月后,我决定离开,自己尝试一下。我写了一篇关于我所学的的文章,Andrei 找到了它,发邮件给我问我是否想建立一个初学者友好的机器学习课程,我说是的,我们建立了这个课程,在 6 个月的时间里,我们有幸教授了 150 多个国家的 27,177 名学生。
把它加起来,你会得到大约 3 年。大约是我最初的本科学位应该花的时间(由于几次失败,我花了 5 年时间完成了 3 年的学位)。
所以就目前的情况来看,我感觉我已经完成了机器学习本科学位。
一些局外人可能会认为我对机器学习有相当多的了解,我确实知道,我知道的比我开始时多得多,但我也知道有多少我不知道。这就是有知识的东西。
- 1 年中: 蜜月期,也称为 noob 收获期。你比初学者强多了,甚至可能有点过于自信(尽管这不是一件坏事)。
- 2-年:哦,也许我并不像我想象中的那样好相。你的初学者技能开始成熟,但现在你意识到要变得更好需要一些努力。
- 3 年期:哇,还有很多要学的阶段。不再是初学者,但现在你知道的足够多,意识到你有多少不知道的(我在这里)。
学习是非线性的(不是一条直线)。你可能学习了整整一个月,却感觉毫无进步。然后不知从哪里,一个发现出现了。如果你想要一个我们如何愚弄自己的例子,你发现错误了吗?我好像还是忘了怎么拼写。
关于我已经说得够多了。这就是我的故事。你的可能是相似的,或者你可能从今天开始。
如果你正在开始,这篇文章是给你的。如果你是一个老手,你可以提供你的建议或者批评我的想法。
我们开始吧,好吗?
如果你是来要课程清单的,那你来错地方了
我上过很多在线课程。我甚至创造了我自己的。
你猜怎么着?
它们都是同一事物的混搭。
与其担心哪个课程比另一个好,不如找一个让你兴奋的老师。
学习任何东西,10%是物质,90%是对学习的兴奋。
你记得多少你学校的老师?
我的猜测是,不管他们教了什么,你记得老师本身比材料多。如果你记得这些材料,那是因为它们在你心中点燃了足够的火焰,足以将它烧进你的记忆。
然后呢?
涉猎一些资源,你足够聪明可以找到最好的。看看哪些能激发你的兴趣,让你坚持下去。
如果老师让你对一项技能感兴趣,学习这项技能并不是一件不愉快的事情。
工程师(和技术呆子)的诅咒
给我看一个宣称她使用最新最好的工具的工程师,我会给你看一个业余的。
我会坦白。我有罪。每一个新的闪亮的框架出来,每一个新的艺术模型,我都在上面。
我经常会发现自己试图发明一个问题来使用市场上的任何新工具。一个经典的本末倒置场景。
一个厨师的全部工作围绕着两个工具,火和刀的控制使用。
这体现在我收到的最好的编程建议中:学习语言,而不是框架。
如果你刚刚开始,一只手数不清你正在学习的工具的数量,那么你正在尝试使用太多的工具。
“我想建造东西”
如果你想构建一些东西,比如 web 应用程序或移动应用程序,先学习软件工程,然后再学习机器学习。
太多的模型在 Jupyter 笔记本中生存和死亡。
为什么?
因为机器学习是一个基础设施问题(基础设施意味着围绕你的模型的所有东西,所以其他人可以使用它,你想要查找的热门新术语是 MLOps )。
部署,就像把你的模型交到别人手里一样,是很困难的。
但这正是我应该在那里多呆些时间的原因。
如果我今天重新开始,我会找到一种方法来部署我建立的每一个半体面的模型(除了导致一个值得分享的实验的几十个实验)。
怎么会?
不要害怕让事情变得简单。人们可以与之交互的基本前端远比 GitHub repo 中的笔记本有趣。
不,真的,怎么会?
训练一个模型,用 Streamlit 围绕它构建一个前端应用程序,让应用程序在本地(在你的计算机上)工作,一旦工作,用 Docker 包装应用程序,然后将 Docker 容器部署到 Heroku 或另一个云提供商。
当然,我们在这里违反了使用一些过多工具的规则,但是完成几次会让你思考将你的机器学习模型放到人们手中是什么感觉。
部署您的模型将会提出当您的机器学习模型在 Jupyter 笔记本中生活时您不会提出的问题,例如:
- 推断需要多长时间(你的模型做出预测的时间)?
- 人们如何与它交互(也许他们发送给你的图像分类器的数据与你的测试集不同,现实世界中的数据经常变化)?
- 有人真的会用这个吗?
“我想做研究”
建造东西变成了研究。您会希望您的模型工作得更快、更好。为了实现这一点,你需要研究做事情的替代方法。你会发现自己在阅读研究论文,复制它们并加以改进。
经常有人问我:“在开始机器学习之前,我应该了解多少数学?”
对此我通常会回答,“在我去跑步之前,我应该知道走多远?”
我并不真的这么说,我通常会更友好一些,说一些类似这样的话,“你能解决你目前正在处理的问题吗?”,如果有,你知道的够多了,如果没有,多学学。
顺便提一下,我刚刚订购了机器学习的数学书籍。接下来的一两个月,我会从头到尾读一遍。阅读了网上的免费文本后,它足以涵盖基础知识。
先技能后证书
我已经拿到了在线课程证书。
我发现越多的证书就意味着越多的技能。
我会以 1.75 倍的速度快速浏览讲座,直到结束,通过自动化考试,并在网上分享我的进步。
我为完成课程而优化,而不是创造技能。因为看别人解释比自己学习更容易。
傻逼。
事情是这样的。我为考试学的所有东西,我都忘了。我记得通过实验学到的一切。
现在,这并不是说在线认证和课程不值得你花费时间。课程有助于培养基本技能。但是做自己的项目有助于积累特定的知识(无法教授的知识)。
- 不要堆积证书,要堆积技能(通过分享你的工作来证明你的技能,稍后会有更多的介绍)。
- 不要做更多的课程,重复你已经做过的课程。
- 不要去寻找最新的工具,而是提高你对历史最悠久的工具的使用。
- 与其寻找更多的资源,不如重读你书架上最好的书。
学习(任何事情)都不是线性的,读两遍同一本书(只要它有一些内容)比增加更多内容要好。
我经常告诉我的学生,尽管当我看到有人分享毕业证书时我感到无比自豪,但我更希望他们而不是完成我的课程,取而代之的是获得他们需要的部分,并将其用于自己的工作。
在你添加东西之前,问问你自己,“我已经从我已经覆盖的内容中吸取汁液了吗?”
我将如何重新开始
首先,比任何资源都重要的是,要摆脱“我学不会”的心态。胡说八道。你有互联网。你可以学到任何东西。
互联网催生了一种新型的狩猎采集者。如果你决定接受挑战,你可以收集资源来创造你自己的道路。
下面的路径也没有设置。它被设计成指南针,而不是地图。你猜怎么着?这些都可以在网上找到。
先打些基础吧。
2020 机器学习路线图摘录。**注意:**本课程主要关注代码优先,尤其是 Python 代码。它还忽略了移动或嵌入式设备的开发。然而,它包含了足够多的资源来获得一个突出的领域的基础。
初学者之路(6-12 个月以上)
如果我重新开始,我会学习更多与机器学习交织在一起的软件工程实践。
我的主要目标是创造更多人们可以互动的东西。
机器学习的特定部分将是:
- 机器学习概念 —了解机器学习可以并且应该用于什么样的问题。的元素 AI 就是为此而来的。
- Python —语言本身,以及机器学习特定框架,NumPy,pandas,matplotlib,Scikit-Learn。查看 pythonlikeyoumeanit 或其中每一个的官方文档。
- 机器学习工具 —主要是 Jupyter 笔记本。
- 机器学习数学——来自 3Blue1Brown 或可汗学院的线性代数,来自可汗学院的矩阵操纵和微积分或者只是看机器学习用的数学书。
除了这些,我还会经历:
-
freeCodeCamp—针对 web 开发技能。
-
使用 Scikit-Learn 和 TensorFlow 进行机器实践学习第 1 部分 —涵盖了绝大多数最有用且经过时间考验的机器学习技术。
这里有很多。因此,为了巩固我的知识,我会使用 Streamlit 或我从 freeCodeCamp 学到的 web 开发技巧来构建 1-2 个里程碑项目。当然,这些会在 GitHub 上分享。
高级路径(6–12 个月以上/持续)
一旦我掌握了一些基本的机器学习技能,我会在它们的基础上做如下的事情。
- fast . ai 的全部课程——众多深度学习和机器学习技术的实际使用案例。观看一个 fast.ai 讲座变成了我们为一个客户构建的解决方案。
- 任意一个 deeplearning.ai 的课程——选一个最能激发你兴趣的。称赞 fast.ai 的实践方法与理论。
- 全栈深度学习课程——这是你要把你已经掌握的机器学习知识和你一直在学习的 web 开发知识捆绑在一起的地方。
- 复制一篇(或多篇)研究论文。
- 包含 Scikit-Learn 和 TensorFlow 的机器学习实践书第 2 部分 — TensorFlow 侧重于概念,但概念可以连接到许多不同的应用。
同样,在经历了这些之后,我会通过建立一个人们可以互动的项目来巩固我的知识。
一个例子是由机器学习模型驱动的 web 应用程序。
示例课程
你为大学学位付出的最大的两样东西是责任感和组织结构。
好消息是,你可以自己得到这两个。
我创建了自己的人工智能硕士学位,作为一种责任和结构的形式。你可以做类似的事情。
事实上,如果我重新开始,我会遵循与 Jason Benn 的 更相似的东西,即我如何学习 web 开发、软件工程& ML 。它和我的类似,但是包含了更多的软件工程实践。
如果你能找到一个(小的)社区和其他人一起学习,那是一个很大的奖励。我还是不太清楚该怎么做。
一个十亿美元的想法是开发一个平台,人们可以创建自己的自我驱动课程,并与其他有类似经历的人互动。我在这里说自我驱动是因为所有的知识很大程度上都是自学的。讲师的角色更多的是激发、引导和挑战,而不是传授知识。
有人想建这个吗?
分享你的作品
学习读书就是吸气。建设和创造就是呼气。不要屏住呼吸。
平衡你对材料的消费和你自己的创作。
例如,你可能花 6 周的时间学习,然后用 6 周的时间将你的知识以一种共享工作的形式整合在一起。
你的分享作品就是你的新简历。
在哪里?
GitHub 和你自己的博客。需要时使用其他平台。对于机器学习项目,一台可运行的 Colab 笔记本是你的最低要求。
少了什么?
这里的一切都是以我自己的经历为依据的,我从营养学学位毕业,花了 9 个月的时间在我的卧室里学习机器学习,同时在周末开车去优步支付课程费用,找到一份机器学习工作,离开工作,建立一个机器学习课程。
我没有去编码训练营或大学学习技术技能的经历,因此无法比较两者的区别。
不过,既然我们在谈论代码和数学,它要么有效,要么无效。知道了这一点,你选择的材料的内容并不重要,重要的是你如何学习它。
本文的视频版本
我把过去三年的一些片段放在一起,并重复了几个要点,以配合这篇文章。并非所有的观点都是一样的,但它们都紧扣主题。
在 1000 天里,我设法长出了一些头发和胡须,并发展了编码技能。
我如何使用面向对象的函数来进行机器学习
我如何以及为什么将面向对象的范例应用于 Julia 机器学习。
这可能是你没有预料到的。
当我面对一些真正的第一世界函数式程序员的问题时,我经常发现自己错过了我最喜欢的面向对象编程语言的一些关键特性,主要是 C++和 Python。这应该是有意义的,因为我真的没有像在面向对象的保护伞下那样长时间呆在功能的保护伞下。不管我错过了哪些功能,我仍然热爱函数式编程范例,这是我一生中唯一的真爱,
朱莉娅
(src = http://julialang.org)
如果你还没听说过朱莉娅,首先,
我很抱歉
其次,Julia 是一种多范例统计编程语言。Julia 结合了 Python 等脚本语言的简单性和 C 或 Lisp 等编译语言的速度和多功能性。Julia 属于函数范式,尽管它支持各种类型的泛型,而且语言本身非常多变,这使得它非常通用。尽管 Julia 多才多艺,我还是要说,它肯定是面向统计程序员的。我这样推断是因为 Julia 不能被编译成可执行文件,事实上它是有功能的,而且典型的 Julia 用户都是某个领域的科学家。
通常,当一种语言被命名为“多范例”时,它仅仅意味着有一些通用的编程概念可能不与特定的范例相关联,但仍然可以以某种方式融入其中。然而,在这种特殊情况下,情况完全不同,因为
我基本上是在茱莉亚写类。
我为什么这么做
Be 在我解释我是如何做到的,或者用这种方式做事的好处之前,我应该先解释一下我为什么想做这样的事情。对于那些不熟悉的人,我是 Julia 的机器学习库的维护者,这个库叫做 Lathe。车床是一个包容性的包,旨在填补朱莉娅的 sklean-like 机器学习的空白,以及实现一些超级酷的神经元链和变压器。Lathe 的主要目标是成为一门伟大语言中如此高水平的最快和最容易的解决方案,许多对机器学习感兴趣的人都注意到了这一点。对于目前为止的模块来说,情况确实如此,而且只会越来越好。
车床:
车床使用更快的方法和简单的方法。使得包装快速、简单且轻便。许多工具和模型…
车床. ai](http://lathe.ai/)
车床如何工作
我讨厌编程的一点是有多少包是令人费解的。对于车床,有一个通用的预测方法,它使用朱莉娅的真棒调度来指导传入的使用。这样做好处是速度快,更重要的是:
可量测性
当显式导入时,可以扩展和操作 Lathe 的功能,将扩展的潜力提高到前所未有的高度。任何最终用户都可以从车床导入某些方法,并使用车床预测方法来预测他们的答案,如果他们愿意,甚至可以修改车床功能。车床是模块化的,零件可以增加和减少。最重要的是,Lathe 提供了不断扩展的统计和预处理库,可以一站式满足您所有的 ML 需求,同时只需要两个依赖项:
- Random.jl
- DataFrames.jl
这些问题
鉴于 Julia 的速度和效率,Lathe 能够在计算单个函数中的每个值(包括权重和变量)时,比 Sklearn 等替代方法的性能高出八倍。这很好,因为这意味着使用车床,您可以跳过拟合,并在一行中进行预测,如下例所示:
using Lathe.models: predict, LinearRegression
using Lathe.preprocess: StandardScalar
yhat = predict(LinearRegression(StandardScalar(Xtrain),ytrain),xtest)
很酷,对吧?
它很酷,但也存在一些问题。每次调用 predict 方法时,都需要再次计算权重。这不仅牺牲了模型在每次加载时的准确性,而且还可能是密集的,特别是当车床模型需要部署到 Genie web 应用程序中时,就像本教程中一样:
[## 在 Julia 中用车床 0.0.7 构建管道(不稳定)
数据科学的很大一部分是数据科学的一个子集,称为数据工程。数据工程(DE)包括…
towardsdatascience.com](/building-pipelines-with-lathe-0-0-7-unstable-in-julia-f7ba1850bde3)
所以我的目标就是:保留车床所熟知的一行预测,同时找到一种方法在构建模型时进行计算。这是额外的挑战,试图想出一个伟大的方式来实现我在车床上工作的新的神经网络。让一个神经网络在每次被预测时都重新训练自己肯定不是最佳的。我大脑中被忽视的面向对象部分立即尖叫起来
“初始化功能!”
但是当然,Julia 是一种函数式编程语言,所以没有类,也没有初始化函数,我们可以在任何时候创建类型…
还是有…?
我是如何做到的
笔记本:
[## emmett GB/Emmetts-DS-笔记本电脑
permalink dissolve GitHub 是 4000 多万开发人员的家园,他们一起工作来托管和审查代码,管理…
github.com](https://github.com/emmettgb/Emmetts-DS-NoteBooks/blob/master/Julia/SUPER%20STRUCT.ipynb)
当我在网上搜索并翻到了我可信赖的 Jupyter 笔记本上试图找到一个解决方案时,我在 Julia discourse 上发现了一个有趣的线索。这个线程是关于结构内部的函数的,这是一个很酷的特性,实际上你可以在 Julia 中使用正确的语法。它对我来说可能没什么作用,但它确实让我思考…如果我采用那个确切的概念,通过在函数内部创建一个类型并使用函数的开头作为初始化函数来改变它,会怎么样?以下是我跳到笔记本上测试的内容:
function Emmett(age)
Age = age
addAge() = (Age+=1)
()->(Age;addAge)
end
这个想法是,如果这可行,我们将在返回中得到一个保存数据“年龄”的类型。这不是很特别,但特别的是增加了构造类型 addAge 的属性,它实际上是一个方法。所以本质上,Python 中的等价内容应该是:
class Age:
def __init__(self,age):
self.age = age
def addAge(self):
self.Age = self.Age + 1
为了测试这一点,我首先构建了自己:
emmett = Emmett(20)
然后试着打印出我的年龄:
println(emmett.Age)
谢天谢地,它回来了:
20
接下来,我测试了这个功能:
emmett.addAge()
println(emmett.Age)
返回了:
21
太好了!
所以现在它工作了!像往常一样,我的第一反应是试图将同样的概念应用于简单的线性回归。我从 Lathe 中复制并粘贴了类型和预测函数,并删除了所有类型断言,结果如下:
功能
function pred(m,xt)
# a = ((∑y)(∑x^2)-(∑x)(∑xy)) / (n(∑x^2) - (∑x)^2)
# b = (x(∑xy) - (∑x)(∑y)) / n(∑x^2) - (∑x)^2
if length(m.x) != length(m.y)
throw(ArgumentError("The array shape does not match!"))
end
# Get our x and y as easier variables
x = m.x
y = m.y
# Get our Summations:
Σx = sum(x)
Σy = sum(y)
# dot x and y
xy = x .* y
# ∑dot x and y
Σxy = sum(xy)
# dotsquare x
x2 = x .^ 2
# ∑ dotsquare x
Σx2 = sum(x2)
# n = sample size
n = length(x)
# Calculate a
a = (((Σy) * (Σx2)) - ((Σx * (Σxy)))) / ((n * (Σx2))-(Σx^2))
# Calculate b
b = ((n*(Σxy)) - (Σx * Σy)) / ((n * (Σx2)) - (Σx ^ 2))
xt = [i = a + (b * i) for i in xt]
return(xt)
end
类型
mutable struct LinReg
x
y
end
# (Our Normal type (mutable so we don't tear our hair out))
做线性回归
首先,我必须修改预测函数,以在最后切断 for 循环,并且只在从简单的线性回归公式返回包含 a 和 b 的数据的类型之前进行计算。
显然,正是在这一点上,我,一个 20 岁的男人,决定称之为超级结构。不确定名字是从哪里来的,但是我喜欢!幸运的是,这是一个非常简单的修改,只删除了一行,添加了一行。这很棒,因为这意味着在我老得不能用键盘打字之前,改变车床的每一个功能都不会花时间。接下来,我决定继续尝试构造类型,而不是创建预测函数。
这就是问题所在。
这种非常非传统的方法使得函数能够保存方法和数据,而不是结构(是的,这是一个很大的漏洞。)我将谈到为什么这是一个问题,而且是一个相当大的问题,这个问题可以被取消,但需要对车床进行大的更改,但只有在我们从这个东西中得到一个预测之后!
埃米特在他的笔记本上,2020 年(彩色)
最终有了一个保存我们需要插入斜率公式的值的“类型”后,我做了一个快速的完整性检查,非常快速地检查了 a 和 b 的值:
println(m.a)
println(m.b)
正如所料,它返回一个数字,所以我继续使用预测函数:
function predict(m,xt)
xt = [i = m.a + (m.b * i) for i in xt]
return(xt)
end
然后编造了一些数据,我可以用简单的比率来跟踪这些数据,以便很容易看出模型是否正常工作。
x = [5,10,15,20,25,30]
y = [10,20,30,40,50,60]
xtrain = [10,15,20]
看数据,一个准确预测的输出应该是[20,30,40],果然…
有用!
好处
不用说,避免每次模型调用的再培训应该是优先考虑的事情。我认为写一个单独的完全可选的 fit 函数可能更好,但是这将需要更多的类型,并为所有类型分派,并且肯定会使整个系统变得不必要的复杂。此外,使用这种方法实际上会节省大量内存,因为数据不一定需要复制到这些新类型中(因为我们只是使用了权重,或者在本例中是 a 和 b)
(大)反面
这种方法会破坏车床使用朱莉娅调度。为了使用分派,我们需要知道通过方法传递的结构的类型。假设这不是一个 struct,并且被赋予了一个随机的名字(至少据我所知是这样的),那么在这个方法中使用 Julia 的 dispatch 是完全不可能的。不过,隧道的尽头有一线光明,因为这使得 predict 方法成为函数的一个属性成为可能,反过来,我们将能够做 Model.predict(parameters)。
因此,带着这个新发现的想法,我决定返回并修改函数,以包含预测方法:
果然,成功了!
但是一行程序呢?
美味的肉汁,让我兴奋不已!
结论
你真的每天都在学习新的东西,实验是编程世界的一半乐趣。我很想得到一些反馈,您更喜欢使用哪个版本,是带有可选 fit 的 dispatch,还是 hacky 面向对象的版本?我非常惊讶和兴奋,朱莉娅能够这样做,以满足我的需求,我希望这种发展是一个陡峭的优势超过以前的方式,如果它实际上是车床的未来!
我如何使用智能手表传感器来防止面部触摸
卢克·切瑟在 Unsplash 上的照片
一个值得追求的想法?
如果自 2020 年 2 月以来,你每天洗手的次数翻了两番,请举手。
我不能代表你在世界的哪个地方,但是在英国,人们非常重视洗手的频率。
已经有政府支持的关于洗手功效和一般手部清洁的教育活动。
消毒站在伦敦几个中心交通枢纽很常见。然而,公众仍不愿回归常态,这是可以理解的。
交通机构甚至正在考虑免费交通倡议,以鼓励公众冒险返回城市并使用交通设施。
但似乎不管我怎么洗手、消毒和擦洗;当我步入公共环境时,我仍然会小心翼翼地把手放在嘴巴、眼睛和鼻子附近。
自二月以来,有大量文章建议人们如何避免触摸自己的脸;见此处,见此处,见此处。
来自健康组织和专家的建议是有益的,值得纳入你的日常生活中,以形成一种习惯。社交距离、手肘问候和良好的手部卫生现在已经根植于我们的日常生活中。
但是如果你像我一样是人类,有时你会忘记。
我们忘记了要谨慎。
提醒我一下
白天,我是一名计算机视觉工程师,晚上,我修补各种形式的技术。
我晚上的大部分时间不是写关于人工智能的话题,就是埋头做兼职项目。
不管什么时候,我的智能手表都会振动。消息、事件、通知和警报都会在我的智能手表设备上触发轻微的轻推,仿佛在尖叫"注意!”。
在与我的一些聪明的朋友讨论过 over Zoom 之后,我建议修改一些代码,创建一个智能手表应用程序,它可以提醒我停止触摸我的脸,或者至少提醒我小心面对面的接触。
想法 相当简单。如果我的手表臂靠近或接触到我的脸,我的智能手表设备会发出轻微的震动。
我的目标是有一种提醒的形式,它不依赖于我不断保持警惕和谨慎的能力。
技术
智能手表挤满了传感器、加速度计、陀螺仪、气压计、GPS 等。
这些传感器接收的数据提供了关于你的身体状态、环境和运动的数字信息。
智能手表检测运动的能力对大多数读者来说并不奇怪,尤其是当智能手表通常会告诉你一些信息,如心率、步数、睡眠时间、水合程度等。
使用一些软件魔法和我生疏的应用程序开发知识,我设法组装了一个实际的智能手表应用程序,当我触摸我的脸或正要触摸时,它可以给你一个轻推。
我称之为 Moretion (婚姻之间的话多而动)。
让我解释一下它是如何工作的。
使用启发式
智能手表传感器不断喷出数字数据。
下面是来自传感器的数字数据的一个子部分的图像。
只是一堆数字。(图片由作者提供)
上图中的数字可能对你来说没有多大意义,但是当我们从这些数字中绘制一些图表时,我们得到的图像似乎提供了更多的意义。
绘制加速度计数据
陀螺仪数据绘制
你可能会在上面的图表中注意到一些重复的模式——请随意再看一遍。
你所观察到的是我将手移向和移离我的脸很多次。
为了检测我的手何时将要或已经触摸到我的脸,我只需选择一个阈值,并让智能手表在达到或超过阈值时振动。
这个简单的想法非常有效,我将很快讨论更多的发现,但让我与你分享这个项目的另一个有趣的方面。
使用机器学习
如果我不使用一点我的机器学习知识,我就不会公正地做这个实验项目。
大多数机器学习应用程序或“AI”都是由神经网络驱动的。一群聪明的研究人员在某种程度上用一些巧妙编写的算法复制了我们大脑中神经元之间的相互作用。
神经网络是很好的识别模式,人类也擅长于此;这就是为什么你会很快注意到上面图片中图表的振荡模式。
递归神经网络(RNN)用于检测和预测时态数据中的模式,就像前面显示的图像中的数字一样。
时态数据通常是按顺序构造的,这使得 rnn 可以很容易地从数据中提取特征——还有更多的内容,但超出了本文的范围。
未来版本的 Moretion 应用程序将实现这些神经网络。Moretion 将基本上能够预测手臂到面部的移动,并在你完全完成移动之前给你发送一个轻推。
结果
我一直在谷歌搭载 Wear OS 的 Falster 3 智能手表上试验性地使用 Moretion。当我在伦敦地铁、火车、公园等公共场所时,我通常会打开这个应用程序。
毫无疑问,我的智能手表提醒了我,我应该限制摸脸的次数。有时我甚至会忘记我已经打开了 Moretion,当我的智能手表发出’ bzzz bzzz’ 的轻推时,我会大吃一惊。
如果你有一个支持 Wear OS 的智能手表,那么如果你好奇的话,你可以试试 Moretion。该应用程序仍处于试验阶段,我将很快对其进行大量更新。在这个时间点上,它是没有形状或形式的依赖方法,你应该始终保持良好的手部清洁。
你可能已经注意到了 Moretion 的一个问题。
Moretion 只轻推佩戴智能手表的腕臂。当你用另一只手臂触摸你的脸时,你没有受到轻推或振动。
如果有足够多的人对这个项目感兴趣,我将很快探索如何解决这个问题。我已经有一些想法了。
未来的发展
在这方面还有很多工作要做。
以下是我将探索的几个工作和研究领域:
- ****电池优化:从多个传感器读取数据对电池来说非常昂贵。我已经将 Moretion 的运行时间限制在几个小时,并使应用程序能够作为后台进程运行。我可以利用很多电池优化技术来降低电池消耗。
- 苹果,Fitbit: 我也在开发苹果版的 Moretion,通过一些额外的工作,Fitbit 版本肯定可以开发出来。我开发了一个能在苹果和 Fitbit 智能手表上运行的 Moretion 版本。
- NHS(国民健康服务)批准:在经历了一些广泛的研究工作和调查后,如果使用 Moretion 来限制面对面接触的数量有好处,那么我将探索使它成为官方批准的 NHS 应用程序的可能性。这完全取决于研究工作和更多的使用结果。
- 研究/调查:检验 Moretion 智能手表应用的有效性需要付出相当大的努力。这项工作将涉及用户在使用智能手表应用程序时的测试和监控。
信息和联系方式
如果你有一个带 Wear OS 的智能手表,请随意试用 Moretion 。
联系我 讨论其他询问或您的体验。
在 LinkedIn 上与我联系。
你的文本数据中的单词有多重要?Tf-Idf 答案…
作者图片
我们人类经常处理文本数据。文本数据主要来源于语言。语言技能是我们在婴儿时期就开始练习的👶。口语大多被转换成音频形式的数据🔉,文本📃或者很少作为图像🔡。从技术角度来看,文本数据可能以不同的形式出现,如新闻文章📰,书籍📚,网页🌐,评论💬、软件代码🖥、计算机系统日志等等。不管是什么形式,这些文本数据都有自己的结构特征,这些特征是由语言(或语法)定义的。此外,在文本数据中存在语义特征(含义),这可以导致识别甚至跨语言的文本片段的相似性。随着科学领域中自然语言处理(NL 语言处理( NLP )和信息处理(IRRIR)的发展,文本表示和文本相似性成为潜在的研究领域。文本表示主要用于,
- 机器翻译—自动将文本从一种语言翻译成另一种语言。
- 文档聚类——基于结构和/或语义相似性对文本文档进行分组。
- 主题检测——识别大型文本语料库的主题。
- 文本摘要。
- 问题回答。
以及更广泛的领域,如信息检索和文档排序。
代表权问题…
即使一些与文本数据相关的用例如文档聚类可以通过考虑数据的文本相似性(通过使用编辑距离、 Jaccard 距离等)来实现。),对于自然语言处理( NLP )和信息检索(IR)中最复杂的用例,文本数据使用向量表示。这是因为大多数机器学习算法都很聪明,可以处理数字数据🧮.例如,尽管图像被视为平面中颜色组合的集合,但默认情况下,它们被表示为包含所有图像信息的数字矩阵,这些信息很容易被计算机处理。但是,在文本数据的情况下,识别有意义的表示并不那么简单。
过去引入了几种文本表示技术。其中有一键编码、 n-gram 模型、词袋模型和神经词嵌入。这些技术各有优缺点。更好的做法是挖掘您的用例,并选择最佳选项。重要的是要理解,表示是您将文本数据呈现给算法的方式。因此,您必须注意选择最合适的数据表示技术,以便您的模型看到它应该看到的数据。
词汇袋👜模型
一种流行的文本表示技术是Bag-of-Words(BoW)模型。在单词包中,模型文本或文档通过对单词的包(无序集合)进行建模来表示。这个单词包不算单词在文中的位置、语法或者结构。它只是统计单词在目标文本中的出现频率,并将这些单词放入一个*包中。*词在文本(句子或文档)中出现的频率是用于词袋模型的特征。
让我们看看如何为文本语料库创建一个单词包模型。
考虑以下文档集( D )(这里,我们将句子作为文档)。我们的目标是生成一个数字表示📊对于这些文档中的每一个。
鲍勃比其他人都聪明
约翰喜欢在晚上探索星星
文件三:天空中阳光灿烂
文件四:夜空布满了星星
第一步:清理✂️,预处理数据
在进行表示建模之前,我们应该明白原始数据总是脏的,我们必须在使用之前清理它们。
首先,我们将所有的单词都小写,以避免将不同大小写的相同单词识别为不同的单词。例如,语料库中的单词“sky”和“Sky”应该被理解为一个单词。
注意:我们可以使用一些其他的文本前置技术,比如词汇化(将单词转换成它们的基本形式(" shine “、” shining ’ “、” shined “-”>" shine “),去除停用词,比如” is “、” the “和” in ",等等。但是为了简单起见,为了强调 Tf-Idf 中 Idf (稍后将详细讨论)组件的威力,我们只坚持使用小写字母。
第二步:创建单词包
完成前面提到的预处理步骤后,我们的四个文档将是:
鲍勃比其他人都聪明
约翰喜欢在晚上探索星星
文件 3 :天空中阳光灿烂
文件四:夜空布满星星
现在,我们可以创建我们的 包 👜单词如下。
所选语料库的单词包
文本表示的 Tf-Idf
Tf-Idf(Termffrequency—Inverseddocumentffrequency)是一个词袋模型,它在捕捉文本中最重要的词方面非常强大。 Tf-Idf 背后的概念可以通过术语频率( Tf )和逆文档频率( Idf )来理解。从 Tf 和 Idf 表示生成的集合表示被称为 Tf-Idf ,它是一种强大的表示文本数据的方式。让我们进入 Tf-Idf 背后的理论。
术语频率(Tf)
顾名思义,术语频率给出了文档中出现的与 BoW 相关的术语的计数。术语频率是术语 t 和文档d的函数
我们现在可以为每个文档生成一个 Tf 向量。每个 Tf 向量是弓的尺寸(在我们的例子中是 19 的尺寸)。如果目标文档在包中没有术语,则该维度将变为零,因为上述等式的分子变为零。下表中的文档列表示每个文档的 Tf 向量。
关于单词包中的术语(t)的文档(d)的 Tf 表示。
我们可以看到,这个 Tf 表示给出了术语在文档中相对于给定的 BoW 的出现程度。但是这足以决定两个文档之间的相似性吗?让我们看看…考虑一下文件 1 和文件 2 的 Tf 表示。我们可以看到,只有术语和在这两个文档中是通用的。因此,我们的向量空间的“”-维度将显示文档 1** 和文档 2 具有相似度(即使所有其他维度将显示这两个文档不相似)。这是真的吗?实际上不是。它们有完全不同的意思。这是作为文本文档的数字表示的术语频率的缺点。词频并不强调文字在文本中的重要性。这就是 Idf 发挥作用的地方。**
反向文档频率(Idf)
逆文档频率( Idf )是一个术语相对于文档语料库的唯一性的度量。这里的想法是,出现在语料库的大多数文档中的术语不会向目标文档添加特殊信息。逆文档频率是为您的 BoW 中的每个术语定义的。
Idf 能够在 BoW 中强调术语的独特性或重要性。如果一个术语出现在大多数文档中,它就不是唯一的,并且 Idf 等式的分母会更大。因此,分数的对数将更小,Idf 值也将更小。一个独特的或罕见的单词将出现在较少数量的文档中,并且其 Idf 值将较大。让我们看看我们的弓的 Idf 值是多少。
BoW 中术语的 Idf 值
我们可以看到,项的 Idf 变为 0。这是因为它出现在所有文档中,并且没有给目标文档添加独特的含义。同样,术语 与 的 Idf 权重也很低。我们可以看到,像 bob、explore 这样在语料库中只出现在一个文档中的单词,由于其唯一性,具有更高的 Idf 值。
请记住,像 、【of】、、这样的术语并没有给文件增加特定的含义。**尽管我们在这里发现它们是独一无二的,但它们并不存在于现实世界中。为了简单起见,我们选择将这些术语( the,in,of,to 和 是 )保留在 BoW 中。但是在实际用例中,我们在前置阶段省略了这种停止字,正如我前面提到的。
天哪…!那么什么是 Tf-Idf 呢…
对…我们已经了解了 Tf-Idf 背后的理论。Tf-Idf 无非是 Tf(t,d) 和 Idf(t,D) 的乘积。
我们可以通过上面的等式为每个文档生成 Tf-Idf 矢量表示,如下表所示。
使用 Tf 和 Idf 计算的 Tf-Idf 表示。
所以,实际上, Tf-Idf 可以通过对所选语料库的词唯一性加权的词频率来理解。在目标文档中几乎随处可见而在语料库中的其他文档中找不到的术语在目标文档中具有高度的唯一性,因此在该文档中具有高 Tf-Idf 权重。
有点文字相似…
为了理解 Tf-Idf 作为文本表示的用法,让我们检查一下语料库中文档之间的相似性。这里,我们要考虑[余弦相似度](https://en.wikipedia.org/wiki/Cosine_similarity)。下表显示了每个文档对之间的余弦相似性。
文档间的余弦相似度。
通过观察余弦相似性,我们可以观察到文档 1* 和文档 2 不再相似,因为 Idf 处理了在每个文档中出现术语的问题。但是我们可以看到文档 1 和文档 3 有 0.012 的相似度。这是因为它们有一个共同的术语 就是 。尽管这些文档之间存在相似性,但 Tf-Idf 已设法通过 Idf 加权来降低相似度。文件 1 和文件 4 的相似性表现相同。文档 3 和文档 4 都是关于 天空 的,因此相似度稍高(0.097)。文件 2 和文件 4 是关于 星星 和夜晚* 的。这种相似性反映为 0.1288,这是所有相似性中最高的。****
我们可以清楚地看到,Tf-Idf 在将文本数据表示为向量方面非常有用,它有可能强调单词的重要性,并相应地对独特和信息丰富的单词进行加权。
Tf-Idf 有几种变体,可以在各个方面对其进行改进。你可以通过跟踪这个找到它们。
我希望你通过阅读这篇文章了解了 Tf-Idf 的基本结构和用途。
Tf-Idf 的缺点
尽管 Tf-Idf 是如此强大的表示文本数据的技术,它仍然是一个 BoW 模型。因此,Tf-Idf 不计算文档中单词的位置。这可能会导致 Tf-Idf 对您的文本数据给出错误的解释。
举个例子,
文献 1 :鲍勃比爱丽丝聪明
文件二 :爱丽丝比鲍勃聪明
具有相同词频的相同单词集({ ‘bob ’ ‘,’ is ‘,’ clever ’ ‘,’ than ’ ‘,’ alice’’ }),但它们给出不同的含义。但是,Tf-Idf 作为 BoW 文本表示模型,将为两个文档提供相同的表示。在 Tf-Idf 模型中可以看到的另一个主要缺点是它消耗了大量的内存和处理能力。
有一些文本表示技术,如神经嵌入,在生成向量表示时计算单词的位置。我们将在另一篇文章中讨论它们。
在那之前,祝你阅读愉快…😀
领域知识在数据科学中到底有多重要?
看看来自美国的招聘信息,不仅仅是。
美国宇航局在 Unsplash 拍摄的照片
Jeremie Harris:在某种程度上,这就像数据科学家或数据分析师必须像一名私家侦探,而不仅仅是一名技术人员。 ”
伊恩·斯科特:“ 嗯,肯定的。我并不反对 Kaggle,但当人们说 Kaggle,我已经完成了这个比赛,我有点翻白眼,因为他们只关注了 10%的问题。(… ) 这些项目中有很多都夭折了,因为 90%的其他事情都没有做好,包括利益相关者的结盟。
读到这里,你可能会想,来自德勤加拿大公司的 Omnia AI 首席科学官 Ian Scott 可能会认为参加 Kaggle 竞赛毫无用处。再想想。这只是摘自 Jeremie Harris 为 TDS 播客(14 分钟)对 Ian 的采访,并没有说明更大的画面。我将在文章中进一步讨论上下文的重要性以及脱离上下文获取信息会发生什么。
伊恩·斯科特在 TDS 播客上
towardsdatascience.com](/data-science-at-deloitte-133457084a5)
通过这篇文章,我试图找到“领域知识对数据科学家到底有多重要?”这个问题的答案,这是我在听这个采访时想到的。为此,我不仅查看了通过他们的讨论提供的见解,还查看了美国数据科学家的**招聘信息,**医疗保健、金融服务、零售、房地产、政府管理、市场研究、信息技术等领域。
上下文在数据科学中的重要性
在采访中,Ian 谈到了数据中可以分析并提供有价值信息的东西,以及数据中没有捕捉到的东西,因此在构建模型时不会考虑这些东西。数据科学家如何处理这些情况?如何设计特征以使所有相关信息和上下文数据都包含在模型中?
这就是领域知识发挥作用的地方。Ian 提到了一种方法,他们有时使用这种方法来更好地理解正在解决的问题和期望的输出:那就是将他的团队成员和客户放在同一个房间几个小时,以便他们可以一起工作来理解真正的问题,理解共享的输出,并共同构建上下文。
这里的关键词是语境。伊恩:“数据胜过背景,胜过算法。算法是我考虑的第三件事,不是第一件事。你有什么数据,给我 数据的上下文数据里的东西,那是关于我在数据 里没有看到的数据。(第 7 分钟)
对此的一种解释是:
- 数据是起点,因为我们最初会检查哪些数据可用,我们已经有了哪些数据。
- 语境。有人说 语境和数据本身 一样重要。为此,我们必须超越数据向我们展示的内容,甚至着眼于政治格局的变化等方面。或者,正如我在独立评估顾问 Michael Bamberger 关于“大数据时代的评估”*的演讲中听到的一个例子,从手机应用程序中收集的信息可能与在某些领域找到关于女性的有用见解无关,因为她们对手机的访问可能会受到其伴侣或其他家庭成员的某种限制。这就是为什么我们需要很好地掌握我们希望通过数据科学解决的问题的背景因素,这甚至可能影响结果。另一个例子是,只看伊恩·斯科特采访中的某些信息。如果你只看下面的陈述,那肯定是。我并不反对 Kaggle,但当人们说 Kaggle,我已经完成了这个比赛,我有点翻白眼。”,没有听完整个采访,他/她会认为 Ian Scott 认为做 Kaggle 比赛是没有价值的。相反,在我看来,他只是想强调光有技能是不够的,还有他们的思维方式和寻找简单答案的能力——“我们围绕人们的思维过程提出很多问题,而不是他们所知道的”。这就是断章取义的意思,有时会非常有害。*
- 算法:一种现在充分利用可用数据及其上下文的算法。
- 结果的解释和展示。我加入第四个元素是因为我相信,在这里,语境应该再次占据中心位置。结果的解释和展示应根据利益相关者/客户的需求进行。数据科学家需要能够以适当的方式向非技术受众传达他们获得的结果。
我记得在我的第一份评估工作中,我不得不快速学习许多领域特定的知识。尽管我是该领域专家团队的一员,但我需要知道他们在谈论什么,并能够建立一个适合特定环境的评估模型。所以,除了完成这个任务,我尽可能多地记录自己的相关话题。
后来,在另一个案例中,当我必须为一个医疗保健项目的评估添加意见时,我觉得在那个领域有经验的评估者比我更有优势。是的,我知道评估的方法,但是我不知道这个项目的历史和它的特殊性。然而,团队的结构和动力是不同的,我期望的输入是技术性的,而不是特定于主题的。在团队内部,我们相互补充,并设法提供所需的产出。
美国数据科学工作调查
现在,让我们看看 LinkedIn(8 月 16 日和 17 日)上来自不同领域的一些数据科学职位发布。
我们将从医院和医疗保健开始,这是我最希望需要领域知识的领域。
医院和医疗保健
为了这个话题,我查看了各个经验层次的招聘信息:实习、入门级工作、副/中高级职位以及高管和主管级别。
在最高资历级别(高管和董事),只有五份公开招聘信息,其中三份将之前的医疗保健经验和知识列为必备条件,一份提到这是潜在求职者的优势,另一份则完全没有提到。
对于助理/中高级水平,我查看了过去 24 小时的帖子,以便了解需要多少领域知识。在 10 个相关的工作公告中,6 个明确要求以前在医疗保健行业的经验,而 2 个认为这是更好的或更好的,另外 2 个实际上来自健康、保健和健身,根本没有要求领域相关的知识。
当涉及到那些要求以往经验的人时,要求听起来如下:“熟悉医疗保健环境和 EHR 数据”;“熟悉基因组学和医学影像数据”;“一年或一年以上的医疗保健工作经验,最好是在医疗保健提供商或卫生系统”;“2 年以上医疗保健数据工作经验(EHR/EMR 医疗保健信息系统优先)”等。
关于初级职位,情况与高级职位类似。有些帖子要求以前的经验,有些不要求。例如:“必须了解医疗术语、概念和价值链,具备一个或多个关键医疗领域的中级知识,例如客户、顾客、产品、提供商和/或索赔。”
当谈到实习的时候,事情就变了,因为没有提到以前在医疗保健领域的经验或教育背景。除了通常的技术技能,有些人要求对行业或他们的使命有真正的兴趣。
金融服务
肖恩·波洛克在 Unsplash 上拍摄的照片
在这种情况下,即使我对金融服务行业的职位进行了筛选,LinkedIn 也显示了其他行业的结果,如零售、员工招聘或信息技术。然而,从我设法看到的帖子来看,我注意到有些工作确实需要以下条件:产品设计、提供商业见解的经验、开发数据产品的热情,尤其是在房地产/金融领域;证明有能力将发现应用于业务问题,以提高收入和利润;敏锐的商业头脑——基于对运营、财务和组织需求和能力等的理解,利用商业判断来制定战略。在这种情况下,与零售业和房地产业一样,一些招聘信息要求有商业背景下的工作经验,或者提到这一点更好,但也有一些工作只要求必要的技术要求。
政府管理
约书亚·苏考夫在 Unsplash 上的照片
这里有两种类型的招聘信息:不需要专业知识的,也有要求专业知识的。此外,他们可能需要成为美国公民,并通过背景调查,这是意料之中的,因为雇主是政府机构。
不太可能要求特定领域知识的行业,因为它们出现在 LinkedIn 上:人员配备和招聘、信息技术、互联网、市场研究、营销&广告、媒体制作。
结论和关键要点
领域知识无疑有助于更好地理解数据和问题的背景。在某些情况下,除了技术技能之外,数据科学家可能还需要强大的主题专业知识,但在其他情况下,也取决于行业或他/她工作的组织的结构方式,这可能不一样。在 OMNIA AI (Deloitte Canada)的案例中,尽管数据科学家除了技术技能外,还需要具备某些软技能,但他们在更大的团队中工作,能够利用团队成员甚至客户的专业知识。在某些情况下,就像在评估中一样,团队可以有很大的用处,科学家不知道的数据可以在主题专家的帮助下得到解决。
当谈到数据科学职位发布时,其中一些确实要求以前在特定领域工作的经验,但不是所有的。有些行业对专业知识的要求更高(如医疗保健),有些行业则更需要专业技能(如市场调研、营销&广告等)。].其他人,不知何故处于中间,要求以前在商业环境中的经验,或认为这是更可取的。
与实习和入门级工作相比,高级工作更可能要求特定领域的知识,这是可以预料的。然而,这并不是在所有情况下都会发生。这也可能是因为某些行业的公司现在才开始将数据科学家加入他们的团队。
在准备成为一名数据科学家的时候如果你还没有确定你希望从事的领域,也试着确定一下,看看雇主对求职者有什么要求。列出这些要求,看看你如何满足它们,并制定一个磨练必要技能的计划。此外,尝试在你的目标领域做项目,并提供已经与某些潜在雇主相关的解决方案。
来源:
- “德勤的数据科学”,Jeremie Harris 为 TDS 播客采访 Ian Scott,https://towardsdatascience . com/Data-Science-at-Deloitte-133457084 a5
- *美国数据科学家 LinkedIn 招聘信息,【https://www.linkedin.com/ *
- FLOWINGDATA,文章“为什么上下文和数据本身一样重要”,采访天普大学数学教授 John Allen Paulos,2010 年 5 月 21 日,https://flowing data . com/2010/05/21/Why-context-is-as-important-the-data-self/
- IEG 全球事件:重新布线评估方法,2020 年 6 月 3 日,Michael Bamberger 关于“大数据时代的评估”的演讲,https://www.youtube.com/watch?v=bFRzcaDc0lU&list = pl 23 ljg-ncg gf _ X-90O _ wht HSI 8 xvu 6 HN&index = 37&t = 3214s
注入随机性如何提高模型精度
来源。图片免费分享。
自举聚合的魔力
装袋,或者说 b ootstrap ag 种族隔离,是机器学习中的一个独特想法。这个概念假设,在不增加任何新数据或知识的情况下,人们仍然可以简单地通过增加随机因素来提高模型的准确性。这个想法是训练一个模型集合,其中每个模型都根据数据的子集进行训练,然后汇总每个模型的预测。
因为每个模型都是在随机选择的大多数数据子集(通常在 60%到 75%之间)上训练的,所以数据中显然会有明显的重叠。然而,根据这个简单的想法,像 Random Forest 这样的 bagging 模型几乎普遍比它们的非 bagging 模型表现得更好,在这种情况下就是决策树。然而,没有添加数据——现有数据只是简单地结合了随机性——那么简单的装袋概念怎么会导致模型性能如此之高呢?
作者创建的图像。
首先,重要的是要对装袋减少方差这一事实有一个直观的理解。虽然在少数情况下这不是真的,但一般来说这是真的。作为一个例子,看看从 x 的正弦波-值 0 到 20,随机噪声来自正态分布。显然,这是非常嘈杂的数据,像决策树这样的高方差算法可能会陷入高度的随机性中,因此泛化能力很差。
作者创建的图像。
另一方面,考虑一个袋装模型。为了产生这种可视化,绘制了十条独立的曲线,每条曲线包含随机选择的百分之二十的原始数据。然后将这些点相对于其周围点的值进行平均,以形成“袋装”曲线,这大大降低了方差和噪声。
作者创建的图像。
显而易见的是,由于随机性,自举人为地“消除”了巨大的差异。当随机性加入到系统中时,正随机性和负随机性相互抵消。通过数据的重复重叠,高方差被剔除,更清晰的关系被支持和揭示。
由于模型的均方误差(MSE)等于 v + b ,其中 v 代表方差, b 代表偏差,自然,如果方差降低,MSE 也会降低。在某些情况下,当方差降低时,偏差会增加。由于 MSE 权重的计算是偏差的平方,而方差只是偏差本身,在这种情况下,装袋实际上会降低性能。
然而,在大多数情况下,减少方差而不相应增加偏差是可能的。这可以用正弦波的例子来说明,其中方差减小了,但是关系只是变得更清楚,而不是变得更有偏差。
尽管对装袋成功的方差减少的解释是直观的并且被广泛相信,但是它还没有被经验证明是尽可能准确的。bootstrap aggregating 成功的另一个解释是,打包等于影响力。这个想法的中心概念围绕着杠杆的想法,这是一个点对模型有多大影响的度量。因此,高杠杆点的存在会显著影响模型,例如,异常值对线性回归系数的影响。
来源。图片免费分享。
如虚线回归所示,不良的杠杆会使模型发生负向倾斜,而良好的杠杆可以稳定该线。不良杠杆的问题是,即使一条线不适合大多数点,指标也会因为不良杠杆的影响而改善。
在大多数情况下,杠杆有一个坏的影响,衰减杠杆可能会减少模型中不必要的方差。一个不稳定的估计值可以被定义为一个预测值,其中有许多非常有影响力的点,而自举具有降低整体杠杆的效果。当大多数杠杆点都有负面影响时,这是积极的。在某些情况下,已经表明装袋可以提高性能,即使在数学上方差没有减少的情况下,当大多数杠杆点对性能为正时也是如此。
因此,差异只是降低杠杆的下游效应。Bagging 工作得如此之好,是因为它通常通过增加随机性来减少影响,这是用正弦波观察到的。这也是为什么在杠杆点普遍影响不大的情况下,装袋表现不佳的原因。这是一个强大的概念,主要应用于基于树的方法,因为它们往往有许多 bagging 试图减少的高影响力的杠杆点。在许多方面,bagging 解决了树方法的记忆和过拟合问题,同时保留了它的许多优点。
如果你喜欢,
你可能会喜欢我的其他一些机器学习文章。
机器学习模型不需要智能,它们的大多数应用都需要执行任务,如…
medium.com](https://medium.com/swlh/real-artificial-intelligence-understanding-extrapolation-vs-generalization-b8e8dcf5fd4b) [## 每个人的 GANs
革命性人工智能概念的直观解释
medium.com](https://medium.com/analytics-vidhya/gans-for-everyone-an-intuitive-explanation-of-the-revolutionary-concept-2f962c858b95) [## 批量规范化:深度学习的最大突破
它是如何工作的——又是如何如此有效的?
medium.com](https://medium.com/analytics-vidhya/batch-normalization-the-greatest-breakthrough-in-deep-learning-77e64909d81d)
Instacart 如何利用数据科学解决复杂的商业问题
斯科特·沃曼在 Unsplash 上的照片
买杂货从来没有这么复杂
Instacart 是一半美国家庭用来从他们最喜欢的杂货店如 Costco,Wegman’s,Whole Foods,Petco 等购买食品的公司,甚至不用离开房子。
其独特的商业模式使其成为一个迷人的案例研究,研究如何在行业中使用数据科学来解决棘手的商业问题。
作为一名数据科学家,您已经学习了算法和技术,但是您如何将它们应用到企业界呢?在企业界,它们可能会带来或损失数百万美元。在本文中,我们将了解 Instacart 如何使用数据科学方法来解决其极其复杂的后端系统背后的进口业务问题。
Instacart 的商业模式
首先,介绍一下 Instacart 是如何运作的。
Instacart 做了很多工作来确保客户的用户体验是流畅的。很简单。
- 下载 Instacart 应用程序。
- 选择一家商店。有很多商店——全食超市、好市多超市、Petco 超市、威格曼超市等。
- 从商店的库存中,选择要添加到购物车中的商品。
- 选择一个一小时的时间窗口,在此期间,您希望您的杂货可以在下一个小时内送达。
由 Andre Ye 创作的图形。
不到一小时,你的杂货就送到了你家门口。UX 非常简单,也很容易导航。
购物者的体验稍微复杂一点。
- 在 Instacart 应用程序中,购物者正在轮班,当订单进入系统时,他们有机会确认订单。
- 他们开车到该订单的商店,并出示了您想要购买的商品列表。
- 当他们找到商品时,他们拿起商品,并扫描条形码以确保它是你想要的产品的准确版本。
- 他们会结帐后开车到你的地址给你送货。
由 Andre Ye 创作的图形。
这个市场有两个明显的方面——购物者和客户。然而,Instacart 实际上是一个四边市场(你能说出另外两个吗?).
双边市场?由 Andre Ye 创作的图形。
Instacart 还与产品广告商和商店合作。四方中的每一方都以某种方式与其他三方互动。每一个箭头都是数据科学加强它的机会。
见解:杰里米·斯坦
Instacart 通过送货费赚钱——例如,支付几美元获得送货,或者购买快递会员资格(每年 150 美元,不限次数)。小费和服务费归购物者所有,这有助于支付劳动力成本,但这还不够。Instacart 也通过与宝洁(Procter and Gamble)等公司和广告商的合作关系赚钱——insta cart 上约 30%的购买都是广告产品。这是数据科学的丰富脉络。
该公司还从商店获得相当大一部分收入——如果 Instacart 能够大幅提高某家商店的流量,该商店可能会愿意为此付费。
然而,Instacart 有很多成本,如交易、信用卡处理和保险。然而,最大的成本是购物者购买食品杂货和开车所花费的时间——所以 Instacart 的主要目标是让系统更有效、更快地运行,以便获得更多利润。
- Instacart 表示,他们的效率比开始专注于优化后端效率之前提高了约 40%。
- 快递客户平均每月花费约 500 美元——经常使用这项服务的人。
- 90%的客户都是回头客。
Instacart 独特的商业模式让数据科学成为关注的焦点,有助于提高利润,并让其四边市场中的四方都更开心——让我们来看看 Instacart 面临的一些数据科学问题和挑战。
方差螺旋与预测。
Instacart 在路上运行——所以当旧金山或纽约这样的大城市出现道路堵塞时,购物者就会受阻。当食品迟到时,顾客会更不高兴。
安德烈·叶制图。
天气变化非常大,当天气寒冷时,客户不想出去买杂货,所以他们可能会更多地使用 Instacart(更高的需求)。然而,作为一个购物者,你不会想在天冷的时候出去,所以很少购物者会去上班(需求减少)。天气好的时候,情况正好相反——更多的人可能想自己去购物(需求减少,供应增加)。
Instacart 和全国 50%的食品杂货都被天气推来推去,他们对此无能为力。
不仅仅是天气——特殊事件和名人或皇室人物的来访会堵塞道路,降低 Instacart 的效率。这些不能仅仅作为离群值而被忽略,因为它们已经发生了,并且将来还会再次发生——它们需要被考虑进去。然而,这意味着数据中的巨大差异,这使得数据预测变得困难。
结帐队伍中的可变队列长度和交货地点的可用停车位是另外两个变量,这两个变量在几个可分因素的组合上有很大不同,如日期、温度、给定商店的库存等。
在许多数据科学应用中,均值是最重要的,但在 Instacart 的情况下,方差和均值一样重要。方差会干扰预测,使估计时间难以置信。(你会如何解决这个问题?)
由此,Instacart 面临两个主要挑战。首先是你如何平衡供需?正如之前的天气所显示的那样,供给和需求经常是相互矛盾的,而不是朝着一个有利的平衡发展。过多的需求和不足的供给会降低顾客的满意度和忠诚度,过多的供给和过少的需求对于依靠紧迫感和效率来获得利润的公司来说意味着没有生产力。
第二个挑战是,一个供给和需求已经达到平衡,如何将购物者路由到尽可能高效?哪些购物者应该去哪些地方,以什么顺序,以最大限度地提高他们的效率,但仍然确保交货准时到达?
衡量需求是困难的。
对任何企业来说,衡量需求对于评估他们的表现是至关重要的。然而,在 Instacart 的情况下,做到这一点相当困难。
当访问者使用 Instacart 时,他们会指定希望他们的杂货到达的交付窗口。因为在某些时间段(如高峰时段)订单会累积,购物者不可能处理所有订单,所以 Instacart 实施了“繁忙定价”,这提高了送货价格。
Instacart 使用机器学习模型来预测时隙何时会填满,以在实际时隙完全填满之前实施繁忙定价。当该时段完全填满时,Instacart 会从可用交付时间列表中删除该时段。该公司还利用销售定价来填补空的时间段。
由 Andre Ye 创作的图形。
每个 Instacart 访问者都有三种结果:
- 他们可以去结帐。
- 他们想结账,但因为没有他们想要的送货选项而走开了。
- 他们只是想探索应用程序,从来没有打算购买任何东西,或为未来构建一个篮子。
在所有这些场景中,访问者都会访问这个页面。你如何区分购买/结账的真实需求和为未来构建篮子的需求,或者只是想探索 Instacart 的需求?
注:“统计需求”是指统计的或已知的需求数量。继续购物的顾客的交易会被记录下来。然而,想要购买食品杂货(需求存在)但没有留下任何购买记录(没有购买任何东西)的客户被视为“未计算的需求”。
由 Andre Ye 创作的图形。
Instacart 建立了一个概率模型来预测访问者在可用情况下进行购买的机会。它考虑了市场和用户的特征,以及他们看到的可用性——哪些窗口是开着的,他们是忙价还是特价,等等。
通过预测每个人都有 100%的可用性,该模型可以估计需求-如果每个人都有 100%的可用性,会有多少次交付?已统计和未统计的需求都会被考虑,但虚假需求不会——这是一个聪明的过滤器。
Andre 创作的图形
使用这种方法,Instacart 能够估计 orange 的需求,以及“丢失交付”的数量(需求-成功购买的数量)。
图片:杰里米·斯坦,Instacart
如果 Instacart 要做任何调度、人员配备或预测,他们希望在正确的需求下完成。现在,他们不仅可以计算,还可以估计丢失的快递数量。
预测交货履行时间
给定一个小时的时间框架,Instacart 的工作是在这段时间内交付食品杂货。否则,顾客的幸福感会下降——事实上,早一点去买菜会让顾客有更高的幸福感。
图片:杰里米·斯坦,Instacart
考虑到顾客满意度的重要性,能够估计给定购物者的履行时间,从而为他们提供最有效的路线是必不可少的。
你可能会认为 Instacart 可以使用谷歌地图的旅行时间,但 Instacart 建立了自己的模型,其性能优于谷歌地图的旅行时间。该公司需要建立自己的旅行时间估计器,因为他们的购物者不是传统的司机——他们经常重复前往同一家商店,需要放下杂货店,进入商店等等,谷歌地图没有纳入这些组件,但 Instacart 的模型可以。
来源:杰里米·斯坦,Instacart
谷歌地图 API 不适合 Instacart 还有一个原因——他们必须为 Instacart 为其购物者考虑的所有路线组合做出预测。有一组候选路线,需要在一个自己进行优化的系统中进行。当你在估计数万亿条路线的完成时间时,等待 100 毫秒用 Google API 检查是不可行的。
一个内部组件可以相互通信、估算器可以根据 Instacart 的特定数据类型进行调整的系统,还是一个需要缓慢的外部 API 的系统?由 Andre Ye 创作的图形。
Instacart 使用分位数回归进行预测。除了寻找平均时间,第 95 百分位的可能时间是多少?或者,第五百分位可能时间?Instacart 的系统考虑了所有步骤中方差的相关性,以便在未来累积方差。
对于模型,Instacart 使用梯度推进决策树——它们有过度拟合的趋势(偏向偏差-方差尺度上的方差),这对于 Instacart 的高方差需求来说是完美的。
他们*【梯度推进决策树】*可以或多或少地记忆数据,这本质上是我们希望在这里发生的许多事情。当我们计划所有不同的组合时,我们可以将它们扩展到每分钟数百万次预测。
-杰里米·斯坦,Instacart
Instacart 有一个很好的方法来估计履行时间——现在它如何为所有的购物者绘制路线呢?
为购物者绘制路线
假设你要处理 300 份订单和 100 名顾客。尽管每次旅行只有三个订单,但有 4.45 亿个送货组合和 100 个不同购物者的 3 个组合。Instacart 每分钟都在处理这些问题——这只是一个小例子。
直觉上,你知道 Instacart 不会搜索所有 4.45 亿个组合,并挑选最重要的一个。
Instacart 的目标是最大化找到的商品数量。
在许多大城市,有很多相同的商店,只是位置不同。如果他们都有相同的产品,购物者可以选择最接近的一个。
由 Andre Ye 创作的图形
然而,库存并不总是最新的。这意味着,在评估客户清单上的产品出现在几家商店库存中的可能性后,Instacart 可能会牺牲额外的距离来换取客户满意度,这是因为客户想要的确切产品出现在库存中的可能性更高。
由 Andre Ye 创作的图形。
然而,如果事实证明好市多#1 确实有顾客寻找的产品,那么 Instacart 只是浪费了额外的时间去更远的商店——随之而来的是,顾客对产品准时到达的宝贵快乐。
对于 Instacart 来说,一秒钟就是金钱。
由 Andre Ye 创作的图形。
Instacart 使用贪婪试探法,这是一种聚合可能的交付并对聚合进行优先级排序的简单方法。事实上,Instacart 的第一个算法甚至更简单。它基于一个问题:
接下来什么快递最有可能迟到?
不管答案是什么,算法都会派一个购物者去处理。如果在第一次递送仍然及时的情况下,还有另一次递送可以添加到列表中,那么它将被添加——并且算法将继续这样沿着列表向下。
从那以后,Instacart 通过使用高效的机器学习方法,对他们的算法进行了巨大的改进——延迟交付减少了 20%,丢失交付稳定,购物速度提高了,忙碌时间百分比增加了 20%。
很复杂。Instacart 每秒钟运行无数次模拟,在计算可行的情况下找到最佳路线。
结论
后端有很多事情在进行。用户体验简单、干净、可靠——如果用户熟悉 Instacart 应用程序,他们可以在不到一分钟的时间内订购杂货。然而,在简洁易用的用户界面背后是一个庞大的系统,由智能机器学习和数据科学决策和应用程序驱动,它把你的杂货送到你面前,让你高兴,也让购物者、商店和广告商高兴。
本文是前 Instacart 的杰里米·斯坦(Jeremy Stan)40 分钟演讲的总结。如果你有兴趣听完整个演讲,可以点击这里进入。所有来自“Jeremy Stan,Instacart”的图片都来自他的幻灯片。
我希望这篇文章能够让您了解看似简单的 ui 背后的复杂系统,并探索和理解如何智能地应用数据科学和机器学习方法来解决实际的业务问题,使用 Instacart 的独特业务模型作为案例研究。
(想知道我是如何为本文制作图表的吗?看看这个故事吧。软件可能会让你大吃一惊:)
AI 是如何帮助截肢者的?
犹他大学的新假肢设计
在 Unsplash 上拍摄的 ThisisEngineering RAEng
人工智能让事情变得更好,或得到改善。零售店通过使用机器学习技术来更好地管理库存。网飞提供更适合用户口味的内容。亚马逊能更好地预测消费者可能会买什么。癌症检测过程更加准确和快速。这一切都归功于人工智能领域的工具和技术。
人工智能让生活更美好的一面也在帮助截肢者。通过使用人工智能,已经使截肢者的生活更容易的假肢得到了进一步改善。犹他大学的科学家设计了一种人工智能假肢,它可以根据用户臀部和残肢的运动进行自我调整。它所实现的是提供一种更平滑和更容易的方式来跨越障碍。
想一想一个正在行走的人。当有一个障碍或一些她不应该踩的东西时,她只是不加思考地跨过去了。动作流畅,除非障碍太大。身体,尤其是臀部和四肢得到调整,使这一运动更加流畅。然而,截肢者跨越的过程并不那么容易和顺利。即使有了假肢,截肢者通常也要停下来一秒钟,调整自己的身体来跨越障碍。这就是科学家应用人工智能设计假肢的动机。
犹他大学生物医学工程助理教授 Tommaso Lenzi 将这项技术描述为“每秒钟一千次,人工智能会观察残肢(即用户的生物臀部,截肢部位以上)的运动,并模仿生物腿,规划仿生关节的新运动,以优化光滑度”。这是一段与这项研究一起发布的视频。
该视频清楚地解释了这一概念,并展示了人工智能动力假肢的成功。请注意使用普通假肢跨越障碍有多困难。使用者必须调整整个身体才能继续前进。另一方面,人工智能驱动的机器人更容易越过障碍。这几乎就像一个没有截肢的人做的一样。假肢上的控制器弯下腰来提供平稳的运动。
这还不是最终产品。这种设计量产后可能会有变化或改进。然而,这一初步成就显示了人工智能帮助截肢者的潜力。当然,它将不限于四肢。人工智能驱动的义肢肯定比普通义肢有用得多。例如,当一个人向前倾斜时,假肢会解释这种运动,并采取适当的行动,如调整手指的位置以抓住东西。
AI 让事情变得更好。让它让生活更美好。
人工智能和机器学习已经引领了卫生领域的许多进步。看起来我们将会看到更多这样的进步。我认为医疗保健是人工智能应该关注的最重要的领域之一。AI 让事情变得更好。让它让生活更美好。这就是犹他大学的科学家们正在努力实现的目标。
感谢您的阅读。如果您有任何反馈,请告诉我。
参考文献
- 【https://www.inverse.com/innovation/ai-prosthetic-leg 号
- https://www.youtube.com/watch?v=gFLItJS1_LI&feature = youtu . be
数据科学如何帮助新冠肺炎疫情?
建立关系模型以加速对疾病动态的理解
作者图片
2011 年,在胰腺癌过早死亡的阴影下,苹果创始人史蒂夫·乔布斯顿悟了。“我认为 21 世纪最大的创新将是生物学和技术的交叉。一个新的时代正在开始。”(艾萨克森,2011 年)他非常感激他的疾病激发了他上大学的儿子里德研究基因组学的热情。
今天,人类正面临——至少十个月以来——自 1917 年西班牙疫情流感以来,在发病率和死亡率的速度和潜力方面最重大的公共卫生挑战之一。但与 1917 年不同,科学现在对生物学、基因组学和疾病动力学有了指数级的更先进的理解。自 2010 年左右以来,我们有了强大的能力,可以使用算法来发现和收集远远超出人类认知能力甚至速度更快的模式和见解。所有这些都回避了一个问题——在机器学习时代以来的第一次全球疫情中,它如何帮助我们?
在谷歌学术上快速搜索可以发现 2020 年 19700 篇预印或发表在同行评审期刊上的论文,这些论文都与人工智能或机器学习以及新冠肺炎相关。本月发表在爱思唯尔杂志混沌、孤立子、&分形上的一篇元综述发现,人工智能和人工智能在新冠肺炎的应用可以归类为筛选、预测、预报、接触追踪和药物开发等功能(Lalmuanawma,2020)。美国国家卫生研究院(NIH)、 PLOS 、医学互联网研究期刊家族 (JMIR)和MedRxiv——BMC、耶鲁和冷泉港实验室的出版物——一直是领先的出版商,公众和科学家之间的大多数传播可以说是通过 Twitter 进行的。
虽然我有偏见,但一个很好的例子是“对新型冠状病毒(新冠肺炎)的病原体-免疫关系的机器学习解释,以及预测免疫和治疗机会的模型:比较有效性研究,”上周发表在 JMIRx Med 上。除了其潜在的重要性,它还举例说明了数据科学如何能够更准确地聚焦,从而提高公共卫生干预措施和政策的效力(Luellen,2020)。
这项研究的关键是,大约 80%的新冠肺炎感染者是无症状的,或者是免疫的,这些有害的症状会导致疾病和死亡,但仍然可以感染其他人。迄今为止,没有人知道为什么或如何识别这些“沉默的携带者”。如果有一种可靠的方法来提前将他们从 20%的患病人群中分类或区分出来,那么免疫者就可以去工作、上学、购物和旅行,而不会给自己带来风险。与此同时,20%的风险人群可以得到保护。此外,如果有不同的生物化学、基因组或分子生物标志物来区分免疫者和患病者,这将提高我们对疾病动力学的理解,并为那些不能接种疫苗的人提出新的可能的治疗方法。最后,它可以帮助决策者优先考虑大规模疫苗接种,从 20%的最大风险开始。
总之,该研究通过机器学习找到了两种途径来准确分类或预测谁可能对新冠肺炎免疫,谁在 20%的风险群体中。在一个由 37 名无症状和 37 名有症状的新冠肺炎患者组成的研究组中,100%的无症状患者的干细胞生长因子β(SCGF-B)——一种免疫蛋白——大于 127,637。或者,94.8%的新冠肺炎免疫患者具有两种其他免疫特征:白细胞介素-16 (IL-16)大于 45,巨噬细胞集落刺激因子(M-CSF)大于 57。
在宏观层面上,数据科学如何被用于协助新冠肺炎疫情的有趣之处还在于研究结果是如何传播的以及在哪里传播的。MedRxiv 于 2020 年 8 月 16 日出版了预印本——经过专业质量审查,但未经同行审查。今天,1,453 人阅读了该摘要,另有 328 人全文下载了该论文。它被 108 个人转发了约 332 次,Altmetric 影响力得分为 58。与此同时,2020 年 10 月 19 日出版的同行评审出版物被五个人发了大约七次推文,被一家新闻媒体转载和播放,并在头五天内在 LinkedIn 上被观看了 191 次,到目前为止,Altmetric 影响力得分为 10。
这个有趣的经历证实了元问题仍然没有改变:科学发现的速度快于人类意识到和应用它们的速度。即使使用社交媒体工具,如在互联网上实时发布结果以便立即免费传播,Twitter,LinkedIn 等。有意义地利用大量科学发现的挑战依然存在。下一代有影响力的工具将是那些能够通过精英管理来识别最重要的研究发现并将其加速付诸实践的工具。
参考
艾萨克森,W. (2011 年)。史蒂夫·乔布斯。纽约:西蒙&舒斯特。
拉穆阿那瓦马,s .,侯赛因,j …(2020).机器学习和人工智能在新冠肺炎(新型冠状病毒)疫情的应用:综述。混沌,孤子&分形,139: 110059。
卢埃勒(2020)。新型冠状病毒(新冠肺炎)的病原体-免疫关系的机器学习解释,以及预测免疫和治疗机会的模型:一项比较有效性研究。 JMIRx Med ,1(1):e23582。
逻辑回归作为分类算法是如何使用的?
回归和分类矛盾吗?
监督学习算法可以分为两大类:
- 回归:预测连续的目标变量。例如,预测房子的价格是一项回归任务。
- 分类:预测离散目标变量。例如,预测电子邮件是否是垃圾邮件是一项分类任务。
逻辑回归是一种监督学习算法,主要用于解决二元“分类”任务,尽管它包含单词“回归”。“回归”与“分类”相矛盾,但逻辑回归的重点是“逻辑”一词,指的是在算法中实际执行分类任务的逻辑函数。逻辑回归是一种简单但非常有效的分类算法,因此它通常用于许多二元分类任务。客户流失、垃圾邮件、网站或广告点击预测是逻辑回归提供强大解决方案的一些领域的例子。它甚至被用作神经网络层的激活函数。
逻辑回归的基础是逻辑函数,也称为 sigmoid 函数,它接受任何实数值并将其映射到 0 到 1 之间的值。
逻辑回归模型将线性方程作为输入,并使用逻辑函数和对数比值来执行二元分类任务。在详细讨论逻辑回归之前,最好先回顾一下概率范围内的一些概念。
概率
概率衡量事件发生的可能性。例如,如果我们说“此电子邮件有 90%的可能性是垃圾邮件”:
Odds 是肯定类别(电子邮件是垃圾邮件)和否定类别(电子邮件不是垃圾邮件)的概率之比。
对数赔率是赔率的对数。
所有这些概念本质上代表相同的度量,但方式不同。在逻辑回归的情况下,使用对数优势。我们将看到为什么对数概率在逻辑回归算法中是首选的原因。
对数比值是比值的对数,比值是正类与负类的概率之比。
概率为 0.5 意味着该电子邮件是垃圾邮件还是非垃圾邮件的几率相等。请注意,概率为 0.5 的对数赔率为 0 。我们将利用这一点。
让我们回到 sigmoid 函数,用不同的方式展示它:
取两侧的自然对数:
在等式(1)中,代替 x,我们可以使用线性等式 z :
那么等式(1)变成:
假设 y 是正类的概率。如果 z 是 0,那么 y 是 0,5。对于 z 的正值,y 大于 0.5,对于 z 的负值,y 小于 0.5。如果正类的概率大于 0,5(即大于 50%的几率),我们可以预测结果为正类(1)。否则,结果是一个负类(0)。
注:在二元分类中,有正/负、1/0、真/假等多种方式来表示两类。
下表显示了一些 z 值和相应的 y(概率)值。所有实数都映射在 0 和 1 之间。
如果我们画出这个函数,我们将得到著名的逻辑回归 s 形图:
分类问题归结为求解一个线性方程:
这似乎就像解决一个线性回归问题。函数的参数在训练阶段用最大似然估计算法确定。然后,对于任意给定的自变量(x1,… xn)的值,可以计算出正类的概率。
我们可以“原样”使用计算出的概率。例如,输出可以是电子邮件是垃圾邮件的概率是 95%,或者客户将点击该广告的概率是 70%。然而,在大多数情况下,概率被用来分类数据点。如果概率大于 50%,则预测为正类(1)。否则,预测为负类(0)。并且,我们刚刚将线性回归问题的解决方案转换为二元分类任务。
逻辑回归是一个简单但非常强大的算法来解决二元分类问题。逻辑函数(即 sigmoid 函数)也通常在非常复杂的神经网络中用作输出层的激活函数。
感谢您的阅读。如果您有任何反馈,请告诉我。
强化学习在商业中是如何运用的?
近年来,强化学习已经证明它可以在不同的游戏中取得比人类更好的结果。但是 RL 也可以用在现实世界的业务中吗?
h2RL 目前被用于几个行业以增加利润。]
强化学习(RL)第一次被如此命名是在半个多世纪前的 20 世纪 60 年代。不久之后,一些研究人员的兴趣从 RL 转移到监督学习,这导致了这两者之间近二十年的混淆。事实上,在 Rosenblatt (1962)和 Widrow 和 Hoff (1960)的著作中,可以看到 RL 和监督学习之间的界限是如何模糊的,在这些著作中,他们使用奖励和惩罚来描述监督学习技术。最后,在 20 世纪 80 年代末,Watkins 向世界介绍了 Q-learning (1989) ,融合了时间差和最优控制研究思路,创造了我们今天使用的现代 RL。
RL 已经走过了漫长的道路,如今,由于在几场视频游戏中取得了超人的表现,如 Pong、Enduro 、 Montezuma 的复仇、其他雅达利游戏和,甚至击败了围棋世界冠军,RL 已经闻名世界。但是,RL 的所有这些用例都是基于(视频)游戏的,许多人甚至称之为营销噱头。尽管许多当前的研究工作已经改进了 RL,使其更有效、更智能和更安全,但 RL 仍然面临着阻碍其在现实世界任务中使用的挑战。
然而,这并没有阻止工程师在许多业务中使用 RL 取得巨大成功,并在此过程中赚了很多钱。小型和大型企业不应该忽视 RL,因为如果使用得当,它可以带来巨大的好处(和利润)。为了给你一些启发,让我们看看世界上一些最大的公司目前是如何使用 RL 来改善他们的业务的。
推荐系统
RL 在商业中最受欢迎的应用可能是在推荐系统中。网飞已经公开宣布,它正在使用 RL 向其用户推荐系列和电影,以及其他机器学习算法,网飞的研究人员正在定期使用 RL 发表论文。 Spotify 也承认使用多臂强盗,一种 RL 算法,用于管理歌曲和艺术家推荐的开发和探索之间的权衡。在 exploitation 中,推荐器推荐与用户正在听的内容高度相关的元素,而 exploration 则推荐不同但用户可能喜欢的内容,为用户带来新的发现。
Spotify 和网飞已经公开承认使用 RL 作为其推荐系统[图片来自 Pexels 。]
亚马逊、易贝、MercadoLibre 和许多其他大型在线零售商也在使用推荐系统,甚至 Medium 也在赞助 2020 RecSys(推荐系统会议)。很容易看出原因:麦肯锡估计,亚马逊上 35%的消费者购买来自其网站的推荐。基于 RL 的推荐系统越来越受欢迎,很可能许多大公司都在使用它们,尽管我们对此一无所知。推荐算法给了公司如此大的商业优势,以至于实际的算法从来没有公开过。也许将来会看到它们中的一些被保存在一个金库里,就在可口可乐秘密配方旁边。
贸易
股票交易机器学习算法有许多实现方式,特别是 RL 算法。然而,这些实施大多被视为机器学习如何用于交易的例子,该领域的大公司直到去年才开始接触它们。
摩根大通也在交易中使用 RL。]
2019 年 4 月,摩根大通宣布开始利用深度神经网络算法执行(DNA)来提升其外汇交易算法。关于精确算法的细节没有公布,但根据在其网站上的简要描述,这些算法似乎可以分析和解释信息,以实时选择最佳的订单安排和执行方式。此外,DNA 使用 RL 来评估个人下单选择的绩效。该公司尚未宣布他们新方法的结果,但已经表示将“加倍”使用机器学习进行外汇交易,暗示有希望的结果。
机器人学
RL 的使用在机器人行业得到了很好的传播【图片来自 pxfuel 。]
几家公司正在使用 RL 来控制制造业中的机器人。事实上,研究中引用的最常见的 RL 用例之一是控制机器人或机器人部件,如机器人手;RL 在机器人学中的应用一直激励着科学家,也为 RL 算法提供了一个很好的验证场景。机器人塑造了制造业,降低了成本,同时减少了生产时间,RL 承诺将这一点进一步推进:RL 提供了一种以高精度控制机器人部件的方法,这些部件具有非常难以编程的复杂行为。
RL 在机器人领域的使用越来越多,涌现了许多初创公司:最近一家知名的公司是 Covariant,其研究人员和工程师来自加州大学伯克利分校和 OpenAI。他们最近筹集了 4000 万美元的资金,所以我们可能会在未来看到更多的共变机器人。
冷却谷歌的数据中心
你可能从来没有想过,但是你能想象运行谷歌的数据中心需要多少能量吗?据估计,行业内数据中心每平方英尺消耗的能源是任何其他商业建筑的 10 至 50 倍,难怪会是这样:数据中心需要能源来运行服务器,数据必须定期备份,服务器需要冷却到 20 至 24°C(68 至 75°F)的恒温。仅冷却数据中心就消耗了大约五分之一的总能源,因此这方面的任何改进都可以转化为数据中心的巨大利润。事实上,据估计,到 2024 年,数据中心冷却市场的价值可能达到 200 亿美元。
计算机服务器需要保持 20-24 摄氏度的恒温[图片来自维基媒体。]
谷歌正在使用 AlphaGo ,也就是击败围棋世界冠军的 AlphaGo,来找出冷却基础设施的最佳框架,如风扇和通风,这将最有效地降低能耗。AlphaGo 被用作推荐系统,向基础设施运营商建议提高能效的选项。这导致冷却数据中心所需的能源减少了 40%,可以想象,这意味着总体成本的巨大节约。
接下来会发生什么?
虽然监督和非监督学习已经在几乎所有行业中取得了进展,但 RL 直到现在一直处于次要地位。这可能是因为 RL 提出了几个挑战,例如样本低效、安全学习和定义良好的奖励函数,这些都是在为现实世界问题实现 RL 解决方案之前必须解决的。如果你想了解更多在现实世界中应用 RL 的挑战,我推荐《现实世界强化学习的挑战》(Dulac-Arnold et al. 2019) 。
研究人员已经开发了几种方法来处理这些问题,我们现在看到一些方法在不同的解决方案中实施,如系统和服务配置、自动驾驶和其他一些解决方案。如果我们认为这只是 RL 能为我们做的所有事情的冰山一角,毫无疑问,未来看起来非常光明!
你知道企业中 RL 的其他实现吗?如果是这样,我很想听听他们的故事!感谢您的阅读!
样本大小与标准误差、功效、置信水平和效应大小有什么关系?
查尔斯·德鲁维奥在 Unsplash 上拍摄的照片
使用图表来展示相关性
在进行统计分析时,尤其是在实验设计期间,一个不可避免的实际问题是确定实验的样本量。例如,在设计网页的布局时,我们想知道增加点击按钮的大小是否会增加点击率。在这种情况下,AB 测试是一种常用于解决这一问题的实验方法。
转到这个实验的细节,您将首先决定我需要给实验组分配多少用户,以及我们需要给控制组分配多少用户。样本大小与四个变量密切相关,即样本的标准误差、统计功效、置信水平和本实验的效果大小。
在本文中,我们将通过图表展示它们与样本量的关系。具体来说,我们将讨论单尾假设检验的不同情况。
标准误差和样本量
统计的标准误差对应于参数的标准偏差。由于在大多数情况下几乎不可能知道总体分布,我们可以通过计算抽样分布的标准误差来估计参数的标准偏差。标准误差衡量分布的离差。样本量越大,离差越小,分布的均值越接近总体均值(中心极限理论)。因此,样本大小与样本的标准误差负相关。下图显示了不同样本量下分布的不同形状:
随着样本量变大,采样分布的离差越来越小,分布的平均值越来越集中,而较平的曲线表示离差较大的分布,因为数据点分散在所有值中。
了解样本量和标准误差之间的负相关有助于进行实验。在实验设计中,有必要不断监测标准误差,看看我们是否需要增加样本量。例如,在我们之前的例子中,我们想看看增加底部的大小是否会增加点击率。我们需要在对照组和实验组中测量的目标值是点击率,它是一个计算如下的比例:
比例统计的标准误差为:
当比例为 0.5 时,标准误差最高。在进行实验时,如果观察到 p 接近 0.5(或 1-p 接近 0.5),则标准误差在增加。为了保持相同的标准误差,我们需要增加样本量 N,以将标准误差降低到原始水平。
统计功效和样本量
统计功效也称为敏感度。它由 1- β计算,其中β为 II 型误差。更高的能力意味着你不太可能犯第二类错误,即当零假设为假时,不能拒绝零假设。如这里所述:
换句话说,当拒绝区域增大(接受范围减小)时,就有可能拒绝。因此,第一类误差增加,而第二类误差减少。下图描绘了单尾假设检验的统计功效、I 型误差(α)和 II 型误差(β)之间的关系。选择置信水平(1-α)后,蓝色阴影区域是该特定分析的功效大小。
从图中可以明显看出,统计功效(1- β)与第二类误差(β)密切相关。当β减小时,统计功效(1- β)增加。统计功效也受 I 型误差(α)的影响,当α增加时,β减少,统计功效(1- β)增加。
中间的红线决定了接受范围和拒绝范围的权衡,决定了统计功效。样本量如何影响统计功效?要回答这个问题,我们需要改变样本量,看看统计功效是如何变化的。由于第一类误差也随着样本量的变化而变化,我们需要保持它不变,以揭示样本量和统计功效之间的关系。下图说明了它们之间的关系:
当样本量增加时,分布将更加集中在平均值附近。为了保持 I 型误差不变,我们需要降低临界值(由红色和粉色垂直线表示)。因此,新的接受范围更小。如上所述,当它不太可能接受时,它更有可能拒绝,因此增加了统计能力。该图说明了统计功效和样本大小彼此正相关。当实验需要更高的统计功效时,就需要增加样本量。
置信水平和样本量
如上所述,置信水平(1- α)也与样本大小密切相关,如下图所示:
由于蓝色和黑色分布的接受范围保持不变,统计功效保持不变。随着样本量变大(从黑色到蓝色),I 型误差(从红色到粉色)变小。对于单尾假设检验,当 I 型误差减小时,置信水平(1-α)增加。因此,样本量和置信水平也是正相关的。
效果大小和样本大小
效应大小是实验的实际显著水平。由实验设计者根据实际情况设定。例如,当我们想检查增加网页底部的尺寸是否会增加点击率时,我们需要定义我们测量的实验组和对照组之间的差异有多大实际意义。0.1 的差异是否足以吸引新客户或产生可观的经济利润?这是实验设计者不得不考虑的问题。一旦设置了效果大小,我们就可以用它来决定样本大小,它们之间的关系如下图所示:
随着样本大小的增加,分布变得更尖(黑色曲线到粉红色曲线。为了保持置信水平不变,我们需要将临界值向左移动(从红色垂直线移动到紫色垂直线)。如果我们不移动替代假设分布,统计功效将会降低。为了保持功效不变,我们需要将备择假设分布向左移动,因此有效效果会随着样本量的增加而降低。它们的相关性是负的。
如何解释上面讨论的相关性?
总之,我们在样本大小和其他变量之间有以下相关性:
为了解释,或者更好地记忆这种关系,我们可以看到,当我们需要减少错误时,对于第一类和第二类错误,我们需要增加样本量。较大的样本量使样本更能代表总体,也是用于统计分析的较好样本。随着样本量的变大,更容易检测出实验组和对照组之间的差异,尽管差异更小。
给定其他变量,如何计算样本量?
计算样本大小的方法有很多,很多编程语言都有计算样本大小的软件包。例如,R 中的 pwr() 包可以完成这项工作。比起知道确切的公式,更重要的是理解公式背后的关系。希望这篇文章能帮助你理解这些关系。感谢您的阅读!
这是我所有博客帖子的列表。如果你感兴趣的话,可以去看看!
我快乐的地方
zzhu17.medium.com](https://zzhu17.medium.com/my-blog-posts-gallery-ac6e01fe5cc3) [## 阅读朱(以及媒体上成千上万的其他作家)的每一个故事
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
zzhu17.medium.com](https://zzhu17.medium.com/membership)
大数据分析在控制方面的现状如何?
现实世界中的数据科学
控制中的使用和发展
T 对使用数据的兴趣导致采用大数据分析来改善决策过程的趋势日益增长。大数据分析被定义为“高级分析技术在大数据集上运行的地方”。由于数据驱动市场的竞争日益激烈,企业正在采用最先进的信息技术来获得竞争优势。
控制或管理会计部门的的角色直接受到大数据分析工具的影响,因为在使用信息支持管理方面,控制者是公司的核心单位。挑战之一是从这些无处不在的信息量中获得洞察力。然后,收到的见解将用于制定决策和调整组织流程以产生价值。
管理会计师或财务总监支持并建议组织的管理层实现其经济、公共和/或财务目标。支持是指管理控制和会计信息系统的设计和维护,以及信息的获取和分发。”
因此,一个公司的决策是基于来自分析结果的证据,而不仅仅是他们经理的直觉。还必须考虑商业文化方面和技术方面,例如合适的基础设施和用户友好的界面,以获得大数据分析的竞争优势。
大数据分析对控制的影响
虽然“审计员”一词在德语国家很常见,但“管理会计师”在美国和英国等英语国家是一个公认的术语。在比较这两种职业时,审计员的任务通常被认为是一个扩展的范围,不仅集中在会计问题上,也集中在管理问题上。
在我们的博客中,术语“控制者”和“管理会计”的意思是一样的,在控制和管理会计文献中很常见。
大数据分析的功能有助于高级分析从分散在不同数据库中的琐碎信息构建事件、场景或感兴趣对象的图片。
公司,特别是其控制单位,可以应用他们从大数据分析中获得的洞察力来增强他们的决策流程,以成功实现他们的业务目标。大数据分析的总体重点是提取基本见解,它基于数据挖掘和统计技术。以前基于直觉的高管行动现在可以通过数据驱动的数学模型来实现。
现在,管制员还可以利用大数据分析场景,并考虑季节性波动。预测的准确性会影响公司规划过程的效率、目标实现的程度、总成本以及满足客户需求的程度。
大数据分析的当前使用和发展
在国际管制员协会(ICV)的“管制员大会”期间,我们通过调查收集了数据。这次会议于 2019 年 5 月在慕尼黑举行,口号是“为你的未来做好准备——想法。学习。网络”。它被认为是欧洲最大的控制会议。
为了衡量分析在使用方面的最近状态,参与者对感知的支持和发展进行了评级(“到目前为止,贵公司在控制领域使用大数据分析工具的程度如何?”).这项研究中的结构通常使用五点李克特量表进行测量,范围从“强烈不同意”(1)到“强烈同意”(5)。
如下图所示,28%的受访控制者回答不使用或很少使用大数据分析。39%的受访者表示,他们的控制部门很少使用大数据分析。关于使用大数据分析的发展,可以说大多数人(48%)认为发展很少。关于在规划阶段使用预测分析的结果显示了一个不典型的过程。大多数人(31%)没有使用这些方法,但仍有 28%的人提到在规划过程中广泛使用预测分析。
我们的调查结果
在德国,大数据分析在控制方面的成熟程度可以归类为处于初级阶段。将大数据分析纳入控制仍然面临**众多障碍和阻碍,**这可能是一些受访者对没有使用大数据分析且仍然没有自动化流程的控制者评价很低的原因。
近年来,大数据分析在控制中的使用遇到了瓶颈,该领域已经停滞。但是公司使用这些工具需要克服哪些障碍呢?只有技术上的?甚至是文化?
在我们的下一篇博客文章中,我们将回答这些问题,并看看回答者的结果。我们将分享我们关于如何消除大数据分析在控制方面的潜在障碍的发现。
如果您喜欢我们的发现并希望支持stargazr . ai请分享或关注我们的Linkedin或Twitter!**
ISIS 如何使用推特
利用社交网络分析了解伊斯兰国的推特网络
亲 ISIS 推特账户的社交网络图
介绍
伊拉克和黎凡特伊斯兰国(ISIL),又称伊拉克和叙利亚伊斯兰国,是一个信奉逊尼派伊斯兰圣战主义的团体。2014 年,ISIS 在占领伊拉克主要城市后声名鹊起。自那以来,监控和防止 ISIS 的影响一直是美国和其他国家的一个关键目标。
多年来,ISIS 一直在利用社交网络传播其信息,并为其事业招募倡导者。从亲伊拉克和大叙利亚伊斯兰国的内容到处决等图像材料,互联网的使用一直是该恐怖组织的主要工具。这些社交网络甚至被用来招募来自美国、英国和加拿大等西方国家的成员。
了解支持 ISIS 的推特账户网络有助于发现谁是主要参与者,内容如何通过网络传播,并改善对 ISIS 活动的监控。
数据
用于这项分析的数据由数据社会网站 data.world 提供。该数据集收集于 2015 年至 2017 年,包含 100 多个亲 ISIS 账户的 1.7 万条推文。收集的功能包括:
姓名、用户名、描述、位置、下载推文时的关注者数量、下载推文时用户的状态数量、推文的日期和时间戳以及推文本身
数据集可以在这里找到。
为了构建 Twitter 账户的网络图,必须创建节点列表和边列表。该图表将通过提及来直观显示客户之间的联系。使用@符号后跟用户的用户名,将 Twitter 提及嵌入到推文的文本中。为了生成节点和边列表,使用 Python 脚本从 tweet 中提取提及,并在发布 tweet 的用户和被提及的用户之间创建边。然后将节点和边列表输入网络绘图程序 Gephi 进行分析。
分析
节点和边列表被输入 Gephi 以生成一个图。图形节点按度数(与其他节点的连接数量)用红色->黄色->蓝色色标进行颜色编码。边缘按重量用红色->黄色->蓝色色标进行颜色编码。Fruchterman Reingold 布局函数用于组织图表的节点。结果图如下所示。
亲 ISIS 推特账户的社交网络图
从上图可以看出,节点和边的数量很大,很难提取有用的信息。然而,即使在这个尺度上,某些结构和关系也是可见的。可以用黄色和蓝色箭头看到几个高权重关系,表示 twitter 用户经常提到另一个特定用户。还可以看到几个 hub(指向许多其他节点的节点)和 authorities(从许多其他节点指向的节点)。让我们更仔细地看一下图表,以便获得更好的见解。
重量级关系
网络中存在几个高权重关系。其中,有两个非常高(用蓝色箭头表示)。这些关系在下面表示为关系 1 和关系 2。
高权重关系的网络图
关系 1 是从用户“mo********”到用户“Ra********”的定向关系。这种关系的权重为 195,是网络中最大的。
关系 2 是从用户“wa******”到用户“Ni********”的定向关系。这个关系的权重为 184,是网络中的第二大。
虽然这些关系示出了从一个特定用户到另一个特定用户的频繁提及,但这并不一定意味着所提及的用户对图表有很大影响。让我们仔细看看图表中的这些用户及其网络。
下图显示了用户“Ra********”的关系。
用户网络图’ Ra******** ’
如上图所示,用户“Ra********”似乎连接到了网络。由于许多关系指向节点的内部和外部,看起来“Ra********”充当网络中的中枢和权威。
下图显示了用户“mo********”的关系。
用户网络图’ mo******* ’
如上图所示,用户“mo********”看起来也很好地连接到了网络,并且在网络中充当集线器和权威。
下图显示了用户“wa******”的关系。
用户网络图’ wa****** ’
像前两个用户一样,用户“wa******”看起来很好地连接到网络,并且充当网络中的中枢和权威。
下图显示了用户“Ni********”的关系。
用户’ Ni******** '网络图
与前面的三个用户不同,这个图显示了一个稍微不同的画面。虽然用户“Ni********”在网络中表现出相对良好的连接,但是其他三个用户表现出高得多的程度。
然而,如果没有基线来比较,这些用户的重要性就无法确立。为了获得网络中节点度数的基线,运行了度数统计报告。发现少量节点具有高度数,而许多节点具有低度数(如在无标度网络中所预期的)。结果如下所示。
节点度报告
网络中为数不多的几个中心和机构可能是关键成员,对于监测工作来说很重要。为了更好地可视化这些节点,它们的大小已经被缩放到它们的程度。该图如下所示。
节点大小按度数缩放的网络图
从上图中可以看出,图中有几个中心和机构(由大节点表示)。我们上面看到的四个节点中的三个也被发现了。
虽然这些节点既是中心又是权威,但这并不表示哪些节点是哪些节点。为了识别哪些节点是中心和机构,制作了两个图表,一个是根据出站关系缩放的节点大小,另一个是根据入站关系缩放的节点大小。这些图表如下所示。
节点大小按度数缩放的网络图(权威)
节点大小扩展到外部程度的网络图(集线器)
从上图中可以看出,通过入站和出站连接分离节点伸缩可以提供有用的信息。虽然枢纽和当局都有很高的地位,但它们在网络中的作用不同。高级别节点(权威)很可能是亲 ISIS 网络的关键成员,他们在网络内部拥有一定的权威。这些成员是主要的安全监控候选人。
另一方面,高出度节点(集线器)是在网络中传播信息的关键。这些成员在网络中联系紧密,在他们的推文中提到了许多人。
此外,其中一些中心似乎是帐户组与更大网络的少数几个连接之一。这些节点被称为桥。从网络中移除这些节点可以显著减小其大小,从而使这些关键帐户关闭。
更新:现在有一篇“第二部分”文章使用社区检测[](http://4949 N 7th St, Phoenix, AZ 85014)扩展了这一分析。
讨论
亲 ISIS 推特账户的社交网络分析可以为改善安全监控和预防措施提供有价值的见解。确定网络中的关键权威使得监测工作能够更好地针对网络中最有影响力的人。此外,识别集线器可以为删除提供关键帐户,从而限制信息在网络中传播的有效性。
虽然该分析着眼于关系权重和节点度,但仍有进一步分析该社交网络的空间。可以分析额外的中心性度量,例如中间性、接近度和 PageRank。
本次分析使用的数据集是 2017 年编制的。由于 ISIS 等组织的快速移动性质,还可以收集新的数据集,以提供更适用于当前形势的见解。