3 个最重要的综合分类指标
复合分类度量帮助您和其他决策者快速评估模型的质量。它们通常比简单的指标(如召回率、精确度或特异性)提供更有价值的信息。
数据科学家和统计学家应该了解最常见的复合分类指标。本指南将帮助你保持直线。🎉

花是一种合成物。资料来源:pixabay.com
这是帮助您理解、使用和记住七个最流行的分类标准的系列文章中的第三篇,也是最后一篇。在本系列的第一篇文章中,我解释了混淆矩阵和最常见的评估术语:准确性。在的第二篇文章中,我强调了三个最常见的基本指标:召回 ( 灵敏度)、精度和特异性。如果你还没有完全理解这些术语,我建议你在继续之前多花些时间了解它们。👍
本文中的每个复合指标都是从基本指标构建的。让我们来看看一些漂亮的复合指标!
平衡精度
正如您在本系列的第一篇文章中看到的,当结果类别不平衡时,准确性可能会产生误导。
平衡精度是用于不平衡数据的更好指标。它考虑了积极和消极的结果类别,并且不会因不平衡的数据而产生误导。
公式如下:
平衡精度*=(((TP/(TP+FN)+(TN/(TN+FP)))/2*
回想一下上一篇文章,哪个度量是 TP/(TP+FN) 的公式?没错,召回——也叫灵敏度和真阳性率!
并且哪个度量是 TN/(TN+FP) 的公式?没错,特异性,又称真阴性率!
因此,这里有一种更简单的方法来编写平衡精度公式:
平衡准确度 =(灵敏度+特异性)/ 2
平衡的准确性只是敏感性和特异性的平均值。当它们同等重要时使用是很棒的。☝️
让我们继续本系列前几篇文章中的一个例子。以下是我们的模型预测网站访问者是否会在 Jeff 的 Awesome Hawaiian Shirt 商店购买衬衫的结果。🌺👕
Predicted Positive Predicted Negative
Actual Positive 80 (TP) 20 (FN)
Actual Negative 50 (FP) 50 (TN)
我们的灵敏度是 0.8,特异性是 0.5。平均这些分数以获得我们平衡的准确度:
(.8 + .5) / 2 = .65
在这种情况下,我们的准确率也是 65%:(80+50)/200。
当结果类的大小相同时,精确度和平衡精确度是相同的!😀

岩石平衡:来源:pixabay.com
现在让我们看看不平衡的数据会发生什么。让我们看看我们以前的疾病检测的例子,阴性病例多于阳性病例。
Predicted Positive Predicted Negative
Actual Positive 1 8
Actual Negative 2 989
我们的准确率是 99%:(990/1000)。
但是我们的平衡准确率是 55.5%!
(((1/(1 + 8)) + ( 989/(2 + 989))) / 2 = 55.5%
😲
您认为 55.5%的平衡准确度比 99.0%的准确度更能体现模型的性能吗?
平衡精度底线
当您有不平衡的数据,并且在正确预测负类和正类之间没有区别时,平衡精度是一个很好的衡量标准。😀
scikit-learn 函数名为**balanced _ accuracy _ score。**
另一个更常见的综合指标是 F1 分数。

公式 1:资料来源:pixabay.com
F1 分数
F1 得分是精度和召回的调和平均值。如果您关心精确度和回忆大致相同的数量,F1 分数是一个很好的指标。请注意,尽管您看到的所有指标后面都可以跟有单词 score F1,但它始终是。☝️
请记住,回忆也被称为敏感度或真阳性率。
以下是 F1 得分的公式,分别使用 P 和 R 表示精确度和召回率:
F1= 2 (P * R)/(P+R)*
让我们看看我们所看的两个例子在 F1 分数方面是如何比较的。在我们的夏威夷衬衫的例子中,我们的模型的召回率是 80%,精确度是 61.5%
该车型的 F1 分数为:
2 * (.615 * .80) / (.615 + .80) = .695
听起来没那么糟糕。🙂
让我们计算疾病检测示例的 F1。该模型的召回率为 11.1%,准确率为 33.3%。
该型号的 F1 为:
2 * (.111 * .333) / (.111 + .333) = .167
那不是很热。☹

比我们模特的 F1 分数高多了。资料来源:pixabay.com
F1 评分很受欢迎,因为它将两个通常非常重要的指标(召回率和精确度)结合成一个指标。如果其中任何一个低,F1 分数也会相当低。
*scikit-learn 函数名为f1 _ score*。让我们看看最后一个流行的复合指标,ROC AUC。
ROC AUC
ROC AUC 代表受试者操作者特征——曲线下面积。它是真阳性率对假阳性率曲线下的面积。请记住,真正的正比率也有名称回忆和灵敏度。**
误报率不是我们在本系列中讨论的一个指标。
假阳性率
误报率(FPR) 是一个额外指标。👍它是通过将假阳性除以所有实际阴性来计算的。**
FPR = (FP / N)
假阳性率是我们看到的唯一一个分数越低越好的指标。⬇️=😀
FPR 很少单独使用。这很重要,因为它是进入 ROC AUC 的两个指标之一。
为了可视化 ROC 曲线,可以使用 sklearn 的plot _ ROC _ curve来绘制。函数签名与您在本系列第二篇文章中看到的plot _ precision _ recall _ curve函数相匹配。
plot_roc_curve(estimator, X_test, y_test)
这里有一个 ROC 曲线的例子:

蓝色是模特的表现。橙色是基线
ROC 曲线是一个流行的图,可以帮助您决定在哪里设置决策阈值,以便您可以优化其他指标。
AUC(曲线下面积)的范围可以从 0 . 5 到 1。分数越高越好。得分为 0.5 可不好,在上图中用橙色线表示。☹️
您希望模型的曲线尽可能靠近左上角。你想要高 TPR 和低 FPR。🙂
我们的模型做得不错,但还有改进的余地。😐
ROC AUC 不是您想要手动计算的指标。✍幸运的是,scikit-learn 函数roc _ AUC _ score可以为您完成这项工作。*注意,你需要将预测概率作为第二个参数传递,而不是预测。☝️*
*roc_auc_score(y_test, y_predicted_probabilities)*
当类别相对平衡时,ROC AUC 是一个很好的汇总统计。然而,不平衡的数据可能会误导。关于一个好的讨论,请看这个机器学习掌握帖子。

平衡行为。资料来源:pixabay.com
摘要
在本文中,您了解了平衡准确性、F1 评分和 ROC AUC。
概述
以下是您在本系列中看到的所有评估指标的公式:
- 精度 = (TP + TN) /全部
- 回忆(灵敏度,TPR) = TP / (TP + FN)
- 精度 = TP / (TP + FP)
- 特异性(TNR) = TN / (TN + FP)
- 平衡准确度 = (灵敏度+特异性)/ 2
- F1 得分 = 2 (精度召回)/(精度+召回)
- ROC AUC = *下面积TPR vs FPR***
ROC AUC 代表曲线下的受试者工作特征面积。不代表接收机工作曲线。👍**
结果摘要
以下是夏威夷衬衫示例的结果:
- 准确度= 65%
- 召回率(敏感度,TPR) = 80%
- 精度= 61.5%
- 特异性(TNR) = 50%
- 平衡精度= 65%
- F1 得分= .695
以下是疾病检测示例的结果:
- 准确率= 99%
- 召回率(敏感度,TPR) = 11.1%
- 精度= 33.3%
- 特异性(TNR) = 99.8%
- 平衡精度= 55.5%
- F1 得分= .167
正如我们两个例子的结果所示,对于不平衡的数据,不同的度量描绘了一幅非常不同的画面。

油漆。资料来源:pixabay.com
包装
还有很多很多其他的分类标准,但是掌握这七个应该会让你成为专家!😀
您看到的七个指标是帮助您选择分类模型和这些模型的决策阈值的工具。您的工作是在选择最终模型和设置决策阈值时明智地使用这些指标。
我应该提到另一种评估分类模型的常用方法。您可以为每个假阴性和假阳性的成本附加一个美元值或效用分数。您可以使用这些预期成本来确定使用哪个模型以及在哪里设置决策阈值。
我希望这篇分类标准的介绍对您有所帮助。如果你有,请在你最喜欢的社交媒体上分享,这样其他人也可以找到它。😀
我写关于 Python 、 SQL 、 Docker 和其他技术主题的文章。如果你对此感兴趣,请注册我的数据科学资源邮件列表,点击这里阅读更多信息,帮助你提高技能。👍
选择愉快!😀
Python 的 3 个疯狂的秘密武器
我不知道没有他们我是如何生活的
我写 Python 已经 5 年多了,我的工具集一直在变小,而不是变大。许多工具都是不必要或无用的,其中一些你会简单地放弃。
这三个是我坚持了很长时间的,和其他的不一样,我只是越来越多地使用它们。

秘密武器#1:用 Kite 写得更快,谷歌更少
大多数代码编辑器都有类似如下的自动完成功能:

…它使用语言(有时是库)文档来提供函数名和参数等信息。
当然这没问题,但是如果你的编辑器可以浏览 GitHub 多年的数据并自动完成不仅仅是函数名,而是整行代码呢?
这只是你应该使用 Kite 的三个理由中的第一个。
原因 1:代码行完成
Kite 会查看您的代码库和变量、在线常用的参数名称、文档,然后给出如下超级上下文建议:

从风筝文件
上面的例子显示了 Kite 如何预测你将使用哪些变量,即使它们被命名为一般名称(如b ) 或使用普通名称(如x或y)。
…我们花了大约 50 个工程师年的时间对 Github 上的所有代码进行语义索引,构建统计类型推理和丰富的统计模型,以非常深入的方式使用这些语义信息。— 亚当·史密斯,凯特的创始人兼首席执行官
原因 2:文件的副驾驶

如果你从未被告知要做 RTFM,那么你可能没有犯过我犯过的错误。
无论如何,你都应该在烦扰一个高级开发人员或者查看堆栈溢出答案之前阅读文档。
风筝副驾驶使文件愚蠢-容易。它与你的编辑器一起运行,并实时显示你用光标高亮显示的任何对象/功能等的文档。
亲爱的第一份工作的高级开发人员:对不起。现在我真的没有借口不首先在文件中寻找答案。😉
原因 3:在本地私人经营
最重要的是,它的构建为在本地运行,因此你可以非常快速地获得推荐,它离线工作,你的代码永远不会被发送到云端。
这对于互联网连接不好的人和在封闭源代码库中工作的人来说非常重要。
结果
我已经使用 Kite 很多年了,它越来越好了。拥有超过 1700 万美元的投资,这家公司哪儿也不去,而这个工具,出于某种愚蠢的原因,i̶s̶̶c̶o̶m̶p̶l̶e̶t̶e̶l̶y̶̶f̶r̶e̶e̶.编辑:我提到的第一个功能现在是 Kite Pro 的一部分,其他的仍然是免费的。有一个很棒的 ROI 计算器 用于 说服你的老板 给你买。
你所要做的就是为你的编辑器下载 Kite 插件,或者下载 copilot,它可以为你安装插件。去得到它!
秘密武器#2:用 MyPy 和静态类型稳定你的代码
Python 是动态类型的*,一个过于简单的解释是,你可以在任何时候让任何变量成为任何数据类型(字符串、整数等)。*
*# These two variable types are declared the exact same way
# Python figures out the data type on it's own, dynamically# string
var_name = "string here"# integer
var_name = 1234*
相反的是静态类型的语言,其中变量必须有一个特定的数据类型,并且总是遵守它。
*# Many languages require the data type to be declared too# string
str var_name = "string here"# integer
int var_name = 1234*
动态类型的利与弊
动态类型的优点是你可以在写作时偷懒,这样可以减少代码混乱。
尽管缺点很多,也很大:
- 在开发周期的后期,你通常会遇到错误
- 代码性能更差,因为 Python 不断地计算类型
- 函数不太稳定,因为它们的输入和输出可以在没有警告的情况下改变数据类型
- 交付代码更加不稳定,因为其他人可能不知道您的变量是什么数据类型或者可能成为什么数据类型
Python 中的静态类型
从 Python 3.5 开始,您可以本机使用静态类型了!此外,mypy 是一个模块,可以让您快速轻松地扫描您的代码库,查找静态类型违规。
这只是一个如何使用它的例子:
*# Declaring a function using normal dynamic typing, without mypy
def iter_primes():
# code here that returns an iterator of ints# Declaring the same function with static typing
from typing import Iteratordef iter_primes() -> Iterator[int]:
# code here that returns an iterator of ints*
现在你可以用pip install mypy安装 mypy 进行扫描,用mypy [path to python file]命令扫描你的代码。这将通知您任何数据类型与您指定的静态类型不匹配的地方。
对于静态示例,我们指定函数返回整数的迭代器。这一简单的更改通过强制执行一致的输出,使函数更加经得起未来的考验。
其他开发人员只需查看声明就可以知道输出的数据类型,而且不像只使用文档,如果不遵守声明,您的代码就会出错。
这是一个取自的超级简单的例子,这里的例子,如果仍然没有意义,去检查一下。
结果
很难列出静态类型可以让你避免未来痛苦的所有方式,但是 mypy docs】有一个很棒的 FAQ ,里面有更多的优点和缺点。
如果你在一个稳定为王的生产代码库中工作,绝对试试 mypy 和类型模块。
秘密武器#3:用 Sonarlint 更快地发现错误并编写更简单的函数
现在每个编辑器都有某种内置的错误检查或“过磅”功能。它查看代码,通常不运行代码,并试图猜测可能出错的地方。这叫做静态代码分析。

VS 代码中的默认 Python Linter
**动态代码分析实际上试图运行/编译你的部分代码,看看它是否正常工作,但它是在后台自动完成的。代替猜测,它实际上知道它是否能工作,以及确切的错误是什么。
SonarLint 是最好的动态代码分析,还有更多优点。这些特点是我喜欢它的原因:
注释或未调用的代码
我犯了留下打印语句、注释掉的代码和未使用的函数遍布我的代码库的错误。这样会警告我,让我很难忘记,告诉我在哪里,很容易找到。
安全风险
一个包含不断更新的安全风险的大型数据库会实时出现在你的代码库中,警告你可能暴露的任何已知漏洞。
安全风险非常小众,不可能背下来,所以大家要用的东西来追踪这些。SonarLint 是一个很好的起点。
从未执行的代码
与未调用的代码略有不同,如果我创建了任何结果不可能达到的评估,这将警告我。这些很难发现,可能会导致几个小时的调试,所以这是我最喜欢的警告之一。
这里有一个例子:
*a = Noneif a == None or not a or a:
this_will_always_get_called()
else:
# sonarlint will warn you about this line never being executed
this_will_never_get_called()*
认知复杂性
这是一个有趣的话题,我可以写一整篇文章,事实上,有一个关于它的整篇白皮书。
简单的解释是,他们创造了一个数学公式,可以评估代码阅读/理解的难度。
它不仅非常有用,而且很容易理解。每次 SonarLint 要求我“降低认知复杂性”时,它都会附带一个对我打破的规则的简单解释,比如“太多嵌套的 if 语句”。
结果
我发现这比基本的阻塞和林挺实践更有用,并且我确信它让我写出了对人类更友好的代码。顺便问一下哪是蟒!
SonarLint 是免费的,所以现在没有理由不去获取它并把它附在你的编辑器上。
结论
如果您跳过了这里,只是一个快速的警告,除非您对这些功能有基本的了解,否则您可能无法正确使用它们。
以下是三种秘密武器的概述:
- 用 Kite Copilot 和编辑器插件写得更快,谷歌更少
- 用 Mypy 和静态类型稳定你的代码
- 使用 SonarLint 编辑器插件更快地发现错误并编写更简单的函数
我希望这些工具能很好地为您服务,我自己也非常喜欢它们。我确信我已经错过了一些其他难以置信的资源,所以一定要在评论中分享你不能没有的东西。
如果你从事数据科学工作,你可能会从我目前的热门文章中发现价值:
这些错误非常普遍,而且非常容易纠正。
towardsdatascience.com](/please-stop-doing-these-5-things-in-pandas-9fbabea897aa)*
计算随机森林中特征重要性的三种方法
特征重要性描述了哪些特征是相关的。它可以帮助更好地理解所解决的问题,有时还可以通过利用特征选择来改进模型。在这篇文章中,我将展示 3 种方法(带代码)来计算来自scikit-learn包(Python 中)的随机森林算法的特征重要性。
内置随机森林重要性
随机森林算法具有内置的要素重要性,可以通过两种方式计算:
- 基尼系数(或平均减少杂质),由随机森林结构计算得出。让我们看看随机森林是如何构建的。这是一组决策树。每个决策树都是一组内部节点和叶子。在内部节点中,所选择的特征用于决定如何将数据集分成两个独立的集合,其中具有相似的响应。内部节点的特征是根据某种标准选择的,对于分类任务,该标准可以是基尼不纯或信息增益,对于回归,该标准是方差减少。我们可以测量每个特征如何减少分裂的杂质(具有最高减少的特征被选择用于内部节点)。对于每个特征,我们可以收集它平均如何减少杂质。森林中所有树的平均值是要素重要性的度量。该方法可在
[scikit-learn](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html#sklearn.ensemble.RandomForestClassifier.feature_importances_)中实现的随机森林(对于分类器和回归器都适用)。值得一提的是,在这种方法中,我们应该查看计算出的重要性的相对值。这种方法最大的优点是计算速度快——所有需要的值都是在随机森林训练中计算出来的。该方法的缺点是倾向于选择(选择为重要的)高基数的数字特征和分类特征。此外,在相关特征的情况下,它可以选择其中一个特征,而忽略第二个特征的重要性(这可能导致错误的结论)。 - 平均降低准确度 —是一种基于准确度平均降低来计算置换出袋(OOB)样本特征重要性的方法。这个方法没有在
scikit-learn包中实现。与这种方法非常相似的是本文下面描述的基于排列的重要性。
我将展示如何使用scikit-learn包和波士顿数据集计算随机森林的特征重要性(房价回归任务)。
*# Let's load the packages*
**import** **numpy** **as** np
**import** **pandas** **as** pd
**from** **sklearn.datasets** **import** load_boston
**from** **sklearn.model_selection** **import** train_test_split
**from** **sklearn.ensemble** **import** RandomForestRegressor
**from** **sklearn.inspection** **import** permutation_importance
**import** **shap**
**from** **matplotlib** **import** pyplot **as** plt
plt.rcParams.update({'figure.figsize': (12.0, 8.0)})
plt.rcParams.update({'font.size': 14})
加载数据集并拆分用于训练和测试。
boston = load_boston()
X = pd.DataFrame(boston.data, columns=boston.feature_names)
y = boston.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=12)
用 100 棵决策树装配随机森林回归器;
rf = RandomForestRegressor(n_estimators=100)
rf.fit(X_train, y_train)
要从随机森林模型中获得特征重要性,请使用feature_importances_参数:
rf.feature_importances_array([0.04054781, 0.00149293, 0.00576977, 0.00071805, 0.02944643,
0.25261155, 0.01969354, 0.05781783, 0.0050257 , 0.01615872,
0.01066154, 0.01185997, 0.54819617])
让我们画出重要性(图表比数值更容易理解)。
plt.barh(boston.feature_names, rf.feature_importances_)

为了有一个更好的图表,让我们对特征进行排序,并再次绘图:
sorted_idx = rf.feature_importances_.argsort()
plt.barh(boston.feature_names[sorted_idx], rf.feature_importances_[sorted_idx])
plt.xlabel("Random Forest Feature Importance")

基于排列的重要性
基于排列的重要性可用于克服用平均杂质减少计算的默认特征重要性的缺点。它在scikit-learn中作为[permutation_importance](https://scikit-learn.org/stable/modules/generated/sklearn.inspection.permutation_importance.html#sklearn.inspection.permutation_importance)方法实现。作为参数,它需要经过训练的模型(可以是与scikit-learn API 兼容的任何模型)和验证(测试数据)。这种方法将随机改变每个特征,并计算模型性能的变化。对性能影响最大的特性是最重要的特性。
置换重要性可以很容易地计算出来:
perm_importance = permutation_importance(rf, X_test, y_test)
绘制重要性图:
sorted_idx = perm_importance.importances_mean.argsort()
plt.barh(boston.feature_names[sorted_idx], perm_importance.importances_mean[sorted_idx])
plt.xlabel("Permutation Importance")

基于置换的重要性在计算上是昂贵的。基于排列的方法对于高度相关的特征可能有问题,它可以将它们报告为不重要。
根据 SHAP 值计算重要性
可以使用 SHAP 解释(它是模型不可知的)来计算随机森林的特征重要性。它使用博弈论中的 Shapley 值来估计每个特征对预测的贡献。它可以很容易地安装(pip install shap)和使用scikit-learn随机森林:
explainer = shap.TreeExplainer(rf)
shap_values = explainer.shap_values(X_test)
要将特征重要性绘制成水平条形图,我们需要使用summary_plot方法:
shap.summary_plot(shap_values, X_test, plot_type="bar")

特征重要性可以用更多细节来绘制,显示特征值:
shap.summary_plot(shap_values, X_test)

使用 SHAP 计算特征重要性的计算开销可能很大。然而,它可以提供更多的信息,如决策图或依赖图。
摘要
给出了计算scikit-learn随机森林的特征重要性的 3 种方法:
- 内置功能重要性
- 基于排列的重要性
- 用 SHAP 值计算
在我看来,检查所有方法并比较结果总是好的。我在 MLJAR 的 AutoML 开源包[mljar-supervised](https://github.com/mljar/mljar-supervised)中使用了基于排列和 SHAP 的方法。我使用它们是因为它们是模型不可知的,并且可以很好地与非来自scikit-learn的算法一起工作:Xgboost,神经网络(keras+tensorflow),LigthGBM,CatBoost。
重要注意事项
- 模型越精确,计算出的重要性就越可信。
- 计算的重要性描述了特征对于机器学习模型有多重要。这是数据中要素重要性的近似值
由 mljar 监管的是一个开源的自动机器学习(AutoML) Python 包,可以处理表格数据。它旨在为数据科学家节省时间。它抽象了预处理数据、构建机器学习模型和执行超参数调整以找到最佳模型的通用方法。这不是一个黑匣子,因为你可以确切地看到 ML 管道是如何构建的(每个 ML 模型都有一个详细的降价报告)。

使用 mljar 监督的 AutoML 包生成的示例报告。
3D 宇宙:数据科学、开发和发展
数据科学,DevOps
DevOps 成为数据科学领域独角兽的重要性。

使用 Canva 制作
数据科学不仅仅是数据收集、分析和建模。让模型可部署并便于与 DevOps 工程师沟通也是数据科学家的一项关键技能。作为 DevOps 实践者的数据科学家使他/她成为独角兽。
数据科学更多的是分析数据,而不是程序开发。为了开发模型或程序,我们使用统计学和机器学习从我们的数据中获得洞察力。另一方面,DevOps 基于软件工程和系统工程。它融合了许多敏捷软件方法论的思想。当我们将这些技术应用于数据科学时,它有助于我们记住数据科学与应用程序开发的相似之处和不同之处。

使用 Canva 设计
在数据科学领域,DevOps 的关键领域包括我们将如何创建模型,如何进行传递,如何以受保护的方式维护我们的模型,以及如何根据感兴趣的量来放大/缩小模型。本文将讨论如何从一个想法到生产,再到管理,开始开发一个机器学习模型。我们开始吧!
数据科学过程
数据科学的第一阶段从收集数据和处理数据开始,即分析数据、探索和执行深入分析,以及交流结果。

数据分析(使用 Canva)
- 可以通过构建脚本、使用 API 调用 Web 抓取以及通过许多数据源来收集数据——UCI 机器学习资源库、Kaggle 网站。此外,数据可以来自以日志文件形式存储的任何应用程序。我们使用电子表格、通常用于 web 和分析应用程序的 NoSQL 数据库、关系数据库和其他外部来源来组织数据。
- 收集数据后,我们需要处理数据——过滤缺失值、不必要的内容异常、提取并重新格式化以满足模型需求。此外,我们可能从几个站点/资源收集数据,在这种情况下,我们需要合并具有共同属性的数据(在确定相关属性之后)。最后用 R、Python、Spark、Pandas 构建一个数据框架&开始用数据做实验。
- 确定相关的变量并进行特征工程(从原始属性中获得附加特征)以提高模型性能。最后,需要根据数据类型以及需要完成的培训、测试和验证来选择算法。
数据科学模型的版本控制
现在假设一位数据科学家遵循了上述所有要求,并将其代码部署到生产中。它能完美地工作而没有任何问题吗?需求的数量可能会增加,您将无法管理已部署的服务。如果您的最终用户希望应用程序提供更多功能,该怎么办?您会再次开始训练模型、构建模型并进行部署吗?这是一个连续的循环,为什么我们不能将这个过程自动化呢?是的,我们可以通过持续集成来实现这一点。

GitHub 知识库(作者提供图片)
有时我们与涉及一个大团队的应用程序一起工作来开发一个产品,它也需要在一个连续的时期内以位和字节来开发。对于这样的应用程序,版本控制帮助我们跟踪模型的每一个版本,跟踪其他团队成员已经更新的变更,并且与合作者共享代码。GitHub 是一个代码库托管服务,使用 Git 版本控制系统。在这里,我们创建一个存储库,并像在本地机器上一样组织我们的项目目录。每当有一个 bug 修复或增强或添加一个功能时,我们的经理或负责人就会提出一个问题,并指派一些人来处理这个问题。现在,这些人开始解决这个问题,也就是说,在我们的例子中提高模型的性能,或者添加一些应用程序特性。
使用自动化工具测试和部署模型
测试对于确保应用程序不会导致任何失败是非常重要的,因为这可能会在未来或开发的后期花费我们一大笔钱。在数据科学的世界里,人们需要进行单元测试来检查代码的功能,然后评估模型的性能。

詹金斯管道(作者照片)
让我们举一个当前情况的实时例子,即 *COVID19,*假设您正在开发一个应用程序来跟踪您所在位置附近的冠状动脉患者。您已经做了所有的事情,训练并测试了模型,还验证了算法以确保它们和预期的一样准确。但是,这是否足以毫无困难地运行应用程序呢?不,因为这里的数据是动态变化的——(数据漂移),因为我们每天在给定的地区可能没有相同数量的阳性病例。对此,什么是理想的解决方案?让生成的数据集遵循相同的预处理步骤,开发和部署模型。
这个繁琐的过程可以通过在 Jenkins(一个 CI 工具)上创建一个带有定义好的管道的作业来避免,如上图所示,所以您将在 Jenkins 上为模型创建一个管道,并要求它在您的数据集使用 API 调用更新时构建、测试、验证和部署。Jenkins 作业也可以定期触发,手动触发,或者当有人将更改推送到 GitHub 存储库时触发。
一些部署实践
人们可以遵循某些部署实践来以环境的形式管理整个过程。当我们在 DevOps 中谈论环境时,它意味着需要运行应用程序或服务的每个部分的基础设施的集合。
- 部署到试运行 —试运行环境是我们的代码准备好被部署的地方,但是我们用它来执行质量保证和集成测试。这是我们的模型首次测试各种功能的地方,就像一个在线电子商务平台,它根据用户以前的订单和搜索结果推荐他们的用户。一旦代码被部署到一个阶段环境中,我们就可以随时发布新的应用程序版本。在此之前,我们可以将工件存储在 Artifactory 上,或者如果我们使用 docker,docker 文件可以存储在 DockerHub 上。
- 金丝雀部署— 当新版本发布时,我们的客户可能会在一段时间内无法使用该服务,因为我们正在更新他们。停机可能会严重影响业务运营。更新时的小错误会对服务造成不良影响。为了避免这种情况,我们使用金丝雀部署。例如,如果我们有 4 台服务器在运行,我们将只使用新功能更新服务器 1,并且只将 10%的流量路由到该服务器,所有其余的服务器将获得 30%的流量。这样,即使服务器 1 出现故障,客户也可以使用其余 3 台服务器。在成功运行新更新的服务器 1 之后,我们移动下一个服务器,并重复该过程。在这里,我们只对某些用户进行更改,即只对这些服务器部署模型或更新更改。

蓝绿色部署(使用 Canva 设计)
蓝绿部署涉及 2 个系统,一个在线,一个离线。我们升级离线系统,对其进行测试&一旦测试成功,就将流量路由到离线系统。如果有任何问题,我们将返回。
- 混沌猴子— 这将在实时过程中破坏或杀死你的服务器,迫使你的工程师找到使服务器健壮的方法&容忍即时故障。网飞使用混沌猴子。
保护和监控生产中的模型

保护模型(使用画布制作)
数据科学模型需要像任何其他生产应用程序一样得到保护和保护。但是对于数据科学来说,安全性通常不被认为是一个重要因素。部署模型文件时,需要一定级别的加密。应用程序将以可执行的格式存储。保护模型的另一种方法是使用访问控制,这涉及两种机制——身份验证,我们确认使用我们服务的人的身份。授权,一组经过身份验证的用户可以执行的操作,例如,我们团队中的所有用户都不允许写入数据库。并且只有一些用户有权限执行该模型。
运营安全通过分配角色、变更管理、日志监控和审核来处理职责分离。需要备份数据,设计高可用性,为测试故障留出时间,为灾难恢复制定业务连续性计划。

GCP 度量探索者(作者提供照片)
一旦模型投入生产,我们可能会遇到某些问题,事件可能会发生,如果不立即解决,会导致巨大的损失。DevOps 是关于开发系统并保持它们运行的。绩效监控是实现这一目标的重要实践。它包括跟踪资源利用率(CPU、磁盘),确保服务对我们的用户可用,测量吞吐量和运行效率等。
有几个 GUI 工具用于监控,上图显示了在 Google 云平台上创建的一个实例的 CPU 利用率。像 Nagios、Google StackDriver、AWS CloudWatch、New Relic、聚合器的 PagerDuty 等工具。在将模型部署到产品中之后,我们需要确保测量模型的质量。进行一些样本预测,评估准确性,如果准确性由于模型漂移而失败,则使用新数据重新训练模型。
集装箱化
容器是运行图像的实例,它们有自己的环境。容器包括代码、变更、流程、网络、依赖关系和操作系统。它们就像通过共享同一个内核来完成特定任务的独立实例。
Docker 是一个在容器中运行应用程序的平台。

使用 Canva 制作
但是我们为什么需要容器呢?对于数据科学家来说,一个主要问题是我们使用的各种工具或软件包的兼容性问题。
**ERROR: Could not find a version that satisfies the requirement install.**
您可能已经多次看到此错误,这是因为您在以前的项目中使用的工具可能会更新,或者更新一个包/工具会反映其他几个工具。使用 docker,我们可以在一个容器中运行一个组件,它的依赖项和库都在同一个虚拟机和操作系统上。例如,在一个容器上运行您的模型的 flask 服务器可以与在另一个容器上运行的数据库服务器通信。
Dockerfile 文件
这是一个带有配置映像的文本文件,包括基本映像、软件包、网络端口和启动命令。通过使用这个文件,我们构建 docker 图像(创建容器的模板)。任何拥有 docker 映像的人都可以运行该容器。下面是一个运行 flask 服务器的简单 docker 文件。现在,通过将该文件包含在我们的 GitHub 存储库中,人们可以通过使用各种云提供商轻松地将该模型投入生产。但是记住我们不想犯任何错误。
FROM python:3.7-slimWORKDIR /appADD . /appRUN pip install --trusted-host pypi.python.org -r requirements.txtEXPOSE 5000ENV NAME OpentoAllCMD ["python","app.py"]
假设您开发了一个 web 应用程序来预订新年晚会的门票。与 12 月 20 日相比,服务器请求从 12 月 30 日开始快速增加。你听说过网飞的服务器瘫痪了吗?是的,最近由于一部著名的西班牙电视剧。那么我们是如何遇到这样的问题的呢?在理想情况下,我们需要根据容量需求增加新的服务器,但在这种情况下,我们可能会因人为错误而导致巨大的失败。顾客会给出负面反馈,他们可能会选择其他平台观看其他节目,或者他们可能会选择其他网站订票。
这可以通过类似 Kubernetes、Amazon ECS、Docker Swarm、Google Kubernetes Engine、Titus(网飞使用的)等容器管理工具来避免。这些流程编排工具支持创建和执行可预测、可重复、可自动化的流程。此外,它们还提供自动扩展功能,根据网络流量,新服务器将加速运行,如果流量减少,它们将缩小服务器的规模,这样每个人都可以在不停机的情况下访问服务。
结论
数据科学是一种构建模型的实践,模型是一种代码或软件,DevOps 可以减轻他们的负担,正如本文所述。DevOps 工程师不太了解数据科学家,数据科学家以及他们与 DevOps 的关系也是如此。我写这篇文章的目的是传达他们各自的需求和期望,这样他们就可以一起工作来构建无错误的应用程序。
如果你发现有改进的地方,请随时提出修改建议。我很快会再赶上你的。在那之前,呆在家里,注意安全!
如果您想联系,在 LinkedIn 上联系我。
2020 年数据科学的 4 个最热门趋势
2019 年对于所有的数据科学来说是重要的一年。
想获得灵感?快来加入我的 超级行情快讯 。😎
全球各行各业的公司都在经历人们所说的 数字化转型 。也就是说,企业正在采取传统的业务流程,如招聘、营销、定价和战略,并使用数字技术使它们好 10 倍。
数据科学已经成为这些变革不可或缺的一部分。有了数据科学,组织不再需要根据直觉、最佳猜测或小型调查来做出重要决策。相反,他们正在分析大量的真实数据,以便根据真实的数据驱动的事实做出决策。这才是数据科学真正的意义所在——通过数据创造价值。
这种将数据整合到核心业务流程中的趋势已经显著增长,根据谷歌搜索趋势的数据,在过去 5 年中,人们的兴趣增加了 4 倍多。数据给公司带来了超越竞争对手的巨大优势。随着更多的数据和更好的数据科学家使用这些数据,公司可以获得有关市场的信息,而这些信息可能连他们的竞争对手都不知道。这已经成为一个数据或灭亡的游戏。

谷歌搜索过去 5 年“数据科学”的受欢迎程度。由谷歌趋势生成。
在当今不断发展的数字世界中,保持竞争优势需要不断创新。专利已经过时,而敏捷方法和快速捕捉新趋势非常流行。
组织不能再依赖他们过去坚如磐石的方法。如果像数据科学、人工智能或区块链这样的新趋势出现,需要提前预期并快速适应。
以下是 2020 年最热门的 4 大数据科学趋势。这些趋势今年引起了越来越多的关注,并将在 2020 年继续增长。
(1)自动化数据科学
即使在今天的数字时代,数据科学仍然需要大量的手工工作。存储数据,清洗数据,可视化和探索数据,最后对数据建模,得到一些实际的结果。手工工作只是乞求自动化,因此出现了自动化数据科学和机器学习。
数据科学管道的几乎每一步都已经或正在实现自动化。
在过去的几年里,自动数据清理已经在进行了大量的研究。清理大数据经常占用数据科学家的大部分宝贵时间。无论是初创公司还是像 IBM 这样的大公司都提供数据清理的自动化和工具。
数据科学的另一大部分被称为特征工程已经经历了重大的破坏。特征工具为自动特征工程提供解决方案。最重要的是,现代的深度学习技术,如卷积和递归神经网络学习它们自己的特征,而不需要手动的特征设计。
也许最重要的自动化发生在机器学习领域。数据机器人和 H2O 都通过提供端到端的机器学习平台在行业中确立了自己的地位,让数据科学家可以非常轻松地处理数据管理和模型构建。 AutoML ,一种自动模型设计和训练的方法,也在 2019 年蓬勃发展,因为这些自动模型超过了最先进的水平。特别是谷歌,正在大力投资云 AutoML 。
总的来说,公司正在大量投资于构建和购买自动化数据科学的工具和服务。只要能让这个过程更便宜、更简单。同时,这种自动化也迎合了规模较小、技术含量较低的组织,他们可以利用这些工具和服务来访问数据科学,而无需组建自己的团队。
(2)数据隐私和安全
隐私和安全一直是技术领域的敏感话题。所有公司都希望快速行动和创新,但在隐私或安全问题上失去客户的信任可能是致命的。因此,他们被迫把它作为一个优先事项,至少不泄露私人数据的最低限度。
在过去的一年里,数据隐私和安全已经成为一个令人难以置信的热门话题,因为这些问题被大量的公共黑客所放大。就在最近的 2019 年 11 月 22 日,在 Google Cloud 上发现了一个暴露的没有安全性的服务器。该服务器包含了 12 亿人的个人信息,包括姓名、电子邮件地址、电话号码、LinkedIn 和脸书的个人资料。甚至联邦调查局也介入调查。这是有史以来最大的数据暴露之一。
数据是怎么来的?它属于谁?谁负责这些数据的安全?它在谷歌云服务器上,实际上任何人都可以创建它。
现在我们可以放心了,全世界都不会在看完新闻后关闭他们的 LinkedIn 和脸书账户,但这确实令人惊讶。消费者变得越来越小心他们给谁他们的电子邮件地址和电话号码。
一家能够保证客户数据隐私和安全的公司会发现,他们更容易说服客户提供更多数据(通过继续使用他们的产品和服务)。它还确保,如果他们的政府颁布任何法律要求客户数据的安全协议,他们已经做好了充分的准备。许多公司选择 SOC 2 合规性来证明他们的安全强度。
整个数据科学过程都是由数据推动的,但大多数数据都不是匿名的。如果落入坏人之手,这些数据可能会被用来加剧全球灾难,扰乱人们的日常隐私和生计。数据不仅仅是原始数字,它代表并描述了真实的人和真实的事物。
随着数据科学的发展,我们也将看到围绕数据的隐私和安全协议的转变。这包括建立和维护数据的安全性、可靠性和完整性的流程、法律和不同方法。如果网络安全成为今年的新流行语,那就不足为奇了。
(3)云中的超大规模数据科学
多年来,数据科学已经从一个小众领域发展成为一个完整的领域,可供分析的数据也在规模上爆炸式增长。组织正在收集和存储比以往更多的数据。
一家典型的财富 500 强公司可能需要分析的数据量已经远远超出了个人电脑的处理能力。一台像样的电脑可能有 64GB 的内存,8 核 CPU 和 4TB 的存储空间。这对于个人项目来说很好,但当你为一家全球性公司工作时就不那么好了,比如拥有覆盖数百万客户数据的银行或零售商。
这就是云计算进入该领域的原因。云计算为任何地方的任何人提供了几乎无限的处理能力。亚马逊网络服务(AWS)等云供应商提供多达 96 个虚拟 CPU 核心和高达 768 GB 内存的服务器。这些服务器可以设置在一个自动扩展组中,其中数百台服务器可以在没有太多延迟的情况下启动或停止,即按需提供计算能力。

谷歌云数据中心
除了计算,云计算公司还提供成熟的数据分析平台。谷歌云提供了一个名为 BigQuery 的平台,这是一个无服务器和可扩展的数据仓库,让数据科学家能够在单个平台上存储和分析数 Pb 的数据。BigQuery 还可以连接到数据科学的其他 GCP 服务。使用云数据流创建数据流管道,云数据处理器在数据上运行 Hadoop 或 Apache Spark,或者使用 BigQuery ML 在庞大的数据集上建立机器学习模型。
从数据到处理能力的一切都在增长。随着数据科学的成熟,由于数据量巨大,我们最终可能会完全在云上进行数据科学。
(4)自然语言处理
自然语言处理 (NLP)在深度学习研究取得巨大突破后,已经坚定地进入数据科学。
数据科学最初是从分析纯粹的原始数据开始的,因为这是处理数据和在电子表格中收集数据的最简单方法。如果您需要处理任何类型的文本,通常需要对其进行分类或以某种方式转换成数字。
然而,将一段文字压缩成一个数字是很有挑战性的。自然语言和文本包含如此丰富的数据和信息——我们过去常常会错过这些信息,因为我们缺乏用数字表示这些信息的能力。
通过深度学习在 NLP 方面取得的巨大进步正在推动 NLP 全面集成到我们的常规数据分析中。神经网络现在可以以令人难以置信的速度从大量文本中提取信息。他们能够将文本分为不同的类别,确定对文本的情感,并对文本数据的相似性进行分析。最终,所有这些信息都可以存储在一个单一的数字特征向量中。
因此,NLP 成为数据科学中的一个强有力的工具。庞大的文本数据库,不仅仅是一个单词的答案,而是完整的段落,可以转换成数字数据进行标准分析。我们现在能够探索更加复杂的数据集。
例如,假设一个新闻网站想要查看哪些主题获得了更多的浏览量。如果没有先进的自然语言处理技术,人们所能做的就是输入关键词,或者仅仅是凭直觉判断为什么一个特定的标题比另一个好。有了今天的自然语言处理,我们就能够量化网站上的文本,比较整段文本甚至网页,从而获得更全面的见解。
对于过去几年中 NLP 最重要的进步的技术概述,你可以查看由 Victor Sanh 撰写的指南。
数据科学作为一个整体正在发展。随着其能力的增长,它正在嵌入每个行业,包括技术性和非技术性行业,以及每个企业,包括小型和大型企业。
随着该领域的长期发展,看到它大规模地大众化,成为我们软件工具箱中的一个工具供更多的人使用,就不足为奇了。
新冠肺炎危机教给世界的关于数据的 4 个教训
意见
新冠肺炎危机至少有一个积极的结果:它让许多人了解了数据解读的困难。
新冠肺炎全球危机对地球上大多数人的日常生活产生了强烈影响。它还创造了一个前所未有的时间,数亿人开始每天分析图表、数据点和流行病学指标。
无论情况有多糟糕,总会有好的结果。除了团结的伟大表现,新冠肺炎危机教会了许多人如何看待和解释数据。通常,他们意识到事情并不像看起来那么简单。
数据收集并不简单
从局外人的角度来看,收集数据似乎是一项简单的任务。既然数据库已经被使用了几十年,那么必须有一个像发送电子邮件来更新中央数据库一样简单的系统。我们都希望。
实际上,这并不容易。有许多数据库系统,许多存储数据的方法,许多对信息进行编码的方法,也有许多对价值进行分类的方法。当你想创建一个中央数据库来收集所有数据时,比如说,新冠肺炎病例和死亡数据,你必须确保所有与你合作的实体使用相同的工具、软件版本、定义、类别名称、文件格式、编码等等
由于疫情极其罕见的性质,大多数国家或州没有类似的系统,必须在几周内临时准备一些东西,通常依靠员工尽力而为,但他们绝不是数据仓库架构师。
通常,最快捷、最自然的解决方案似乎是 Excel。它被广泛使用,并被视为一种标准格式。然后,不同的地区、州、医院或疗养院将他们的日常数据以 Excel 文件的形式(当你知道其他人发送了 pdf 文件时,这仍然是可以的)发送到一个中央实体,该实体的不幸任务是将所有这些数据汇编在一起。

你收到消息了。[ 通过这个发电机
Excel 对于许多任务来说是一个很好的工具,但是它不是一个数据库。它故意弄乱数据类型(这是一个如此普遍的问题,以至于一些人类基因不得不因为 Excel 而被重命名)或者它能够处理的条目数量有限。最近提出使用过时版本的 Excel 无法处理超过 65,536 行,这是英国超过 16,000 例新冠肺炎病例没有被通知和考虑的原因。使用不适当的软件和数据收集实践确实对公共卫生产生了重大影响。
定义很重要
现在让我们假设我们收集的数据是正确的,这只是这条路的开始。获得正确的定义是另一项任务,起初看起来很琐碎,但实际上并不是这样。例如,让我们从这个简单的问题开始:
什么算新冠肺炎死亡?
看起来很简单,对吗?类似于“被病毒感染后死亡的人”听起来是一个合适的答案。实际上,事情并不顺利。如果我们看下面的图表,我们可以看到 2020 年美国的超额死亡人数,大概是由新冠肺炎造成的。实际上,大约三分之一的超额死亡不是新冠肺炎造成的。

美国归因和非归因的超额死亡。图摘自温伯格等人的文章[ 链接 ]
这些死亡中的大多数很可能与新冠肺炎有关(尽管可能是间接的),否则,我们将面临另一个未确定的过度死亡原因的重大问题。
这种差异的原因是多种多样的,取决于国家或州。在某些情况下,疗养院或医院外的死亡数没有统计或仅在几天后才公布。非肺炎症状导致的死亡可能没有被报道。此外,社会隔离有时会因为缺少亲近的证人而难以确定死因。这还不包括那些可能倾向于少报死亡人数的政客。
这个例子告诉我们,得到正确的简单定义并不容易,需要比预期更多的计划和验证。此外,从不同的角度看数据(例如,不仅看报告的 Covd-19 死亡,也看全球死亡),有助于更清楚地了解现实。
选择正确的指标并不简单
获得正确的定义仍然不是最终目标。你还必须确保你正在寻找正确的衡量标准来评估情况并做出正确的决定。
在第一波疫情期间,人们开始密切跟踪多个指标,以更好地把握形势的严重性。一些研究着眼于活跃或累积病例的数量,死亡人数,或者在更罕见的情况下,重症监护病房(ICU)的入住率。
所有这些指标显示了疫情的不同方面,但它们都依赖于不同的假设和方法偏差,例如:
- 我们如何统计死亡人数?(见上文)
- 什么是阳性病例?(仅症状?需要测试结果吗?如果有,是哪个测试?)
为了更好地理解如何解释指标,我们必须了解它是如何产生的。以下示例显示了西班牙新冠肺炎病例(红色)和死亡病例(黑色)的演变。如果你不看红色曲线的背景,你会认为现在的情况比 3 月和 4 月时更糟糕,当时西班牙已经是受影响最严重的国家之一。

西班牙累计确诊新冠肺炎病例数。[ 来源
但细看更多细节,现实就不一样了。
首先,我们可以看到,大多数死亡是在早期积累的,在第二波传染病期间,死亡人数要少得多(但仍有一些人死亡)。

西班牙累计新冠肺炎死亡人数。形状与累计病例数大相径庭(见上)。[ 来源
第二,曲线没有解释检测方法是如何演变的。在疫情开始时,用于检测病例的资源很少,流程也没有正确定义。现在,PCR 测试(最敏感的测试)每天都在大量进行。即使是无症状的人也要接受检测(在第二波中,西班牙约有 40%的阳性病例),而 3 月和 4 月的情况并非如此。
这可能是这次疫情的主要收获之一。许多人现在不会盲目地看一个指标,而是会质疑它是如何产生的,并且会反射性地看不同的指标来了解当前的情况。
取样也很重要
新冠肺炎疫情产生了大量任何人都可以访问、解读或辩论的数据。然后,试图比较所有这些数据点,让我们自己了解情况,谁知道呢,会比专家更聪明。
但是,在实践中,这些比较往往是棘手的,往往是由于抽样方法的差异。抽样是统计学课堂上教授的第一个概念之一,因为它在我们如何解释数据方面起着核心作用,新冠肺炎的数据向我们展示了许多由于数据生成方式而难以进行比较或分析的例子。
例 1:我们无法比较不同时期的测试数据
随着疫情的进步,各国大规模测试人口的能力也在提高。早在 4 月份,很少有人接受检测,他们大多数人的症状与新冠肺炎病毒相符。最近几周,测试次数比最初增加了 5 到 10 倍。

法国、英国和西班牙每千人每天测试的次数— [ 来源
这意味着测试一个人的标准现在不同了,因为我们可以测试更多的人。虽然我们最初主要测试高度易感的人,但现在常见的是测试那些仅仅因为他们与受感染的患者接触过的人,或者纯粹为了大规模筛查活动而随机测试的人。
这意味着我们不能直接比较数据,如阳性检测的百分比或无症状病例的数量,因为采样程序随着时间的推移已经发生了巨大的变化。随着时间的推移有不同的值是正常的,因为 1)病毒的流行不断演变,2)我们根据不同的标准对不同的人群进行采样。毕竟,我们的目标不是设计一个简洁的实验过程,而是提供对疫情最好的反应。
例 2:我们不能(直接)比较国家之间的死亡率风险
随着疫情成为全球性的,来自不同国家的数据进行了比较,以更好地了解哪些策略是有效的或无效的。很快就变得很明显,一些指标,如死亡率风险,在不同国家之间有很大差异,像西班牙,意大利或瑞典等国家显示出更高的比率。

不同国家死亡率风险的演变— [ 来源
然而,很明显,我们无法从这些数据中得出明确的结论,因为许多参数因国而异,例如:
- 人口年龄结构(例如,意大利是世界上平均人口年龄最高的国家之一,而新冠肺炎老年人的死亡率更高)
- 社会互动水平
- 国内的基因多样性(一些基因变异使人们或多或少容易患病,包括新冠肺炎)
- 医疗基础设施(如 ICU 床位数量)
- 对疫情的反应(例如,意大利和瑞典都有很高的死亡率,但他们采取了非常不同的方法来抗击疫情)
- 数据质量(如前所述,并非所有国家都以相同的方式收集或定义数据)
虽然您可以使用适当的统计模型来校正其中的一些因素(如人口年龄结构),但当涉及不同的数据收集方法或人口行为时,情况会变得更加复杂。
总的来说,人们越来越意识到,在很多情况下“我们就是无法比较”,这可能是一件好事,因为这是处理任何数据时的一项关键技能。
让我们不要忘记
令人欣慰的是,随着情况的好转,我们很快将不再需要担心每天新增的新冠肺炎病例或其他类似的数据。但是,为了更好地理解我们的世界和面对其他挑战,例如气候变化,总会有数据需要解释。然后,让我们不要忘记我们从这场危机中学到了什么,让我们在解读数据时总是问自己:
- 数据是如何获得(样本)和收集的?
- 定义是什么意思?
- 看哪个指标更有意义?
希望这能帮助我们做出更好的决定。
2020 年成为计算机视觉专家的 4 步指南
我在过去 2-3 年的旅程中学到了什么

计算机视觉正在崛起!见鬼,它正以极快的速度扩张!这个领域中不断出现的大量创新使得新手或初学者很难轻易在其中立足。在这篇文章中,我将谈论一些不可或缺的东西,同时对初学者非常有益,最终将帮助他们随着时间的推移在这个领域获得高于平均水平的专业知识。考虑到这些想法和教训来自我自己的经历,从一个初学者爬上同样的台阶,你可以期待他们是务实的。

描述掌握任何技能的邓宁-克鲁格曲线
首先要做的事情!这是如何成为计算机视觉专家的 而不是捷径 。我要说的步骤不是一个人可以在 1 个月内掌握的,为下一次面试做准备。但是这些将帮助你在 4-9 个月的时间里真正进入这个领域,这取决于你的热情。
我们已经走了这么远了!以前没看过的一定要看!
1.理论:
好吧好吧好吧!这应该是不同的,但我在这里开始与相同的旧东西。但说实话,一个人需要学习理论来正确地了解这个主题,并对它有一个整体的想法。没有人告诉你要记住你读到和看到的所有东西,但重要的是你至少要从头到尾看一遍。也许,你能找到的最好的资源就是下面的课程:
- 斯坦福的机器学习 : *这只是在你不习惯基本的机器学习的情况下。*即使在深度学习的时代,基本的机器学习仍然非常非常重要。这是由吴恩达开发的课程,开启了 MOOC 革命,至今仍有重要意义。
- deeplearning.ai 的深度学习专门化(Deep Learning Specialization):这是当前人工智能领域最好的(如果不是最好的)资源之一。吴恩达再次涵盖了深度学习的关键和核心主题的整个范围。第四门课程涵盖了卷积神经网络,但在我看来,除了第五门课程(序列模型)之外,其他课程对一个有抱负的计算机视觉科学家都很重要。请记住,有些人认为这一课程和上述课程有点肤浅,而少数人认为这太理论化了。所以公平地说,它在难度方面取得了公平的平衡。
- 用于视觉识别的卷积神经网络 (CS231n)斯坦福:如果要总结这个列表,这是不能忽略的。由另一位斯坦福大学的研究人员费教授,这门课程比上述课程更难(因为它是为真正的大学生开设的),并且只专注于计算机视觉。虽然我还没有经历过这一点,但它非常有名,在社区中受到好评。多年来,这门课程一直由安德烈·卡帕西和贾斯廷·约翰逊这样的计算机视觉领域的知名人士教授。
- Udacity 的计算机视觉纳米学位:这个订阅费很高,但很值。它涵盖了基础知识,并深入到应用方面,如图像字幕,物体检测和跟踪等。另外,你可以和 PyTorch 一起工作,py torch 在这个领域肯定会超过 Keras-Tensorflow。
- [计算机视觉中的深度学习](http://Deep Learning in Computer Vision)由 HSE 提供:本课程是俄罗斯国立研究大学更大专业的一部分,它从计算机视觉中的深度学习的角度覆盖了很多 SOTA 的研究。HSE 是 Coursera 上评分最高的课程提供商之一。

2.竞赛:
一旦你掌握了所有的基础知识,甚至在你掌握所有的基础知识之前,你必须尝试你所学的东西。为此,竞争意识有时是有益的。在线人工智能平台的世界来了。Kaggle 一直是这一领域的先锋。它彻底改变了机器学习领域,因为它创造了一个研究人员社区,并为初学者开辟了机会之路。这方面其他值得注意的平台有 AICrowd 、 CodaLab 、 DrivenData 等。甚至脸书研究公司现在也在举办公开比赛。MLContests.com汇总列出了很多不同平台正在进行的比赛。
这些平台通常在一年中的任何时候都有大量的计算机视觉比赛在进行。其中一些是 CVPR,ICCV 研讨会的挑战,而其他的是由公司赞助的。对新人来说,比排名的诱惑力更大的是公共笔记本和该领域专家讨论的结合。这些打开了一个巨大的新的信息和技能集,不能从理论和课程中学到。

Kaggle 竞赛仪表板
让我们来看一个例子。我目前正在做“全球小麦检测”的挑战,你可以在我上面的仪表盘中看到。人们正在使用的最有前途的架构是 EfficientDet、FasterRCNN 和 YOLO。我知道最后两个,但不知道 EfficientDet。我有机会熟悉这个强大的模型。各种最新架构和相关代码的笔记本海洋不仅对初学者有益,对经验丰富的从业者也同样有益。

3.个人项目:
如果你想向世界展示你在这个领域高于平均水平,最好建点东西。没有人在这个领域寻找应用程序。事实上,如果你能做到这一点,这意味着你有能力创建和部署基于人工智能的应用程序,这是所有初创公司都在寻找的宝贵技能。抛开这些不谈,创建小规模的项目并不困难。只是不要做其他人都在做的事情,这是常识!不要成为在 GitHub 账户上只有一个储存库的人,那就是泰坦尼克号幸存者。
招聘人员越来越关注你的项目,以评估你的能力。在这种情况下,你在做什么比你做得多好更重要。澄清一下,在混乱的数据集上对一个有趣的问题获得 50%的准确率要比在 MNIST 上获得 99.98%的准确率好得多。
一些可以尝试的事情:
- 为数据集上的任何问题创建一个精心制作的笔记本。更好的方法是在存储库中创建一组笔记本来处理不同的问题,或者对同一数据集使用不同的方法。
- 开发一个你认为有用的小软件包。它不必是开创性的,但只要让事情变得更容易。它会让你对设计和编写人们可以使用的代码有更多的了解。如果你喜欢,可以在 pip 上主持。衣领上多了一颗星。

开始这一切的那个,Yann LeCun 的 LeNet-5
4.研究论文:
为了成为真正的简历专家,她/他需要阅读研究论文。随着这个领域的发展,每天都有新的网络出现。这在很大程度上与学术界的出版或灭亡文化有关,但即使忽略小规模的改进论文,其他杰出论文的列表也足够长了。这肯定不容易,但是养成阅读论文的习惯会让你在更小的领域获得更广泛的知识。
你最需要的,也是能让你从具备上述技能的人中脱颖而出的,是发表你自己的研究。在 CVPR、ICCV、NeurIPS 等顶级会议上发表文章。你的简历肯定会受到很大的不同对待。这些会议通常有很多研讨会。将这样的研讨会作为第一份出版物的目标可能是一个明智的决定。许多计算机视觉职位的招聘信息已经开始将此作为首选,甚至是申请的最低资格。
5.额外见解:
一、访问的复杂性
阻止人们进入计算机视觉领域的一大障碍仍然是获得负担得起的计算能力的问题。让我们诚实地说,除非你在大学或在投资深度学习的公司工作,否则你很可能必须经历很多磨难来训练你的模型或自掏腰包。
这篇 对于那些希望做出最佳经济选择的人来说,是一篇非常有用的文章。如果你在网上寻找简单免费的 GPU 选项,你有 Google Colab 和 Kaggle 笔记本。Colab 允许您运行代码 12 个小时,并提供 GPU/TPU。而 Kaggle 给你 30 小时/周的 GPU 和 TPU 运行时间。至于付费提供商,我发现对于业余爱好者来说,vast.ai 是一个非常好的选择。
二。乔布斯
最后,如果你想问什么是让你在当前工作中有别于其他人的关键因素,我会说是 3 件事,不分先后:
- 出版物、GitHub 个人资料和 Kaggle 个人资料。
这三个人越来越多地被招聘者所关注,而以前却不是这样。这是无视你的正规教育。大多数顶级职位的最低要求是博士学位。而其他公司的要求可能没有这么严格。
祝你一路顺风!请记住…
“一夜成名需要 20 年。”
拟合机器学习模型前的 4 个必要步骤
一种简单的面向对象的数据处理方法。

照片由 chuttersnap 在 Unsplash 上拍摄
Learning Rate 是为那些对 AI 和 MLOps 的世界感到好奇的人准备的时事通讯。你会在每周五收到我关于最新人工智能新闻和文章的更新和想法。订阅这里!
在一个通用的机器学习管道中有许多步骤,并且在设计它的时候有很多想法。有问题定义、数据采集、错误检测和数据清理等。在这个故事中,我们首先假设我们有一个干净的现成数据集。
考虑到这一点,我们概述了在拟合任何机器学习模型之前的四个必要步骤。然后,我们在 Pytorch 中实现这些步骤,使用公共语法调用多个方法调用;方法链接。我们的目标是定义一个简单而通用的 API,将任何原始数据集转换成机器学习模型可以使用的格式。
为此,我们将使用 构建模式 、,它使用逐步方法构建一个复杂的对象。
builder 模式是一种设计模式,为面向对象编程中的对象创建问题提供了一种灵活的解决方案。它的目的是把一个复杂物体的构造和它的表现分离开来。
那么,这四样东西是什么?在最简单的情况下,建模前的数据处理包括四个不同的动作:
- 加载数据
- 分成训练/有效/测试集
- 标记数据元组
- 获取批量数据
在接下来的小节中,我将逐一分析这四个步骤,并用代码实现它们。我们的目标是最终创建一个 PyTorch DataLoader,PyTorch 使用这个抽象来表示数据集上的 iterable。拥有一个DataLoader是设置训练循环的第一步。所以,事不宜迟,让我们把手弄脏吧。
加载数据
对于这个例子,我们使用一个模拟数据集,它以 pandas DataFrame格式保存。我们的目标是为训练集和验证集分别创建一个 PyTorch Dataloader类。因此,让我们构建一个名为DataLoaderBuilder的类,它负责构建这些类。
我们看到DataLoaderBuilder的唯一操作是存储一个data变量,它的类型是torch.tensor。所以现在,我们需要一个从熊猫DataFrame初始化它的方法。为此,我们使用 python classmethod。
classmethod是一个普通的 python 类方法,但是它没有接收self作为第一个参数,而是接收了一个class。因此,给定一个熊猫DataFrame,我们将DataFrame转换成 PyTorch 张量并实例化DataLoaderBuilder类,该类作为cls参数传递给方法。可选地,我们可以只保留我们关心的DataFrame的列。在定义它之后,我们将它修补到主DataLoaderBuilder类。
分为培训和验证
对于这个例子,我们将数据集分成两组;培训和验证。很容易扩展代码,把它分成三组;培训、验证和测试。
我们希望随机分割数据集,保留一定比例的数据用于训练,并留出一些数据用于验证。为此,我们使用 Pytorch 的SubsetRandomSampler。你可以在 PyTorch 的官方文档中读到更多关于这个采样器和更多采样方法的信息。
默认情况下,我们保留 90%的数据用于训练,并且我们跨行拆分(axis=0)。代码中的另一个细节是我们返回 **self** 。因此,在创建了 **train_data** 和**valid_data**split 之后,我们返回了整个类。这将允许 as 最终使用方法链接。
标注数据集
接下来,我们应该标记数据集。很多时候,我们用一些特征变量来预测一个因变量(即目标)。那当然就是所谓的监督学习。label_by_func方法根据给定的函数注释数据集。在这个调用之后,数据集通常被转换成(features, target)元组。
我们看到label_by_func方法接受一个函数作为参数,并将其应用于训练集和有效集。我们的工作是设计一个函数,在我们想要标记某种形式的数据集的任何时候为我们的目的服务。在后面的*“把它们放在一起”*例子中,我们展示了创建这样一个函数是多么简单。
创建批次
最后只剩下一步;将数据集分成几批。为此,我们可以利用 PyTorch 的TensorDataset和DataLoader类。
这是这个链中的最后一个方法,因此,我们将其命名为“build”。它创建训练和有效数据集,有了它们,就很容易用已知的批量实例化相应的 Pytorch **DataLoader** **。**请记住,我们现在已经标记了数据,因此,self.train_data是一个由features和target变量组成的元组。因此,self.train_data[0]保持features并且self.train_data[1]保持目标。
了解了这一点之后,让我们用一个简单的例子来说明这一点。
在本例中,我们创建了一个包含三列的虚拟数据集,其中最后一列存储了目标或依赖变量。然后我们定义了一个get_label函数,它提取最后一列并创建一个 features-target 元组。最后,使用方法链接,我们可以很容易地从给定的 pandas DataFrame中创建我们需要的数据加载器。
结论
在这个故事中,我们看到了在拟合任何模型之前,数据处理的四个必要步骤是什么,假设数据集是干净的。虽然这是一个玩具示例,但它可以用于并扩展到各种各样的机器学习问题。
此外,还有一些步骤没有在本文中介绍(例如,计算机视觉的数据规范化或扩充),但本文的目的是提供一个关于如何构建代码来解决相关问题的总体思路。
我叫 Dimitris Poulopoulos,是希腊比雷埃夫斯大学*BigDataStack的机器学习研究员和博士©。我曾为欧洲委员会、欧盟统计局、国际货币基金组织、欧洲中央银行、经合组织和宜家等主要客户设计和实施人工智能和软件解决方案。如果你有兴趣阅读更多关于机器学习、深度学习和数据科学的帖子,请在 twitter 上关注我的 中 、LinkedIn或@ james2pl**。***
数据科学家应该知道的 Git 分支的 4 个步骤

机器学习项目的分支、合并和标记介绍
我相信使用版本控制,不管项目有多小。当你在进行任何类型的快速、敏捷或迭代开发时,这一点尤其重要。训练模型和超参数调整是您想要多个实验和里程碑快照的主要例子。
我最近写了关于数据科学家应该知道的 6 个 Git 命令的文章,作为版本控制新手的入门读物。在本文中,我们将探索一些新的命令来帮助您管理项目的多个独立版本,并将它们合并在一起。
如果您是 Git 新手,您可能想知道什么是分支?可视化分支如何工作的最简单的方法是时间旅行电影的情节。有主时间轴,在 Git 中称为主。当你想做一些新的事情时,你可以从主时间线分支到另一个时间线。主时间线和备用时间线仍然平行前进,但是在任何时候,你都可以跳回到主时间线。当你在 Git 中这样做时,你可以选择是否合并你的修改。
它看起来像这样:

布朗博士解释了错误合并马蒂·小飞侠 1985 年分行的后果。
玩笑归玩笑,理解如何以及何时分支对于使用 Git 至关重要。我将带你经历我在项目中使用的四个步骤。
1.树枝
正如我前面提到的,当您创建一个新的 repo 时,您会自动在主分支中工作。通过在命令行中键入以下内容,您可以看到这一点:
git branch
这应该会返回项目中的所有分支。你现在工作的那个是绿色的。

在这一点上,我们应该花一点时间来讨论什么时候应该创建一个新的分支。比方说,你正准备开发一个新的特性或者重构一些东西。当你解决问题的时候,你不想担心签入错误的代码,所以做一个沙箱来试验是个好主意。把一个分支想象成你的主项目的一个拷贝,在那里进行修改是安全的,不会影响主代码库。
我对我的分支使用特定的命名约定。要创建一个新的分支,您将使用前面的命令,但是将分支的名称添加到其中,如下所示:
git branch v0.1.0-feature
如您所见,我使用软件版本约定来命名我的分支。我从v0.1.0开始,一路向上。因此,下一个分支将是v0.2.0,直到我达到一个新的完整版本,如v1.0.0。有时,您需要对现有版本进行增量更改。在这种情况下,我将创建一个名为v0.2.1的分支。
如果您在一个组中工作,您可能希望指定一个人作为回购所有者,并将他们指定为可以创建新功能分支的人。团队中的每个人都可以直接在那个分支中工作,或者创建他们自己的子分支。在这个场景中,我会创建一个名为v0.1.0-features-jf的个人分支,或者像v0.1.0-features-create-new-model一样添加一个特定的特性名称。
随着时间的推移,您将拥有项目所有主要特性版本的完整历史。它可能看起来像这样:

2.检验
创建分支只是等式的一部分。如果你想在新的分公司工作,你需要先做一个检查。签出分支是通过以下命令完成的:
git checkout v0.1.0-features
结帐完成后,您将在控制台中看到一条确认消息:

现在,如果您在控制台中键入git branch,它将突出显示您正在工作的新分支:

在签出分支时,有几件事你应该记住。
- 您应该只在提交任何阶段性更改后签出新的分支。Git 有时会将这些带到您要切换到的分支。如果未选中此选项,它会破坏您正在工作的分支。
- 如果您有新的未跟踪的文件,它们将不会被触及。即使切换分支,这些新文件仍将存在。因此,还必须注意 stay 文件,这些文件也可能破坏要切换到的分支。
在切换分支之前,最好使用git status,并确保在使用checkout之前一切正常。
最后,如果您正在处理一个从在线回购中下载的项目,您可能没有对所有分支的本地访问权。您可以使用git fetch --all下拉引用到远程源的分支,然后检查您想要的分支。
3.合并
所以当你在一个新的部门工作了足够长的时间后,是时候保存你所做的一切了。虽然提交变更已经为您逐步完成了这一点,但是在某些时候,您会想要将变更合并回主分支。当您在工作分支中完成更改,并且代码稳定后,就可以用下面的命令检查主分支了:
git checkout master
进入主分支后,可以使用以下命令合并特征分支更改:
git merge v0.1.0-features
在使用命令之前,您总是希望位于将接收合并的分支中。假设所有的东西都被正确地合并了,那么您现在应该在主分支中拥有来自您的特性分支的所有代码。
如果您遇到冲突,控制台会告诉您问题出在哪里。你可以使用各种策略来解决这些问题,这些策略现在有点超出范围。
4.标签
这个过程的最后一部分是标记您所做的更改。标记类似于分支。标签代表项目在给定时间的快照。既然您已经将一个特性分支合并到了主分支中,那么现在是创建该版本标签的好时机。因此,当您仍然在主分支中时,在命令行中键入以下内容:
git tag v0.1.0
注意,我没有在标签名中添加feature。这有助于表示项目中已完成且稳定的点。因此,当有人签出项目时,他们可以立即从主分支以最新的稳定状态构建项目。同样,如果您希望他们只使用代码库的特定状态,比如在特定日期发布的内容,他们可以切换到相应的标签。
你可以在任何时候看到一个项目中的所有标签,只需在控制台中输入git tag。

就像git branch一样,您将看到当前 repo 中本地所有标签的列表。
冲洗并重复
总而言之,在 Git 中进行分支时,有四个基本命令:
branch创建新的工作分支- 切换到一个新的分支
merge将代码变更从一个分支复制到另一个分支tag保存代码的快照
现在,您可以执行步骤 1–4来继续创建新的工作分支。请记住,在分行工作时,您可以像平时一样提交。使用这些提交和它们的注释来跟踪您在稳定发布中所取得的进展。
最后要指出的是,永远不要将代码提交给标签。修补一个标签的正确方法是检查它所来自的分支,并从那里创建一个新的分支。例如,标签v0.1.0对应于分支v0.1.0-features。这意味着您将把补丁代码添加到一个新的v0.1.1-features分支,然后将这些更改合并回master,并将其标记为v0.1.1。
如果master分支在你正在修补的特征分支之前;您需要决定是从当前分支标记还是合并到主分支,并在下一个版本的标记中包含这些更改。
做这件事没有一成不变的方法,这完全取决于规模有多大,有多少人在回购中工作,以及谁负责管理回购的合并。
虽然您可能想要merge对master分支的更改,但是它也可能需要合并到额外的特征分支中。所以为了简单起见,我只在迫切需要更新产品而不能等到下一个版本时才修补标签。
我唯一的硬性规定是没有标签项目的任何代码或输出都不能投入生产。重要的是要知道什么版本是活动的,并有一个快照以防出错。这开始进入事情的 DevOps 方面。如果你想了解 DevOps 在过去几十年中是如何发展的,一定要看看我的文章“devo PS 文化的演变”
如果您是 Git 新手,或者在使用分支时需要一些帮助,我希望这有所帮助?如果你在下面留下评论,我很乐意回答你提出的任何问题。
4 种类型的附加特征重要性
内容:
- 哪个目的对于可变的重要性? 1.1 设定你的目标…
1.2…通过选择象限 - 4 个面向目标的象限 2.1 沙普利效应区
2.2 SHAP 区
2.3 沙普洛斯区
2.4 塞奇区 - 每个象限的 Shapley 解 3.1 Shapley 值
3.2 应用于特征属性 - 未来展望和要点信息
- 参考文献

由作者提供的来自datajms.com的附加特性重要性的 4 个目标导向象限的概述。
你可能听说过特征重要性方法:有很多这样的方法,它们对于变量选择和模型解释非常有用。但是还有更多:增加可变重要性的景观最近已经变得结构化并系统化。
这篇文章不仅仅是 SHAP 的另一篇文章,它提出了相似的观点,分享了一个重要的组成部分: Shapley 值。提出了一个结构化的 2 乘 2 矩阵,以便根据目标和范围更好地考虑可变的重要性。侧重于附加特征归因方法,4 个确定的象限与他们的“最佳”方法一起提出:SHAP,夏普利效应,夏普勒斯和最近的 SAGE。然后,我们将研究 Shapley 值及其性质,这使得 4 种方法在理论上是最优的。最后,我将分享我对可变重要性方法的看法。
1。哪个目的的重要性可变?
那么,什么是可变重要性,它们应该具有哪些性质?我们将关注具有以下两个要求的可变重要性:
- 特征属性:表示我们的模型 f 的兴趣数量对每个特征的依赖程度。
- 相加重要性:将重要性相加应该产生一个有意义的量(通常是模型 f 的感兴趣的量)。
虽然特征归属属性是可变重要性的本质,但是附加重要性要求更具挑战性。更著名的可变重要性方法打破了它:Breiman 随机森林变量重要性、特征切除、排列重要性等。让我们关注这两个属性的可变重要性。
1.1.设定你的目标…
让我们来关注一个重要的概念:兴趣量。感兴趣的量是您想要“分割”为变量总和的度量。如果你觉得这个定义太模糊,你会喜欢下面的 Shapley 值部分。
选择感兴趣的数量是下一步,应该符合你的目标。不同视角对应多种选择:
- 局部与全局范围:变量重要性应该对数据集的每一行求和,还是在总体范围内求和?局部范围适用于关注一个数据点的相关情况,或应沿着一维分析重要性的情况。而全局范围与用于高层决策的汇总指标相关:变量选择、因素优先级等等。
- 灵敏度与预测能力度量:变量重要性应该是模型 f 如何变化的度量,还是预测性能如何随之提高?从灵敏度的角度来看,重要性应该集中在用 f 计算如何依赖一个变量。而预测能力方法设置重要性,以说明一个变量对提高预测性能(减少损失函数)有多大贡献。
1.2.…通过选择象限
这些局部与全局范围和灵敏度与预测能力指标定义了一个 2×2 目标导向矩阵。每个象限都以重要性度量命名,从理论上讲,重要性度量对于其感兴趣的数量是“最优的”。这些方程是每个感兴趣的量的加法分解的简化版本。
更具体地说,让我们介绍一些符号。假设从你的变量 X=(X₁,X₂,…,Xᵣ) ,你尝试用你的模型 f(X)∈ ℝ最小化损失函数 l(y,f(x)) 预测 Y 。 x 和 y 是指一个数据点,而 X 和 Y 是总体水平(随机变量)。𝔼和𝕍分别表示一个变量的期望值(“平均值”)和方差。

附加变量重要性的 4 个面向目标的象限,带有感兴趣的数量和附加细分。每个象限都用象限的最优方法命名。图来自datajms.com,由作者提供。
2.4 个以目标为导向的象限
让我们来看看 4 个象限和它们解决的不同问题。我们将按时间顺序进行这次旅行,因为它讲述了两个不同的研究团体如何最终相遇的好故事!
2.1.沙普利效应区
改进 Sobol 指数(1993) [1],Owen 在 2014 年引入了一个重要性度量[2],该度量已由 Song 等人在 2016 年开发并命名为“Shapley 效应[3]”(另见 Iooss 等人在 2017 年的进一步工作和数值实验[4])。它来自于敏感性分析和不确定性量化领域,旨在量化模型 f (例如一组复杂方程的计算机模拟)的输出在多大程度上取决于 X 输入参数。Shapley 效应也完全与机器学习相关,它关注于学习模型 f 的变化在多大程度上依赖于变量 X 。
感兴趣的量是𝕍( f(X) 。方差是量化变异的自然选择。请注意,在敏感性分析社区中,指数通常由总方差归一化,因此所有变量的重要性总和为 1(或 Sobol 指数“接近”1)。
通过查看 4 个象限,一个问题出现了:为什么不选择𝔼( f(X) 作为感兴趣的量?这绝对是全球性的。然而,它与解释变化无关:正的和负的变化将消失在 0 全局贡献中。
让我们继续到 2017 年,开始机器学习社区的 Lundberg 传奇。
2.2.SHAP 区
由 Lundberg 于 2017 年设计并实现[5],shap a 具有局部敏感性焦点。请注意,尽管 shap 是在机器学习会议上发表的,但它并不涉及 Y 目标或模型 f 的任何学习。这就是为什么我能够把它应用到一个非学习的、基于专家的算法中,用于新冠肺炎患者定位。然而,它非常适合机器学习社区,因为它的快速模型特定的实现。
兴趣量坚持最自然的选择: f(x) for x∈ X 。与全局范围不同,在这里同时有正面和负面的贡献是有意义的。了解变化的方向是完全相关的,并允许对 shap 值进行良好的可视化探索(在 shap 包中实现)。
2.3.沙普罗斯区
2020 年发表在 Nature[6](但预印在 2019 年),Lundberg 等人提出了一项创新!虽然本文主要关注基于树的模型,但提出了一个新的想法:使用 shap 将模型误差分解为特征贡献(参见本文的 2.7.4 和图 5),这对于生产中模型的监督性能监控非常有用。我虚构了 SHAPloss 这个名字,以强调所实现的不同目标,尽管实现是在 shap 包内完成的,只需改变 TreeExplainer 中的 model_output 参数。
感兴趣的量是对于 (x,y)∈ (X,Y)的局部损失-l(Y,f(x))* 。*注意 l 自然可以是分类问题的对数损失,同时是回归的 MSE。添加了负号,因此较大的正贡献ϕᵢ意味着可以大大提高性能的特性。
2.4.圣贤区
在 2020 年 4 月提交的预印本[7]中,Covert 和 Lundberg 等人介绍了 SAGE(Shapley Additive Global importancE),一种 SHAPloss 全局公式的解决方案以及计算它的有效方法。请注意,本文远远超出了 SHAPloss 简单的局部到全局的概括,但它也包括对现有重要性方法的回顾,并介绍了理论上的通用预测能力。此外,SAGE 论文明确提到了我们所谓的 Shapley 效应区,解释了 SAGE 在目标上的不同之处。在某些方面,它关闭了我们已经探索过的四象限回路。
感兴趣的量是𝔼[-l(y,f(X)) ],局部 SHAPloss 公式的自然集合。与 SHAP 到沙普利效应的转换不同,这里采用原始预期。这是因为几乎没有正负湮灭,因为增加一个变量通常不会增加损失。
3.每个象限的 Shapley 解
既然已经设定了目的及其感兴趣的数量,Shapley 值[8]理论为每个象限提供了给定期望属性的最佳解决方案。让我们先介绍一下 Shapley 值,看看它如何应用于各种感兴趣的量。
3.1.沙普利值
沙普利值 ϕᵢᵐ 是一种“公平”分享联盟pᵣ={1m(pᵣ获得的利益数量的归属方法,2,…,r} 每个实体之间 i∈ Pᵣ 。 m(u) 是返回联盟的利息数量 u 的函数。联盟是一组实体:有 2ʳ可能的联盟,包括∅和 Pᵣ。最后,让我们用 Sᵢʳ 来表示不包含实体 i 的所有可能联盟的集合。
沙普利值 ϕᵢᵐ 是唯一满足 5 个期望属性(查看 SAGE 论文[7]的 3.1 了解其含义)的数量权重,这 5 个属性分别是对称性、线性度、单调性、虚拟性以及效率,我们在这里写道: m(Pᵣ)=m(∅)+ ∑ ϕᵢᵐ
关于这个 Shapley 值的公式,有很多要讲的。但这有点跑题了,我更愿意把重点放在如何将 Shapley 的想法应用到 4 个象限上。
3.2.应用于特征属性
在我们的上下文中使用 Shapley 值意味着 i 实体就是 Xᵢ 变量。剩下的两个任务是选择感兴趣的量,并为变量 u 的每个联合定义 f 。为我们的 4 象限选择的解决方案是沿着缺失变量取期望值:fᵤ(x)=𝔼(f(x|xᵤ=xᵤ)。有关更多信息,请参见 SAGE 文件中的详细信息。
4 个感兴趣的量转化为 4 个 m(u) 函数,这导致了象限的 4 个名称:具有期望属性的可变重要性方法!
让我们用更精确的感兴趣的量 m(u) 重写 2 乘 2 矩阵,这些量是 f 和所有特征联盟 u ( u∈ { ∅、 { X ₁}、{ X ₂}、…、{ X ₁ ,X ₂}、…}).

可加变量重要性的 4 个面向目标的象限,详细的公式。图来自datajms.com,作者提供。
四个沙普利值ϕᵢshap(x)、 ϕ ᵢ 损失( x ) 、 ϕ ᵢ EFF 和 ϕ ᵢ 圣人是每个象限的“最优”解。请注意,这些值之间有两个链接:
- ϕ ᵢ 圣人= 𝔼[ϕ ᵢ 损失( x )]
- 潜在地,如果损失函数 l 是 MSE,我们有ϕᵢeff=ϕᵢsage 与y=f(x)。
4.未来展望
我们刚刚看到,对于每个象限,“最佳”解决方案已经被定义,并且实现是可用的。那么,完整的故事被讲述了吗?
一方面,我认为附加重要性测量领域已经达到了一个成熟的里程碑,最佳地填充了 4 个象限,从而结束了循环。在 SAGE 的文章之前,我不知道敏感性分析和预测能力重要性之间有任何明确的联系。
另一方面,在可变重要性和特征属性方面仍有改进的空间,包括更好地利用这些技术和探索此范围之外的价值:
更好地使用象限中的方法:
- SHAPloss 在数据科学社区中的传播:尽管 SHAP 在数据科学社区中的采用率非常快,但 shap loss 目前仍不为人所知(除了 Hall 的一本励志笔记本)。我看到了对生产中的模型进行受监督的(当基本事实标签已知时)性能监控的价值。
- 计算效率的提高:除了基于树的模型之外,这些方法都是计算密集型的,并且会很快变得难以处理。实现和统计估计的改进可以提高可用性(参见最近的工作[9])。
除了 2 乘 2 矩阵:
- 基于公平的利益数量:为什么不设想其他列?理解模型行为和模型性能是首要的重要步骤。但是,负责任的数据科学也包括相关的偏见和公平性监测。理论上,似乎可以选择一个基于公平的相关兴趣量 m(u) 并构建其 Shapley 值,以查看“不公平”将如何在特征之间划分。伦德伯格用人口均等指标开辟了道路,巧妙地保持在 SHAP 区域内。
- 探索非附加的特征归属方法。如果使用乘法分解或完全不同的重新加权方法[10]来完成,量化感兴趣的量在多大程度上依赖于输入特征仍然是广泛的研究和实践领域。
一些外卖信息。我希望这篇文章:
- 启发你理解变量重要性的不同目标和范围。
- 让你相信,自从 Sobol 在 20 世纪 90 年代开创了这个领域以来,相加重要性度量领域无疑比以往任何时候都更加成熟。
- 根据你的目的,让你思考选择最有效的象限。
对 SHAP 和沙普利效应区的结果和代码感兴趣吗?你可以查看我的文章新冠肺炎患者定位算法的可变重要性。此外,您可以查看 SAGE 论文[7]以获得更多非最优但计算量更小的方法的示例,以及它们如何适合 2×2 矩阵。
5.参考
[1]: 索博尔,I. M. (1993)。非线性数学模型的灵敏度估计。数学建模和计算实验,1(4),407–414。顺便说一句,我找到的唯一在线版本是一份由 I. M. Sobol 本人手写注释的复印件,寄给了著名的敏感性分析研究员 Andrea Saltelli。
[2]: 欧文,A. B. (2014)。索博指数和沙普利值。SIAM/ASA 不确定性量化期刊,2(1),245–251。
[3]: Song,e .,Nelson,B. L .,& Staum,J. (2016)。全局灵敏度分析的 Shapley 效应:理论和计算。SIAM/ASA 不确定性量化期刊,4(1),1060–1083。
[4]:伊奥斯,b .,T15 普里尔,C. (2019)。相关输入敏感性分析的 Shapley 效应:与 Sobol 指数的比较,数值估计和应用。国际不确定性量化杂志,9(5)。
[5]:伦德伯格,S. M .,T16 李,S. I. (2017)。解释模型预测的统一方法。神经信息处理系统进展(第 4765-4774 页)。
[6]: Lundberg,S. M .,Erion,g .,Chen,h .,DeGrave,a .,Prutkin,J. M .,Nair,b .,Katz,r .,Himmelfarb,j .,Bansal,n .,& Lee,s . I .(2020)。用可解释的人工智能对树木从局部解释到全局理解。自然机器智能,2(1),2522–5839。
[7]:隐蔽,我,伦德伯格,s .,T17 李,S. I. (2020)。通过附加重要性测量了解全局特征贡献。arXiv 预印本:2004.00668。
沙普利,L. S. (1953)。n 人游戏的一个值。对博弈论的贡献,2(28),307–317。
[9]:普利斯克等人最近的预印本将沙普利效应的计算提高了几个数量级:普利斯克,e .拉比蒂,g .&博格诺沃,E. (2020)。灵敏度分析中沙普利效应的计算。arXiv 预印本:2002.12024。
[10]: 巴乔克,f .,甘博亚,f .,卢贝斯,J. M .,&里塞尔,L. (2018)。熵变量促进机器学习中的可解释性&。
进行机器学习的 4 种方式
你的团队处理机器学习的正确方式是什么:研究、开源、托管平台还是 API?

来源:作者
机器学习可能会令人困惑。每个人都用这个词来表示稍微不同的东西,有太多的东西需要跟上。
在你选择供应商或平台来满足你的人工智能需求之前,了解机器学习的哪个“层”最适合你很重要。你可以从头开始构建自己的人工智能,使用现成的产品,或者介于两者之间的东西。
在本帖中,我们将带你浏览四个选项,并通过将它们与交通工具进行比较,帮助你确定哪一个最适合你。
机器学习的不同“层次”

就像不同的交通工具一样,你可以用不同的方式使用机器学习。来源:作者
- 开发新的语音转文本算法等新颖的研究就像制造汽车一样。
- tensor flow 等开源框架类似于拥有一辆汽车。
- AWS SageMaker 等托管平台就像打车。
- Google Translate 等 API类似于乘坐航班。
你可以在不同的层面建立一个机器学习解决方案。当你进入更专业的层时,更多的特性可以直接工作,但是你得到的灵活性更少。
每一层都建立在前一层的基础上:API 通常建立在托管平台上,托管平台建立在开源框架上,开源框架建立在研究的基础上。
不同的问题最好由不同的层来解决
哪一层最适合你,主要取决于你要解决的问题。
然而,并非所有的层都是相同的大小:例如,一个问题被一个托管平台干净地解决,这实际上是非常罕见的。

不同的问题更适合不同的层次。“托管平台”层比许多人想象的要小。来源:作者
因为托管机器学习平台背后的公司使用激进的营销策略,所以人们经常高估这些平台的价值。事实上,托管平台通常会让您面临使用现成 API 的最坏情况,同时无法完全解决您在使用开源框架构建定制解决方案时必须接受的棘手问题。
让我们深入了解一下每一层。
做人工智能研究就像制造你自己的汽车
如果你想使用人工智能,你可能会想雇佣一个博士团队。但这就像雇佣一个机械工程师团队,让他们为你制造一辆汽车,然后 24/7 全天候为你服务。
如果你是一名参加国际比赛的赛车手,这可能是合理的——但在其他方面可能就不合理了。类似地,像谷歌这样的公司有研究团队,他们通过开发新的算法和架构来推动人工智能的基础。
这项工作成本很高,往往需要几年甚至几十年才能创造出真正的价值。如今,大多数公司甚至不需要考虑采用这种方法。除非你在你的领域取得领先的 1%的成绩,否则拥有一个专门的研究团队是不太可能有意义的。
你可能想做你自己的人工智能研究,如果:
- 你正在创造一个 Siri 的竞争对手,你希望它在语音到文本的翻译方面比 Siri 更好。
- 你正与其他投资银行展开正面竞争,并希望让你的交易算法获得优势。
样本团队结构:
- 一个研究工程师团队:博士、博士后和教授。
- 能够将研究成果转化为机器学习解决方案的数据、机器学习和 devops 工程师团队。
使用开源框架就像拥有自己的汽车一样
随着学术研究的成熟,它演变成像 Tensorflow、PyTorch 和 Keras 这样的开源框架。世界各地成千上万的开发者免费为改进这些框架做出贡献。
任何人都可以免费下载并使用这些开源框架。这些与亚马逊、谷歌和微软等昂贵的托管平台使用的强大“引擎”完全相同。但是您可以灵活地按照自己的方式构建系统。
但就像拥有自己的汽车一样,这也有一些不利之处。如果你有一辆车,你需要学习如何驾驶或者雇一个司机。要使用 Tensorflow 这样的工具,你需要学习编码或者雇佣一个开发者。
如果你有一辆车,你还需要担心加油、更换轮胎和找到一个安全的车库等事情。如果你建立自己的定制机器学习解决方案,你还需要建立一个合适的基础设施并维护它。
你可能想用开源框架开发你的机器学习解决方案,如果:
- 您希望改进一个非常适合您的业务的工作流程。
- 您拥有关于内部问题的数据和领域知识。
- 你不怕承担复杂的软件项目。
样本团队结构:
- **内部:**devo PS 工程师、机器学习工程师、数据科学家、项目经理和主题专家的团队。
或
- **外部:**像美国这样的机构,他们使用开源框架构建你的定制 ML 解决方案。
使用托管平台就像打车一样
有时候你很快就需要某样东西,你愿意为此付出更多。如果你需要做一次快速的一次性旅行,你可以乘出租车。但是如果你每天都坐长途出租车,那么买辆车可能更划算。
同样,像 AWS Sagemaker、Dataiku、Knime、Alteryx 这样的托管平台,可以让你更快上手,并提供一些预建的组件帮助你更快上手。
但是,尽管这些平台可以节省你的时间,但它们往往比他们的营销团队愿意承认的要有限得多。此外,如果你被“锁定”在其中一个上,费用可能会很高。就像出租车一样,如果你一直需要它,那么它可能是错误的解决方案,你可能会比你预期的更快达到它的极限。
您可能希望使用托管平台,如果:
- 机器学习不会成为你业务的重要组成部分,也不会成为竞争优势的来源。
- 您希望将机器学习应用于已经很好理解并且已经在其他地方解决的标准问题(例如,推荐系统、流失分析、需求预测)。
样本团队结构:
- 至少一个机器学习工程师,一个开发人员,一个 DevOps 专家。
使用 API 就像坐飞机一样
如果你只是需要定期从伦敦到纽约,那么公共交通可能会很好地满足你的需求。这是最不灵活的运输方式,但它做一件事,而且做得很好。
类似地,像 Google Translate 这样的 API 和 web 应用程序最容易插入到您现有的基础架构中。它们还可以根据您的需要进行扩展,并提供无可匹敌的质量水平。
但它们也是最不灵活的。如果您有任何定制需求,那么 API 可能对您来说不够灵活。此外,您还需要支付额外费用:例如,使用翻译 API,您可能需要为翻译的每个字符付费。
您可能想要使用 API,如果:
- 你有一个电子商务平台,你想让用户看到其他语言评论的自动翻译。
- 你经营着一家物流公司,你想要自动优化送货路线。
样本团队结构:
- 一个开发人员将 API 集成到您的系统中。
后续步骤
一旦你选择了对你来说最有意义的“层”,那么你就可以开始进入使用什么样的编排平台、工具或管理平台的细节。
如果您仍然不确定,请与我们预约免费电话来讨论什么可能适合您!
本文原载于【datarevenue.com。
我在学习 Tableau 时经常犯的 5 个错误
入门
这些错误是可以避免的

今年早些时候,我醒来说今天将是我学习 Tableau 的一天。我卷起袖子,直接看了我在 Youtube 上找到的第一个初学者教程,标题很吸引人,比如“如何在一天内学会 Tableau”大约 30 分钟后,我发现自己闲下来了(不久后我关上了笔记本电脑),开始了构建我的第一个 Tableau 仪表板的缓慢而痛苦的跋涉。事实证明,学习 Tableau 并不是花了我一天的时间,而是花了我两个月的时间,因为我在学习过程中不断地犯技术性和非技术性的错误。
这是我在学习 Tableau 时犯的五个最大的错误,以及如何避免它们以成功和有效地掌握这个流行的 BI 工具。
错误 1 |学习我不需要的画面特征
当我排队等候我的第一个 Tableau YouTube 教程时,我很难认识到我应该首先学习 Tableau 的哪些功能。问题还不止于此——我真的不知道我的数据故事中的问题。所以当我坐着看教程的时候,一切看起来都是相关的。我会失去兴趣或被拉进新的教程,这是有道理的——我缺乏让学习过程感觉个性化所需的洞察力和专注度。
虽然作为初学者,这个错误可能很难完全避免,但我建议花点时间思考一下你认为 Tableau 可以帮助解决的数据故事中的问题。这些可能看起来像:
- 使用仪表板使您的数据演示更具互动性和吸引力。
- 快速创建漂亮的分层地图。
- 利用 TabPy 加强你的预测可视化。
您将希望从学习直接涉及您的分析过程中的问题的特征开始。Tableau 的功能非常丰富,在学习如何在 Tableau 中使用自定义地图框样式之前,理解细节层次(LOD)表达式可能会对您有所帮助。
错误 2 |用不相关的数据集练习
要学习 Tableau,您需要一个可靠的数据集,最好是一个“真实的”数据集,以便在工作中加以利用。我最初的实践数据集大部分都非常干净,从来不需要连接。
如果你没有现成的数据集,你可以在这里、这里或者这里找到很棒的公共数据集。我建议使用与您办公桌上最常出现的数据类型相似的数据集。对我来说,这是调查数据,所以我开始确保我的实践数据集都有李克特量表和人口统计数据。对你来说,这可能意味着寻找包含大量地理、数字或布尔数据的数据集。
错误 3 |选择了错误的教程
这个错误我犯了好几次了。在这个过程中,我了解到一些教程涵盖了你所知道的关于 Tableau 的一切,而其他教程只涵盖了最基本的东西。在一个快速的“如何学习 Tableau”在线搜索中,你会看到这两个极端的广泛代表。
这两个教程
选择合适的教程是一个寻找两种类型视频的练习。第一个是介绍性教程,教你 Tableau 的基本功能。这个视频应该教你如何下载 Tableau,连接你的数据源,建立你的第一个工作表,使用流行的功能,如可视化“演示”,并了解 Tableau 的尺寸和措施。对于这种类型的视频,我建议在这里观看 Edureka 的免费 YouTube 课程的前 1.5 小时。
第二种类型的视频专用于您的数据分析。从错误#1 和#2 中吸取教训后,我开始关注如何利用 Tableau 来可视化我的调查数据。我在史蒂夫·韦克斯勒在 2014 年 Tableau 会议上的演示中的上传中找到了完美的内容。这个视频是非常具体的调查,并成功地帮助我清理和重塑我的数据,然后上传到 Tableau。对于第二种类型的视频,我建议在 YouTube 上寻找小众教程,这些教程使用与你相似的数据集,并针对你的特定行业。
提示:参与使用你将使用的 Tableau 平台的教程。例如,您可能会发现您在 Tableau 桌面教程中学习的功能在 Tableau Public 上不可用。这肯定会令人失望!
以下是您在学习过程中可以利用的一些其他资源:
- 现场网络研讨会您可以提出您的问题,并获得现场解答!对于一些网络研讨会,您甚至可以下载一个演示数据集,与演讲者一起工作。
- 免费培训视频如果你正在使用 Tableau Desktop,这些视频会特别有帮助。
一旦你完成了你的第一个项目,你可能会发现 Tableau 是多么多才多艺,然后更有意识地指导你的学习。您可能希望搜索教程来帮助您成为计算奇才或在 Tableau 中编写令人印象深刻的 Python 代码行的专家。
错误 4 |没有花足够的时间学习加入
由于 SQL 培训,我现在对内部、左侧、右侧和完全外部连接有了更多的了解,但在我刚开始学习 Tableau 时,我对连接一无所知。我在几个教程中看到了这个特性,但是错误地把它归类为另一个我不需要马上知道的特性。伙计,我错了。我很难合并数据集或完全避免连接数据。回顾过去,最令人沮丧的是,连接是 Tableau 中最容易实现的部分,也是数据分析不可或缺的部分。花时间理解连接以及如何应用它们是至关重要的。
错误 5 |建立一个我无法分享的可视化
我花了几个小时制作的第一个 Tableau 仪表盘最终成了一个局部半身像,因为我很快发现我的客户没有简单的方法来查看交互式仪表盘。因为数据是保密的,我不能把我的作品上传到 Tableau Public。我必须考虑的唯一选择是指导我的客户将 Tableau Reader 安装到他们的桌面上。我最终决定下载并以 PDF 格式分享我的作品(这是一个悲伤的时刻)。

一个悲伤但坚定的本文作者。我是说,帕格。照片由马太·亨利在 Unsplash 上拍摄
为了避免这个错误,花点时间设想你计划如何交付你的工作。如果你的数据是非机密的,我建议你熟悉 Tableau Public,即使你是在 Tableau Desktop 上工作。
提示:Tableau Desktop 和 Tableau Public 是这家公司最受欢迎的产品。后者是免费的,但对您可以连接的数据源类型有一定的限制,如果您正在处理机密数据,则不适合使用它。根据 Tableau ,“你不应该公布你想保密的机密数据,比如你公司的销售计划或者你的个人财务信息。一旦发布,你就应该知道这些数据不再是隐私了。”
Tableau Desktop 不是免费的,但是如果你是一个注册学校的学生,你很幸运。学员可以下载访问 Tableau 桌面一年,免费 **。**如果你不是学生,Tableau 确实提供了 14 天的免费试用,你可以在这里下载并用来练习。
我建议访问您将在几个月后使用的平台。
最后…
我在学习 Tableau 时犯的这五个错误成为了加强我自学过程的教训。在我学习新技术的时候,对它们的反思帮助我成为了一名更好的学生。现在,我很想听听你的意见—
你是否曾经从事一项新技术,但在学习过程中感到停滞不前?这是一项其他人似乎马上就能掌握的技术吗?
采用数据科学的 5 个阶段
你的公司数据流畅吗?
有些公司是为数据科学而建立的。其他人需要做出一些重大的基础设施改变,以便数据科学为他们有效地工作。在本文中,我概述了公司在利用数据科学的过程中经历的数据流畅性的 5 个阶段。
如果你是一名数据科学家,你的公司所处的数据流畅性阶段将极大地影响你所做的工作类型。如果您是数据科学经理或负责公司数据战略的人,这篇文章可以作为将您的组织带到下一个级别的路线图。


第一阶段
第一阶段:数据收集
这是数据科学采用生命周期的基础。如果您的公司没有高质量的数据,您就无法执行高质量的数据科学。处于这一阶段的组织认识到数据在未来可能很重要,因此他们开始收集数据。
大多数公司已经过了这个阶段,但是重新评估你的数据收集协议和最佳实践并没有坏处。

第二阶段
第 2 阶段:数据汇总
收集数据是不够的。组织意识到,除非对收集的数据进行清理和组织,否则这些数据毫无用处。数据科学家和分析师可以处理杂乱的数据,但通常情况下,至少需要做一点工作。
处于这个阶段的公司通常会雇佣一名数据架构师,并开始将他们的数据转移到一些数据库基础设施中。
这个阶段的开销可能比人们预期的要多。许多不同的系统可以通过多种方式收集数据。数据工程师需要获取所有这些数据,并对其进行格式化,使其具有凝聚力。

第 3 阶段
阶段 3:分析洞察力
公司认识到数据可以帮助他们改进决策。在这个阶段,洞察通常是描述性的,并且基于在数据透视表中发现的趋势。人类的决策正在被分析洞察力所补充。这项工作通常可以由一组分析师来完成。
这种洞察力的例子通常出现在金融或营销领域。公司基于这种类型的分析对客户进行细分,并在不同的市场销售不同的产品。

第四阶段
第 4 阶段:高级分析
你开始使用更先进的机器学习模型来改善决策。这个阶段的特点是模型在人的监督下做出决策。组织需要认同和信任他们的数据科学团队,才能达到流畅的这一阶段。在这个级别,数据科学家是必须的。
高级分析将数据科学视为一种产品。数据科学家制作供自己或他人“使用”的研究和模型。例如,如果一家卡车运输公司建立了一个模型,可以预测车辆何时需要新轮胎。这个模型,结合人类的评估,将决定何时更换轮胎。

第五阶段
阶段 5:分析集成
数据流畅性层级的最后一个阶段是将数据科学完全整合到业务的某些领域中。在这里,机器学习模型被投入生产,并在没有人类直接监督的情况下做出决策。在这个阶段,你的数据科学家(或机器学习工程师)正在与你的工程团队合作,让数据科学成为一种服务。
分析集成将数据科学视为一项服务。这方面的一个例子是一个在线网站的推荐系统,它根据顾客的喜好和过去的购买情况向顾客展示不同的产品。
https://www.youtube.com/watch?v=BXmEmIK5aqI
想想你的公司在数据流畅的阶段。你有合适的资源,知道如何将你的能力提升到一个新的水平吗?
大数据的 5 个 v 隐藏着一个陷阱
商业科学
如何有效利用大数据

被 数据驱动是必须的 。明智的决策制定,尤其是在自动化商业智能的支持下,可以带来更高的投资回报率和更好的业务成果。
从人工智能工程到超自动化,在所有业务领域使用数据的更有效方法是 Gartner 2021 年每一个顶级战略技术趋势的核心。
后 Covid 时代,以数据为中心不再是发展的选择。这是要求。
尽管如此,哈佛商业评论报告称,77%的高管认为大数据和人工智能计划是他们最大的挑战。更糟糕的是,这一比例在过去几年中呈指数级增长。
这种趋势在未来十年有可能继续吗?随着公司试图转换到数据驱动的思维模式,他们很难有效地使用他们的数据。大多数企业不知道如何摆脱的第 22 条军规。
你已经收集了大量的交易数据。现在怎么办?

Arturo Rey 在 Unsplash 上拍摄的照片
收集和访问数据不是挑战 。企业每天都会产生数十亿个数据点。到 2025 年,每天将产生 463 艾字节的数据。这比存储人类历史上所有话语所需的字节数大了 90 倍!这些数据中很大一部分是社交媒体、Tik Toks、电子邮件和自拍,但更多的是交易数据。
尤其是零售企业,它们从交易数据中获得了一些最有价值的商业情报。这曾经是一个简单的过程。我们可以使用 Excel 甚至手工计算需求和理想价格。如今,分析交易数据的传统方法远远不够。数据的规模让我们甚至无法理解这些数字,更不用说从中获得有用的见解了。
大数据改变了问题的性质。
我们不再费力收集数据;我们努力有效地使用它。
一旦你有了这么多的交易数据,感觉就无法理解接下来应该发生什么。
大数据的传统 4v
幸运的是,有一个行业标准可以指导我们。为了有效利用大数据,您需要解决 4 个 Vs。你必须理解、标准化和验证这些元素,否则你将永远无法成功地提取可用的情报。

马库斯·斯皮斯克在 Unsplash 上拍摄的照片
1.卷
你到底有多少数据?当然,大数据意味着大量数据,但是您使用了多少呢?容量决定了您的分析必须容纳多少数据。
2.速度
数据收集、存储和处理的速度有多快?你是接近拥有实时数据,还是有滞后?模型多久需要考虑一次新数据?速度决定了你的分析有多及时和相关。
3.品种
你有什么样的数据?它是如何构成的?你的数据来源有多多样化?数据类型的变化是否足以让 it 部门提供适用的建议?多样性决定了你的分析是孤立的还是整体的。
4.准确性
数据是否正确?有缺失的部分吗?你的数据有多少是噪音?准确性决定了你的分析有多准确。
价值:新的第五代
大数据的这些 V 可能是行业标准,但数据科学家越来越认识到第五个甚至更重要的 V: 值 。
换句话说,在商业环境中,大数据最重要的是你将数据转化为决策的能力,从而提高公司的投资回报率。数据必须是可操作的,并且带来的价值要大于分析数据的成本。在规模上,数据的质量比数量更重要。价值评估可用数据的最终质量。
这第五个 V 对公司来说至关重要。仅仅因为我们根据其他 v 收集了好的数据,并不意味着它实际上是有用的。拿走价值,数据无用。

Daoudi Aissa 在 Unsplash 上拍摄的照片
更好的数据接收+更好的分析=成功
数据的价值因素是为什么如此多的公司在尝试成为有效的数据驱动型企业时失败了。有些人花了太多时间试图管理前四个 v,以至于他们不知所措,无法在价值到来时提取有用的见解。其他人则完全专注于分析,而不担心大数据的基础,因为数据的缺陷会限制其价值。没有完美的平衡,你就丢掉了关键的智慧。
幸运的是,当您自动化基础工作(数据摄取和分析)时,平衡比您想象的要容易。
了解数据接收
数据摄取与您管理和创建数据模型的方式有关。本质上,数据摄取与前 4 个 Vs 有关。这是一个处理数据量、降低速度、根据多样性进行描述并监控准确性的过程。数据被适当地存储起来,任何差异或缺口都被识别和修复。
数据摄取可能非常复杂,但是现在有一些工具可以自动完成这个过程。在 Evo ,我们创建了 EvoFlow ,它编排数据流并运行一系列检查以确保我们使用的数据是有序的。气流和其他工具可以达到类似的目的。这些工具会自动执行并反复检查验证数据是否符合前 4 个 v 的流程,从而让您专注于价值。
自动化分析

然而,关注价值并不意味着你应该牺牲自动化。分析也应该自动化,以避免人为错误。我们发现这是数据科学和商业科学之间的差异:自动化减少了使用和输入错误,这是性能不佳的最重要来源。
平衡这一边的自治系统最大化价值,这是每个公司最应该关心的大数据元素。分析是最终将大量交易数据和其他业务数据归结为洞察力的一步。这就是大数据实际上可以在 KPI 和贵公司的市场成功中发挥作用的地方。如果没有自动化分析,您将永远无法优化值。
避免数据驱动的陷阱:人工智能自动化

照片由 Michael Dziedzic 在 Unsplash
数字化转型仍然是一个难以实现的目标,但通过自动化、人工智能驱动的大数据使用,每个企业都可以成为真正的数据驱动型运营。如果我们试图在没有比人类更快地处理、验证和分析数据的技术的帮助下使用数据,大数据的陷阱只会抓住我们。您不需要淹没在交易数据中,而是挖掘其价值以获得更好的结果。
**想更多地了解大规模数据接收和交易数据的技术方面吗?**在 Evo 大学参加免费课程!我的同事托比亚·图迪诺是一名数据工程师专家,他深入研究你所知道的一切,开始更有效地使用你的交易数据。我鼓励你报名参加 https://evo.ltd/join 大学。
PS 我定期写商业科学。推荐后续阅读:
数学最优化的悖论
towardsdatascience.com](/supply-chain-optimization-worth-it-or-not-20ae4c6e635) [## 94%完美:2000 亿美元库存问题的惊人解决方案
机器学习和人类经理一起修复供应链
towardsdatascience.com](/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/)
SQL Select 语句过程的 6 个步骤
使用简单示例详细解释查询执行顺序

由 Pixabay 授权
介绍
*在本文中,我将一步一步地描述对关系数据库执行查询的逻辑过程。为此,我将使用两个简单的非标准化表格:公民和*城市。它们描述如下:

表格描述
市民表包含杰出市民的数据和他们居住的城市的识别号,城市是包含城市名称和他们各自的识别号的表。

数据
假设我们只想知道两个城市的名称,除了圣布鲁诺,那里有两个或更多的居民。我们也希望结果按字母顺序排序。
这是获取所需信息的查询。
SELECT city.city_name AS "City"
FROM citizen
JOIN city
ON citizen.city_id = city.city_id
WHERE city.city_name != 'San Bruno'
GROUP BY city.city_name
HAVING COUNT(*) >= 2
ORDER BY city.city_name ASC
LIMIT 2
查询流程步骤
1.获取数据(从,加入 )
2。行过滤器( Where )
3。分组(分组由 )
4。组过滤器(有 )
5。返回表达式(选择 )
6。指令&分页(指令由&限制/偏移)
第一步:获取数据( From,Join )
FROM citizen
JOIN city
该过程的第一步是执行来自子句的中的语句,随后是 Join 子句。这些操作的结果是得到两个表的笛卡尔乘积。

笛卡尔乘积
一旦来自的和连接被执行,处理器将根据条件得到符合条件的行。**
ON citizen.city_id = city.city_id

合格的行
第二步:行过滤器(Where)
在获得合格的行之后,它被传递给 Where 子句。这使用条件表达式评估每一行。当行的计算结果不为 true 时,它们将从集合中移除。
WHERE city.city_name != 'San Bruno'

第三步:分组(分组依据)
下一步是执行 Group by 子句,它会将具有相同值的行分组到汇总行中。此后,所有的选择*表达式将按组计算,而不是按行计算。*
GROUP BY city.city_name

第四步:分组过滤(Having)
Having 子句的由一个逻辑谓词组成,它由在组之后处理,并且它不再引用单个行,只能引用行组。
HAVING COUNT(*) >= 2
执行该操作的结果将保持如上图所示的设置。这是因为每个组中都有两个或更多的元素。
第 5 步:返回表达式(选择)
**在这个步骤中,处理器评估查询结果将被打印的内容,以及是否有一些函数要在数据上运行,如 Distinct 、 Max 、 Sqrt 、 Date、Lower、等。在这种情况下,select 子句只打印城市名称,并用标识符“city”作为 city_name 列的别名。
SELECT city.city_name AS "City"

步骤 6:排序(Order by)和分页(Limit / Offset)
查询的最后处理步骤处理显示顺序和限制结果集大小的能力。在我们的例子中,要求最多显示两个按字母顺序排序的记录。
ORDER BY city.city_name ASC
LIMIT 2

结果集
结论
更好地理解事物是如何工作的,就能获得更好的结果。对如何执行一个 Select 语句有了基本的理解,就更容易得到预期的结果集。
希望这篇文章对你也有帮助。
数据科学的 7 个习惯
生产力
用这些习惯开始你的每一天

米切尔·霍兰德在 Unsplash 上的照片
每天,我都过着我的日常生活。重复一遍。
在数据科学的世界里,我做的大部分工作是探索未知的领域(读作:数据)。工作流或多或少类似于每个项目迭代。数据收集—探索—流程—建模—测试—部署—监控—展示—重复。我想知道,我怎样才能确保我不是一遍又一遍地重复同样的循环?我怎样才能做得更好?
我找到的答案是:适应我的习惯。您如何:
- 查看和重构数据科学问题,
- 创建相互协作,以及
- 保持有效沟通
是经常被忽视的习惯。请记住,数据科学不是构建最佳模型,而是通过数据产生积极影响。你的习惯会影响你对每个问题的反应。
受斯蒂芬·R·科维的启发, 高效能人士的 7 个习惯 改变了我。对我来说,这仍然是一本很有影响力的书。不管是不是数据科学,在我的工作流程中应用这些习惯可以提高我的工作效率。我想和你分享这些让我保持积极心态的习惯。
以下是我从数据科学的角度对这 7 个习惯的看法。当我们经历它的时候,问问你自己,你需要改变这些习惯吗?
1 —积极主动

嗯,不是那种主动。相反,为了更大的利益采取主动。
数据科学不是做利益相关者想要的事情。它是增长黑客和解决商业问题的工具。没有人比你更了解这些数据。一个高效的数据人员应该就如何利用数据提出建议!人们可能没有意识到数据的力量。
专注于数据能带来什么价值!
“被动型的人受感情、环境、条件和周围环境的驱使。积极主动的人是由价值观驱动的——经过仔细思考、选择和内化的价值观。”—斯蒂芬·柯维
2——以最终目标为出发点

数据科学不是完成你的工作,而是找到实现目标的最佳途径。
回答商业问题时,要想好结果会是什么。没有它,任何项目都不能很好地计划和执行。当我们不知道范围的时候,我们怎么能工作呢?一个有效的数据人员应该对项目如何完成有一个好的想法。每个项目的最佳实践可能有所不同。
无论是仪表板、模型、数据产品还是电子表格文件;最好的输出是什么,怎么做?
“从心中的目标开始,意味着从清楚地了解你的目的地开始。这意味着知道你要去哪里,这样你才能更好地了解你现在在哪里,这样你迈出的步伐才会始终朝着正确的方向。”—斯蒂芬·柯维
3-把重要的事情放在第一位

艾森豪威尔决策矩阵。图片作者。
数据科学不在于你做了多少分析。
必须优先解决最重要和最紧迫的问题。如果数据科学团队被大量的请求所淹没,这 4 个象限必须明确。一个有效的数据人员知道应该先做什么。我们为什么要在无关紧要的事情上费心呢?
衡量什么是重要的,什么是紧急的,并始终坚持最高优先级从长远来看会有回报。
“关键不在于优先处理你日程表上的事情,而在于安排好你的优先事项.”—斯蒂芬·柯维
4——考虑双赢

数据科学与你的工作表现无关。
你有没有遇到过阻碍,想要用你的方式解决?伟大的组织在内部(甚至外部)协作。思考双方如何双赢是获得信任和确保长期成功的关键。一个有效的数据家伙知道每个人都可以赢!如果一个人赢不了,再想想。
关注那些不是片面的甚至只是权宜之计的解决方案。
“这不是你的方式或我的方式;是更好的方式,更高的方式。”—斯蒂芬·柯维
5 —首先寻求理解,然后寻求被理解

照片由 Devin Avery 在 Unsplash 上拍摄
数据科学不在于你的项目有多复杂。
大多数数据人认为数字和逻辑驱动,而其他大多数人不这么认为。然而,并不是所有的问题都可以用数字来解释。获得对人的充分理解的关键是同理心和开放的心态。一个有效的数据人员在做出假设之前应该首先理解。错误的方法不太有效。
寻求另一种观点,或许会开启另一种更好的可能性。让我们多听听!
“大多数人没有带着理解的意图去听;他们听着,意图回答。”—斯蒂芬·柯维
6 —协同增效

佩里·格罗内在 Unsplash 上的照片
数据科学不是你一个人的工作。
要完美地执行一个精心设计的计划,团队合作是必不可少的。想象一下:没有实现的数据建模;没有用户定义的指标的仪表板;没有数据工程的分析。没用。一个高效的数据人员必须能够与其他人同步工作。组织之所以存在,是因为每个人都在其中。
求协作!每个人可能会提供不同的和更好的选择。
“协同优于我的方式或你的方式。这是我们的方式。”—斯蒂芬·柯维
7 —磨快锯子

我意识到,数据科学是巨大的。
只有通过持续不断的学习,才能对数据科学有更深入的了解。争取更多的知识,适应新的问题。没有放之四海而皆准的方法。一个高效的数据人员随时准备解决任何问题。发展自己,接受挑战!
记住你是你最大的财富!
“除非你不断提高自己的技能,否则你很快就会变得无关紧要。”—斯蒂芬·柯维
现在,你最需要改进的习惯是什么?
我知道这些习惯已经有 5 年了,但是我还在继续努力。控制习惯很难,因为它们迫使你走出舒适区。但是,不要担心你不能控制的事情,记住你只能控制你自己。
“从小事做起,许下承诺并信守承诺。然后,许下更大的承诺,并信守承诺。”—斯蒂芬·柯维
更进一步,实际上还有第八个习惯。找到自己的声音,并激励他人找到自己的声音。话题从效率转移到伟大。将愿景、纪律、激情和良知转化为灵感。如果你是数据科学的领导者,请考虑阅读它!
一步一个脚印!祝大家平安健康。
参考
[1]斯蒂芬·R·科维,《高效能人士的 7 个习惯 (1989)
[2]斯蒂芬·R·科维,第八个习惯:从有效到伟大 (2004)
伟大数据科学家的 7 种性格特征
要成为一名伟大的数据科学家,我们需要做更多的事情,这样我们才能实现前所未有的突破。

介绍
大数据的出现导致数据科学的重要性日益凸显,编程和统计知识被视为开始数据科学家职业生涯的主要技能。这些技能有助于进入数据科学行业,这使得全球数百万学生注册了各种在线课程。通过访问互联网,任何人都可以掌握在数据科学领域获得一席之地所需的工具和技能。由于获取技术知识没有障碍,大多数学习者都有望达到相当水平的数据科学能力。
因此,要成为一名伟大的数据科学家,要让自己与众不同,需要的不仅仅是满足技术需求的能力。在我成为数据科学家的过程中,我和各种各样有成就的数据科学家一起工作过,我了解到这 7 种个人特质有助于造就一名伟大的数据科学家。
性格特征
好奇的
作为一名数据科学家,由于数据科学领域的快速发展和不断变化的特征,我们需要对学习新知识和技能有一种不可抑制的热情。学习和了解新的数据科学技术的愿望是不断帮助数据科学家提高其分析能力的一个重要因素。集体知识的积累使我们能够识别不同知识体系之间的逻辑联系。此外,求知欲是提出问题和探索的冲动的表现,这有助于数据科学家在解决问题时避免认知偏差。例如,当我们确定两个变量之间的相关性时,我们倾向于得出因果关系存在的结论。然而,理解统计概念不是为了发现因果关系,一个好奇的数据科学家将进行进一步的探索,以了解和理解两个变量之间的潜在关系。
面向细节
编程是数据科学中的一项基本技能,因此调试练习在设计从数据处理到性能评估步骤的数据科学解决方案时是不可避免的。然而,编程和数据科学技术广度的结合在编码数据科学管道时引入了相当大的复杂性,这使得数据科学家必须关注最小的细节。一个小的编码错误演变成产生意外分析结果的关键问题并不罕见。除了在编程中勤奋调试之外,面向细节的数据科学家通常会在将数据输入机器学习算法之前花费大量时间来检查数据的质量。因此,面向细节有助于数据科学家创作高质量的作品。
批判性推理
在解决现实世界的问题时,数据科学家通常需要客观地分析数据,以证明或反驳某个假设。因此,批判性推理使数据科学家能够就该做什么培养清晰而理性的思维。除了发现隐藏的见解,我们还需要通过构建可以使用数据科学技术解决的问题来系统地解决问题。当处理大量信息时,数据科学家需要在实验和理论确认中构建和评估假设。因此,我们需要持怀疑态度,永远不要通过寻找反映真相的答案来接受表面上的陈述,而不是寻找我们容易得到的答案。例如,在数据科学生命周期中,批判性推理帮助数据科学家在数据采集步骤中批判性地评估数据的可信度。
创造性的
数据科学的本质是使用数据来发现事物如何以不同的方式运作,以产生更多的价值。因此,创造力是一个伟大的数据科学家的关键特质,因为它能够创造出无中生有的东西。例如,在特征工程过程中需要巨大的想象力来增强机器学习模型的性能。此外,在开发可理解的可视化的过程中,创造力是一个重要的元素,随着设计过程超越数据科学技术能力,可视化可以有效地向利益相关者提供见解。尽管数据科学是逻辑驱动的,但创造力使数据科学家能够从未探索的不同角度来看待问题。
爱说话的
数据科学解决方案的开发涉及从获取数据到训练机器学习模型的高度复杂的技术。因此,将分析结果转化为可操作的业务见解并与业务利益相关方进行沟通,是伟大的数据科学家最重要的特质。分析结果的交流决定了数据科学解决方案的影响,因为从逻辑上和情感上吸引利益相关者的能力有助于我们与利益相关者说相同的语言。我们需要利用业务语言来有效地交流技术成果,因为它鼓励利益相关者有效地参与构思和成果验证。许多伟大的数据科学家在交流结果时感同身受,他们通过创造一个引人注目的故事来呈现事实和数据,以促进任何人的理解。
心胸开阔
由于与各种利益相关者(如数据工程师和业务主管)的合作占主导地位,开放的思维使数据科学家能够与其他人高效地合作。思想开放的状态有助于数据科学家暂停判断,以便继续探索最佳可能的解决方案。即使我们正在研究一个假设,也有许多其他的假设可能会带来更好的见解。因此,伟大的数据科学家是思想开放的数据科学家,即使模式与最初的预测不同,他们也会观察新出现的模式。
病人
最后但同样重要的是,伟大的数据科学家是一个有巨大耐心的人,因为从编程到调整机器学习模型的技术元素的组合是高度复杂的。即使是最好的数据科学家也会面临编程错误和弱模型性能,其中耐心是在数据科学领域取得成功的必备特质。耐心是将您的技术能力转化为成就的重要因素,因为创建成功的数据科学解决方案需要持续的努力。在成为数据科学家的过程中,失败是不可避免的,耐心帮助我们采取积极的态度在寻找最佳解决方案的过程中重构问题。
结论
要成为一名伟大的数据科学家,我们需要做更多的事情,这样我们才能实现前所未有的进步。由于任何能够访问互联网的人都可以学习数据科学,因此将会有许多拥有相同技术技能的数据科学家。因此,上面阐述的 7 个特征将把你的数据科学能力提升到一个更高的水平,让你与众不同。虽然不是每个数据科学家都具备所有的特征,但我们可以在成为伟大数据科学家的过程中学习发展这些特征。将自己转变为更好的数据科学家的过程应该超越学习技术技能,包括 7 种个人特质,因为无论在哪个领域和行业,它们都是高度可转移的。
每个数据科学家都应该知道的 9 个概率概念和公式
学习如何计算概率,两个事件的交集和并集之间的差异,条件概率,精度测量和主要计数技术

乔希·阿佩尔的照片
概率是什么?
概率是一个反映特定事件发生的几率的数字。换句话说,它量化了(从 0 到 1,或从 0%到 100%) 一个事件发生的可能性。
概率是数学的一个分支,它提供了描述随机过程的模型。这些数学工具允许建立随机现象的理论模型,并使用它们进行预测。像每个模型一样,概率模型是对世界的简化。然而,一旦模型捕捉到基本特征,它就是有用的。
在本文中,我们提出了 9 个概率的基本公式和概念,每个数据科学家都应该理解和掌握,以便恰当地处理任何概率项目。
1.概率总是在 0 和 1 之间
事件发生的概率总是在 0 到 1 之间(或者 0%到 100%),
0≤P(A)≤1
- 如果事件不可能发生: P(A) = 0
- 如果一个事件是确定的: P(A) = 1
例如,用标准的六面骰子(正面从 1 到 6)掷出 7 是不可能的,所以它的概率等于 0。用硬币掷头或尾是确定的,所以它的概率等于 1。
2.计算概率
如果样本空间的元素(随机实验的所有可能结果的集合)是等概率的(=所有元素具有相同的概率),则事件发生的概率等于有利情况的数量(它可能发生的方式的数量)除以可能情况的数量(结果的总数):

例如,六面骰子的所有数字都是等概率的,因为它们都有相同的出现概率。用骰子掷出 3 的概率是

因为只有一个有利的情况(只有一张脸上面有 3),有 6 个可能的情况(因为一共 6 张脸)。
3.事件的补充
事件的互补(或相反)概率为:

例如,没有掷出 3 的概率是:

4.两个事件的联合
两个事件结合的概率是其中任何一个事件发生的概率:
P(A 或 B)= P(A∪B)= P(A)+P(B)-P(A∪B)
假设某一年两栋房子发生火灾的概率是:
- 在房子 A 中:60%,所以 P(A)=0.6
- 在房屋 B 中:45%,因此 P(B)=0.45
- 在两院中至少有一个:80%,所以 P(A∪B)=0.8
图形上我们有

房屋 A 或房屋 B发生火灾的概率为
P(A∪B)= P(A)+P(B)-P(A∪B)= 0.6+0.45 0.25 = 0.8
通过对 P(A)和 P(B)求和,计算 A 和 B 的交集,即 P(A∩B)两次。这就是我们减去它,只计算一次的原因。
如果两个事件互斥(即两个事件不能同时发生),则两个事件发生的概率等于 0,因此上述公式变为
P(A∪B)=P(A)+P(B)
例如,事件“在六面骰子上掷出 3”和事件“掷出 6”是两个互斥的事件,因为它们不能同时发生。因为它们的联合概率等于 0,所以在六面骰子上掷出 3 或 6 的概率是

5.两个事件的交集
如果两个事件是独立的,那么这两个事件相交的概率(即联合概率)就是这两个事件发生的概率:
(美国和 B)=P(A∩B)=P(A)⋅P(B)
例如,如果掷两枚硬币,两枚硬币都是反面的概率是

注意 P(A∩B)=P(B∩A)。
如果两个事件互斥,则它们的联合概率等于 0:
P(A∩B)=0
6.两个事件的独立性
由于上述公式,可以验证两个事件的独立性。如果等式成立,则称这两个事件是独立的,否则称这两个事件是相关的。形式上,事件 A 和 B 是独立的当且仅当
P(A∩B)=P(A)⋅P(B)
- 在两个硬币的例子中:

这两个事件因此是独立的,表示为

- 在两栋房子发生火灾的例子中(见第 4 节):
P(A∩B)=0.25
和
P(A)⋅P(B)=0.6⋅0.45=0.27
所以下面的等式不成立
P(A∩B)≠P(A)⋅P(B)
这两个事件因此是相关的(或不独立的),表示为

7.条件概率
假设两个事件 A 和 B,P(B)>0。给定(已知)B 的条件概率是在事件 B 已经发生的情况下事件 A 发生的可能性:

注意,一般情况下,给定 B 的概率不等于 B 给定 A 的概率,即 P(A|B)≠P(B|A)。
从条件概率的公式中,我们可以推导出乘法定律:

如果两个事件是独立的,P(A∩B)=P(A)⋅P(B),并且:
- P(B)>0,条件概率变成

- P(A)>0,条件概率变成

等式 2 和 3 意味着知道一个事件发生不会影响另一个事件结果的概率。这实际上是独立性的定义:如果知道一个事件的发生无助于预测(不影响)另一个事件的结果,那么这两个事件本质上是独立的。
贝叶斯定理
从条件概率和乘法定律的公式中,我们可以推导出贝叶斯定理:

例子
为了说明条件概率和贝叶斯定理,假设下面的问题:
为了确定一个人是否患有某种疾病,需要进行血液测试。当一个人患有这种疾病时,该测试可以在 80%的情况下揭示疾病。当疾病不存在时,在 90%的情况下测试是阴性的。经验表明,这种疾病出现的概率为 10%。研究人员想知道在测试结果为阳性的情况下,个人患有该疾病的概率。
为了回答这个问题,定义了以下事件:
- 病人:检查结果是阳性的
- 医生:这个人有这种疾病
此外,我们用一个树形图来说明这一说法:

(所有 4 种情况的总和必须等于 1,因为这 4 种情况包括所有可能的情况。)
假设测试结果为阳性,我们在寻找个人患病的概率,P(D|P)。遵循条件概率的公式(等式)。1)我们有:

就我们的问题而言:

从树形图中,我们可以看到,在两种情况下,阳性测试结果是可能的:(I)当一个人患有疾病时,或者(ii)当这个人实际上没有患有疾病时(因为测试并不总是正确的)。为了找到阳性测试结果的概率 P(P ),我们需要总结这两种情况:

情商。4 然后变成

如果检测结果呈阳性,患这种疾病的概率只有 47.06%。这意味着,在这种特定情况下(相同的百分比),一个人在知道自己的测试呈阳性的情况下,患病的几率不到 1/2!
这一相对较小的百分比是由于这种疾病相当罕见(只有 10%的人口受到影响)以及测试并不总是正确的(有时它检测到疾病,尽管它不存在,有时它没有检测到它,尽管它存在)。因此,与有阳性结果和实际患病的人的百分比(8%)相比,有更高百分比的健康人有阳性结果(9%)。这就解释了为什么在宣布检测结果之前往往要进行几项诊断性检测,尤其是对罕见疾病。
8.准确度测量
基于上述疾病和诊断测试的示例,我们解释了最常见的准确性测量:
- 假阴性(数量和比率)
- 假阳性(数量和比率)
- 灵敏度
- 特征
- 阳性预测值
- 阴性预测值
在深入研究这些准确性度量的细节之前,这里有一个度量和树形图的概述,其中为 4 个场景中的每一个添加了标签:

改编自维基百科

假阴性
假阴性(FN)是指被错误标记为而不是患有疾病或状况的人数,而实际上它是存在的。这就像告诉一个怀孕 7 个月的女人她没有怀孕。
从树形图中,我们可以看到:

而且,假阴性率 ( FNR )定义为

假阳性
假阳性(FP)是指被错误标记为患有疾病或状况的人数,而实际上是而不是存在。这就像告诉一个男人他怀孕了。
从树形图中,我们可以看到:

而且,假阳性率 ( FPR )定义为

灵敏度
测试的敏感性,也称为回忆,衡量测试在条件存在时检测条件的能力(被正确识别为患有疾病的患者的百分比):

其中 TP 为真阳性。
从树形图中,我们可以看到:

特征
检测的特异性衡量检测在不存在疾病时正确排除疾病的能力(被正确识别为未患病的健康人的百分比):

其中 TN 是真正的负数。
从树形图中,我们可以看到:

阳性预测值
阳性预测值,也称为精度,是与条件的存在相对应的阳性结果的比例,因此阳性结果是真正阳性结果的比例:

从树形图中,我们可以看到:

阴性预测值
阴性预测值是对应于不存在该条件的阴性的比例,因此阴性结果是真阴性结果的比例:

从树形图中,我们可以看到:

9.计数技术
为了使用第 2 节中的公式,必须知道如何计算可能元素的数量。
概率中有 3 种主要的计算技术:
- 增加
- 排列
- 结合
在等概率结果的情况下,如何计算可能元素的数量,见下文。
增加
乘法法则如下:
#(A×B)=(#A)×(#B)
其中##是元素的数量。
例子
在餐馆里,顾客必须选择一道开胃菜、一道主菜和一道甜点。餐厅提供两道开胃菜、三道主菜和两道甜点。有多少不同的选择是可能的?
有 12 种不同的可能选择(即 2⋅3⋅2).
排列
排列的数量如下:

其中 r 为长度,n 为元素个数,r≤n,注意 0!=1 和 k!=k×(k−1)×(k−2)×⋯×2×1 如果 k=1,2,…
排列的顺序很重要!
例子
计算集合 A={a,b,c,d}中长度为 2 的排列,没有一个字母重复。你找到了多少种排列?
用手

在 R 中
library(gtools)x <- c("a", "b", "c", "d")# See all different permutations
perms <- permutations(
n = 4, r = 2, v = x,
repeats.allowed = FALSE
)
perms## [,1] [,2]
## [1,] "a" "b"
## [2,] "a" "c"
## [3,] "a" "d"
## [4,] "b" "a"
## [5,] "b" "c"
## [6,] "b" "d"
## [7,] "c" "a"
## [8,] "c" "b"
## [9,] "c" "d"
## [10,] "d" "a"
## [11,] "d" "b"
## [12,] "d" "c"# Count the number of permutations
nrow(perms)## [1] 12
结合
组合的数量如下:

其中 r 是长度,n 是元素的数量,r≤n。
组合中的顺序不重要!
例子
一个 5 个孩子的家庭,3 个女孩 2 个男孩的概率是多少?假设生女孩和生男孩的概率相等。
用手
- 3 名女孩和 2 名男孩(有利案例):

- 可能病例数:2^5=32

在 R 中
- 3 个女孩和 2 个男孩:
choose(n = 5, k = 3)## [1] 10
- 可能情况的计数:
2^5## [1] 32
3 个女孩和 2 个男孩的概率:
choose(n = 5, k = 3) / 2^5## [1] 0.3125
感谢阅读。我希望这篇文章能帮助你理解概率论中最重要的公式和概念。
和往常一样,如果您有与本文主题相关的问题或建议,请将其添加为评论,以便其他读者可以从讨论中受益。
相关文章:
- 学生的 R 和手工 t 检验:如何在不同场景下比较两组
- R 中的相关图:如何突出显示数据集中最相关的变量
- 聚类分析完全指南:k-means 和手动和 in R 系统聚类
- 我的数据符合正态分布吗?关于最广泛使用的分布以及如何检验 R 中的正态性的注释
- 手工卡方独立性检验
原载于 2020 年 3 月 3 日 https://statsandr.com。
9 必须知道处理任何熊猫数据帧的函数
一个包含熊猫最常用的所有函数和调用的备忘单

伊莲娜·洛希娜在 Unsplash 上的照片
在这篇文章中你会发现:
- 五个功能了解你的数据集
- 按值过滤您的数据框架
- 有了日期时间类型
- 合并多个数据集
- 手柄列
- 分组 乘值
- 应用功能
- 使用λ方法
如果您还不是会员,请在此获得您的中级会员资格!
1.了解您的数据集
加载数据集后要做的第一件事是仔细查看数据框中的信息。为此,以下函数正好满足您的需求。
Head() 打印数据集的前 5 行,包括列标题和每一行的内容。
df.head()
Info() 打印列标题和存储在每列中的数据类型。当您试图了解哪些值需要更改类型以便对它们应用函数时,此函数非常有用。存储为字符串的整数在转换为整数之前不会相加。
df.info()
Shape() 以格式(‘行’ x ‘列’)给出数据帧的大小。
df.shape
Describe() 给出数据集中所有数值的平均值、中值、标准差和百分位数。我建议在确保所有数值都存储为整数或浮点数之后,使用 describe。
df.describe()
【唯一() 允许你查看每一列中的唯一值。当您有分类数据并且想要了解类别时,这尤其有用。
df['columnName'].unique()
为给定的列查找数据集中重复次数最多的值。
df.column.value_counts().head(**20**)
2.按值过滤
过滤是处理任何熊猫数据帧时需要的一项基本技能。为了将列中的值与筛选器进行比较,使用了运算符。
可以对数值进行过滤,也可以对定性或分类值进行过滤。
df = df[df.value > 0 ]
df = df[df.column != 'value']

通过使用按位运算符,可以应用各种过滤器。在下面的示例中,OR 和 and 运算符用于创建两个新的数据帧,它们是原始数据帧的过滤版本。
df1 = df[(df.Party == ‘Conservative’) | (df.Party == ‘Labour’)]
df2 = df[(df.Party == ‘Conservative’) & (df.City == ‘London’)]
3.日期时间
datetime 数据类型允许您重新格式化 pandas 数据帧中的列,以便能够处理日期、按最早/最近的日期排序或者甚至按周/月分组。这可以通过 pandas 中的 到 _datetime() 函数轻松完成。
df[‘date’]=pd.to_datetime(df[‘date’], infer_datetime_format=True)
如果我们想得到一个更详细的视图,就把日期分成几个部分。
df['month'] = df['date'].dt.month
4.合并数据集
两个数据帧的连接或合并可以在列或索引上完成。如果在列上连接列,数据帧索引将被忽略,并将为合并后的数据集创建一个新的索引。否则,如果在索引上连接两个数据帧,该索引将作为合并发生的公共列。
merged = pd.merge(df**,** df2**,** on='episode'**,** how='inner')
merged = pd.merge(df**,** df2**,** on='episode'**,** how='outer')
一个内部合并,将只保留共享公共索引或列值的每个数据集中的值。外部合并将连接整个数据集,并为合并时在其他数据集中找不到的列和行返回空值。

5.处理您的列
可以使用列参数打印列名,也可以使用。前面提到的 info()函数。
print(df.columns)
df.info()
重命名列可以通过一种快速简单的方式来完成。这在使用“合并”功能后特别有用,新列通常被标记为 column_x 和 column_y 。
df.rename(columns={"oldName1": "newName1", "oldName2": "NewName2"})
删除列也是一个必须知道的功能。参数 inplace = True 经常被遗忘,没有它你将看不到你的数据帧的任何变化。
df.drop(columns=[‘column1’, ‘column2’], inplace = True)
6.按值分组
这个 pandas 函数将根据传递的列名创建行之间的层次结构。第一个示例将根据国籍对行进行分组,并对每个国籍进行计数。结果将是一个包含两列的 data frame:Nationality 和 count。
df1 = df.groupby(["nationality"]).count().reset_index()
当不想丢失存储在其他列中的信息时,第二个例子特别有用。这里,产生的数据帧将有三列:姓名、国籍和每个国籍的姓名计数。
df1 = df.groupby(["name", "nationality"]).count().reset_index()
当可视化数据帧中的不同分组时,这可能特别有用。下面的文章将带你了解如何使用该功能绘制条形图。
7.对所有行应用函数
到目前为止,这是每天使用熊猫数据帧的最强大的应用之一。apply()函数,顾名思义,允许我们对数据帧的每一行应用一个函数。apply()方法将 df 数据帧中的一行一行地传递给 string_to_float()函数。
def string_to_float(row)
row['value'] = float(row[value'])
return row(['value'])df['price'] = df.apply(string_to_float, axis = 1)
行[‘value’]只是传递给函数的 df 数据帧的行。我可以通过指定它们的名称来访问这一行中的任何列。
8.λ函数
lambda 函数是一个不绑定到标识符的匿名函数。一般结构如下:
λ自变量 : 表达式
对参数执行表达式,并返回结果。
一个非常基本的 lambda 函数应用在非熊猫环境中的例子。
x = lambda a : a + 10
print(x(5))
如果您想将 lambda 函数应用于整个数据集,语法如下。
df['value'] = df['value'].apply(lambda x: float(x) if != "Not Available" else none)
当值为“可用”时,此示例更改列的数据类型。
什么时候使用适当的函数,什么时候使用 lambda 函数?
这是我留给你的事情…取决于你想执行多少任务,一个合适的函数可能更容易构建。而使用 lambda 函数可以实现快速而简单的更改。
非常感谢你的阅读!
更多类似的文章,请点击这里在 Medium 上找到我!
如果您有任何关于如何改进的问题、建议或想法,请在下面留下评论或通过 LinkedIn 这里取得联系。

1559

被折叠的 条评论
为什么被折叠?



