成功的机器学习项目的 4 个拦截器和 4 个解锁器
如何构建可靠有用的机器学习系统
扬·阿莱格在 Unsplash 上的照片
众所周知,机器学习项目经常失败,根据 Gartner 的数据,85%的人工智能项目失败,甚至 96%的项目处理问题。当谈到新技术时,高学位是正常的,但这些数字是惊人的。这可能是因为没有满足机器学习的要求,没有增加价值,或者由于工程原因,模型没有投入生产。通常有可能提前发现潜在的问题。这篇文章是基于我过去五年在应用机器学习方面的经验来早期识别这些陷阱的。
一般要求
机器学习项目应该自动化决策。这可以是任何事情,从最终决定在图像上显示什么(图像分类),用户得到哪些推荐(推荐系统)或哪台机器需要维护(预测性维护)。
为了使机器学习项目成功,有一些主要的要求,可以事先评估。这四个是潜在的障碍(数量、质量、复杂性、可解释性)
在这一点上应该提到的是,这篇文章不是关于研究,而是应用机器学习。
量
ML 项目合理性的最重要的方面是必须做出的决策的数量(以及节省了多少时间)。不值得开发一个机器学习系统来自动化罕见的决策甚至频繁的决策,总的来说几乎不花费任何时间。开发成本太高了。训练一个可以每天对物体进行几次视觉检查的图像识别模型是不值得的。机器学习是优化频繁和重复任务的工具。
质量
通常有一些频繁重复的任务,但是没有人的监督是无法完成的。例如,如果一个模型的质量要求很高,以至于总是需要一个人(例如,法规),机器学习几乎不会优化任何东西。虽然存在所谓的人在回路系统,但这些系统更复杂、成本更高,并且需要 ML 模型来可靠地对不确定性进行分类,这种不确定性目前通常是不可靠的。
对于大多数任务来说,不可能 达到 人类表现。在完全受控的环境和非常狭窄的任务中,超人的表现甚至很少被期待。要评估一个模型是否能达到这个阈值,看看其他人已经做了什么。通常应用机器学习的会议非常有用。小心研究论文,它们并不总是适用于真实世界的数据。
复杂性
人工智能和 ML 是时髦的词,有时它们被使用,在那里一个适应良好的过程和基于规则的系统解决底层的任务。好多这么- 叫 AI 其实不是 AI 。通常更明智的做法是首先依赖手工制作的基于规则的系统(基于统计数据),如果它们失败或变得太复杂,只使用 ML。这些基于规则的系统失败的领域有:计算机视觉、自然语言处理、语音识别、序列建模等。
可解释性
任何最大似然模型都只能和训练它的数据一样好。人工智能不是可以预测未来的黑魔法,即使媒体经常给人这样的印象。机器学习系统通过示例进行学习,并允许一定程度的泛化。最终,数据总能解释模型是如何做出决定的,即使事情没那么简单。
一个经过训练可以区分猫和狗图像的模型只会识别猫和狗。这样的模型概括了品种、比例、光照条件等。但是如果你让这样一个模型对一个咖啡杯进行分类,它会把它看成一只狗或者一只猫,因为除此之外它什么都不知道。
即使你试图预测股市崩盘,你也可以训练一个模型来识别所有过去的崩盘。关键是,下一次崩盘不太可能像前几次一样,因此所有这些模型在实践中都失败了。
这里的例子可能是显而易见的,但有时不可能知道数据是否包含所需的信息。机器学习模型没有常识或世界知识,这仍然取决于我们。他们应该预测的必须是数据中存在的**,并且必须与算法可以找到的模式相匹配。**
运行模型
以上几点比较抽象,概念性强。以下几点与技术和工程更相关。
技术复杂性
模型需要的技术基础设施和模型本身的一般复杂性决定了构建这样一个模型的时间。例如,使用像 SVM、KNN 和决策树这样的传统方法要容易得多,因为它们可以通过与周围系统相同的编程语言编写的现有框架和库来轻松集成。如果涉及到一些最先进的神经网络,通常会复杂得多。如果不是关于图像识别、文本或语音(……),这种改善通常与付出的努力不成比例**。**
做预测
一个模型是否必须按需(即“实时”)提供预测,或者该模型是否用于批处理,这两者之间有着巨大的差异。和其他软件系统一样,这里的问题不仅仅是关于可伸缩性和可用性,也是关于用例。
如果 ML 模型在本地可用,并且不需要通过 API 访问,则每天使用模型进行数百万次预测的过程可以调度得更快。另一方面,推荐系统是按需激活的,并且必须提供低延迟。微服务并不总是最好的解决方案。
训练数据量也起着重要作用。大型深度学习模型喜欢用几万亿字节的数据训练几周。显然,这种模型比直接从数据库中训练的随机森林要复杂得多。或者一个简单的 CSV 文件。
维护和监控
监控和可维护性是一个关键概念。一旦模型开始生产并停止工作,如果没有适当的监控,您就会发现这一点,但为时已晚。通过从硬编码规则转移到数据驱动模型,错误变得不那么明显。因此,除了生产软件系统的典型指标之外,还需要进一步的特定于 ML 的监控。
半衰期
机器学习模型很少无限有效。通常数据在一段时间后会发生变化,模型会失效。对于自动重新训练的模型或在线学习系统,这方面实际上是免费的,但所有其他模型都需要不时地重新训练(模型漂移)。
由于要识别新的对象,需要每两周训练一次图像识别系统,但是训练时间为两周的图像识别系统可能不是最佳方法。
结论
我希望我能鼓励一些读者思考这些问题。当建立一个人工智能驱动的系统时,在概念上和技术上有许多陷阱和障碍。确保给出了数量、质量、复杂性和可解释性要求,并设置了技术资源,项目成功的可能性最大化。
我在学习 Python 时犯的 4 个编码错误
更好的编程
一起学习我最纠结的 Python 概念
几年前,我开始了学习 Python 的冒险,我已经知道了一些其他的编程语言,比如 PHP(第一种将我引入 web 开发的语言),JavaScript(我已经很擅长了,并且正在编写一个 UI 库)和 C#,这是我当时收入的来源。
我通过自己开发一个应用程序来学习 Python,因此我将许多 JavaScript 和 C#的做事方式融入到我的代码中,这很糟糕,尽管有时它会工作。我花了一些时间,阅读他人的代码,并与他人合作,实际上提高了语言水平。今天我想和你一起回顾一下我在学习 Python 时犯的一些错误(代码方面的)。
#1 误解 Python 范围
Python 范围解析基于所谓的 LEGB 规则,这是 L ocal、 E nclosing、 G lobal、 B 内建的简写。尽管看起来非常简单,但当时我还是有点迷惑,例如,考虑下面的例子:
x = 5
def foo():
x += 1
print(x)foo()-----------
Output
-----------
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in foo
UnboundLocalError: local variable 'x' referenced before assignment
对于上面的代码,我希望它能够工作,并修改全局变量x
以最终打印6
。但是,事情可能会变得更奇怪,让我们来看看下面修改过的代码:
y = 5
def foo_y():
print(y)foo_y()-----------
Output
-----------
5
这到底是怎么回事?在一段代码中,全局变量X
给出了一个UnboundLocalError
,然而,当我们试图打印变量时,它工作了。原因与范围有关。当你在一个作用域(比如函数作用域)中给一个变量赋值时,这个变量就变成了这个作用域的局部变量,并且隐藏了外部作用域中任何相似命名的变量。这是我们拍摄《T4》时第一个场景中发生的事情。
如果我们打算像函数foo()
一样访问全局变量x
,我们可以这样做:
x = 5
def foo():
global x
x += 1
print(x)foo()-----------
Output
-----------
6
通过使用关键字global
允许内部作用域访问全局作用域中声明的变量,这意味着变量没有在任何函数中定义。类似地,我们可以使用nonlocal
来产生类似的效果:
def foo():
x = 5
def bar():
nonlocal x
x += 1
print(x)
bar()foo()-----------
Output
-----------
6
nonlocal
正如global
允许你从外部作用域访问变量,然而,在nonlocal
的情况下,你可以绑定到一个父作用域或全局作用域上的一个对象。
#2 迭代时修改列表
虽然这个错误不仅在 Python 中很常见,但我发现它在新的 Python 开发人员中很常见,甚至对一些有经验的开发人员也是如此。虽然有时可能看起来不那么明显,但在某些情况下,我们最终会修改当前正在迭代的数组,导致不恰当的行为,或者如果我们幸运的话,我们会得到一个错误并很容易注意到它。
但是让我给你一个例子来说明我的意思,假设给定一个数组,你需要减少数组,只包含偶数元素,你可以尝试这样做:
def odd(x): return bool(x % 2)
numbers = [n for n in range(10)]
for i in range(len(numbers)):
if odd(numbers[i]):
del numbers[i]-----------
Output
-----------
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
IndexError: list index out of range
在所描述的场景中,当在迭代过程中删除一个列表或数组的元素时,我们会得到一个错误,因为我们试图访问一个不再存在的项目。这是一种不好的做法,应该避免,在 python 中有更好的方法来实现类似的事情,其中包括:
def odd(x): return bool(x % 2)
numbers = [n for n in range(10)]
numbers[:] = [n for n in numbers if not odd(n)]
print(numbers)-----------
Output
-----------
[0, 2, 4, 6, 8]
您也可以使用filter
函数来实现同样的功能,虽然它可以工作,但有些人认为这不是 Pythonic 的工作方式,我也有点同意,但我不想卷入这场讨论。我宁愿给你选择,你可以研究和决定:
def even(x): return not bool(x % 2)
numbers = [n for n in range(10)]
numbers = list(filter(even, numbers))
numbers-----------
Output
-----------
[0, 2, 4, 6, 8]
#3 闭包中的变量绑定
我想从我在 twitter ( @livecodestream )上发布的一个测试开始,我问人们他们认为下面的片段会是什么结果:
def create_multipliers():
return [lambda x : i * x for i in range(5)]for multiplier in create_multipliers():
print(multiplier(2))-----------
Output
-----------
8
8
8
8
8
对许多人来说,包括我自己,当我们第一次遇到这个问题时,我们认为结果会是:
0
2
4
6
8
然而,代码实际上导致了完全不同的结果,我们对此感到非常困惑。实际发生的是 Python 会做一个后期绑定行为,根据这个行为,在调用内部函数的时候会查找闭包中使用的变量值。所以在我们的例子中,无论何时调用任何返回的函数,在调用它的时候都在周围的范围内查找i
的值。
这个问题的解决方案可能看起来有点粗糙,但它确实有效
def create_multipliers():
return [lambda x, i=i : i * x for i in range(5)]for multiplier in create_multipliers():
print(multiplier(2))-----------
Output
-----------
0
2
4
6
8
通过使用 lambda 函数的默认参数来传递i
的值,我们可以生成函数来执行所需的行为。我对这个解决方案感到非常困惑,我仍然认为它不是很优雅,但是,有些人喜欢它。如果你知道这个问题的另一个可能的解决方案,请在评论中告诉我,我很乐意阅读。
#4 名称与 Python 标准库模块冲突这个问题实际上在我刚开始的时候相当普遍,即使是现在,有时我也会犯这个错误。这个问题是由于将一个模块命名为与 Python 附带的标准库中的一个模块同名而引起的。(例如,您的代码中可能有一个名为 email.py 的模块,这将与同名的标准库模块相冲突)。
也许名称冲突本身不会对您的代码产生任何问题,但有时我们会覆盖 Python 标准库的函数或模块,这些函数或模块稍后会在已安装的库中使用,并且它会因抛出错误或行为不当而发生冲突。无论如何,这是一个糟糕的情况。
一个典型的错误如下:
a = list()
print(a)list = [1, 2, 3] # This is where we break it
a = list()-----------
Output
-----------
[]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'list' object is not callable
通过简单地创建一个名为list
的变量,我们中断了对list
函数的访问。而且,即使有其他的访问方式(比如__builtins__.list()
,我们也要避免这种名字。
结论
本文并没有涵盖开发人员在用 Python 编码时会犯的所有常见错误,而是那些我最纠结的事情。如果您想了解更多关于如何编写出色的 Python 代码以及避免其他一些错误的信息,我推荐您阅读:
让我们一起学习一些简单的技巧来编写更多的 Pythonic 代码。
medium.com](https://medium.com/swlh/make-your-code-great-python-style-3223c1160299)
感谢阅读!
Python 初学者应该避免的 4 个常见错误
Python 初学者
我很艰难地学会了,但你不需要
让我们面对现实吧。学习编程很难。
许多人会同意,但有些人不同意。我不相信。
这是因为我总能在不同的编程语言中发现微妙的方法来做我想做的事情。我以为我已经掌握了它们。但我错了。你可以在你的代码中做任何事情,但是你不应该做任何你想做的事情。
我很快意识到我尝试的那些“微妙”的方法是不好的做法。但是一段有效的代码怎么会是坏的呢?我习惯于采用这些不好的(和微妙的)做法,它回来困扰着我。我是吃了苦头才知道的。
在分享每个 Python 新手都应该知道的 4 个常见错误之前,确保你熟悉下面这篇文章中的一些 Python 内置特性。
超越 lambda、map 和 filter 的 Python 技巧
towardsdatascience.com](/5-python-features-i-wish-i-had-known-earlier-bc16e4a13bf4)
1.不使用迭代器
每个 Python 新手都这么做,不管他们对其他编程语言的熟练程度如何。无处可逃。
给定一个列表list_
,如何使用 for 循环逐个访问列表中的元素?我们知道 Python 中的列表是由索引的,因此我们可以通过list_[i]
访问第 I 个元素。然后我们可以为 for 循环创建一个范围从0
到len(list_)
的整数迭代器,如下所示:
**for** i **in** **range**(**len**(list_)):
foo(list_[i])
它工作了。代码没有问题。这也是在其他语言如 C 中构造 for 循环的标准方式。但是实际上我们可以用 Python 做得更好。
如何?
你知道 Python 中的列表是可迭代的吗?通过利用它的可迭代特性,我们可以生成可读性更好的代码,如下所示:
**for** element **in** list_:
foo(element)
在 for 循环中并行遍历多个列表可以通过zip
函数实现,而enumerate
可以帮助你在迭代一个 iterable 对象时获取索引号(即计数器)。在 5 Python 特性中介绍和解释了它们,我希望我能早点知道。
2.使用全局变量
全局变量是在主脚本中声明的具有全局作用域的变量,而局部变量是在具有局部作用域的函数中声明的变量。在 Python 中使用global
关键字允许你在一个函数中局部访问和修改全局变量。这里有一个例子:
许多初学者喜欢它,因为使用global
似乎可以避免传递函数所需的所有参数。但这其实不是真的。它只是隐藏了动作。
使用global
s 也不利于调试目的。功能应被视为块盒,并且应该是可重用的。修改全局变量的函数可能会给主脚本带来副作用,这很难发现,而且很可能会导致复杂的代码,调试起来更加困难。
在局部函数中修改全局变量是一种糟糕的编程实践。您应该将变量作为参数传入,对其进行修改,并在函数结束时将其返回。
照片由弗拉季斯拉夫·克拉平在 Unsplash 上拍摄
*不要混淆全局变量和全局常量,因为在大多数情况下使用后者是完全可以的。
3.不理解可变对象
对于新的 Python 学习者来说,这可能是最常见的惊喜,因为这个特性在这种语言中是非常独特的。
Python 中有两种对象。可变对象可以在运行时改变它们的状态或内容**,而不可变对象则不能。很多内置对象类型是不可变的,包括 **int、float、string、bool、和 tuple 。
st **=** 'A string'
st[0] **=** 'B' # You cannot do this in Python
另一方面,像 list 、 set 和 dict 这样的数据类型是可变的。因此,您可以更改列表中元素的内容,例如list_[0] = 'new'
。
当函数中的默认参数可变时,会发生意想不到的事情。让我们以下面的函数为例,其中一个可变 空列表是参数list_
的默认值。
**def** foo(element, list_=[]):
list_.**append**(element)
**return** list_
让我们调用函数两次,而不为list_
输入参数,这样它就取默认值。理想情况下,如果没有提供第二个参数,那么每次调用函数时都会创建一个新的空列表。
a = foo(1) # returns [1]
b = foo(2) # returns [1,2], not [2]! WHY?
什么?
原来 Python 中的默认参数是在定义函数时计算一次的**。这意味着调用函数不会刷新默认参数。**
Ravi Roshan 在 Unsplash 上拍摄的照片
因此,如果默认参数是可变的,并且每次调用函数时都会发生变化。变异后的默认参数将用于所有未来的函数调用。“标准”修复是使用(不可变)None
作为默认值,如下所示。
**def** foo(element, list_=**None**):
if list_ is **None**:
list_ = []
list_.**append**(element)
**return** list_
4.不复制
对于学习者来说,复制的概念可能是外国的,甚至是违反直觉的 T42。假设你有一个列表a = [[0,1],[2,3]]
,然后你在b = a
前声明一个新列表。您现在有两个具有相同元素的列表。通过改变列表b
中的一些元素,应该不会对列表a
有什么(副作用)影响吧?
错了。
当您使用赋值语句即b = a
来“复制”一个列表时,对一个列表的元素所做的任何修改在两个列表中都是可见的。赋值操作符只在目标和对象之间创建绑定,因此示例中的a
和b
列表共享同一个引用,即 Python 中的id()
。
如何复制对象?
如果您想要“复制”对象,并且只修改新(或旧)对象中的值而不进行绑定,有两种方法可以创建副本:浅层复制和深层复制。两个对象将有不同的引用。
使用我们之前的例子,您可以通过b = copy.copy(a)
创建一个a
的浅层副本。浅层拷贝创建了一个新对象,它存储了原始元素的引用。这听起来可能很复杂,但让我们看看下面的例子:
在创建了一个嵌套列表 a
的浅层副本之后,我们称之为b
,两个列表有不同的引用id(a) != id(b)
,用符号!=
表示‘不相等’。然而,它们的元素具有相同的引用,因此id(a[0]) == id(b[0])
。
这意味着改变b
中的元素不会影响列表a
,但是修改b[1]
中的元素会影响a[1]
,因此这个副本是浅层的。
简而言之,如果 **b**
是 **a**
的浅层拷贝,那么对 **b**
中嵌套对象内元素的任何更改都会出现在 **a**
中。
如果你想复制一个嵌套的对象,而在它们的元素之间没有任何绑定,你需要一个由b = copy.deepcopy(a)
生成的a
的深层副本。深度复制创建一个新对象,而递归地在原始元素中创建嵌套对象的副本。
简而言之,深度拷贝无任何绑定复制一切。
外卖
这就是 Python 初学者应该避免的 4 个常见错误。我很艰难地学会了,但你不需要。你可以注册我的时事通讯来接收我的新文章的更新。如果您对 Python 感兴趣,您可能会发现以下文章很有用:
超越 lambda、map 和 filter 的 Python 技巧
towardsdatascience.com](/5-python-features-i-wish-i-had-known-earlier-bc16e4a13bf4) [## Python 3.8 中针对 Python 新手的 6 项新特性
请做好准备,因为 Python 2 不再受支持
towardsdatascience.com](/6-new-features-in-python-3-8-for-python-newbies-dc2e7b804acc) [## 每个 Python 初学者都应该学习的 4 个 NumPy 技巧
编写可读代码的技巧
towardsdatascience.com](/4-numpy-tricks-every-python-beginner-should-learn-bdb41febc2f2)
编码快乐!
4 种不同的方法来有效地排序熊猫数据帧
大蟒
正确探索、理解和组织您的数据。
小姐姐塑造的形象
对数据进行适当的分类可以让你更容易理解。
许多人求助于 Pandas 中的高级索引和聚合功能来回答每个分析阶段的问题。当您需要操作数据时,这些特性会非常有用。然而,Pandas 还提供了对数据帧进行排序的不同方式,这可能比其他矢量化解决方案更适合分析数据。
如果您想要对多个列进行排序,或者如果您只需要对一个系列进行排序,Pandas 内置的功能可以帮助您做到这一点。
在这篇文章的最后,使用不同的分类方法,我们将回答以下问题:
- 哪五款电子游戏在欧洲市场销量最多? 用:
.sort_values()
解决 - 哪款游戏发布最早,当年全球销量最低? *用:*多重论证
.sort_values()
解决 - 北美市场销售额最高和最低的四大视频游戏是什么? 用:
nsmallest()
和nlargest()
解决 - 哪家发行商一年内 Xbox One 销量最高,同年其 PC 和 PS4 销量如何? *求解用:*多指标
.sort_values()
我们将使用这个视频游戏销售数据,所以如果你想继续的话,请下载 csv 文件。一如既往,出发前别忘了进口熊猫。
import pandas as pd# load data
df = pd.read_csv('vgsales.csv').dropna()
df['Year'] = df['Year'].astype(int)
df.head()
来自 Kaggle 的视频游戏销售数据(销量以千计)
排序的快速介绍
Pandas 中所有可用的分类方法分为以下三类:
- 按索引标签排序;
- 按列值排序;
- 按索引标签和列值的组合排序。
Pandas 会自动为您创建的每个数据框生成一个索引。索引标签从 0 开始,每行递增 1。您可以在上面的截图中看到,索引标签出现在最左边的列中(没有列名的那一列)。
您可以看到,根据自动生成的索引对数据帧进行排序实际上没有意义。但是,如果我们将“Name”列设置为数据帧的索引,那么我们可以按字母顺序对表进行排序。我们可以通过一行简单的代码来改变索引并对其进行排序:
df.set_index('Name').sort_index()
在这里,我们可以看到.sort_index()
函数重新组织了数据,因此以标点符号作为名称第一个字符的游戏位于列表的顶部。
如果你再往下看,它会显示游戏名称的第一个字符是数字,然后是以字母开头的游戏。排序层次结构中的最后一个是特殊符号,就像上表中的最后一个条目。
这是一个根据数据帧的索引进行排序的非常快速的例子。现在让我们进入一些更高级的排序!
用不同的熊猫分类方法回答视频游戏销售问题
哪五款电子游戏在欧洲市场销量最多?
为了回答这个问题,我们将使用.sort_values()
函数。代码如下:
df.sort_values(by='EU_Sales', ascending=False).head(5)
这里,我们输入要排序的列(EU_Sales)并组织我们的数据,使最高值排在最前面(将升序设置为“False”)。您可以在下面看到输出。
已排序的数据框架已经重新组织,因此我们现在可以看到,欧盟销量最多的游戏与全球销量最多的游戏并不完全相同。
什么游戏出版最早,当年全球销量最低?
为了回答这个问题,我们对“Year”列和“Global_Sales”列都感兴趣。我们将再次使用.sort_values()
函数,但略有不同:
df.sort_values(by=['Year','Global_Sales']).head(1)
在这种情况下,我们希望按多列对数据进行排序。使用这个函数,只需传递一个列名列表,就可以对任意多的列进行排序。在这种情况下,我们首先编写“Year ”,然后编写“Global_Sales ”,这意味着该函数将首先根据数据帧的发布年份对其进行排序,然后根据其销售额进行排序。
默认情况下,该函数将首先对数值最低的数据帧进行排序,因此我们不需要传递ascending=True
(尽管如果您愿意,您可以传递)。你可以在下面看到结果。
在这里,我们将“Atari”发布的游戏“Checkers”认定为数据集中最早发布(1980 年)的全球销量最低的游戏。
北美市场销售额最高和最低的四个视频游戏是什么?
带着这个问题,我们只关心销售值,这意味着我们不需要像“名称”和“平台”这样的视频游戏元数据。我们只关心一列,即“NA_Sales ”,它给出了北美市场的值。这意味着我们正在与一个“系列”一起工作,这是熊猫中的一维数组。
因为我们处理的是一个序列,所以我们可以使用nsmallest()
和nlargest()
方法来给出序列中最小或最大的“n”值。要使用这个函数,您只需传递一个值“n ”,它表示您想要查看的结果的数量。为了回答这个问题,我们写出如下内容:
df['NA_Sales'].nlargest(4)
并且:
df['NA_Sales'].nsmallest(4)
根据熊猫文档,你可以使用这些方法,因为它们可能比我们目前使用的.sort_values()
和head()
方法更快。然而,这似乎更适用于非常大的数据集,因为即使是 16,291 行的数据集也没有什么不同。例如:
df['NA_Sales'].sort_values(ascending=False).head(4)
您可以看到,我们用不同的代码行获得了相同的值,并且花费了相同的时间(11 毫秒)。然而,我认为使用nlargest()
和nsmallest()
会使代码更简洁。函数名不言自明且易于理解,因此您不必为了一个漂亮的函数而牺牲可读性。
哪家发行商一年内 Xbox One 销量最高,同年其 PC 和 PS4 销量如何?
为了回答这个问题,我们将创建一个数据透视表。当您希望在一个易读的表格中聚集和呈现数据时,这些功能非常有用。
创建数据透视表的代码如下所示:
df_pivot = df.loc[df['Platform'].isin(['PC','XOne','PS4'])]
df_pivot = df_pivot[['Platform','Year','Publisher','Global_Sales']]df_pivot = df_pivot.pivot_table(index = ['Publisher','Year'],
columns = 'Platform',
aggfunc = 'sum',
fill_value = 0)
如果你不熟悉数据透视表和多索引的使用,我建议你看看我以前的文章。
[## 如何在 Pandas 中使用 MultiIndex 来提升您的分析
复杂数据分析中数据帧的层次索引介绍
towardsdatascience.com](/how-to-use-multiindex-in-pandas-to-level-up-your-analysis-aeac7f451fce)
为了回答我们的问题,我们希望能够比较 PC、PS4 和 Xbox One 的销售情况,因此该数据透视表便于我们查看数据。初始数据透视表如下所示:
现在,在对这些数据进行排序时,我们感兴趣的是“XOne”的最高“Global_Sales”。如果我们看一下这个数据帧中的列,我们会看到有一个多索引。
df_pivot.columns
当按 MultiIndex 列排序时,需要确保指定相关 MultiIndex 的所有级别。为了对新创建的数据透视表进行排序,我们使用了以下代码:
df_pivot.sort_values(by=('Global_Sales','XOne'), ascending=False)
在这里,您可以看到我们将一个元组传递给了.sort_values()
函数。这是因为我们要排序的列名是(’ Global_Sales ‘,’ XOne ')。您不能只传递“XOne ”,因为在这种情况下这不是一个有效的列名。因此,在对这种数据帧进行排序时,一定要指定 MultiIndex 的每个级别。生成的表格如下所示:
基于此,我们可以看到电子艺界(EA)2015 年全年 Xbox One 销量最高。我们还可以看到其同年在 PC 和 PS4 细分市场的销量。排序后的数据透视表可以很容易地对不同的列进行并排比较,所以请记住这种方法,因为您可以在许多不同的情况下使用它。
我们完事了。
这只是对熊猫分类的介绍。有许多不同的方法可以找到我们所经历的问题的答案,但我发现排序是进行初步分析的一种快速而简单的方法。
请记住,排序数据帧的方法不止一种。有些方法可能比其他方法更有效,Pandas 提供了内置方法来帮助您编写看起来更整洁的代码。
祝你的分类冒险好运!
BigData/ETL:从头开始设置 ETL 数据管道的 4 个简单步骤
用几个命令建立 ETL 管道
ETL(提取转换负载)
这个博客有什么不可期待的?AWS Glue、AWS 数据迁移服务或 Apache Airflow 等托管 ETL 解决方案。基于云的技术是受管理的,但不是免费的。并且不在本文的讨论范围内。
目录
- 什么是 ETL 管道?
- ETL 管道有哪些不同的用例?
- ETL 先决条件—Docker+Debezium+Kafka+Kafka Connect—鸟瞰图
- ETL 设置——4 步流程
1:什么是 ETL?
ETL 代表提取转换加载管道。它用于建立数据仓库或数据湖。
注意:数据仓库收集多种结构化数据源,如关系数据库,但是在数据湖中,我们存储结构化和非结构化数据。
2: 一个 ETL 管道的各种用例有哪些?
ETL 有广泛的用例,如下所示:
- 为非结构化数据赋予结构,因为我们将它存储到数据仓库中,通常我们使用数据仓库来存储来自多个资源的结构化数据。
- ML 工程师获取模型训练数据的数据管道。并且经常是 ML 工程师/数据科学家(L1)的首要任务。
- 用于制作备份或临时数据源。
**注意:**在这个例子中,我们将使用源作为 MySQL 数据库,目的地作为 Elasticsearch,它固有地与 Kibana 集成,用于数据可视化和机器学习。
3: ETL 先决条件—Docker+Debezium+Kafka+Kafka Connect—鸟瞰图
MySQL(源)+Debezium+Kafka/Kafka Connect+elastic search(目的地)+ Kibana
从上图中可以看出,我们将使用以下内容:
- Docker: 一个容器管理系统(CMS)。为了简单起见,我们使用 Docker。https://www.docker.com/
- Debezium: Debezium 只不过是一个变更数据捕获(CDC)。它跟踪来自源数据库的每个事件(插入、更新、删除),并使用 Kafka Connect 将事件推送到 Kafka。它使用源数据库日志来读取每个事务,并为特定的事务创建一个事件。
**注意:**对于 MySQL,我们称之为 binlog,对于 PostgreSQL,我们称之为 wal-logs(预写日志)
- 卡夫卡连接: 顾名思义,帮助 Debezium 与卡夫卡连接。
- 卡夫卡: 卡夫卡帮助事件流和实时消费。卡夫卡和动物园管理员一起追踪这些事件。https://bit.ly/2Gb9Sm7
- ***ELK(destination)😗**我们考虑将 Elasticsearch 作为我们的目标数据源,默认情况下,它与 Kibana 集成在一起,用于数据可视化&机器学习,这就是俗称的 elastic search+Logstash+Kibana(ELK stack)https://bit.ly/36dmioe
4:让我们开始设置它——一个 4 步流程
第一步: 更改 Debezium 喜欢的 MySQL binlog 格式:只需进入/etc/my.cnf,基本上在 MySQL 配置文件中添加以下配置即可:
/etc/my.cnf (MySQL 配置文件)
第二步: 启动 Zookeeper,Kafka & Kafka 使用 Docker 连接:
$ docker run -it --rm --name zookeeper -p 2181:2181 -p 2888:2888 -p 3888:3888 debezium/zookeeper $ docker run -it --rm --name kafka -p 9092:9092 --link zookeeper:zookeeper debezium/kafka:1.0$ docker run -it --rm --name connect -p 8083:8083 -e GROUP_ID=1 -e CONFIG_STORAGE_TOPIC=my_connect_configs -e OFFSET_STORAGE_TOPIC=my_connect_offsets -e STATUS_STORAGE_TOPIC=my_connect_statuses --link zookeeper:zookeeper --link kafka:kafka --link mysql:mysql debezium/connect:1.0
**注:**熟悉 Docker 的可以用 docker-compose.yaml,可以在这里找到:https://github . com/debezium/debezium-examples/blob/master/tutorial/
步骤 3(提取) :我们将使用curl
向我们的 Kafka Connect 服务提交一个 JSON 请求消息,以开始使用 Debezium 从源数据库捕获事件(它需要下面的源数据库凭证):
curl -i -X POST
-H "Accept:application/json"
-H "Content-Type:application/json"
localhost:8083/connectors/ -d
'{ "name": "etl-connector",
"config": { "connector.class": "io.debezium.connector.mysql.MySqlConnector",
"tasks.max": "1",
"database.hostname": "<mysql_host>",
"database.port": "3306",
"database.user": "<mysql_username>",
"database.password": "<mysql_password>",
"database.server.id": "184054",
"database.server.name": "dbserver1",
"database.whitelist": "<database_name>", "database.history.kafka.bootstrap.servers": "kafka:9092", "database.history.kafka.topic": "dbhistory.<db_name>" } }'
第四步(变换&加载) :最后一步,写一个卡夫卡式的消费者。消费者只不过是一个简单的函数/代码,它将提取 Debezium 事件,对其进行转换,并将其加载到 ELK 目的地。
请在这里找到完整的参考源代码模板:https://github . com/burhanuddinbhopalwala/ETL-elastic search-app
搞定了!在本例中,我们使用批量插入进行弹性搜索。你可以从上面的源代码中看到下面的日志。
...
2017-09-21 07:38:48,385 INFO MySQL|dbserver1|task Kafka version : 0.11.0.0 [org.apache.kafka.common.utils.AppInfoParser]
2org.apache.kafka.clients.consumer.internals.AbstractCoordinator]
2017-09-21 07:38:48,402 INFO MySQL|dbserver1|task Successfully joined group inventory-connector-dbhistory with generation 1 [org.apache.kafka.clients.consumer.internals.AbstractCoordinator]
2017-09-21 07:38:48,403 INFO MySQL|dbserver1|task Setting newly assigned partitions [dbhistory.inventory-0] for group inventory-connect WorkerSourceTask{id=inventory-connector-0} finished initialization and start [org.apache.kafka.connect.runtime.WorkerSourceTaskINFO -- : CREATING MASTER DB CONNECTION
INFO -- : CONNECT ELASTICSEARCH
INFO -- : CONNECTED KAFKA
INFO -- : WAITING FOR 500 MESSAGES, RECEIVED 1, ID: 685475
INFO -- : WAITING FOR 500 MESSAGES, RECEIVED 2, ID: 457548
INFO -- : WAITING FOR 500 MESSAGES, RECEIVED 3, ID: 985484
INFO -- : WAITING FOR 500 MESSAGES, RECEIVED 4, ID: 258547
INFO -- : WAITING FOR 500 MESSAGES, RECEIVED 5, ID: 257544
错误:如果你有任何错误,你可以去 Debezium 网站:https://debezium.io/。
最后,感谢阅读。我希望这篇博客对你有所帮助。一如既往地记得呼吸:)
连接 🤝***😗**
- 邮箱:bbhopalw @ Gmail
- Linkedin:www.linkedin.com/in/bbhoaplw
用于进一步阅读✍️***😗**
大数据&云工程博客:
后端工程&软件工程博客:
Python 中 4 个易于使用的自省函数
Python 初学者
如何在运行时检查对象
Python 是近年来最流行的编程语言。很多人都知道。但如果你问 Python 有哪些与众不同的优势?不是每个人都能回答这个问题。可能有很多答案。
对我来说,肯定是’对象内省’或者’类型内省’。虽然您可以在许多其他语言中找到类似的特性,但 Python 无疑为您提供了最适合初学者的内置工具。
但首先,什么是对象内省?
它能够在运行时检查对象的类型或属性,并在代码中利用它们的属性。下面是初学者应该学习的 4 个简单易用的自省功能。
1.类型()
数据类型是对象的分类,决定了可以对其执行何种操作。例如,加号运算符+
可以应用于整数,也可以应用于字符串,但是它们的执行方式不同。
a = 1 + 1 # 2
b = 'Hello' + 'World' # 'HelloWorld'
前者是求和运算,而后者是串联运算。如果你试着把1 + 'Hello'
加在一起,你会得到一个错误,因为这个操作是未定义的。
因此,数据类型非常重要,因为它影响操作的执行方式。然而,Python 中的数据类型是一个噩梦。这是因为不同的库有许多不同的数据类型,由不同的人群用不同的标准和用法编写。
例如,在 Python 中有许多不同的方法来“包含”或“保存”数字 1,下面是一些例子:
a = 1
b = 1.0
c = [1]
d = (1,)
e = np.int64(1)
f = pd.DataFrame([1])
g = 'one' # well, why not?
照片由伊丽莎白·罗威尔·马特森在 Unsplash 上拍摄
在同一个脚本中使用不同的数据类型是很常见的。为诊断目的检索对象数据类型的最简单方法是使用type()
。
print( [type(x) for x in [a,b,c,d,e,f,g]] )
# [<class 'int'>,
<class 'float'>,
<class 'list'>,
<class 'tuple'>,
<class 'numpy.int64'>,
<class 'pandas.core.frame.DataFrame'>,
<class 'str'>]
2.isinstance()
要检查一个对象是否是一个类的实例,标准的方法是isinstance(object, class)
。它有两个参数,一个对象和一个类。如果object
是class
的实例,函数返回True
,否则返回False
。
a = 1
if isinstance(a, int):
print('a is an integer.')
else:
print('a is not an integer.')# 'a is an integer.'
因为它返回一个布尔对象,所以通常用在条件子句中。如果class
参数是一个元组,如果对象是元组中的类型之一,它将返回True
。
my_fav_numbers = [-1, 1, 5]
print(isinstance(my_fav_numbers, (dict, list))) # True
假设你定义了一个函数,它应该只接受整数作为参数,否则,就会出现意想不到的后果,比如一个永不结束的递归函数。您可能想要检查参数是否是int
的实例。
assert isinstance(n, int), 'n should be an integer!'
本文中的更多信息:
Python 中的分步示例
medium.com](https://medium.com/better-programming/how-to-write-recursion-in-3-steps-9d512189a94e)
3.目录()
这可以说是 Python 中最强大的内省功能。您可以看到对象的所有有效属性和方法。
a = [1,2,3]
print(dir(a))
# ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
这里有一个可以应用在对象a
上的方法列表(以字符串的形式),比如sort
对列表进行排序,pop
获取和移除列表的最后一个元素等等…因此,如果您不确定是否存在方法sort
,只需检查'sort' in dir(a)
,如果存在,它将返回True
。
另一方面,当你在没有任何参数的情况下调用dir()
时,你会期待什么?一个错误?不要!
它返回当前范围内的名称列表!记得我之前定义过my_fav_numbers
吗?或者我有吗?让我们检查一下:
'my_fav_numbers' in dir() # True
4.id()
id()
返回对象的内存地址。Python 没有指针的概念,但是您仍然可以使用id()
来模拟指针操作。这可能太高级了,但是仍然有一些简单的事情可以通过这个函数来完成。
a = [1,2,3]
b = aprint(id(a), id(b))
# 140301827626760 140301827626760print(id(a[0]))
# 140302068451232
通过检查对象a
和b
的 id,我们知道它们有相同的内存地址。
另一方面,如果您想更多地了解可变对象,检查它们的内存地址会有所帮助。
a = [1,2,3]
print(id(a)) # 140298456699464a = [4,5]
print(id(a)) # 140298456729672a[0] = -1
print(id(a)) # 140298456729672
你能解释一下上面片段中发生的事情吗?如果您不知道什么是可变对象,请查看下面的文章:
我很艰难地学会了,但你不需要
towardsdatascience.com](/4-common-mistakes-python-beginners-should-avoid-89bcebd2c628)
外卖
我们仅仅触及了 Python 中内省函数的皮毛。你觉得那些功能有趣有用吗?下面留言评论!你也可以注册我的时事通讯来接收我的新文章的更新。如果您对提高 Python 技能感兴趣,以下文章可能会有所帮助:
如何轻松增强您的 Python 代码
towardsdatascience.com](/4-hidden-python-features-that-beginners-should-know-ec9de65ff9f8) [## Python 初学者应该避免的 4 个常见错误
我很艰难地学会了,但你不需要
towardsdatascience.com](/4-common-mistakes-python-beginners-should-avoid-89bcebd2c628)
4 个基本的 A/B 测试部分
进行 A/B 测试时,您应该回顾的 4 个部分
动机
根据 Fast.ai / FastBook ,
试着思考反馈回路在你的系统中的所有表现方式,以及如何在你的数据中识别它们。最后,这又回到了我们最初的建议,即在推出任何类型的机器学习系统时,如何避免灾难。
简而言之,考虑您的用户群和可能影响您的 ML 系统的特定细分市场是有好处的(部署前或部署后,但在这种情况下,我们更关注部署后)。Fast.ai 很好地解释了各种用户群如何影响你的整体 ML 系统。如果我们想一想——如果我们使用 A/B 测试来评估我们的 ML 系统,那么这个想法也适用于 A/B 测试。所以,重要的是我们要思考我们的 A/B 测试可能会出错的原因。
介绍
几年前,我看到了一个关于 A/B 测试的精彩演示。该演示介绍了进行 A/B 测试时需要注意的 4 个部分。我的老板*(当时)*和我在工作中使用这个术语,发现它非常有见地。
快进到今天,到处都找不到原来的讲座 lol。所以我想我应该写一篇关于这个主题的文章*(为我自己也为别人)。同样,如果我能找到的话,我会参考最初的演讲(可能是优步)*。
那么这些神奇的段子我们应该考虑哪些呢?
这些片段
由作者用 MS Paint 创建
他们来了,光彩照人。我尽力记住了原来的段名,但是失败了,所以我创造了新的名字。这些原则应该仍然有效。好了,下面我给出了更多关于如何解读这张图的细节。
- 影响了! =如果你做出改变*(一个或多个)*这些是你帮助过的人。假设你正在 A/B 测试一个新的通知,这些人会在你的通知生效时积极行动!由于你所做的改变,这些人更多地使用你的应用程序。他们说“干得好!坚持下去!”
- 不管你在做什么,不管你在做什么实验,这些人都会继续使用你的应用。这些是你的收养者。他们采纳了你的应用,超越了所有的实验。不管你的应用程序有没有变化,这些都是你的强用户。不利的一面是,你做的任何事情都不能真正增强它们的用途。从好的方面来说,谁在乎呢?!这些人喜欢你的申请!
- 打乱了! = Ut-oh!以前有人很开心,现在你的改变让他们抓狂了。这些人要么不喜欢你所做的改变,要么他们讨厌改变,不管是哪种情况,都不要去管他们。
- 憎恨者 =“这个应用程序很愚蠢”是这些人说的,不管你对你的应用程序做了什么改变。这些人只是不喜欢你所拥有的,很难将他们切换到*【受影响】的部分。祝他们成为【领养者】好运。对一些人来说,你可能有更好的机会赢得乐透。例如,也许你有一个社交媒体应用程序,并说你有一个【仇恨者】注册了,因为他们的朋友制作了它们。因此,这位客户确实不喜欢社交媒体,但他们碰巧有一个个人资料,只是为了取悦一个朋友。你的新通知系统不太可能赢得他们的支持*(有可能但不太可能)。
迷茫?别担心。让我们试一个例子。
假设你拥有世界上最好的纸尿裤在线零售商 Diapers.com。你的顾客需要注册一个账户,然后才能去买他们想要的所有尿布。因为你的网站没有顾客结账,你知道谁是你的顾客,他们买什么,他们不买什么。您想要测试您的结帐页面的新外观。你想看看新的背景色是否能促进销售。您有一个通常的结帐页面,它有一个浅红色的背景颜色,我们称之为’红色’视图。你想引入一个新的浅蓝色背景视图,我们称之为新的’T14 蓝色 T15’视图。我们希望新的’蓝色’结账视图将有助于增加销售额。
*当你有’红色’页面时购买量减少,但有了新的’蓝色’页面时购买量增加的客户——这些是你的’**影响!”*顾客。这些顾客喜欢你新的结帐背景色!
那些在“红色页面购买了大量商品,并且仍然在新的“蓝色页面购买了大量商品的人——这些人就是你的“采纳者”。不管你做什么网站改变,这些顾客都会买纸尿裤。
那些以前没有买很多东西,并且仍然没有用你的新’蓝色’页面买很多东西的人——这些是你的’憎恨者。不管你做什么网站改变,这些顾客几乎不买纸尿裤。
最后,那些曾经购买很多,但现在随着您的新’T34 蓝色 T35’页面,他们购买较少-这些是您的’T36 中断!‘顾客’。这些顾客以前会买很多纸尿裤,但是你的新背景色导致他们买的纸尿裤变少了!哎呦!
摘要
这有什么大不了的?嗯,你可以做你的 A/B 测试,汇总你所有客户的结果,然后报告你的发现。其实这是你应该做的事情。但是,如果你发现你的 A/B 测试对你的人群几乎没有什么影响呢?你最终可能会扔掉一些用户非常喜欢的非常好的特性。将你所有客户(在你的测试人群中)的 A/B 测试结果汇总是你应该做的事情,但这不应该是你唯一做的事情。
既然【仇恨者】和采纳者没有受到你的实验的影响,也许你应该把他们从你的 A/B 测试结果中去掉(或者至少有一个排除了这些群体的结果版本)。为什么?好吧,在你的结果中包括这些客户会给你的结果增加很多噪音,从而淹没你对业务的真正影响。
你能识别出“中断的”片段吗?如果是这样的话,您可以为这些客户关闭该功能。为什么要从你的“影响”中去掉一个特征呢顾客爱在你没有的时候?也许你可以定制每个客户的体验?为什么要扔掉能让你赚钱的东西呢?
此外,您可以在宏观和/或微观层面上查看这些细分市场。例如,您可以通过多次实验对您的客户进行细分。或者,您可以针对一个实验对您的客户进行细分。无论哪种方式,都有新的信息可以获得。这种细分之所以如此有效,是因为它让你更好地了解你的实验表现和你的客户群。哪些客户在拖后腿?哪些客户喜欢你做的一切?分解你的 A/B 测试结果会有很多收获。
结束了
就是这样!感谢您的阅读,并希望您发现这是有帮助的!
数据科学家经常低估的 4 项基本技能
数据科学不仅仅是数据
每当您查找成为数据科学家的路线图时,您经常会面临一系列需要发展和提高的技术技能,以便开始您的职业生涯。然而,这些指南中的大部分经常会错过——或者故意忽略——它们和所有的技术技能一样重要,但是经常被低估。
数据科学家或开发人员不仅仅是程序员或数据挖掘者;他们集不同角色于一身。他们有点像商业规划者、科学传播者、分析师和想法产生者。
作为一门数据科学,不仅仅是编写高精度的模型;它不仅仅是坐在电脑前,学习如何编码,如何使用特定的模型,或者阅读该领域的最新研究。
在本文中,我将介绍一些技能,我认为这些技能对于一名数据科学家在职业生涯中脱颖而出至关重要。这些技能大部分都是软技能,有一个技术技能似乎大部分时间都被忽略了。
清晰有效的沟通技巧
沟通是最重要的技能,在大多数技术领域都被遗忘了,不仅仅是数据科学。当你的工作是处理复杂的方面,试图理解我们周围的世界时,我们会让一切变得过于复杂。
这是有原因的,在大多数技术领域,当我们与其他开发人员和程序员,甚至是研究人员开会时,我们需要看起来既精通又聪明。所以,我们使用花哨的词语和复杂的例子。
如果不能简单的解释,说明你理解的不够好。——爱因斯坦
这种策略在技术环境中可能行得通,但如果你需要将你的发现传达给更广泛的受众,它就行不通了。有效沟通的能力不仅仅是简单地解释复杂的想法。要成为一名有效的沟通者,你需要练习用正确的词语表达你的想法。
此外,有效沟通的一个重要部分是使用正确的视觉辅助工具,它不会与你的话相矛盾,而是支持它,并有助于更好地传递你的想法。
要成为一个更好的沟通者,练习做以下事情:
- 适应口头和非口头交流。肢体语言和你实际说的话一样多。
- 保持事情简明扼要。一种方法是使用 PIP 模型(目的、重要性、预览)。陈述你工作的原因,它为什么重要,以及它是如何工作的。
- 不要仅仅依赖你的视觉辅助工具——图表。当你展示它们时,简单地解释它们各自代表了什么。
- 掌握好时机。人类的一个坏习惯是,当我们在公共场合讲话时,我们倾向于东拉西扯。为自己设定一个明确的时间目标将有助于你避免这种情况。
用引人注目的视觉效果讲述您的数据故事。
towardsdatascience.com](/data-visualization-101-7-steps-for-effective-visualizations-491a17d974de)
基本的业务理解
任何数据科学项目的第一步都是数据。你需要收集数据,清理数据,然后分析数据。要做到这一点,就要分析数据,理解它试图告诉你的故事;您需要对数据源有一些基本的了解。
大多数时候,我们使用特定的业务模型收集数据,以服务于特定的目标。了解业务模型的基础可以帮助您更好地理解数据,从而更好地分析数据。
“数据科学不仅仅是处理数字:它是应用各种技能来解决行业中的特定问题”——n . r . Srinivasa Raghavan
成为一名数据科学家不仅仅是数字;虽然数字在该领域发挥着巨大的作用,但每个数据科学家都需要知道他们工作领域的商业模式。他们需要知道为什么要遵循这种模式,以及它对业务有何益处。
一个收集和分析数据却不知道数据背后的商业模式的数据科学家,就像是在读一个用另一种语言写的故事,但用的是你母语的字母表。你可以阅读它,但除非你翻译它,否则你无法理解它。
你不需要深入研究或者去商学院更好地理解你的数据。你只需要知道在你的工作场所遵循的特定模式的基础。
协作和团队精神
作为一名数据科学家,你永远不会独自工作。你总是为同一个目标而努力的团队中的一员。你可能需要与经理、设计师、市场以及最重要的客户打交道。当然,还有其他数据科学家。
为了能够在这样的工作环境中成长和证明自己,你需要成为一名优秀的团队成员,乐于听取新的想法,并总是欢迎建设性的反馈。你应该保持开放和客观,同时保持你独特的视角。
作为团队成员的另一个方面是与开源项目合作。开源软件是你发展技能、回报社区/社会以及结识与你有相同兴趣和想法的人的一种方式。
最后,成为团队成员的一个好方法是指导。当你主动提出成为新人的导师时,无论是在一般领域还是在你特定的工作场所,你不仅仅要证明你知识渊博,显示你灵活并愿意与他人分享你的知识。
维护代码的能力
我想谈的最后一项技能是一项技术技能,当我们进入这个领域时,我们(包括我自己)似乎需要克服这项技能。这个技能就是版本控制的流畅性。
用最先进的模型编写好的代码并不是终点。在软件开发中,没有终点;总有一些东西需要添加和改进。编写可维护的代码并绘制代码是一项需要大量时间和实践才能掌握的技能。
第一步是熟悉版本控制。我意识到版本控制并不有趣,而且在大多数时候,非常令人困惑,但尽管如此,这是每个数据科学家都应该掌握的基本技能。
如果你的代码维护得很好,其他数据科学家会很容易理解。它很容易构建和扩展。如果您的数据结构发生变化,拥有一个可维护的代码将使适应新数据的过程更加顺利。
什么是版本控制,为什么它很重要?
towardsdatascience.com](/version-control-101-definition-and-benefits-6fd7ad49e5f1)
结论
成为一名数据科学家不仅仅是为了数据。有时它是商业、营销和沟通的结合。为了成为一名有影响力的数据科学家,你需要掌握一些技能。
技能,如有效和清晰的沟通技巧,对商业模式的一些基本理解,以及成为一名优秀团队成员的能力。这些软技能可以改变你的职业生涯,为你的未来打开新的机会和视角。
一开始,从事数据科学职业可能会让人望而生畏,但我认为这是非常值得的。当你用数据讲述一个故事,在选择中找到模式,并帮助让这个世界变得更美好时,你会获得这种令人惊叹的成就感,让你忘记所有你必须经历的麻烦。
管理大型分布式数据团队的 4 个基本策略
给我们远程第一世界的数据领导者的建议。
新冠肺炎已经迫使几乎每个组织适应新的劳动力现实:分布式团队。我们分享四个关键策略,让您的远程数据团队成为整个公司的力量倍增器。
现在是第 6 个月(还是 72 个月?很难说)全球疫情,尽管从你的卧室到餐桌的通勤时间很短,但你仍在适应这种新常态。
您的团队负责所有相同的任务(处理临时查询、修复损坏的管道、实现新的规则和逻辑等)。),但是对损坏的数据进行故障排除只会变得更加困难。当你们彼此相距 5 英尺远时,确定一个 数据停机 事件的根本原因已经足够困难了;当你在不同的时区工作时,这要困难 10 倍。
分布式团队并不新奇,事实上,在过去的几十年里,它们变得越来越普遍,但是在疫情期间工作对每个人来说都是新的。虽然这种转变扩大了地理人才库,但这种规模的合作会带来不可预见的障碍,特别是在处理实时数据时。
你每天的站立只能让你到此为止。
以下是管理大型分布式数据团队的 4 个基本步骤:
记录所有的事情
当团队被分配时,关于哪些表和列是“好的或坏的”的信息被分解。我们在一家领先的电子商务公司采访的一位数据科学家告诉我们,团队需要花 9 个月的时间来开发一种蜘蛛感知能力,了解哪些数据位于何处,哪些表是“正确的”,哪些列是健康的,哪些是实验性的。
答案?考虑投资数据目录或沿袭解决方案。这种技术提供了一个关于团队数据资产的真实来源,并使理解数据输入的格式和样式指南变得容易。当数据治理和法规遵从性开始发挥作用时,数据目录变得尤为重要,这是金融服务、医疗保健和许多其他行业的数据团队最关心的问题。
为数据设置 SLA 和 SLO
不仅要确保数据团队成员之间的一致性,还要确保与数据消费者(即营销、高管或运营团队)的一致性,这一点非常重要。要做到这一点,我们建议从站点可靠性工程书籍中抽出一页,为数据设置并调整清晰的服务级别协议(SLA)和服务级别目标(SLO)。围绕数据新鲜度、数量和分布的期望 SLA,以及可观察性的其他支柱,在这里将是至关重要的。
Reddit 的数据科学经理 Katie Bauer 建议分布式数据团队保留一份重要项目的预期交付日期的中心文件,并每周审查该文件。
她说:“当利益相关者提出问题时,我可以很容易地访问这份文件来寻找答案,而不是在一周内 ping 我的团队进行更新。”“这让我们专注于交付工作,避免不必要的转移。”
投资自助工具
投资自助式数据工具(包括像雪花和红移这样的云仓库,以及像 Mode、Tableau 和 Looker 这样的数据分析解决方案)将简化数据民主化,无论数据用户的位置或角色如何。
同样,自助式版本控制系统有助于每个人在大型工作流上进行协作时保持一致,这在跨时区利用实时数据时变得极其重要。
优先考虑数据可靠性
负责管理 PII 和其他敏感客户信息的行业,如医疗保健和金融服务,对错误的容忍度很低。数据团队需要确信,从消费到输出,数据在整个管道中都是安全和准确的。围绕数据可靠性的正确流程和程序可以防止此类数据停机事件并恢复对您数据的信任。
许多年来,数据质量监控是数据团队捕获不完整数据的主要方式,但这种方式不再适用,尤其是当实时数据和分布式团队成为常态时。我们的远程优先世界需要一个更全面的解决方案,能够无缝跟踪数据可观察性的五大支柱以及根据您组织的需求量身定制的其他重要数据健康指标。
记住:不好也是好的
我们希望这些建议能帮助你接受甚至拥抱数据世界的新常态。
然而,除了这些更具战术性的建议之外,记住不好也没关系也无妨。git lab 的第一位数据分析师 Emilie Schario ,现在是内部战略顾问,说得好:“这不是普通的远程工作。在全球疫情的强制远程工作期间取得成功的要素与“照常远程工作”的含义不同。”
我们很想听听你对领导分布式团队的建议!向 巴尔摩西 伸出你的智慧之言。
4 门免费数学课程,用于隔离和提升您的数据科学技能
来源:this is engineering@ Pexels—免费库存图片
因为没有数学数据就没有科学
当我进入数据科学和机器学习领域时,任何与数学和统计相关的东西都是我在大约 10 年前最后一次访问的,我估计这可能是我一开始觉得很难的原因。我花了很多时间阅读和观看视频,对我们在行业中日常使用的许多工具的事情是如何发生的有了一些基本的了解。然而,到了一定程度,我觉得有必要对我在 Jupyter 笔记本上做的所有“导入”和“适应”背后发生的事情有一个坚实的理解。所以我决定是时候擦掉我数学知识上的灰尘了。
现在,我还在做这件事,我想这永远不够。此外,我来自商界,身处一个充斥着来自工程、统计、物理和其他精确科学的专业人士的行业。我知道在数据科学的世界里有很多东西要学,但是你知道吗?技术和语言可能来来去去,但是这个领域的数学背景将会一直存在。
这就是为什么今天我总结了 4 门课程来提高你的数学知识,并利用一些由于这种不幸的情况而给予我们的空闲时间。因为,你知道,这些天你应该呆在家里😉。
1。 机器学习的数学
地点:Coursera
参与机构:伦敦帝国理工学院
所需时间:104 小时(实际上至少+50%)
先前要求:无
课程本身的摘要:
对于机器学习和数据科学中的许多高级课程,你发现你需要更新数学基础知识——这些东西你可能以前在学校或大学里学过,但在另一种背景下教授,或者不是很直观,以至于你很难将其与计算机科学中的使用联系起来。这个专业旨在弥合这一差距,让你跟上基础数学的速度,建立直观的理解,并将其与机器学习和数据科学联系起来。
涵盖的主题:
- 线性代数
- 多元微积分
- 主成分分析
提示:Coursera 的大部分课程和专业都有审核的选项。你不会获得证书,但你可以使用课程的大部分资源。我个人觉得这已经足够了。注册时,只需选择课程审核选项:)。
地点:edX
参与机构:微软
所需时间:50 小时
先决条件:Python 和一些数学基础知识
课程本身的摘要:
想学习机器学习或人工智能,但又担心自己的数学能力可能达不到?像“代数”和“微积分”这样的词会让你感到恐惧吗?你是否已经很久没有在学校学过数学了,以至于你已经忘记了很多当初学过的东西?
你并不孤单。机器学习和人工智能建立在数学原理上,如微积分、线性代数、概率、统计和优化;许多潜在的人工智能实践者发现这令人望而生畏。这门课程不是为了让你成为数学家而设计的。相反,它旨在帮助你学习一些重要的基本概念和用来表达它们的符号。本课程提供了处理数据和应用所学技术的实践方法。
涵盖的主题:
- 方程式、函数和图形
- 差异化和最优化
- 向量和矩阵
- 统计和概率
提示:本课程有开始日期,但你可以选择一个更早的开始日期,并免费查看该群组的所有内容。
地点:edX
参与机构:加州大学圣地亚哥分校
所需时间:100-120 小时
先修要求:多元微积分和线性代数
课程本身的摘要:
对不确定性的推理是噪声数据分析中固有的。概率和统计为这种推理提供了数学基础。
在这门课程中,你将学习概率和统计的基础。您将学习数学理论,并获得使用 Jupyter 笔记本将该理论应用于实际数据的实践经验。
涵盖的主题:
- 机器学习的数学基础
- 统计素养:理解诸如“在 99%的置信水平上”这样的陈述的含义
提示:本课程有开始日期,但您可以选择一个更早的开始日期,并免费查看该群组的所有内容。
地点:Coursera
参与机构:加州大学圣克鲁斯分校
所需时间:22 小时(实际上不少于 30 小时)
先决条件:对概率有一些基本的了解
课程本身的摘要:
本课程介绍了统计的贝叶斯方法,从概率的概念开始,到数据的分析。我们将学习贝叶斯方法的哲学,以及如何对常见类型的数据实施它。我们将比较贝叶斯方法和更普遍教授的频率主义方法,并看到贝叶斯方法的一些好处。
涵盖的主题:
- 概率和贝叶斯定理
- 统计推断
- 离散数据的先验和模型
- 连续数据模型
这就是现在所有的窥视。我建议按照给出的顺序学习这些课程,当然,如果你符合要求,也可以学习你喜欢的任何课程:)。
别忘了看看我的一些最新故事:
- 我们数据人为什么以及如何帮助对抗新冠肺炎
- 官方:时间不存在;如何处理时间特征?
- 我应该在我的机器学习模型中包含截距吗?
此外,请随意访问我在 Medium 上的个人资料,查看我的其他故事和如果您想直接在您的电子邮件上收到我的最新文章,只需 订阅我的简讯 **😃。**最后,我想知道您是否对未来故事的其他特定类型的课程感兴趣:
回头见!感谢您的阅读!
地道熊猫代码的 4 个隐藏的宝石
图片来源:像素
分享更多熊猫提示来提高你的数据处理水平
我的上一篇文章,熊猫的 6 个鲜为人知但令人敬畏的技巧,希望已经给你一些熊猫高效编码的味道。继续这个话题,如果你还不知道的话,让我们来探索更多关于熊猫的小技巧和窍门。
这篇博客将使用我们在上一篇博客中讨论过的 html 技巧,使用直接从维基页面食物营养成分表中抓取的乳制品表。这是一张表格的快照,显示了食物名称、度量单位/克数以及相应的热量值。
1。 **Pandas series**
或 **list**
或 **series of lists**
简单来说,Pandas 中的 series 是一个带有索引标签的一维数组。与设计用于指示元素位置的列表索引不同,序列中的索引标签可以是用户定义的任何内容。这当然在使用序列时提供了灵活性,但是如果你不熟悉索引标签在 pandas 中是如何工作的,这也“设置了一个陷阱”。
所以我们今天的任务#1 是检查一个值(例如,skim, instant
)是否存在于一个序列中(例如,dairy_table[‘Food’]
)。如果是,则返回 true 否则为假。很简单,这个任务只需要一行代码,如下图所示,
惊讶和困惑?用最直观的 in
操作符,我们的第一个代码返回假,然而第二个代码返回真?为什么 Python 告诉我食物一栏不含skim, instant
,含index6
?
嗯,原因是使用in
直接检查熊猫系列将检查skim, instant
是否存在于索引标签中,而不是我们的食物列的值。因此,为了避免落入这个“陷阱”,我们必须指定值/值列表作为我们的搜索空间,下面演示了几种方法,
当在 Pandas 中处理系列时,继续下一个潜在的“陷阱”,也就是说,允许一个单独的系列包含列表/元组,并且需要额外的步骤将它们解析到它们自己的列中。例如,让我们将我们的 dairy 表修改为一个包含值元组的数据帧,作为一个新的列 Nums ,
现在,我们的任务#2 是将 Nums 列分成两个单独的列。同样,最直观的方式是通过索引来访问元组中的每个元素,
当然,对于每个元组中只有两个值的例子来说,这是可行的。如果我们有数百个值,而无法手动访问每个元素,该怎么办?另外,正如我们从输出中看到的,这个 list comprehension 返回一个必须进一步转换为整数值的字符串列表。相当多的基本细节!
那么有没有一个简单的方法来实现它呢?答案是肯定的,而且非常简单,如下所示,
**** * 更新 2022:加入我们的 YouTube 社区🎦** 【数据说话带吉】 😄
2。宁滨值潇洒地用 **map**
或 **applymap**
我们的任务#3 是将食物值分为三类——牛奶、布丁和奶油,定义如下:
与其单调乏味地创建多个if
语句或isin()
函数,不如通过利用映射技巧以更智能的方式来实现。首先,我们将值组织到一个映射字典中,其中每个值属于其对应的 bin,
然后,我们使用map
或applymap
来替换原始值,
这里有两点需要注意:
(1)我们交换了原始映射字典中的键和值,以便它的键与数据集中的实际食物名称匹配。
(2)我们演示了两种实现方式:map
和applymap
,我经常被问到这两个概念的区别。简单来说,**map**
取入并返回系列,而**applymap**
取入并返回数据帧。例如,上面代码中的map()
函数用于食物序列,它用序列方法fillna()
将字典中没有的值重新编码为*‘其他’*。
相比之下,第二个函数applymap()
用于整个数据帧,搜索与字典关键字匹配的值(即食物名称),然后用相应的字典值(即 bin 名称)替换它们。如果没有找到匹配的键,代码将保持原始值不变。
因此,map()
或applymap()
都可以工作,上面的一行代码写起来简洁且易于维护,更不用说它应该比遍历每个食物名称的组要快得多。
3。 **where**
用作相当于 **ifelse**
中的 R
R 中我最喜欢的一个函数是ifelse
;类似地,Pandas 提供了where
函数来做同样的事情:当指定的布尔条件不满足时替换值。
例如,下面显示了一个食品名称列表,我们的目标是用*‘其他’*替换列表中省略的食品名称。现在,让我们看看where(other)
如何方便地完成这个数据操作任务,
4。类型**category**
类型保存内存
最后但同样重要的是,我想讨论一个关于 Pandas 中的分类数据类型的技巧,这是为对象数据节省空间的另一种选择。保存为object-dtype
的字符串通常会占用大量内存,而category-dtype
在后端使用整数值来表示原始值,因此更节省空间和时间。现在,让我们仔细看看我们刚刚创建的 object-dtypeFood _ Category列,
这里有几个注意事项,(1)一旦被转换为类别类型, Food_Category 被编码为整数;(2)通过将对象数据类型转换成类别数据类型,存储器使用从 1051 字节减少到 427 字节(即,减少 60%)。
然而,关于 category-dtype 的两个警告不能被忽略。首先,就像 R 中的factors
,category-dtype
在新值赋值方面不像object-dtype
那样灵活。例如,如果我们想用下面的代码向 Food_Category 列添加一个新的类别/级别,我们将得到臭名昭著的 ValueError msg。该错误指示新级别(即,另一个 _ 类别)在被分配给任何行之前必须首先被添加到容器中,
因此,正确的方法是首先使用add_categories()
方法设置电平值,
关于category-dtype
的另一个警告是,对于具有较少重复值的列,极端情况是所有的值都是唯一的,category-dtype
将比object-dtype
占用更多的内存。让我们以食物列为例,这里所有的值都是唯一的,
我们可以看到,一旦食物列被转换为category-dtype
,memory_usage 从 1605 字节增加到 2262 字节(即增加了 41%)。因此,当一个object-dtype
列包含许多重复值时,分类将最有利于高效存储。
上前练习
总而言之,我已经分享了我的熊猫小贴士和技巧,我希望我能早点知道。完整代码链接在我的 Github 里。现在轮到你开始编码了!😃
没有不断的练习,就不会有优秀的音乐[熊猫]。
简·奥斯汀《傲慢与偏见》中的凯瑟琳夫人(第 31 章)
我希望你喜欢这个博客! 想要更多数据科学和编程技巧?使用 我的链接 注册 Medium,获得我所有内容的全部访问权限。
还订阅我新创建的 YouTube 频道 《数据与吉谈》
以下是我的其他博客,你可能也会觉得很有启发性。
* [## 每个数据科学家都应该知道的 6 个 SQL 技巧
提高分析效率的 SQL 技巧
towardsdatascience.com](/6-sql-tricks-every-data-scientist-should-know-f84be499aea5) [## SQL、R 和 Python 中的数据整形
从 Python vs. R 到 Python & R
towardsdatascience.com](/data-reshaping-in-sql-r-and-python-d44ca19e71b8)*
初学者应该知道的 4 个隐藏的 Python 特性
Python 初学者
如何轻松增强您的 Python 代码
本·怀特在 Unsplash 上拍摄的照片
学习是永无止境的。你将永远学不完如何用 Python 编程。你可能会不断发现Python 中有用的新特性,你可能会被需要学习的内容淹没。
不存在一本书或一个网站包含你需要了解的关于 Python 的一切。甚至官方文件也没有。Python 的可能性基本上是无限。
我用 Python 编码已经很多年了,并且发现了一些有趣的 Python 特性,这些特性非常独特。你在其他编程语言中找不到的东西。这里有 4 个隐藏的 Python 特性,Python 初学者可能会觉得有用。
1.For-else 循环
你熟悉 Python 中的条件语句吗?
while
循环,打勾。
for
循环往复,轻松。
if else
从句,你把它钉在了上。
for else
条款呢?什么?
只有当 for 循环完成而没有遇到 a break
语句时,else
块中的代码才会运行。如果你不知道什么是break
,那么看看下面的文章了解更多信息。
Python 中退出子句的三种方法
medium.com](https://medium.com/better-programming/how-to-use-pass-break-and-continue-in-python-6e0201fc032a)
那么这个 for-else 循环怎么有用呢?也许用户在for _ in range(3):
循环中有 3 次尝试输入正确的密码,只有正确的密码激活break
语句。else
块包含连续 3 次输入错误密码的后果,例如锁定用户使用系统。
令人惊讶的巨蟒。
2.比较运算符链接
您希望检查a
中的值是否在 0 到 100 的范围内,因此您将进行两次比较,并使用and
将它们组合起来。0 <= a
和a <= 100
。这很简单。
但是你可以链接这些比较,并以一种更容易被人理解和更直观的方式0 <= a <= 100
写出来。解释器会将它们分开,并读取类似0 <= a and a <= 100
的比较操作。
a = 25
0 <= a <= 100 # True
0 <= a and a <= 100 # True
# The two expressions above are **equivalent** in Python
也可以把链条做得更长,比如0 < a < 10 < b < 100
。
直觉蟒。
3.扩展切片
我们可以使用语法a[start:stop:step]
和可选的第三个步骤参数来分割列表a
。它读取切片序列的一部分,从start
开始,到stop
结束,步长为step
。步长必须是整数,并且可以是负的。
a = list(range(10))
print(a[::2]) # [0, 2, 4, 6, 8]
print(a[3::-1]) # [3, 2, 1, 0]
我们可以通过将步骤参数设置为-1
简单地通过a[::-1]
来反转列表。如果没有指定,该步骤默认为1
,这意味着没有元素跳过或列表反转。
令人印象深刻的蟒蛇。
西蒙·马辛格在 Unsplash 上拍摄的照片
4.价值交换
Python 中如何交换两个对象的值?轻松点。你只需创建一个临时对象temp
,就像你在其他语言中做的那样。
# Standard way to swap values of two objects in other languages
temp = a
a = b
b = temp
但这不是很可读性也远非优雅。但是您实际上可以使用 Python 中的一行简单代码轻松地交换这些值。
# Standard Python way to swap values
b, a = a, b
为什么有效?解释器首先评估右侧,并在内存中创建一个元组 (a,b)
。然后对左侧进行评估,其中元组中的两个元素分别被解包和赋值给b
和a
。它实质上交换了分配给a
和b
的对象。
极小的蟒蛇。
Jakub Dziubak 在 Unsplash 上拍摄的照片
相关文章
感谢您的阅读!你觉得那些功能有趣有用吗?下面留言评论!你也可以注册我的时事通讯来接收我的新文章的更新。如果您对提高 Python 技能感兴趣,以下文章可能会有所帮助:
超越 lambda、map 和 filter 的 Python 技巧
towardsdatascience.com](/5-python-features-i-wish-i-had-known-earlier-bc16e4a13bf4) [## Python 3.8 中针对 Python 新手的 6 项新特性
请做好准备,因为 Python 2 不再受支持
towardsdatascience.com](/6-new-features-in-python-3-8-for-python-newbies-dc2e7b804acc) [## Python 初学者应该避免的 4 个常见错误
我很艰难地学会了,但你不需要
towardsdatascience.com](/4-common-mistakes-python-beginners-should-avoid-89bcebd2c628)
数据科学家本周应该阅读的 4 篇有趣文章(11 月 13 日)
为机器学习从业者和数据科学家编写的优秀文章
作者图片
大师算法——比尔·盖茨建议你阅读《更好地理解人工智能》,作者是贝尔纳多·佩雷拉
Bernardo 提供了一本书的评论,该书提供了机器学习领域和相关主题的非技术视角。
Bernardo 的文章中提到的书名叫“大师算法”,这是一个吸引大多数机器学习从业者的标题。
贝尔纳多提出,围绕人工智能有几个模糊的陈述、承诺和问题,但他的总体努力指向寻求更多知识的愿望。
Bernardo 对“主算法”的评论详细而直接,因为它总结了本书十章的主题和关注点,并提供了 Bernardo 对本书作者意图和本书欠缺方面的个人意见。
也许你是一名数据科学家,需要从 Jupyter 笔记本、无休止的教程博客和黑屏中休息一下,那么“大师算法”可能是你需要的新鲜空气,不会偏离人工智能领域太远。
阅读贝尔纳多的评论,了解更多信息。
书评和评论文章。
towardsdatascience.com](/the-master-algorithm-a-book-review-and-opinion-piece-f3a3f2cf5606)
邻里监督有了新工具:私人拥有的车牌阅读器
在人类社会众目睽睽之下整合各种形式的人工智能技术通常是有争议的。
争议源于政府管理机构的持续监控,这侵犯了不知情的公民的隐私。如果你仍然不确定我所描述的有争议的人工智能,那么想想配备人工智能的面部识别系统或监控系统。
Ella 的文章探讨了人工智能技术在社区中的集成所带来的影响,这些社区不欢迎他们不得不以安全性来换取高水平的隐私。
尤其是当这些系统的数据不再掌握在政府管理机构手中,而且日常公民也可以访问时。
计算机视觉和深度学习技术在创造高效的车牌阅读器方面发挥了重要作用,其速度之快,使得想法能够成为研究工作,现在则成为实际产品。
Ella 的文章关注的是一家特殊的自动车牌阅读器制造商,群体安全。这篇文章还包括了在他们的社区内使用过羊群安全提供的工具的公民的陈述和意见。
对于寻求获得我们开发的算法的社会影响的高层次概述的机器学习从业者来说,这是一本好书。
居民们担心这些小玩意会让人窥探——甚至更糟
onezero.medium.com](https://onezero.medium.com/neighborhood-watch-has-a-new-tool-privately-owned-license-plate-readers-302f296abb27)
用 Fairlearn 创建公平的机器学习模型作者鲁本·克霍夫
如果你是一个对创建机器学习模型感兴趣的数据科学家,请阅读这篇文章。
机器学习模型中的偏见一直是最近讨论的话题,特别是随着面部识别和跟踪等人工智能技术的采用增加。
Ruben 关于减轻从数据集到训练模型的偏差传播的帖子与所有级别的数据科学家都有很高的相关性。
Ruben 通过向读者提供术语“公平建模”的描述,介绍了在机器学习模型中实施公平的关键思想。
除了提供与公平性建模主题相关的一些概念信息和关键术语,Ruben 的文章还包括在数据集内实施公平性的技术实现细节。
Ruben 演示了如何利用微软开发的名为 Fairlearn 的 python 包;该软件包用于根据某些关键指标和受保护的变量来衡量数据集内的公平程度。
微软防止模特歧视人的工具
towardsdatascience.com](/creating-fair-machine-learning-models-with-fairlearn-d9946c32d48)
10 种不同的数据科学职位名称及其含义BySara a . Metwalli
面向希望了解数据科学领域内角色定义的数据科学求职者。
数据科学作为一个领域,涉及到不同的角色和学科。试图准确地找到什么样的角色最能概括你在数据科学方面的兴趣和技能是一项挑战,有时会令人困惑。
Sara 的最新文章探讨了十种角色的定义和职责,所有这些角色都与数据科学领域相关。
您可能正在阅读本文,并认为您已经非常了解与数据科学领域相关的所有角色,但是请相信我,本文中包含的一些角色和描述可能会让您感到惊讶。
Sara 写了一篇文章,许多数据科学求职者都会喜欢,因为了解什么样的角色最适合你的专业知识非常重要。
为你的技能选择合适的角色。
towardsdatascience.com](/10-different-data-science-job-titles-and-what-they-mean-d385fc3c58ae)
我希望这篇文章对你有用。
要联系我或找到更多类似本文的内容,请执行以下操作:
雇用数据科学家时要寻找的 4 个关键特征
外加面试中使用的样题
格伦·卡斯滕斯-彼得斯在 Unsplash 上拍摄的照片
寻找优秀的数据科学家可能是一项棘手的任务。谷歌搜索“数据科学技能缺口”显示,在世界上许多国家,公司正在努力寻找合适的候选人来满足他们不断增长的数据科学需求。
一个糟糕的招聘选择可能会非常昂贵,因此,能够有效地审查候选人非常重要,以确保他们非常适合这个职位,并且能够有效地在您的公司引入/扩展数据科学。
严格
理解可用数据的来源,以及任何数据质量问题,对于产生高质量的输出是必不可少的。当使用任何数据集时,数据科学家应该做的第一件事是执行深入的统计分析,以深入研究他们的原始材料,并避免做出任何懒惰的假设。
伴随严谨而来的是好奇心。一名优秀的数据科学家会对他们正在处理的数据提出许多问题,并且很快就会理解其属性、限制、怪癖和有趣的内部关系。毕竟,数据描述了现实世界中发生的一些事情,主动深入数据并发现其秘密会带来超出原始简报的新机会。
示例问题:
- “举例说明数据质量问题影响您工作的时候,您是如何发现的,以及您是如何处理的。”
- 使用与你的行业相关的公开可用的数据集设置一个实际问题。一个很好的迹象是,如果候选人在开始提供见解之前问了很多问题,以确认他们对数据的理解。
弹性
处理数据可能是一项艰苦的工作。
但通常,最难处理的是不确定性。当你开始一个建模或分析项目时,不能保证你能找到任何有用的东西。无论你投入多少时间和精力,你得到的数据可能都是噪音,没有信号。
当一切似乎都不起作用时,可能会令人沮丧和沮丧,因此韧性是一个重要的特质。有能力不断推动和尝试新事物而不放弃,或者更糟的是,不损害你的职业操守是至关重要的。但保持清醒的商业头脑也很重要,知道一旦收益递减法则使任何进一步的努力都变得徒劳,什么时候该收手。
示例问题:
- “告诉我一件让你感到兴奋的工作没有按计划进行的时候。”
- “你如何决定一件作品何时可以交付?”
神入
数据科学是一种翻译练习。随之而来的是一个混乱的、定义不清的现实世界中的人类问题。这个问题的一个清晰明确的数字近似解决方案出来了。数据科学家的工作是确保近似值很好地映射到人类问题,捕捉其细微差别,并满足利益相关者和用户的要求。为此,他们需要设身处地地为许多人着想,提出许多问题,并真诚地寻求理解是什么让人们这样做。
因此,实践同理心是数据科学的核心技能。理解参与项目的每个人的特殊经历和愿望,并进行有效的沟通,对于项目的成功至关重要,不应该为了技术技能而降低优先级。
示例问题:
- “告诉我最近参与一个项目的人的情况,他们有什么不同的期望?”
技术
我们都看到了工作中不断增加的每一项技术的清单,他们希望应聘者成为这方面的专家。
“理想的候选人将拥有 10 年以上的 SQL、Python、SAS、TensorFlow、Keras、PyTorch、Tableau、PowerBI、Qlikview、yadda yadda yadda,所有这些都在企业级财务环境中提供给 C-Level 高管”。
数据科学的技术前景一直在变化。因此,最重要的能力是能够快速掌握新的技术技能,并将其融入自己的技能。
在特定技术领域的经验在你的公司可能特别重要,所以在工作描述中说明这一点是很好的。但是要尽量保持宽松,不要把技术上有天赋的候选人排除在外,他们可能不完全符合那种经验,但会很快获得所需的能力。
样题
- 不要靠自我标榜的经验或者 LinkedIn 的背书。不是所有的“经验”都是平等的!一个实际的问题,通过你所在行业的一个案例研究,你会更多地了解一个人的思维过程是如何运作的,以及他们如何运用自己的技能来解决问题。例如,我过去面试过几个声称精通 SQL 的候选人,但是当面对一些表和一个关于数据的问题时,他们很难应用连接的概念。
- 像 HackerRank 这样的网站提供了许多编程语言的测试环境,这在筛选候选人的早期阶段可以作为验证。测试每个候选人自我描述的优势,而不仅仅是工作描述中列出的技能。
4 个鲜为人知的熊猫功能,可以让你的工作更轻松
为数据科学学习熊猫
增强你的数据科学项目
照片由 Jérémy Stenuit 在 Unsplash 上拍摄
许多数据科学家一直使用 Python 作为他们的编程语言选择。作为一种开源语言,Python 通过提供各种数据科学相关的库获得了相当大的流行。特别是,pandas 库可以说是基于 Python 的数据科学家中最流行的工具箱。
不得不说熊猫库开发的太好了,为各种操作提供了非常庞大的函数集合。然而,这个强大的工具箱的缺点是,一些有用的功能可能不太为初学者所知。在这篇文章中,我想分享四个这样的功能。
1.where()函数
大多数时候,对于我们正在处理的数据集,我们必须进行一些数据转换,以使数据具有可分析的格式。[where()](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.where.html)
函数用于替换不满足条件的值。让我们考虑下面的例子来了解它的用法。当然,我们首先需要导入 pandas 和 numpy,就像我们处理所有数据操作步骤一样。
对 Series 使用 where()
在上图中,我们创建了一个序列并应用了where()
函数。具体来说,这个函数的签名用法是where(condition, other)
。在这个调用中,condition
参数将产生布尔值,当它们为True
时,原始值被保留,当它们为False
时,将使用由另一个参数指定的值。在我们的例子中,任何低于 1000 的值都被保留,而等于或大于 1000 的值被分配给 1000。
该函数不仅可用于 Series,也可用于 DataFrame。让我们看看 DataFrame 的类似用法。在下面的例子中,数据帧df0
的奇数将全部增加 1,偶数保持不变。
将 where()与 DataFrame 一起使用
2.函数的作用是
与where()
函数不同,[pivot_table()](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.pivot_table.html)
函数仅适用于 DataFrame。这个函数创建一个电子表格风格的数据透视表,因此它是一个很好的工具,通过以一种简单的方式显示数据来汇总、分析和呈现数据。用一个更现实的例子可以最好地展示它的威力。
对 DataFrame 使用 pivot_table()
在上图中,我们创建了一个数据框架,其中包含工资和奖金记录以及雇员的性别和部门信息。然后,我们使用pivot_table()
函数创建了一个数据透视表。具体来说,我们将工资和奖金列设置为values
参数,将部门设置为index
参数,将性别设置为columns
参数,将[np.mean, np.median, np.amax]
设置为aggfunc
参数。
在输出中,您可以看到我们有一个数据透视表,其中显示了 2(性别)乘 2(部门)的表格,分别是工资和奖金变量的平均值、中值和最大值。一些有趣的观察结果包括,在 A 部门,女性的工资高于男性,而在 b 部门,情况正好相反。在这两个部门,女性和男性的奖金相似。
3.函数的作用是
当我们有一个包含序数度量的数据集时,有时创建分类分位数来识别可能的模式比参数化地检查这些序数度量更有意义。理论上,我们可以自己计算分位数临界值,并使用这些临界值映射数据,以创建新的分类变量。
然而,这个操作可以通过[qcut()](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.qcut.html)
函数轻松实现,该函数根据变量的等级将变量离散成大小相等的池(例如,分位数和十分位数)。让我们通过下面的例子来看看这个函数是如何工作的。
对 DataFrame 使用 qcut()
在上图中,我们创建了一个包含 3 列的数据帧。我们对生成var2
列的分位数感兴趣。因此,我们将q
参数指定为 4(如果需要十分位数,也可以是 10)。我们还指定了标签列表来标记这些分位数。
4.melt()函数
根据数据科学家使用的工具,一些人喜欢“宽”格式(例如,一个主题一行多个变量),而另一些人喜欢“长”格式(例如,一个主题多行一个变量)。因此,我们经常需要在这些格式之间进行数据转换。
与完全转置数据帧的转置 [T](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.T.html)
函数不同,[melt()](https://pandas.pydata.org/docs/reference/api/pandas.melt.html)
函数对于将数据从宽格式转换为长格式特别有用。让我们通过下面的例子来看看它是如何工作的。
对 DataFrame 使用 melt()
在上图中,我们创建了一个宽格式的数据帧。具体来说,我们有服药前和服药后两种措施。然后我们使用melt()
函数产生一个长格式的数据帧。我们将SubjectID
指定为id_vars
,将两个度量指定为value_vars
,并将列重命名为更有意义。
在你走之前
我们可以探索熊猫的更多功能。在本文中,我们刚刚学习了四个我们有些人不太了解的函数,但它们在我们的日常数据操作工作中非常有用。
我希望你喜欢读这篇文章。你可以在 GitHub 上找到代码。
关于作者
我写关于 Python 和数据处理与分析的博客。万一你错过了我以前的一些博客,这里有一些与当前文章相关的文章链接。
更好的 Python
medium.com](https://medium.com/better-programming/30-simple-tricks-to-level-up-your-python-coding-5b625c15b79a) [## 理解 map()函数操纵熊猫系列
了解使用 map()函数将数据转换为所需格式的基本原理
towardsdatascience.com](/understand-map-function-to-manipulate-pandas-series-8ac340d514f7) [## 关于在 NumPy 中生成随机数的备忘单
查看 NumPy 中最常用的生成随机数的函数。
towardsdatascience.com](/a-cheat-sheet-on-generating-random-numbers-in-numpy-5fe95ec2286)
4 个鲜为人知但非常实用的熊猫手术
发现更多的熊猫
Pandas 是使用最广泛的数据分析和操作库,它提供了许多处理数据的函数和方法。由于它们执行的任务,其中一些比其他的更频繁地被使用。
在本帖中,我们将介绍 4 个熊猫手术,它们不太常用,但仍然非常实用。
先说进口 NumPy 和熊猫。
import numpy as np
import pandas as pd
1。因式分解
它提供了一种编码分类变量的简单方法,这是大多数机器学习技术中的一项必需任务。
这是来自客户流失数据集的分类变量。
df = pd.read_csv('/content/Churn_Modelling.csv')df['Geography'].value_counts()
France 5014
Germany 2509
Spain 2477
Name: Geography, dtype: int64
我们可以用一行代码对类别进行编码(即转换成数字)。
df['Geography'], unique_values = pd.factorize(df['Geography'])
factorize 函数返回转换后的值以及类别索引。
df['Geography'].value_counts()
0 5014
2 2509
1 2477
Name: Geography, dtype: int64unique_values
Index(['France', 'Spain', 'Germany'], dtype='object')
如果原始数据中有丢失的值,您可以为它们指定一个值。默认值为-1。
A = ['a','b','a','c','b', np.nan]
A, unique_values = pd.factorize(A)
array([ 0, 1, 0, 2, 1, -1])A = ['a','b','a','c','b', np.nan]
A, unique_values = pd.factorize(A, na_sentinel=99)
array([ 0, 1, 0, 2, 1, 99])
2。分类
它可用于创建分类变量。
A = pd.Categorical(['a','c','b','a','c'])
类别属性用于访问类别:
A.categories
Index(['a', 'b', 'c'], dtype='object')
我们只能从一个现有类别中分配新值。否则,我们将得到一个值错误。
A[0] = 'd'
我们还可以使用 dtype 参数指定数据类型。缺省值是 CategoricalDtype,由于内存消耗,它实际上是最好的选择。
我们来做一个例子,比较一下内存使用情况。
这是每列的内存使用量(以字节为单位)。
countries = pd.Categorical(df['Geography'])
df['Geography'] = countries
内存使用比原始功能少 8 倍。对于较大的数据集,节省的内存量将进一步增加,尤其是当我们只有很少的类别时。
3。区间
它返回一个表示区间的不可变对象。
iv = pd.Interval(left=1, right=5, closed='both')3 in iv
True5 in iv
True
closed 参数指示边界是否包含在内。它取的值是“两个”、“左”、“右”和“都不是”。默认值为“右”。
iv = pd.Interval(left=1, right=5, closed='neither')5 in iv
False
当我们处理日期-时间数据时,时间间隔很方便。我们可以很容易地检查日期是否在指定的间隔内。
date_iv = pd.Interval(left = pd.Timestamp('2019-10-02'),
right = pd.Timestamp('2019-11-08'))date = pd.Timestamp('2019-10-10')date in date_iv
True
4。宽到长
Melt 将宽数据帧转换为长数据帧。这个任务也可以用融化功能来完成。Wide_to_long 提供了一种不太灵活但更用户友好的方式。
考虑下面的样本数据帧。
它包含了一些人不同的分数。我们希望以一行(而不是单独的一列)表示分数类型的方式来修改(或重塑)该数据帧。例如,A 下面有 3 种分数类型(A1、A2、A3)。在我们转换数据帧之后,将只有列(A)和类型(1,2,3)将用行值表示。
pd.wide_to_long(df, stubnames=['A','B'], i='names', j='score_type')
stubnames 参数指示将包含这些值的新列的名称。宽格式的列名需要以 stubnames 开头。“I”参数是用作 id 变量的列,“j”参数是包含子类别的列的名称。
返回的数据帧有一个多级索引,但我们可以通过应用 reset_index 函数将其转换为普通索引。
pd.wide_to_long(df, stubnames=['A','B'], i='names', j='score_type').reset_index()
Pandas 在数据科学和机器学习领域的成功和优势归功于功能和方法的多样性和灵活性。一些方法执行基本的任务,但是也有更详细和更具体的任务。
熊猫通常有多种方式来完成一项任务,这使得它很容易很好地适应特定的任务。
感谢您的阅读。如果您有任何反馈,请告诉我。
4 个可以在一行 python 代码中执行 EDA 的库
使用 Pandas Profiling、Sweetviz、Autoviz 和 D-Tale 进行探索性数据分析
图片由 Pixabay 的 Mudassar Iqbal 拍摄,使用 Pixlr 编辑
探索性数据分析(EDA)是一种分析数据并发现模式、视觉洞察等的方法。在继续建模之前。人们花费大量时间进行 EDA 以更好地理解数据,这可以通过使用自动可视化工具来最小化,例如 **Pandas-profiling、Sweetviz、Autoviz、**或 D-Tale
EDA 涉及许多步骤,包括一些统计测试、使用不同类型的图来可视化数据等等。EDA 的一些步骤讨论如下:
- **数据质量检查:**可以使用
describe()
、info()
、dtypes()
等熊猫库函数完成。它用于查找多个特征、其数据类型、重复值、缺失值等。 - **统计测试:**进行一些统计测试,如皮尔逊相关、斯皮尔曼相关、肯德尔测试等,以获得特征之间的相关性。它可以使用 stats 库在 python 中实现。
- **定量检验:**一些定量检验用于发现数值特征的扩散,计数分类特征。它可以使用 pandas 库的函数在 python 中实现。
- **可视化:**特征可视化对于理解数据非常重要。条形图、饼图等图形技术用于了解分类特征,而散点图、直方图则用于数字特征。
为了执行上述任务,我们需要输入几行代码。这里自动可视化库开始发挥作用,它可以使用一行代码执行所有这些任务。我们将在本文中讨论一些自动可视化工具:
- 熊猫简介
- Sweetviz
- Autoviz
- D-Tale
使用 pandas-profiling 库进行探索性数据分析的数据集是从 Kaggle 下载的 Titanic 数据集。
熊猫-简介:
Pandas profiling 是一个开源的 python 库,可以自动化 EDA 过程并创建详细的报告。Pandas Profiling 可以很容易地用于大型数据集,因为它非常快,可以在几秒钟内创建报告。
安装:
您可以使用 PyPl 安装 pandas-profiling:
**pip install pandas-profiling**
GitHub 熊猫档案库。
用法:
报告:
pandas-profiling 库生成一个报告,其中包含:
- 数据集概述
- 可变属性
- 变量的相互作用
- 变量的相关性
- 缺少值
- 抽样资料
(作者 GIF)
Sweetviz:
Sweetviz 是一个开源的 python 自动可视化库,它可以生成一份报告,在高密度绘图的帮助下探索数据。它不仅自动化了 EDA,还用于比较数据集并从中得出推论。可以通过将一个数据集视为训练数据集而将另一个数据集视为测试数据集来对两个数据集进行比较。
安装:
您可以使用 PyPl 安装 Sweetviz:
**pip install sweetviz**
Sweetviz 的 GitHub 存储库。
用法:
报告:
Sweetviz 库生成一份报告,其中包含:
- 数据集概述
- 可变属性
- 范畴关联
- 数字联想
- 数字特征的最频繁、最小、最大值
(作者 GIF)
Autoviz:
Autoviz 是一个开源的 python 自动可视化库,主要致力于通过生成不同类型的绘图来可视化数据之间的关系。
安装:
您可以使用 PyPl 安装 Autoviz:
**pip install autoviz**
用于 Autoviz 的 GitHub 库。
用法:
报告:
Autoviz 库生成一份报告,其中包含:
- 数据集概述
- 连续变量的成对散点图
- 分类变量的分布
- 连续变量的热图
- 每个分类变量的平均数值变量
(作者 GIF)
d-童话:
D-Tale 是一个开源的 python 自动可视化库。它是最好的自动化数据可视化库之一。D-Tale 帮助您获得数据的详细 EDA。它还有一个功能是代码导出,用于报告中的每个绘图或分析。
安装:
您可以使用 PyPl 安装 D-Tale:
**pip install dtale**
用于 D-Tale 的 GitHub 库。
用法:
报告:
dtale 库生成一份报告,其中包含:
- 数据集概述
- 自定义过滤器
- 相关性、图表和热图
- 突出显示数据类型、缺失值、范围
- 代码导出
(作者 GIF)
结论:
我更喜欢使用几个 python 库,通过自定义函数来完成我的 EDA。应该使用上面讨论的库来加速您的工作。
对于初学者来说,在尝试这些库之前,使用 pandas 的库开始做 EDA 并编写 python 代码是很好的,因为更重要的是具备基础知识和编程实践。
上面讨论的最好的数据自动可视化是 DTale 库,因为它报告了详细的 EDA、定制过滤器和代码导出。代码输出是这个库比其他库更好的主要亮点。
参考资料:
[1]走向数据科学(2020 年 8 月 30 日):一行 python 代码的 EDA
喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一小部分会员费,不需要你额外付费。
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
satyam-kumar.medium.com](https://satyam-kumar.medium.com/membership)
感谢您的阅读
数据科学中需要掌握的 4 个线性代数主题
来源:路易斯·鲍尔斯@ Pexels-免费股票图片
以及在哪里可以学到它们
首先也是最重要的,我想为过去几周缺乏故事和内容向自己道歉…它们太忙了!在确认了我们在 Ravelin 的最后 2000 万英镑的新成立之后,我们看到了一波新客户的到来,这总是好消息,但也有相当多的工作!好了,现在,我已经说够了这些废话,我将开始这个故事,介绍一件我打算从现在开始在我的所有内容中开始做的新事情:包括我最近阅读的一段引文或一段文字,我发现它对从事数据科学的人来说特别有趣和相关。
我们将从我亲爱的同事亚当·格拉斯最近在讨论模特的表现时告诉我的一件事开始这一部分。他说:
死亡,税收和误报?
他聪明的声明引用了最初的一句话“除了死亡和税收,没有什么是确定的”,这句话有时出自本·富兰克林,有时出自马克·吐温或丹尼尔·笛福。我特别喜欢亚当的信息,因为不知何故它减轻了我们的负担。怎么会?从这个意义上说,当我们在处理分类问题时,如果我们不仅要追求精确度,还要追求准确性和其他相关的分类指标,那么假阳性几乎是不可能避免的。如果你对阅读这方面的更多内容感兴趣,我的这个故事讨论了分类问题中的类别不平衡,对这些度量和概念做了更多的解释。
敬请期待下一段引言!但是现在我们马上跳到我们今天的主题:你需要在数据科学领域的线性代数的 4 个主题。正如我在以前的故事中说过的,技术和语言可能来来去去,但这个领域的数学背景将永远存在。这就是为什么,很好地理解数据科学中使用的主要概念,尤其是机器学习,是理解我们从库中导入的算法实际上如何工作以及我们应该做什么(和避免什么)的关键。)当我们使用它们的时候。这就是为什么今天我们要从最基础的开始,一路向上,介绍一些我个人认为应该学习的东西。
1.线性代数
1.1.向量和矩阵
向量和矩阵是我们在数据科学领域所做的一切的关键部分。例如,当我们训练模型时,我们拟合特征矩阵,当我们查看数据中元素之间的距离时,我们通常会发现特征向量之间的某种几何距离,当我们使用降维技术时,我们通常只是找到一种简洁的方式来表示一组向量,而不会失去它们之间的潜在关系。这就是为什么我们需要从理解这些元素是什么开始。
资源:
1.2.矩阵运算
机器学习中,矩阵运算无处不在。矩阵只不过是一个具有一列或多列以及一行或多行的二维数组。听起来很熟悉?这听起来像熊猫的数据帧吗?答对了。你猜怎么着:每次我们对我们的任何特征执行加法、减法或乘法时,我们通常都是在执行矩阵运算。此外,我们使用最多的大多数算法在某种程度上都使用了矩阵运算。例如,神经网络是一系列一个接一个发生的矩阵运算。机器学习大师的以下文章包含了对该主题的很好的介绍,如果您想阅读更多内容,可以看看更多资源:
资源:
- 矩阵和矩阵运算简介,来自机器学习大师
1.3.碱基和格拉姆-施密特过程
我们在数据科学中经常使用的一些算法使用逆矩阵作为它们求解过程的一部分。这就是为什么在数据科学中,我们总是希望矩阵尽可能正交。这使得逆变换更容易计算,这意味着变换之后是可逆的,因此投影也更容易计算。如果这一切听起来有点令人困惑,我强烈推荐以下链接。
资源:
1.4.特征向量和特征值
特征向量和特征值是我们线性代数旅程的最后一个里程碑。降维算法,正如主成分分析严重依赖于这些概念,一些现实世界的工具,如谷歌搜索算法,将它们作为其逻辑的关键部分。如果你已经对前面推荐的所有主题感到满意,那么理解最后一点将是非常重要的!
资源:
- 最温和的主成分分析介绍,我之前的一个关于走向数据科学的故事
- [谷歌如何在网络大海捞针](http://Feature Column How Google Finds Your Needle in the Web’s Haystack),来自美国数学协会网站
- 特征向量和特征值,来自 YouTube 上的 3Blue1Brown
这就是线性代数。如果你认为我错过了任何相关的话题,请让我知道!在未来的故事中,我们将在微积分的世界中经历一个类似的列表!
同时,别忘了查看我之前的一些故事:)
充分利用您的数据
towardsdatascience.com](/5-more-tools-and-techniques-for-better-plotting-ee5ecaa358b) [## 机器学习和数据科学隔离免费在线课程
从初级到高级。充分利用 covid 19-锁定
towardsdatascience.com](/machine-learning-free-online-courses-from-beginner-to-advanced-f50982dce950) [## 我应该在我的机器学习模型中包括截距吗?
并简要介绍了数据科学中的回归建模
towardsdatascience.com](/should-i-inlcude-the-intercept-in-my-machine-learning-model-2efa2a3eb58b)
或者直接访问我在 Medium 上的个人资料,查看我的其他故事。还有如果你想直接在你的邮箱里收到我的最新文章,只需 订阅我的简讯 **😃。**再见,感谢阅读!
媒体上见!
每个数据科学家都应该知道的 4 种机器学习方法
人工智能精要
了解主要的最大似然学习方法:监督学习,非监督学习,半监督学习,强化学习
图一。阿德里安·特林考斯在 Unsplash 上拍摄的照片
随着人工智能的不断进步,这个领域已经变得太大了,以至于无法全部专攻。有无数的问题,我们可以用无数的方法去解决。一个经验丰富的人工智能研究人员在一个领域的知识可能对另一个领域毫无用处。理解不同机器学习问题的本质非常重要。尽管机器学习问题的列表很长,不可能在一篇文章中解释清楚,但我们可以将这些问题分为四种不同的学习方法:
- 监督学习;
- 无监督学习;
- 半监督学习;和
- 强化学习。
在我们深入研究这些方法之前,让我们先来看看什么是机器学习:
什么是机器学习?
“机器学习”一词是由 IBM 科学家、计算机游戏和人工智能领域的先驱阿瑟·塞缪尔在 1959 年首次提出的。机器学习被认为是人工智能领域下的一个子学科。它旨在利用经验自动提高为特定任务设计的计算机算法的性能。在机器学习研究中,经验来自训练数据,训练数据可以被定义为根据先前记录的观察或实时反馈收集的样本数据。通过这种体验,机器学习算法可以学习和建立数学模型来进行预测和决策。
学习过程从将训练数据(例如,示例、直接经验、基本说明)输入模型开始。通过使用这些数据,模型可以非常快速地在数据中找到有价值的模式。这些模式然后被用于对相关事件进行预测和决策。如果开发者构建了允许连续训练的合适的机器学习系统,则即使在部署之后,学习也可以继续。
四种机器学习方法
顶级机器学习方法根据其学习反馈机制的性质进行分类。大多数机器学习问题可以通过采用这些方法中的一种来解决。然而,我们可能仍然会遇到不适合这些方法之一的复杂的机器学习解决方案。
这种分类是必要的,因为它将帮助您快速发现将来可能遇到的问题的本质,分析您的资源,并开发合适的解决方案。
让我们从监督学习方法开始。
监督学习
有监督的学习是机器学习任务,学习基于示例输入-输出对将输入映射到输出的函数。它从由一组训练样本组成的带标签的训练数据中推断出一个函数。
T 当数据集包含响应变量值(或标签)的记录时,可以采用监督学习方法。根据上下文,这些带有标签的数据通常被称为“标签数据”和“训练数据”
示例 1: 当我们试图使用一个人的体重、年龄和性别来预测他的身高时,我们需要包含他的体重、年龄、性别信息以及实际身高的训练数据。这些数据允许机器学习算法发现身高和其他变量之间的关系。然后,使用这些知识,该模型可以预测给定人的身高。
示例 2: 我们可以根据之前看到的垃圾邮件和非垃圾邮件的区别特征,例如电子邮件的长度和电子邮件中特定关键字的使用,将电子邮件标记为“垃圾邮件”或“非垃圾邮件”。从训练数据的学习持续进行,直到机器学习模型在训练数据上达到高水平的准确度。
图二。关键点——监督学习(作者提供的图表)
有两个主要的监督学习问题:(I)分类问题和(ii)回归问题。
分类问题
在分类问题中,模型学习根据它们的变量值对观察值进行分类。在学习过程中,模型会接触到大量带有标签的观察结果。例如,在看到数千名顾客的购物习惯和性别信息后,模型可以根据他/她的购物习惯成功预测新顾客的性别。二元分类是用于在两个标签下分组的术语,例如男性和女性。另一个二元分类的例子可能是预测图片中的动物是“猫”还是“不是猫”,如图 2–4 所示。
图 3。监督学习中的分类问题(作者图)(由 Freepik 制作的图标,那些图标,来自 Flaticon 的桉树)
另一方面,当有两个以上的标签时,使用多标签分类。识别和预测图像上的手写字母和数字是多标签分类的一个例子。
回归问题
在回归问题中,目标是通过利用其他变量(即自变量、解释变量或特征)和目标变量(即因变量、响应变量或标签)之间的关系来计算值。我们的目标变量和其他变量之间的关系强度是预测值的关键决定因素。根据客户的历史数据预测客户会花多少钱是一个回归问题。
无监督学习
监督学习是一种在 ML 算法中使用的学习方法,用于从不包含标签的数据集进行推断。
图 4。关键点——无监督学习(作者提供的图表)
有两个主要的无监督学习问题:(I)聚类和(ii)降维。
使聚集
无监督学习主要用于聚类分析。
聚类分析是一种分组工作,其中一个组(即一个聚类)的成员比其他聚类的成员彼此更相似。
有许多不同的聚类方法可用。它们通常利用一种基于选定度量的相似性度量,例如欧几里德距离或概率距离。生物信息学序列分析、遗传聚类、模式挖掘和对象识别是可以用无监督学习方法解决的一些聚类问题。
降维
无监督学习的另一个用例是降维。维度相当于数据集中使用的要素数量。在某些数据集中,您可能会发现存储在各个列中的数百个潜在要素。在大多数数据集中,这些列中有几个是高度相关的。因此,要么选择最好的,即特征选择,要么结合已有特征提取新的特征,即特征提取。这就是无监督学习发挥作用的地方。降维方法帮助我们创建更整洁的模型,没有噪音和不必要的特征。
半监督学习
EMI-监督学习是一种结合了监督学习和非监督学习特点的机器学习方法。当我们有少量标记数据和大量未标记数据可用于训练时,半监督学习方法特别有用。监督学习特征有助于利用少量的标签数据。相比之下,无监督学习特征对于利用大量未标记数据是有用的。
半监督学习(Semi-supervised learning)是一种在训练过程中结合少量已标记数据和大量未标记数据的机器学习方法。
嗯,你可能会想,如果半监督学习有实用的现实应用。虽然监督学习是一种强大的学习方法,但标记数据(用于监督学习)是一个昂贵而耗时的过程。另一方面,即使没有标记,大量的数据也是有益的。因此,在现实生活中,如果做得正确,半监督学习可能会成为最合适和最有成效的 ML 方法。
在半监督学习中,我们通常从聚类未标记的数据开始。然后,我们使用标记数据来标记聚类的未标记数据。最后,大量现在标记的数据用于训练机器学习模型。半监督学习模型可能非常强大,因为它们可以利用大量的数据。
图 5。关键点——半监督学习(作者提供的图表)
半监督学习模型通常是监督和非监督学习中使用的现有机器学习算法的转换和调整版本的组合。这种方法成功地应用于语音分析、内容分类和蛋白质序列分类等领域。这些领域的相似之处在于,它们提供了丰富的未标记数据,而只有少量的标记数据。
强化学习
强化学习是机器学习的主要方法之一,它涉及在特定的环境中寻找最优的代理行为来最大化回报。代理人学习完善自己的行动,以获得尽可能高的累积回报。
强化学习有四个主要元素:
- 代理:执行分配给它的任务的可训练程序
- **环境:**代理完成任务的真实或虚拟世界。
- **动作:**导致环境中状态改变的代理的移动
- **奖励:**基于行动的消极或积极的报酬。
强化学习既可用于现实世界,也可用于虚拟世界:
例 1: 你可以创建一个不断发展的广告投放系统,根据不同设置产生的广告收入来决定在网站上投放多少广告。广告投放系统将是现实世界应用的一个很好的例子。
例 2: 另一方面,你可以在一个具有强化学习的视频游戏中训练一个代理,与其他玩家竞争,通常被称为机器人。
例 3: 最后,用强化学习方法进行虚拟和真实机器人的运动训练。
图 6。要点—强化学习(作者提供的图表)
一些流行的强化学习模型可以列举如下:
流行的深度学习框架的一个缺点是缺乏对强化学习的全面模块支持, TensorFlow 和 PyTorch 也不例外。深度强化学习只能用建立在现有深度学习库之上的扩展库来完成,比如 Keras-RL 、 TF。代理,和 Tensorforce 或者专用的强化学习库比如开放 AI 基线和稳定基线。
既然我们已经介绍了所有四种方法,下面是一个总结图,可以对不同的 ML 方法进行基本比较:
图 7。关键点——所有四种 ML 方法(作者提供的图表)
最终注释
人工智能领域正在迅速发展,并成为一个主要的研究领域。随着领域的扩大,AI 的子领域、子子领域已经开始出现。虽然我们不能掌握整个领域,但我们至少可以了解主要的学习方法。
这篇文章的目的是让你熟悉这四种机器学习方法。在接下来的文章中,我们将会介绍其他的人工智能要素。
订阅邮件列表获取我的最新内容
如果你喜欢这篇文章,可以考虑订阅简讯 !✉️
除了我的最新内容,我还分享我的 Google Colab 笔记本,其中包含我发表的每篇文章的完整代码。
既然你正在阅读这篇文章,我确信我们有着相似的兴趣,并且现在/将来会从事相似的行业。那么我们就通过Linkedin来连线吧!请不要犹豫发送联系请求!Orhan g . Yal n—Linkedin
看看我的内容指南:
帮助您轻松浏览我的内容的指南。
oyalcin.medium.com](https://oyalcin.medium.com/a-guide-to-my-content-on-artificial-intelligence-c70c9b4a3b17)
地理空间数据科学的 4 个必备 JupyterLab 扩展
GIS 和交互式地理空间数据的基本 JupyterLab 扩展。
由 Lucas Ludwig 在 Unsplash 拍摄
毫无疑问,JupyterLab 是研究数据科学的最佳工具之一。它被设计成可扩展和可定制的,事实上,有很多可用的扩展。
作为一名地理空间数据科学家,我在考虑一些我在新安装 Anaconda 环境后经常使用的 JupyterLab 扩展。我意识到我错过了一些扩展,并思考了它们在我的 JupyterLab 体验中的重要性。
在本文中,我将分享四个最受欢迎和最基本的 JupyterLab 扩展,用于使用 JupyterLab 进行空间数据科学研究。这些是用于在 JupyterLab 中渲染地图或地理空间数据的特定工具。
1.geo JSON-扩展
geo Jon 扩展使您能够在 Jupyter 实验室内快速绘制 geo Jon 数据。无需读取数据或使用其他桌面软件将其可视化。
在这个例子中,我们用 JupyterLab 单元格中的几何图形绘制一个类似 JSON 的数据。
在 JupyterLab 中直接绘制 GeoJSON 数据—图片由作者提供。
它还可以让你渲染 Geosjon 文件,并在 Jupyter notebook 中显示出来。GeoJSON-extension 创建一个单独的输出,并附带从 Openstreetmap 加载的底图。多方便啊?💪只需将您的数据作为 Geosjon 文件,然后双击它。
GeoJSON 输出视图-图片由作者提供。
使用 GeoJSON-extension 是一种快速便捷的可视化地理空间数据的方法,无需使用 Geopandas 等 python 库在内存中读取数据。要启用 GeoJSON-extension,您可以在 Conda 终端上运行以下命令:
jupyter labextension install @jupyterlab/geojson-extension
有关更多信息,请访问 GeoJSON-extension 资源库。
[## @jupyterlab/geojson-extension
用于渲染 GeoJSON 的 JupyterLab 扩展安装@jupyterlab/geojson-extension 以渲染…
www.npmjs.com](https://www.npmjs.com/package/@jupyterlab/geojson-extension)
Jupyter Matplotlib — Ipympl
我喜欢使用 Geopandas 和 Matplotlib 来创建非交互式地理空间数据可视化。但是,我最近发现可以用 Jupyter matplotlib 扩展— Ipympl 来扩展 Matplotlib 交互式绘图。从那时起,它就是我的 go 工具,可以通过 Geopandas 实现快速交互式地理空间数据可视化。
以下示例显示了 Jupyter Matplotlib 扩展的交互功能。可以像往常一样创建 Geopandas 地块,只需要调用 Jupyter magic 命令:%matplotlib widget
。
交互式 Geopandas plot 与 Ipympl——图片由作者提供。
要使用 Ipympl 的交互功能,您可以使用 Conda/ pip 安装它:
conda install -c conda-forge ipympl
pip install ipympl
如果使用的是 jupyterLab,还需要安装 node js 和 Jupyter Lab 扩展管理器。
conda install -c conda-forge nodejsjupyter labextension install @jupyter-widgets/jupyterlab-manager
jupyter lab build
如果您想开始并设置您的环境,您可以阅读这篇文章。
[## 如何在 Jupyter 环境下生成交互式 Matplotlib 图
使用所有使用 Matplotlib 的 Python 库创建交互式绘图/地图
towardsdatascience.com](/how-to-produce-interactive-matplotlib-plots-in-jupyter-environment-1e4329d71651)
IpyLeaflet
IpyLeaflet 是 Jupyter 笔记本世界和流行传单可视化图书馆之间的桥梁。通过 Ipyleaflet,您可以在 Ipywidgets 的帮助下创建交互式的高级地理空间数据可视化。它还允许您创建双向通信地图。
使用 IpyLeaflet 的搜索栏和全屏缩放—图片由作者提供
要安装 IpyLeaflet,您可以使用 Conda 或 pip。
conda install -c conda-forge ipyleafletpip install ipyleaflet
您还需要启用 JupyterLab 扩展:
jupyter labextension install **@jupyter**-widgets/jupyterlab-manager jupyter-leaflet
我在这里还有一份关于 Ipyleaflet 交互式制图的广泛的初学者指南:
[## IpyLeaflet:Jupyter 笔记本中的交互式映射
IpyLeaflet 交互式地理空间数据可视化初学者指南。
towardsdatascience.com](/ipyleaflet-interactive-mapping-in-jupyter-notebook-994f19611e79)
开普勒格尔-朱皮特
KeplerGL Jupyter 笔记本扩展附带了一个最好的大数据地理空间数据可视化工具。有了这个扩展,你在 Jupyter 中就有了一个强大的用户界面来创建交互式的、漂亮的地图。
借助 KeplerGL Jupyter Lab extension,您可以将世界一流的可视化工具、易于使用的用户界面(UI)以及 python 和 Jupyter 笔记本的灵活性(3D 可视化 GIF)结合起来
KeplerGL Jupyter 的 3D 建筑足迹—图片由作者提供
要安装 Keplergl Jupyter notebook,只需在终端上运行这三行代码。
pip install ipywidgets
pip install keplergl
$ jupyter labextension install [@jupyter](http://twitter.com/jupyter)-widgets/jupyterlab-manager keplergl-jupyter
要开始使用开普勒,您可以阅读这篇文章:
[## 开普勒。GL & Jupyter 笔记本:优步开源开普勒的地理空间数据可视化。标距长度
在 Jupyter 笔记本中绘制地理空间数据&轻松地与开普勒的用户界面交互以调整可视化。
towardsdatascience.com](/kepler-gl-jupyter-notebooks-geospatial-data-visualization-with-ubers-opensource-kepler-gl-b1c2423d066f)
结论
JupyterLab 是我最喜欢的工具,这些地理空间扩展的可用性让我坚持下来👌🏻带着它而不是回到 Jupyter 笔记本。在本文中,我分享了专门为地理空间数据科学家和 Geo 人员必备的四个 JupyterLab 扩展。
如果您在地理空间数据科学应用中使用了其他特定的 JupyterLab 扩展,请告诉我。你可以在推特上找到我。
熊猫生态系统中 4 个必去的图书馆
用这些附件增强你的熊猫技能。
Pandas 是一个非常强大和通用的 Python 数据分析库,它加速了数据科学项目的预处理步骤。它提供了许多在数据分析中非常有用的函数和方法。
虽然熊猫的内置功能能够进行有效的数据分析,但定制的工具或库为熊猫增加了价值。在本帖中,我们将探索 4 种工具来增强熊猫的数据分析过程。
失踪人口
Pandas 提供了检查数据集中缺失值数量的函数。 Missingno 库更进一步,通过信息可视化提供数据集中缺失值的分布。
使用缺失号的图,我们能够看到缺失值在每一列中的位置,以及不同列的缺失值之间是否存在相关性。在处理缺失值之前,在数据集中探索它们是非常重要的。因此,我认为 Missingno 是数据清理和预处理步骤中非常有价值的资产。
让我们首先尝试探索一个关于流媒体平台上电影的数据集。数据集可在 Kaggle 上的这里获得。
该数据集包含 16744 部电影和描述每部电影的 17 个特征。Pandas isna 函数结合 sum() 给出了每一列中缺失值的数量。但是,在某些情况下,我们需要的不仅仅是计数。让我们用 Missingno 来探究缺失值。
import missingno as msno
%matplotlib inline #render plots within jupyter notebook
我们将使用的第一个工具是缺失值矩阵。
msno.matrix(df)
白线表示缺少值。“年龄”和“烂番茄”栏以白线为主。但是,在其他缺少值的列中有一个有趣的趋势。它们通常在公共行中缺少值。如果某行的“导演”列中缺少值,则很可能“流派”、“国家”、“语言”和“运行时间”列中也缺少值。在处理缺失值时,这是非常有价值的信息。
Missingno 还提供了热图和条形图,可以更深入地了解数据帧中缺失的值。如果你想进一步阅读,这里有一个更详细的帖子和例子:
浏览数据集中缺失的值。
towardsdatascience.com](/visualize-missing-values-with-missingno-ad4d938b00a1)
侧钻
Sidetable 根据选择的列创建频率表。假设我们有一个数据集,其中包含某个分类变量的一些测量值(例如模型)。我们有许多不同的类别,每个类别有许多观察值(行)。通过使用 sidetable,我们可以了解每个模型在数据集中所占的份额。这也可以使用 pandas 的 value_counts 函数来实现,但是 sidetable 提供的信息更多,我们将在示例中看到。
如果您使用 jupyter 笔记本,我们首先需要用pip
或!pip
安装它:
!pip install sidetable
然后导入它:
import pandas as pd
import sidetable
我们现在可以使用 stb 作为数据帧的存取器。我将使用 Kaggle 上可用的数据集。它包含了拍卖的二手车的数据。
df = pd.read_csv("/content/USA_cars_datasets.csv")#drop redundant columns
df.drop(['Unnamed: 0','vin','lot'], axis=1, inplace=True)df.head()
Sidetable 返回每个类别的计数和百分比以及累积值。让我们将它应用于“品牌”栏:
df.stb.freq(['brand'])[:10]
它肯定比 value_counts 更能提供信息。我们对数据集中的分布有了更多的了解。累积值的一个额外特性是我们可以设置累积百分比的阈值。然后,达到阈值后的类别被标记为“其他”。
如果你想获得更详细的概述并了解 sidetable 的其他功能,这里有一个关于 sidetable 的更详细的帖子:
对数据框架的信息丰富、见解深刻的概述。
towardsdatascience.com](/pandas-sidetable-just-announced-708e5f65938f)
熊猫-datareader
Pandas-datareader 是熊猫的远程数据访问库。它使得用几行代码获取股票价格数据变得非常简单。如果您想从事时间序列预测或算法交易,您可以使用 datareader 轻松获得股票价格的原始数据。
我们来做一个简单的例子。
import numpy as np
import pandas as pd
from pandas_datareader import dataaapl = data.DataReader("AAPL",
start='2015-1-1',
end='2019-12-31',
data_source='yahoo')
仅此而已!我们现在已经将 2015 年至 2020 年的苹果股价数据保存在熊猫数据框架中。
如果您计划使用 LSTMs(一种特殊类型的递归神经网络)做项目,预测股票价格是一个不错的选择。通过 pandas-datareader 可以很容易地访问流程的原始数据。当然,在将数据输入模型之前,您需要对数据进行一些预处理和重新格式化。
特征工具
Featuretools 是构建在 pandas 之上的自动化特征工程工具。这在构建机器学习模型时非常有用,因为特征工程是机器学习管道的关键预处理步骤。
我们对这些特征和它们之间的关系了解得越多,我们建立的机器学习模型就越好,越健壮。因此,Featuretools 是您的宝贵财富。
熊猫的功能丰富了第三方包。你可以选择长的方法,只用熊猫自己的函数和方法来做你的分析。但是,最好简化某些任务以节省时间。此外,第三方软件包通过展示不同的方法和视角来改进数据分析过程。
感谢您的阅读。如果您有任何反馈,请告诉我。