我从高效数据科学家那里学到的 15 个习惯
我将在 2021 年使用这些习惯,成为一名更有效的未来数据科学家
叶夫根尼·切博塔列夫摄于佩克斯
当谈到进入数据科学领域时,你需要使用书中的每一个技巧来给自己一个优势,推动你越过终点线。
那么,为什么不试着模仿业内精英的习惯呢?
本文不是成为高效数据科学家的“快速致富”方法。相反,它展示了帮助最优秀的数据科学家获得成功的习惯。
人们常说,数据科学家的价值取决于他们对组织的影响。这种影响始于通过养成良好的习惯成为一名高效的数据科学家。
1.跟上技术的发展。
有多少当前的数据科学技术是在过去十年左右才出现的?几乎大部分都是。
带着要好好尝试的动机进入数据科学领域,你已经将自己降格为一个不断学习的人。别担心,没有听起来那么凄凉。
然而,你应该时刻牢记的是,要想在职场中保持相关性,你需要跟上技术的发展。所以,如果你整个职业生涯都在用 MATLAB 做数据分析,那就试着学习用 Python 编码吧。如果你已经用 Matplotlib 创建了你的可视化,试着用 Plotly 做些新鲜的东西。
**如何实现这个习惯:**每周花一个小时(或者尽可能多的空闲时间),尝试新技术。通过阅读博客文章找出哪些技术是相关的,并选择一些你想添加到你的堆栈中的技术。然后,创建一些个人项目,学习如何最大限度地利用新技术。
2.保留适当的文件。
我似乎总是很幸运地阅读和处理那些糟糕的文档和没有支持性注释来帮助我理解到底发生了什么的代码。
我曾经把它归因于程序员的小声刻薄,直到有一天,我意识到这只是一个糟糕的程序员的标志。
我接触过的所有优秀程序员都提供清晰、简洁的文档来支持他们的工作,并在他们的程序中加入有用的注释来描述某些代码行在做什么。这对于使用复杂算法和机器学习模型来解决问题的数据科学家来说尤其相关。
如何实现这个习惯:花些时间阅读好的代码文档或关于如何编写好的代码文档的文章。为了练习,为旧的个人项目写文档,或者花些时间修改你当前项目的文档。由于数据科学世界的很大一部分都是在 Python 上运行的,所以请查看这篇关于如何记录 Python 代码的写得非常好的文章:
https://realpython.com/documenting-python-code/
3.加入数据科学社区。
开发人员是皮肤苍白的社会弃儿,他们把自己锁在孤独中,编写注定要统治世界的代码,这种刻板印象是一种过时的概括,不能反映整个科技行业的现代复杂性。
“没有人是一座孤岛。”—许多数据科学家最喜欢引用的一句话
数据科学的复杂性使得数据科学社区内外的专业人士需要一个庞大的支持网络来解决各种问题,这使得数据科学家成为必要。
然而,社区的重要性并不仅仅停留在专业层面。随着数据科学领域的扩展,有必要为未来的分析师和工程师铺平道路,这样他们也可以产生影响,并进一步支持其他数据科学家。
随着数据科学领域的“性感”逐渐消失,做出必要改变的唯一方式是发起一场社区范围的运动,激励行业向更好的方向转变。
**如何实现这个习惯:**成为导师,撰写内容丰富的博客文章,加入数据科学论坛并帮助回答问题,开设 Youtube 频道来分享你的经验,参加 Kaggle 比赛和黑客马拉松,或者创建课程来帮助未来的数据科学家学习他们进入该行业所需的技能。
4.定期重构您的代码。
重构是在不改变代码原有功能的情况下清理代码的过程。虽然重构是一个在软件开发环境中必然产生的过程,但是重构对于数据科学家来说是一个有用的习惯。
我重构时的口头禅是*“少即是多”*。
我发现,当我最初编写代码来解决数据科学问题时,我通常会将良好的编码实践扔在门外,以支持编写在需要时工作的代码。换句话说,会出现大量的意大利面条式代码。然后,在我让我的解决方案工作之后,我会回去清理我的代码。
如何实现这个习惯:看看旧代码,问问同样的代码是否可以写得更有效率。如果是这样,花些时间自学最佳编码实践,并寻找可以缩短、优化和阐明代码的方法。查看这篇概述代码重构最佳实践的文章:
5.优化您的工作空间、工具和工作流程。
有如此多的提高生产力的 ide 扩展,令人惊讶的是,有些人还没有选择优化他们的工作流。
这个习惯对每个人来说都是如此独特,以至于它真的决定了哪些工具、工作空间和工作流能让你成为最有效和最高效的数据科学家。
**如何实现这个习惯:**一年一次(或者更频繁,如果对你更有效的话),评估你的整体效力和效率,并确定你可以改进的地方。也许这意味着早上第一件事就是研究你的机器学习算法,或者坐在健身球上而不是椅子上,或者给你的 IDE 添加一个新的扩展来为你处理代码。尝试不同的工作空间、工具和工作流程,直到您进入最佳状态。
6.专注于理解业务问题。
据我所见,数据科学 75%是理解业务问题,25%是编写模型来找出如何解决这些问题。
编码、算法和数学是容易的部分。了解如何实现它们,以便它们可以解决特定的业务问题,而不是太多。通过花更多的时间去理解业务问题和你试图解决的目标,剩下的过程会顺利得多。
要了解你所在行业面临的问题,你需要做一些调查,收集一些背景知识,以支持你对你试图解决的问题的了解。例如,你需要了解是什么让某个特定行业的客户产生兴趣,或者一个工程公司试图达到的特定目标。
**如何养成这个习惯:**花些时间研究一下你现在工作的具体公司以及他们所在的行业。写一份你可以参考的备忘单,包括公司的主要目标,以及公司在特定行业可能面临的问题。不要忘记包括你可能想用来解决商业问题的算法,或者对未来可能有用的机器学习模型的想法。每当你发现一些有用的东西时,就把它添加到这个备忘单上,很快你就会拥有一个与行业相关的珍闻宝库。
7.采用极简风格。
不,不是在生活中。在您的代码和工作流中。
人们经常说最好的数据科学家使用最少的代码、最少的数据和最简单的算法来完成工作。
虽然我说的极简主义者并不是要你马上假设稀缺性。通常,当有人讨论极简主义在代码中的重要性时,会导致人们试图开发仅使用几行代码的惊人解决方案。停下来。是的,令人印象深刻,但这真的是对你时间的最好利用吗?
相反,一旦你熟悉了数据科学的概念,就开始寻找可以优化你的代码的方法,使它简单、干净、简短。使用简单的算法来完成工作,不要忘记编写可重用的函数来消除冗余。
**如何实现这个习惯:**随着你作为数据科学家的进步,开始推动自己编写更高效的解决方案,编写更少的代码,使用更简单的算法和模型来完成工作。学习如何在不降低效率的情况下缩短代码,并留下大量注释来解释代码的压缩版本是如何工作的。
8.使用函数来消除复杂性和冗余。
我将第一个承认,当我第一次编写数据分析代码时,我严重忽视了函数。当我在不同的分析中努力推理时,我的 IDE 中充满了意大利面条式的代码。如果你看了我的代码,你可能会认为它走得太远了,并自愿把它带到谷仓后面,以结束它的痛苦。
一旦我设法拼凑出一个还算过得去的结果,我就会回去尝试修复一个相当于严重事故的东西。通过将我的代码打包成函数,我很快消除了不必要的复杂性和冗余。如果这是我对我的代码做的唯一的事情,那么我已经把它简化到一个点,我可以重新访问解决方案并理解我是如何到达那个点的。
**如何实现这个习惯:**写代码的时候不要忘记函数的重要性。人们常说,最好的开发人员是懒惰的开发人员,因为他们知道如何创建不需要太多工作的解决方案。在你写完一个解决方案后,回过头来把多余或复杂的代码捆绑到函数中,以帮助组织和简化你的代码。
9.应用测试驱动的开发方法。
测试驱动开发(TDD)是一种软件开发原则,它专注于编写不断测试的增量改进代码。TDD 运行在一个“红绿重构”系统上,该系统鼓励开发人员构建测试套件,编写实现代码,然后优化代码库。
数据科学家可以成功地实现 TDD,以产生分析管道,开发概念证明,处理数据子集,并确保功能代码在开发过程中不会被破坏。
如何实现这个习惯:研究测试驱动开发,确定这种技术是否能给你的工作流程增加一些东西。TDD 并不是所有问题的完美答案,但是如果考虑周全的话,它会很有用。查看这篇文章,它对 TDD 进行了很好的描述,并提供了一个如何在数据科学项目中实现它的例子:
10.小而频繁地犯错误。
你有没有做过一个拉请求,然后你的电脑被错误信息和 wazoo 发出的问题搞得崩溃?我有。糟透了。
当你想介绍一个对你做出如此大承诺的人时,深呼吸,记住这个人显然没有花时间去养成良好的习惯。
基于团队的软件开发的黄金法则是什么?小而频繁地犯错误。
**如何实现这个习惯:**养成经常提交代码变更的习惯,并且定期发出拉取请求以获取最新的代码。您或其他人所做的每个更改都可能会破坏整个项目,因此重要的是要做出易于恢复且可能只影响项目的一部分或一层的小更改。
11.把自我发展放在首位。
取决于你问谁,这个行业要么数据科学家太多,要么太少。
不管这个行业是变得饱和还是贫瘠,你都将和一大堆非常合格的候选人竞争一份工作。这意味着在申请工作之前,你需要已经养成了自我提升的习惯。如今,每个人都痴迷于技能提升,而且理由充分。这种趋势对于数据科学家来说应该也不例外。
**如何养成这个习惯:**做一份技能清单,看看你如何符合雇主在招聘启事中提出的要求。你是一个能够高效使用 Keras、NumPy、Pandas、PyTorch、TensorFlow、Matplotlib、Seaborn、Plotly 等相关库的 Pythonista 吗?你能写一份备忘录,详细说明你的最新发现,以及它们如何能让你的公司效率提高 25%吗?你是否愿意作为团队的一员来完成一个项目?找出任何缺点,找一些好的在线课程或资源来提高你的技能。
12.开始一个项目时要考虑到最终结果。
在《高效能人士的 7 个习惯 中,史蒂芬·科维论述了“以目的为出发点”的原则。
为了有效地将这与数据科学项目联系起来,您需要在项目的规划阶段问自己,项目的预期结果是什么。这将有助于塑造项目的路径,并给你一个为达到最终目标而需要达到的结果的路线图。不仅如此,确定项目的结果会让你从整体上了解项目的可行性和可持续性。
**如何实现这个习惯:**每个项目开始时都有一个规划会议,明确列出你希望在开发期结束时实现的目标。确定你将试图解决的问题,或者你试图收集的证据。然后,你可以开始回答可行性和可持续性问题,这些问题将塑造你的项目的里程碑和成果。从那里,你可以开始编写代码和机器学习模型,并有一个清晰的计划来指导你完成项目。
13.理解,这样你才能被理解。
在试图准备一个关于为什么自旋 V2 粒子服从费米-狄拉克统计的新生讲座失败后,理查德·费曼说了一句著名的话“我不能把它简化到新生水平。这意味着我们真的不了解它。”被称为“伟大的解释者”,费曼留下了数据科学家只能希望效仿的遗产。
数据科学是一门使用数据讲述引人入胜的故事的艺术,只有当讲故事的人理解他们试图讲述的故事时,它才会成功。换句话说,理解是你的任务,这样你才能被理解。在理解你试图完成的事情的早期培养这种习惯,这样你就可以和其他人分享到一个合理的理解水平,这将使你成为房间里最有效的数据科学家。
**如何养成这个习惯:**使用费曼技巧来深入理解你试图发现的概念和试图解决的问题。这种方法与分析数据,然后向一般非数据科学利益相关者解释结果的数据科学流程保持一致。简而言之,你把你对主题的解释精炼到这样一个程度,你可以用简单的、非行话的术语来解释,任何人都可以理解。
14.阅读研究论文。
在一个由硕士和博士主导的领域,研究论文经常被用来分享行业新闻和见解。
研究论文是了解他人如何解决问题、拓宽我们的视野以及跟上最新趋势的有用途径。
**如何养成这个习惯:**每周挑选一两篇与你目前的工作或你感兴趣的技术相关的研究论文阅读。试着每周为这个文献综述留出时间,让它成为一个优先事项。熟悉阅读研究论文的三步法,这有助于你快速收集相关信息。为了真正巩固你对论文的理解,试着把你从阅读中学到的东西落实到个人项目中,或者和同事分享你学到的东西。
15.接受改变。
从使用的技术到实现的目标,数据科学的世界正在快速变化。不要成为那种固步自封、不愿改变的数据科学家。
作为一名专业人士,对变化保持开放的态度不仅能迫使你不断进步,还能让你在快速变化的行业中保持相关性,一旦你落后了,这个行业就会把你踢出局。
如何实现这个习惯:每当一项新技术或实践成为新闻,试一试,看看这项新技术或实践带来了什么。即使您只是阅读文档,您也可以随时了解行业的最新变化趋势。此外,您可以为您的公司带来对技术的看法,并帮助他们驾驭技术变革和进步。在办公室里做一个耳听八方的人可以帮助你保持领先,也可以帮助你指导你的团队和公司找到更好、更有效的解决方案。
在数据科学职业生涯的任何阶段,养成良好的习惯都可以让你发挥潜力,成为团队中的一名高效成员,对他们试图解决的任何问题产生重大影响。
没有比现在更好的时间来花时间为未来的成功做准备。
你现在应该使用的 15 个鲜为人知的有用 SkLearn 模型
可以从 SkLearn 库中使用的一些更有趣的模型。
(图片由作者提供)
Sk Learn 可能是 Python 最流行的机器学习模块之一。这是有充分理由的,因为 SkLearn 有一个非常棒的可用模型、缩放器、工具甚至编码器的目录!虽然有一些非常流行的模型非常有名,但是 SkLearn 是一个非常大的库,很容易忘记它附带的所有函数和类。虽然文档是一个很好的起点,但是扩展您的建模能力的另一个很好的方法是更熟悉使用不同的模型。
考虑到这一点,我开始喜欢 SkLearn 的许多不同型号。有很多很好的模型被严重的利用不足。今天,我想把我最喜欢的 SkLearn 中的一些模型带给你,也许下次你面临一个独特的问题时,你会知道这个模型及其相应的应用!
数据
今天,我们将安装模型,以展示上述模型的用法。当然,要做到这一点,我们需要传递一些一维数组来预测特征。简单来说,
我们需要数据来训练。
鉴于我们在笔记本上工作,我认为它应该是开源的,所以如果你想看到这些模型适合笔记本,你可以在这里看到源代码:
由于我们将审查分类模型以及连续模型,我们将需要分别促进这些特征类型的目标。我要用一个旧的。我手边的 CSV 文件叫做 weatherHistory.csv:
import pandas as pd
import numpy as np
df = pd.read_csv("weatherHistory.csv")
现在让我们来看看!:
df.head(5)
(图片由作者提供)
由于我们将同时使用分类和连续模型,我需要分类和连续 y。对于连续目标,我决定使用温度。为了分类,我使用了降水类型特征。对于我的预测功能,我将使用湿度功能:
caty = "Precip Type"
cony = "Temperature (C)"
x = "Humidity"
现在,我们将训练测试相应地将数据分成两个数据帧:
from sklearn.model_selection import train_test_split
train, test = train_test_split(df)
当然,我不会对这些数据做太多的处理,只是为了举例说明一些模型。考虑到这一点,这些模型不能适用于带有缺失值的数据,所以让我们得到数据框架中缺失值计数的总和。
df.isnull().sum()
想听些有趣的事吗?我可以发誓是 is_null()而不是 isnull()。
查看摘要,
Formatted Date 0
Summary 0
Precip Type 517
Temperature (C) 0
Apparent Temperature (C) 0
Humidity 0
Wind Speed (km/h) 0
Wind Bearing (degrees) 0
Visibility (km) 0
Loud Cover 0
Pressure (millibars) 0
Daily Summary 0
dtype: int64
很明显,我可能有点超前了,让我们放弃一些不好的观察:
df = df.dropna()from sklearn.model_selection import train_test_split
train, test = train_test_split(df)
现在让我们把它放入一维数组:
trainX = train[x]
cattrainy = train[caty]
contrainy = train[cony]
testX = test[x]
cattesty = test[caty]
contesty = test[cony]
SkLearn 经常要求将这些阵列重新调整为垂直的,因为它更喜欢矩阵列中的特征,而不是矩阵行。让我们重塑这些小狗,然后我们将准备适合一些模型。为了做到这一点,我们将需要把这些一维数组变成 NumPy 数组。这是因为 SkLearn 与 NumPy 的集成程度更高,尽管它确实喜欢 Pandas 系列,但在许多情况下,NumPy 数组更加动态,也更常用:
trainX = np.array(trainX)
cattrainy = np.array(cattrainy)
contrainy = np.array(contrainy)
testX = np.array(testX)
cattesty = np.array(cattesty)
contesty = np.array(contesty)trainX = trainX.reshape(-1, 1)
cattrainy = cattrainy.reshape(-1, 1)
contrainy = contrainy.reshape(-1, 1)
testX = testX.reshape(-1, 1)
cattesty = cattesty.reshape(-1, 1)
contesty = contesty.reshape(-1, 1)
对于连续的问题
典型地用于监督模型的两种不同类型的模型是连续模型。这些模型预测的是定量值,而不是定性值。也就是说,这些模型中的许多将利用回归来估计连续值。
№1:保序/单调回归
保序或单调回归是一种令人敬畏的回归形式,许多机器学习工程师甚至从未听说过。保序回归可以是预测连续目标的非常准确的模型,但在这方面也有其自身的局限性。这方面的一个很好的例子是,这种模型往往容易过度拟合,通常要让模型工作良好,就要平衡偏差,并试图提高准确性。
这个模型的另一个重要问题是数据必须是非递减的。这意味着该模型的典型应用通常会涉及经济和商业场景。因此,考虑到这一点,虽然这个模型对于处理经济数据的人来说可能非常有用,但对于许多科学工作来说,它不一定是最好的模型。
然而,在适当的应用和平衡偏差中,保序回归可以是一个非常强大的预测模型!如果你想了解更多关于保序回归的知识,你可以看看我写的这两篇文章,一篇是我用 C++从头开始编写保序回归器,另一篇是我详细阐述模型的工作原理:
为了适应这个模型,我们首先需要使用 make_regressor 函数,它将为我们提供一个基本的回归模型,我们可以在这个模型上构建保序回归。让我们这样做:
from sklearn.isotonic import IsotonicRegression
from sklearn.datasets import make_regression
isox, isoy = make_regression(n_samples=10, n_features=1, random_state=41)m.fit(isox, isoy)
m = IsotonicRegression(trainX, contrainy)
m = IsotonicRegression()
m.fit(isox, isoy)
m.predict(testX)
№2:正交匹配追踪
另一个只适用于某些数据特征的非常有用的工具是正交匹配追踪。该模型用于获取稀疏编码信号,并去除所述数据中的噪声和异常。这意味着这些机器学习算法被用来根据数据修复某些输入信号,我认为这是机器学习的一个非常好的应用。
虽然正交匹配追踪的主要用途可能相对简单,但该模型的用途可能会更广泛。鉴于这是一个非常独特的模型,它是如何工作的呢?
正交匹配追踪形成了其名称所描述的精确运算。为了剖析这个定义,让我们来单独看一下这些词:
- 直角的——在直角内或者包含直角。
- 匹配—将观察值与值联系起来。
- 追求——寻找。
因此,基本上,我们正在寻找与我们的数据完美匹配的地方,它依赖于多维跨度的数据 D,这可能是编程世界中的一种字典类型。用维基百科的话说,
。想法是从希尔伯特空间(H)创建一个近似信号(f ),作为统计函数的加权和,即 pdf/CDFs/Gamma。
虽然我们现有的数据肯定不适用于这种特定模型,但在本例中,我将创建一些稀疏信号作为数据传递:
**from** **sklearn.linear_model** **import** [OrthogonalMatchingPursuit](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.OrthogonalMatchingPursuit.html#sklearn.linear_model.OrthogonalMatchingPursuit)from sklearn.datasets import make_sparse_coded_signal
n_components, n_features = 550, 100
n_nonzero_coefs = 10
*# y = Xw*
*# |x|_0 = n_nonzero_coefs*
y, X, w = [make_sparse_coded_signal](https://scikit-learn.org/stable/modules/generated/sklearn.datasets.make_sparse_coded_signal.html#sklearn.datasets.make_sparse_coded_signal)(n_samples=1,
n_components=n_components,
n_features=n_features,
n_nonzero_coefs=n_nonzero_coefs,
random_state=0)
idx, = w.nonzero()
现在我们将扭曲我们的目标数据:
y_noisy = y + 0.05 * [np.random.randn](https://numpy.org/doc/stable/reference/random/generated/numpy.random.randn.html#numpy.random.randn)(len(y))
符合我们的模型:
omp = [OrthogonalMatchingPursuit](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.OrthogonalMatchingPursuit.html#sklearn.linear_model.OrthogonalMatchingPursuit)(n_nonzero_coefs=n_nonzero_coefs)
omp.fit(X, y)
coef = omp.coef_
idx_r, = coef.nonzero()
第三名:拉斯·拉索
如果你已经使用机器学习很长时间了,你可能听说过套索回归。套索回归是一个奇妙且相当标准化的工具,已经在机器学习中被频繁使用了很长一段时间。在预测连续目标的大多数时候,这肯定是我的首选模型。
然而,拉斯拉索模型不是你正常的拉索回归。“LARS lasso 模型”中的 LARS 是最小角度回归的简称。最小角度回归是一种预测连续特征的机器学习算法。它对于处理维数非常高的数据非常有用。该模型通过协变量的线性子集来工作。
这种模型的一个伟大之处在于,虽然在尺寸方面的天花板比传统模型显著提高,但与通常以这种方式使用的模型相比,它真的没有那么慢。话虽如此,但重要的是要记住,虽然该模型是从最小角度回归得到的,但这并不使其成为线性的-这就是模型的套索部分的由来。当然,如果线性模型是您正在寻找的,您可以在使用最小角度回归的传统线性回归模型上利用相同的概念,这也在 SkLearn 中。
from sklearn import linear_model
reg = linear_model.LassoLars(alpha=0.01)
reg.fit(trainX, contrainy)
reg.predict(testX)
№4:最小角度回归
正如最小角度回归在套索模型中的类似应用中所述,最小角度回归是一种用于预测连续要素的模型,通常使用协变量的线性子集。这是最小角度回归和 LARS Lasso 回归最显著的区别。最小角度回归是指该模型的线性版本。
在计算上,最小角度回归的优点是与正向选择一样快。虽然这是一个巨大的好处,但它最大的优势是在 p >> n 的情况下。如果两个变量同等相关,那么它们的系数应该以相同的速度增加。
from sklearn import linear_model
reg = linear_model.Lars()
reg.fit(trainX, contrainy)
reg.predict(testX)
№6: SGDRegressor
SkLearn 中一个概念的另一个伟大实现是随机梯度下降。随机梯度下降是一种迭代使用的方法,用于优化数学函数和构建成本。很可能你听说过梯度下降,这是类似的-但是,这个模型名称中的随机意味着我们只对 epoch 使用单个训练示例。这是两个极端中的高端,从批次梯度下降开始,每个时期使用整个批次,中间是两者的组合。
随机梯度下降中的损失梯度是每次对每个样本进行估计的,并且模型沿着强度递减的时间表进行更新,在典型的机器学习术语中也称为学习速率。
from sklearn.linear_model import SGDRegressor
m = SGDRegressor()
m.fit(trainX, contrainy)
m.predict(testX)
№7:胡伯回归
使用回归学习方法,通常会有难以克服的模型缺点。对于线性模型来说肯定是这样的,线性模型可能很难完全适合稀疏数据或多维数据。幸运的是,SkLearn 有一个很好的 Huber 回归实现。
这种形式的回归可用于处理异常值并避免建模错误,使用 SkLearn 包中可用的典型模型可能很容易犯这种错误。这可能很有用,因为尽管该模型很有用且拟合良好,但它也相对简单,这意味着过拟合和过采样不是使用该模型时通常会遇到的问题。
Huber 回归优化了平方损失(均方误差),与简单线性回归等模型相比,它对异常值相当稳健。实际上,斯坦福大学的 Art B. Owen 发表了一篇非常有趣的论文,对于那些不熟悉这种建模方法的人来说,这篇论文可能值得一读。有兴趣可以去看看:
下面是我发现的最有效的一句话,用来从数学上分析这个模型将如何处理这些数据:
“最小二乘准则非常适合于具有高斯分布的 yi,但是当 yi 具有较重的尾部分布或几乎相同的尾部分布时,当存在异常值时,会给出较差的性能。Huber (1981)描述了一个稳健的估计量,它采用了一个受非常大的残值影响较小的损失函数
不用说,这个模型是难以置信的酷!我认为它在剔除异常值方面肯定有它的用处,异常值是造成预测连续问题的困难的一个因素——这经常被低估,但在初级统计领域似乎很明显。
既然我们在数学上对这个模型有些熟悉,我们实际上可以考虑在 Sklearn 中拟合它(那是一个笑话。)
from sklearn.linear_model import HuberRegressor
m = HuberRegressor()
m.fit(trainX, contrainy)
m.predict(testX)
№8:多项式回归
虽然这个“模型”可能更多的是与其他模型一起使用的概念,但它肯定会非常有用!机器学习的一个非常常见的模式是使用非线性函数来创建线性预测。这将保持模型的速度,同时不会浪费任何预测能力。一个很好的例子是简单线性回归上的多项式回归。
在使用多项式回归的示例中,它适合用函数构建的更高维度的数据。由于使用了多项式特征,该模型可以很容易地拟合和用于解决广泛的连续问题。
为了在 sklearn 中实际使用多项式回归,我们实际上要使用多项式特性:
**from** **sklearn.preprocessing** **import** PolynomialFeatures
poly = PolynomialFeatures(2)
poly.fit_transform(trainX)from sklearn.linear_model import LinearRegression
reg = LinearRegression()
reg.fit(trainX, contrainy)
reg.predict(testX)
№9:普通最小二乘法
普通最小二乘法是另一种预测连续特征的非常酷的数学机器学习模型。普通最小二乘法也是一种线性模型,适合用来最小化数据中点之间平方和的系数。
普通最小二乘法的权重严重依赖于用于预测目标的特征的独立性。也就是说,这个模型对于具有单一特性的实现非常有用。此外,它可以与多个特征一起使用,但肯定需要将特征向目标加权。查看这个描述,很容易看到像普通最小二乘法这样的模型在我们的机器学习武器库中的确切位置。
不幸的是,OLS 的 SkLearn 实现并不像大多数实现那样简单。OLS 系数实际上包含在线性回归类下面。系数 _:
linear_model.LinearRegression().fit(trainX, contrainy).coef_
№10:NuSVR
回到支持向量机的魔力,请允许我向您介绍 NuSVR。NuSVR 当然是和 NuSVC 一样的模型和机器实现。这两个模型都利用 libsvm,并使用参数 nu 来控制机器中支持向量的数量。但是,与 nu 代替 C 的 NuSVC 不同,这里 nu 代替了 epsilon-SVR 的参数 epsilon。
使用该模型的优点是提供了用于调整向量机的参数,该向量机用于帮助估计该回归问题。也就是说,该模型非常适合预测连续特征,这些特征对于我们的目标可能非常重要,也可能不太重要。
**from** **sklearn.svm** **import** NuSVR
from sklearn.svm import NuSVR
m = NuSVR()
m.fit(trainX, contrainy)
m.predict(testX)
№11:多任务套索
就像拉斯·拉索一样,你可能听说过拉索回归。作为复习,这是一个非常常用的预测连续特征的非线性模型。多任务套索的不同之处在于,多任务套索将使用 L1/L2 规范作为正则化。
为了证明这一点,让我们看看套索回归的优化目标:
(1 / (2 * n_samples)) * ||Y - XW||^2_Fro + alpha * ||W||_21
在本例中,||W||_21
将被修改以适应多任务套索的公式:
||W||_21 = \sum_i \sqrt{\sum_j w_{ij}^2}
本质上这意味着我们得到了每一行的总和。
from sklearn.linear_model import MultiTaskLasso
m = MultiTaskLasso()
m.fit(trainX, contrainy)
m.predict(testX)
对于分类问题
在机器学习中,可能会有很多连续的问题,但是
№12:线性 SVC
LinearSVC 是一种支持向量机类型的模型。该模型的 SkLearn 实现是使用 libsvm 创建的。虽然核可以是非线性的,但是它的 SMO 通常不能很好地适用于大量样本。这就是线性支持向量分类器派上用场的地方。
也就是说,虽然 Sklearn 中还有其他一些很棒的 SVC 实现可能更有名,但是 LinearSVC 无疑是一个非常值得注意的模型!SVC 通常以多类模式工作,用一个类来衡量另一个类。在 LinearSVC 的情况下,所有这些类都是相互权衡的——这使得该模型比许多 SVC 竞争对手更全面。
至于 SkLearn 类,它是一个令人敬畏的、近乎完美的实现。它非常好地支持密集和稀疏数据,并且可能是一个令人难以置信的模型——在我看来,很容易成为 Python 中最好的线性分类模型之一!
from sklearn.svm import LinearSVC
m = LinearSVC()
m.fit(trainX, cattrainy)
m.predict(testX)
№12:SGD 分类器
正如我们在简要讨论 SGDRegressor 时所讨论的,随机梯度下降是指在每次迭代中使用每一批来加权特性的成本。当然,SGDClassifier 与现在应用于分类问题的概念完全相同。
像 SGDRegressor 一样,这个模型是一个很好的实现,尤其是在处理大量特性时,它非常有价值。虽然这可能会导致性能大幅下降,但可能需要权衡由此产生的预测是否值得这些特别的努力。
安装 SGDRegressor 非常简单,并且和这个列表中的许多人一样,将遵循
- 进口
- 合适的
- 预测
from sklearn.linear_model import SGDClassifier
m = SGDClassifier()
m.fit(trainX, cattrainy)
m.predict(testX)
13 号:伯努利朴素贝叶斯
伯努利朴素贝叶斯分类模型可以像任何贝叶斯分类模型一样使用,但是它有一个锦囊妙计:
伯努利分布。
您可能熟悉这个分布,因为它的 CDF 经常出现在逻辑分类模型附近。我想说这个模型的用法和多项式非常相似。然而,尽管 MultinomialNB 在计数和发生方面表现得更好,BernoulliNB 却使用伯努利分布,并且是为布尔型特征而设计的。这当然让我回想起我最初的陈述,伯努利用于逻辑回归,也就是说,这个模型本质上有相同的用途,所以它使用相同的分布是有意义的。
尽管该模型通常用于预测二元特征,但今天我们只传递一些可能更适用于多项式的典型分类数据。也就是说,记住这两个模型的用例是很重要的,因为它们非常强大,但是应该用于它们适当的特性类型。如果您不了解您试图预测的目标,那么使用模型是没有意义的,我认为这些模型之间的差异突出了数据科学家需要了解不同的模型需要不同类型的功能才能很好地工作。这是一个很好的经验,但不管怎样,它遵循了我们对 SkLearn 的典型期望:
from sklearn.naive_bayes import BernoulliNB
m = BernoulliNB()
m.fit(trainX, cattrainy)
m.predict(testX)
№14:山脊分类
如果你一直在研究机器学习模型,尤其是连续模型,你可能听说过岭回归。岭回归是一种用于预测连续特征的流行模型。当然,RidgeClassification 是这种分类问题的精确模型的分类等价物。
模型的分类版本将目标转换为{-1, 1}
,然后用典型的岭回归将其建模为回归问题。我认为这是一个非常酷的概念,因为在我看来,将回归和其他解决问题的连续方法应用于一个完全不同的问题,如分类,是非常酷的。
幸运的是,尽管这个模型真的很棒,看起来像一个先进的概念,但奇妙的 SkLearn 使它非常容易使用,符合图书馆的典型惯例:
from sklearn.linear_model import RidgeClassifier
m = RidgeClassifier()
m.fit(trainX, cattrainy)
m.predict(testX)
№15:校准分类器
这份名单上最酷的车型之一可能是 CalibratedClassifierCV。该模型使用交叉验证来估计分类器的参数。该模型可以与作为基础的逻辑回归器一起使用,这将使它成为用于对布尔类型进行分类的伟大模型。
然而,由于这个模型实际上可以采用不同的基本估计量,所以一个常用的模型实际上是保序回归。保序回归是一个非常酷的模型,但在我看来,当与分类问题结合起来时,它会变得更酷。这意味着阈值现在被附加到类,而不是连续数据中的任意分位数。
不同于这个列表中预测目标的许多其他解决方案,这是另一个将成为其他模型的补充的解决方案。换句话说,我们可以通过简单地构建一个分类器来校准任何分类器。在这个例子中,我将使用高斯朴素贝叶斯建立一个模型,这是 SkLearn 中的另一个分类模型,类似于多项式朴素贝叶斯。
from sklearn.naive_bayes import GaussianNB
from sklearn.calibration import CalibratedClassifierCV
base_clf = GaussianNB()
calibrated_clf = CalibratedClassifierCV(base_estimator=base_clf, cv=3)
calibrated_clf.fit(trainX, cattrainy)
calibrated_clf.predict(testX)
“顺便说一下,在我看来这是一个非常酷的方法,我真的认为 SkLearn 在对象的使用方式和它们作为类使用的约定上击中了要害。”
结论
SkLearn 是一个如此令人敬畏的库,以至于现在的机器学习工程师可能会认为这是理所当然的。图书馆里有很多模型是绝对不可思议的,可能会被忽视,因为冠军已经出现了。这些型号你用过几个?我希望这些对这些令人敬畏的模型的描述和介绍是有趣的,甚至对你下一个项目的模型选择有所帮助。
非常感谢你的阅读,新年快乐!我认为这些模型在未来将是非常宝贵的资产。也许如果你遇到一个好的二进制分类问题,或者线性建模问题,你会回想起我第一年写的这篇文章。希望这篇文章能激发更深入的挖掘和研究,以了解更多关于建模的知识,因为学习建模真的很有趣。
15 个非常有用的 Python 基础模块
忘记依赖性,使用标准库!
(图片由作者提供)
I 简介
本月早些时候,我深入研究了 Python 编程语言基础上的一些非常强大且非常有用的函数。这些标准库模块和 Python 函数非常棒,但幸运的是,当谈到 Python 编程语言所能提供的东西时,它们都只是昙花一现。如果您没有时间阅读我的上一篇文章,在这篇文章中,我概述了一些其他的标准库工具,我认为它们可能比这些工具更有用,您可以在这里查看:
</10-surprisingly-useful-base-python-functions-822d86972a23>
尽管我在上一次迭代中概述了许多精彩的特性,但是 Python 标准库还可以为那些有足够决心成为它的专家的程序员提供更多的特性。Python 的真正优势在于其基础的简单性和开箱即用的能力,特别是操纵数据和使用其他语言和脚本。这当然在它提供的包中有很大反映,这些包通常提供处理外部代码、文本和数据的功能。数据操作只是 Python 编程语言标准库实际能力的一小部分。也就是说,只需要一点点知识,就可以用几个包的例子将标准的 Python 体验提升到一个新的水平。这里有 15 个我最喜欢的,我想大多数 Python 程序员可能想看一看!
№1: cmath
复杂类型无疑证明了 Python 在某种程度上的科学和数字意图。这种类型在 Python 中出现已经有一段时间了,它允许虚数和实数作为一个完整的值存储。这一点最常见的是在浮点数上加上虚数,例如:
5.5+8.2 米
其中:
- 5.5 是真正的浮动。
- 8.2 是一个假想的浮点数。
然而,除了保存数字之外,如果没有适当的操作来支持,复杂的浮点数本质上是没有用的。这就是 cmath 模块的用武之地。cmath 不仅支持平方根和对数函数等基本运算,还提供了更高级的函数,如相位、极坐标或 x。
对于任何可能与复数进行交互的 Python 用户来说,这个模块几乎肯定是必不可少的。它不仅提供了一个足够的主干,可以处理任何至少部分是虚数的数字,还可以提供更多关于这些数字的极坐标信息。对于我的例子,我选择利用这个模块中的 exp()、log()和 phase()方法。然而,不言而喻的是,这个神奇的工具中有更多的选项值得一试!
为了使用 cmath,我们首先需要导入它。我个人通常会将它别名为 cm,但我必须承认我不确定这是否是一种约定:
import cmath as cm
接下来,我们将创建一个可以用来计算的复数:
z = 5.5 + 8.2j
最后,我们将获取新的复数值,并在新变量上使用 cmath 包中的一些精彩方法!
cm.phase(z)
cm.log(z)
cm.exp(z)
№2:迭代工具
Python 标准库中下一个非常有价值的工具是一个叫做 itertools 的小模块。我怎么推荐使用这个模块都不为过,因为它似乎真的比我想象的要方便得多。itertools 模块可用于非常有效和容易地创建更好的、有时是独特的迭代,如果不使用该模块,将会花费更多的时间。
这个模块基本上是一些业界领先的迭代工具的组合,包含在一个纯粹的 Pythonic 包中。在很多场景中,通过结合使用 Python 的其他特性,这些工具被简单地包含在 Python 中。文档中也提到了一个很好的例子。SML 编程语言提供了一种制表工具——制表()方法,可以使用标准库中已有的 map 和 count 函数在 Python 编程语言中重新创建该方法。
不用说,这个模块肯定是值得拥有的!当使用迭代时,这个模块的真正价值就体现出来了,因为它可以使许多低效或乏味的迭代任务变得轻而易举,并且在内存和计算方面效率更高。这个模块包含了一些很棒的函数,比如 count()、chain()、accumulate()等等!
在大多数情况下,我看到 itertools 别名为 it 和 its,我个人更喜欢 its。
import itertools as its
我假设我们都熟悉 Fizz Buzz 编码测试。使用这个简单的编码测试,我们可以看到利用 itertools 中更高性能的迭代解决方案相对于使用原始 Python 来处理我们的问题的价值。大多数程序员可能会采取类似的方法来解决问题:
for num in range(1, 21):
if num % 3 == 0 and num % 5 == 0:
print('FizzBuzz')
elif num % 3 == 0:
print('Fizz')
elif num % 5 == 0:
print('Buzz')
else:
print(num)
哪个当然是正确的!然而,使用 itertools,我们可以大大缩短这个函数的长度,以及计算它所需的时间:
def fizz_buzz(n):
fizzes = its.cycle([""] * 2 + ["Fizz"])
buzzes = its.cycle([""] * 4 + ["Buzz"])
fizzes_buzzes = (fizz + buzz for fizz, buzz in zip(fizzes, buzzes))
result = (word or n for word, n in zip(fizzes_buzzes, its.count(1)))
for i in its.islice(result, 100):
print(i)
№3:平分
与列表中的许多工具不同,等分模块有一个直接的目的。这个模块的目的是将 Python 中的数组或列表一分为二。这对于各种不同的操作都很方便,但是这个包经常被同名的 Scipy 实现扔到一边。如果我不得不猜测为什么会这样,我会说也许 Scipy 实现支持 Numpy 矩阵?
不管其文化接受程度如何,那些只使用普通 Pythonic 列表的人肯定会发现这个模块非常有价值。该模块配有工具,可以正常对分,也可以左右对分。此外,该模块还附带了一些更有趣的功能,比如 insort(),它将插入和排序所提供的值。让我们导入这个模块,看看它是如何处理列表的:
import bisect as bs
现在,我们可以使用此模块制作一个列表并将其一分为二:
ls = [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90]
bs.bisect(ls, 9)
第四名:统计
os 模块是一个非常流行的 Python 模块,当然在标准库中。os 模块附带了用于操作文件系统、系统硬件甚至操作系统内核的工具。os 模块也有三个功能:
- 斯达
- fstat
- lstat
这些都是用来获取一个文件的状态,或者获取所述文件的描述符。os 模块中的 stat 函数将返回一个 stat_result 类型,这正是我们使用 stat 模块所需要的。因此,使用该模块的第一步是从操作系统模块获得一个 stat。让我们从导入模块开始,并将 stat 类型设置为一个新变量:
import os
st = os.stat("logreg.ipynb")
现在让我们看看这个新类的类型。如果一切按计划进行,st 的类型应该是 stat_result。
每当我们查看 stat 模块的文档时,我们很快就会了解到,这种类型并不是我们实际要放入新函数中的类型。我们可以观察到这一点,因为函数 stat.filemode()接受一个整数,而不是 os.stat_result。我们真正需要的实际上包含在我们刚刚创建的类中,名为 st_mode。我们可以这样称呼它:
st.st_mode
现在让我们导入 stat。
import stat as stt
现在,我们可以将新的 stat 模式从 os.stat_result 类传递到 stat.filemode()函数中:
stt.filemode(st.st_mode)
(图片由作者提供)
№5:记录
脚本任务可能非常困难!如果有许多并发服务和子流程可能在 systemctl 或类似的东西下一起在后台运行,这一点尤其正确。可能会有大量的应用程序,不可避免地,一些应用程序几乎肯定会遇到一些问题。缓解此类问题的一个很好的方法是直接从开发-运营手册中获得的,
伐木。
日志记录是一种简单的方法,可以同时跟踪几个进程,并在遇到某些问题和异常时,进一步了解幕后发生的事情。日志记录为简单的日志记录提供了一组易于使用的函数。这些是[debug()](https://docs.python.org/3/library/logging.html#logging.debug)
、[info()](https://docs.python.org/3/library/logging.html#logging.info)
、[warning()](https://docs.python.org/3/library/logging.html#logging.warning)
、[error()](https://docs.python.org/3/library/logging.html#logging.error)
和[critical()](https://docs.python.org/3/library/logging.html#logging.critical)
。
不用说,日志是一个非常有用的工具,所有 Python 程序员都想熟悉它。对于某些领域,如开发运营或系统管理来说尤其如此,但这也适用于软件工程和数据科学的奇妙世界。在部署和日常计算机操作的许多情况下,日志记录都会派上用场,尤其是当您想要开发和调试自己的应用程序时。现在让我们用一些 Python 来弄脏我们的手,并开始创建我们自己的日志!我们要做的第一件事当然是导入日志模块:
import logging as lgg
现在,我将使用 basicConfig 函数来创建一个新文件,我们的日志可以放入其中:
lgg.basicConfig(filename='mylog.log', level=lgg.DEBUG)
现在我将在其中记录一些消息!
lgg.debug('This message will be in mylog.log')
lgg.info('So will this :)')
看看我们的文件系统,我们可以打开一个新的日志文件,其中包含我们的文本:
(图片由作者提供)
这个日志实现的一个很酷的特性是,我们可以忽略不想在日志中看到的信息。例如,如果我们不希望看到任何调试消息,可以将级别设置为 20。
№6: html
html 模块主要以包含在其中的名为“解析器”的子模块而闻名给定名称,实际上很容易想象这个模块的确切用途。该模块可用于轻松地逐个标签地解析 HTML。这使得处理你正在阅读的文本中的 HTML 更加容易,甚至可以用 Python API 将 HTML 翻译成基于 C 的框架。
很多时候,程序员可能会遇到他们不想浏览的大型 HTML 页面,或者从请求中接收到的字符串很难用字符串片段来解析。如果需要,您甚至可以使用解析器和一些代码来实际编写 HTML!这个工具有很多用途,但是我决定不把所有的胡萝卜放在一个篮子里,而是演示可以从 html.parser 导入的解析器。
from html.parser import HTMLParser
既然我们的解析器已经导入,我们将创建一个新变量并初始化一个 HTMLParser 类:
parser = HTMLParser()
最后但同样重要的是,我们将使用 HTMLParser 类中包含的 feed()函数,并向其中输入一些 HTML:
parser.feed('<html><head><title>parsedhtml</title></head>'
'<body><h1>this was parsed</h1></body></html>')
在大多数情况下,这个解析器不太像 HTML 解析器,而更像 HTML 分离器。也就是说,大多数使用这个模块的程序员很可能会在这个模块上构建一个定制的解析器。
№7:网络浏览器
虽然这个模块肯定不是列表中最有用的,但我确实认为它是一个很酷的模块,可能会派上用场。也就是说,webbrowser 模块正是如此;网络浏览器的快捷方式。考虑到这一点,你可以认为它最常用于自动获取某种类型的网页链接。
可能有几个不同的原因可以让你这么做。我能想到的应用大多是在软件工程中,但几乎可以肯定,这个模块有更有用的应用。不考虑它对普通程序员的实际用处,我认为它是一个非常简洁的小模块,所以让我们来试试吧:
首先,我们可以通过 Bash 直接执行来打开我们的链接:
!python3 -m webbrowser -t "towardsdatascience.com"
或者我们当然可以使用 Python 代码导航:
import webbrowser
webbrowser.open_new("lathe.ai")
№8: ftplib
当顶级中央处理器只有四个内核时,文件传输协议(FTP)是我们用来传输文件的方式。不管它的年龄和各自的替代品(有这么多更好的解决方案),FTP 已经设法在一定程度上坚持了多年。也就是说,在某些情况下,你可能真的不得不使用 FTP。
仅仅因为您拥有对服务器的文件访问权限并不意味着您拥有对服务器的 SSH 访问权限。记住,如果不使用 SCP 或 SSH,很难连接到一个开放的端口并移动文件。幸运的是,当情况像这样结束时,FTP 总是可以介入。
虽然我很想演示 ftplib 包,但我并不喜欢这个协议;却没有很好的方法来处理它。当然,我可能会着手在我的服务器上设置 FTP,然后在我的笔记本中返回并从 Python 连接到它,但是该模块及其文档相对来说比较基础,因此很可能只需查看那里的代码就可以理解代码:
**>>> from** **ftplib** **import** FTP
**>>>** ftp = FTP('ftp.us.debian.org') *# connect to host, default port*
**>>>** ftp.login() *# user anonymous, passwd anonymous@*
'230 Login successful.'
**>>>** ftp.cwd('debian') *# change into "debian" directory*
**>>>** ftp.retrlines('LIST') *# list directory contents*
-rw-rw-r-- 1 1176 1176 1063 Jun 15 10:18 README
**...**
drwxr-sr-x 5 1176 1176 4096 Dec 19 2000 pool
drwxr-sr-x 4 1176 1176 4096 Nov 17 2008 project
drwxr-xr-x 3 1176 1176 4096 Oct 10 2012 tools
'226 Directory send OK.'
**>>> with** open('README', 'wb') **as** fp:
**>>> ** ftp.retrbinary('RETR README', fp.write)
'226 Transfer complete.'
**>>>** ftp.quit()
№9: uuid
通用唯一标识符(UUIDs)在计算领域是一个非常重要的概念。对于现代企业计算来说尤其如此,有时可能每天都要识别和处理成百上千个不同的东西。UUIDs 允许计算机很容易地区分数据到底是什么。UUIDs 在现代计算世界的各种应用程序中广泛使用,例如
- web 开发
- 数据库管理
- 进程管理
- 包装开发
还有更多。
uuid 模块的伟大之处在于它非常容易使用。您可以通过简单地使用四个 uuid 1–5()来检索几乎任何内容的标识符,但不包括该模块提供的两个方法。第一个也是最常用的 uuid()方法肯定是 uuid1(),但是,许多人也使用 uuid4(),因为 uuid1()还会用创建该标识符的计算机的详细信息来标记该标识符。为了启动这些函数,我们需要导入它们。
import uuid
现在我们将调用 uuid1()函数:
uuid1()
我们会看到这将返回一个 UUID。接下来我们可以做的是打印出所有不同的 UUID 函数,看看它们的输出是什么样的。为了使用另外两个函数 UUID3()和 UUID4(),我们需要提供一个名称空间标识符。这通常是通过两种不同的协议完成的,要么是域名服务器(DNS ),要么是统一资源定位器(URL ),并且允许基于名称空间创建标识符。这将基于标识符的 SHA-1 散列创建我们的新 UUID。例如,我们可以将名称空间设置为 towardsdatascience.com。对于名称空间参数,我们将提供一个名称空间对象,它打包在 uuid 模块中。至于名字,我们将提供 towardsdatascience.com。从提供的示例中可以看出,uuid 1 和 uuid 3 的中心通常保持一致:
print(uuid.uuid1())
print(uuid.uuid3(uuid.NAMESPACE_DNS, "towardsdatascience.com"))
print(uuid.uuid4())
print(uuid.uuid5(uuid.NAMESPACE_DNS, "towardsdatascience.com"))print(uuid.uuid1())
print(uuid.uuid3(uuid.NAMESPACE_DNS, "towardsdatascience.com"))
(图片由作者提供)
№10:IP 地址
无论何时,当你使用帐户,或者试图使这些帐户安全时,跟踪互联网协议地址或 IP 地址是很有意义的。该协议有两个版本,它是整个互联网上计算机和服务器之间所有通信的基础。任何时候你的电脑与其他地方的电脑连接,你都有可能被你的 IP 地址所识别。这些地址为互联网提供了更多的安全性,因为它使网站和您的互联网服务提供商更容易跟踪什么用户在做什么。
这是好是坏,在数据伦理领域是一个完全不同的话题,但事实是,IP 地址是大多数服务器管理员和程序员通常应该熟悉的工具。在 Python 中,我们有一个标准的库模块,叫做 ipaddress。在很大程度上,该模块通常用于处理 IP 网络和服务器上的本地 IP 配置。使用该模块的流行应用程序的一个很好的例子是 Gunicorn3,这是一个 Pythonic 式的高性能 web 服务器。如果你想了解更多关于 Gunicorn3 的知识,或者想用它部署 Flask,我在一年前(实际上是将近两年前)写了一篇文章,我认为这篇文章很好地利用了它:
在很大程度上,这个包只是用来创建 IP 的类,并把它们从字符串世界带到 Python 世界,在那里它们是自己独特的类型。也就是说,唯一要演示的是如何创建这样一个类:
import ipaddress
ipaddress.IPv4Address('192.168.0.1')
№11:获取文本
Get text 是另一个非常酷的工具,我可以肯定地看到它在标准库中得到了一些应用。Gettext 是一个非常酷的转换到 Python 基础上的实现,我认为这非常棒!到目前为止,在这方面最常用的方法是 gettext()方法。该方法接受一个参数,该参数将是一个字符串,并且将是我们希望翻译的文本。
import gettext as gxt
为了实际使用这个包,我们需要将语言数据加载到其中。这很常见,因为如果没有这种能力,模块很可能会非常庞大。这个过程实际上是漫长的,我计划在以后的文章中讨论它,因为在这里解释它太费时间了。然而,在讨论这个工具可能存在的一个严重问题之前,我可以解释使用 gettext 的基本过程和优点。
Gettext 通过生成一个. pot 文件来使用。的。pot 文件包含单个环境或整个应用程序的翻译信息。然后加载该文件,并在与 gettext()方法一起使用时将加载到设置的区域设置中。这是一种处理翻译的好方法,因为它将编程和翻译完全分开。
gtxt.gettext("Hello world!")
这个工具唯一的重大缺陷可能是它的许可。Gettext 是在 GPL 和其他自由软件许可下发布的。这是有问题的,因为这可能意味着该工具不可用于商业用途。这意味着基本上任何私人使用或工作中的使用都侵犯了与它一起分发的许可证。在软件世界中,许可是一件需要注意的重要事情,因为以错误的方式使用带有错误许可的软件会给你带来很多麻烦。也就是说,许可讨论的一个有趣部分是,gettext 在这种情况下是用 Python 打包的,它是在 PSF 语言下打包的——这是一个比 MIT 许可更自由的许可。这两个许可证可能暗示这可以在专业设置中使用,但是我不是律师,不能真正说这个软件的许可是否会阻止它在现实世界中使用。
№12:泡菜
可能这个列表中最有价值的数据科学标准库模块是 pickle 模块。pickle 模块用于将类型序列化为压缩数据,以后可以在不同的环境中再次加载和使用这些数据。这对于机器学习模块之类的东西非常有用,这些模块通常包含充满字典和数字的类,以确定模型在特定情况下可能需要做什么。
为了使用这个模块,我们需要准备一个我们想要序列化的类。对于这个例子,我决定做一个关于人的课程:
class Person:
def __init__(self, feet, inches, weight):
self.height = feet * 12 + inches
self.bmi = weight / self.height ^ 2
self.weight = weight
现在我将创造我自己:
emmett = Person(6, 4, 160)
(图片由作者提供)
太奇怪了…
我觉得很奇怪,Python 不考虑操作的顺序。我也觉得^(float 不工作很奇怪。我想我已经被朱利安的数学宠坏了。我们可以用一组括号来修正这个错误:
class Person:
def __init__(self, feet, inches, weight):
self.height = feet * 12 + inches
self.bmi = weight / (self.height ^ 2)
self.weight = weight
现在让我们创建我们的 emmett 对象并序列化它!
import pickle as pkl
emmett = Person(6, 4, 160)
为了将新类序列化到文件中,我们将使用 pickle.dump()函数。使用此函数的最佳方式是使用 with 语法。with 块将允许我们定义一个新变量作为一个打开的可写文件,然后将文件流插入到我们的函数中,并调用它:
with open("emmett.pkl", "wb") as output:
pkl.dump(emmett, output)
现在我们将做同样的事情,但是我们将使用 pickle.load()函数进行加载。我们还将通过用 r 替换 w 来将写权限更改为读权限。
with open("emmett.pkl", "rb") as inp:
emmett2 = pkl.load(inp)
现在,emmett2 与 emmett 类完全相同,可以移动、共享和重用!
№13:回复
正则表达式是一个编程概念,它可能会改变您第一次使用字符串的方式。正则表达式是很酷的小命令,可以放在一个字符串中,以告诉计算机如何处理该字符串。re 包提供了类似于 Perl 编程语言的正则表达式匹配。
也就是说,Python 中的 re 模块用于检测和解析这些正则表达式。这对于可能需要解释来自其他应用程序的大量输入字符串的应用程序非常有用。当用正则表达式编码时,这些字符串可能需要以特定的方式运行或执行特定的任务。大多数程序员可能都熟悉的一个很好的例子是 markdown。Markdown 使用表达式来告诉何时使用某些标题高度、项目符号、图像和其他文本功能,如超链接。
这个包中最常用的函数肯定是 compile()函数。这个函数可以用来将任何字符串转换成正则表达式对象,然后可以在整个包中使用。我不认为有人会觉得有必要给这个取别名:
import re
让我们在一个字符串上尝试 compile()函数:
st = "hello world, it has been a good day. \n hello world, it has been a bad day. \n"re.compile(st)
№14:复制
当处理类型时,总会有关于可变性的讨论。易变性有它的缺点和优点。Python 是一种动态类型的语言,这意味着类型可以频繁地改变。不仅如此,这种语言还具有很多迭代特性,这意味着这种语言通常不太关心数据的保存。正是由于这个原因,为了避免你的类的数据发生灾难性的、不可逆转的变化,一致地创建你的类型的副本将变得极其重要。
幸运的是,在 Python 中确保安全和复制工作相对容易。Python 安装附带了一个标准的库工具,名为 copy。
import copy as cp
复制模块将提供两个功能,copy 和 deepcopy。两者的区别在于 copy 创建对子对象的引用,而 deepcopy 递归地复制这些对象。考虑到这一点,深度复制用其下的类构建的类可能是明智的,但在处理类内部的简单数据类型时只使用 copy 可能更有意义。
emmett2 = cp.copy(emmett)
emmett2 = cp.deepcopy(emmett)
№15:功能工具
函数工具是一个广泛的工具工具箱,通常与 Python 编译器交互,可用于函数,以控制它们的特定行为方式。文档中有一个关于这种用法的很好的例子,我认为它突出了为什么它肯定是一个非常有用的软件包:
import functools as fut
from functools import lru_cache
现在让我们看一个基本的例子,functools 非常有用,非常棒!对于计算机来说,阶乘计算是一个非常困难的计算。通常这些是使用查找表计算的,因为它们的计算实际上很难做到。这是有原因的,因为阶乘本身就是解释递归的好方法。我们可以用 Python 写一个递归阶乘函数,如下所示:
**def** factorial(n):
**return** n * factorial(n-1) **if** n **else** 1
这个函数唯一的缺点是,为了计算阶乘,它会不断地调用自己。这将破坏每次使用该函数时的性能。然而,也就是说,我们可以通过在内存中存储先前计算的结果来改进后续调用。functools 模块允许我们通过缓存调用来这样做:
[@lru_cache](http://twitter.com/lru_cache)
def factorial(n):
return n * factorial(n-1) if n else 1
现在每次阶乘调用一个已经缓存的计算时,它只是从内存中加载数字!这将极大地节省我们的性能。
结论
Python 编程语言有超过 200,000 个包,其中许多包都非常成熟和古老。然而,依赖关系最终可能很难处理,通常有办法通过查看标准库来避开环境空间。此外,标准库中有大量的工具,肯定可以完成工作,并为您提供大量关于下一步编程的想法。在未来,希望这些神奇的工具能够派上用场,这里提供的关于这些模块的信息将会派上用场!感谢您的阅读!
15 个必须知道的机器学习算法
机器学习综合指南
solébikes 在 Unsplash 上拍摄的照片
近年来,机器学习经历了巨大的增长。我们比以往任何时候都更清楚机器学习可以实现什么。越来越多的高质量数据和计算的进步进一步加速了机器学习的普及。
有各种各样的机器学习算法,可以分为三个主要类别:
- 监督学习算法在给定一组观察值的情况下,对特征(独立变量)和标签(目标)之间的关系进行建模。然后,该模型被用于使用这些特征来预测新观察的标签。根据目标变量的特性,可以是分类(离散目标变量)或回归(连续目标变量)任务。
- 无监督学习算法试图在无标签数据中找到结构。
- 强化学习基于行动奖励原则工作。一个代理通过迭代计算其行动的回报来学习达到一个目标。
在这篇文章中,我将简要解释监督和非监督类别中的 15 种流行的机器学习算法。
我们将讨论的算法有:
- 线性回归
- 逻辑回归
- 支持向量机
- 朴素贝叶斯
- k-最近邻
- 决策图表
- 随机森林
- 梯度推进决策树
- LightGBM
- CatBoost
- XGBoost
- k 均值聚类
- 分层聚类
- DBSCAN 聚类
- 主成分分析
1.线性回归
线性回归是一种监督学习算法,通过对数据拟合线性方程来模拟连续目标变量和一个或多个独立变量之间的关系。
线性回归是一个好的选择,自变量和目标变量之间需要有线性关系。我们可以使用散点图或残差图来检查线性。
线性回归模型试图将回归线拟合到最能代表关系或相关性的数据点。最常用的技术是普通最小二乘法(OLE ),它通过最小化数据点和回归线之间距离的平方和来找到最佳回归线。
下图显示了一条线性回归线,它试图根据给定的数据点对速度和距离变量之间的关系进行建模。
(图片由作者提供)
2.逻辑回归
逻辑回归是一种受监督的学习算法,最适用于二进制分类任务,如流失预测、垃圾邮件检测和广告点击预测。
逻辑回归的核心部分是逻辑(即 sigmoid)函数。它接受任何实数值,并将其映射到 0 到 1 之间的值。
(图片由作者提供)
逻辑回归模型将线性方程作为 sigmoid 函数的输入,并使用对数概率来执行二元分类任务。
逻辑回归返回概率值。下面是一个典型的逻辑回归曲线。
逻辑回归曲线(图片由作者提供)
我们可以使用概率值或将它们转换成标签(例如 1 和 0)。例如,如果概率大于 50%,则预测为正类(1)。否则,预测为负类(0)。
作为正类和负类之间的阈值的值取决于问题。我们可以调整区分正面类别和负面类别的阈值。如果设置为 70%,只有预测概率大于 70%的观测值才会被归为正类。
3.支持向量机(SVM)
SVM 是一种监督学习算法,主要用于分类任务。
SVM 生成一个决策边界来分隔类别。在创建决策边界之前,在 n 维空间中绘制每个观察值(或行)(n 是特征的数量)。例如,如果我们使用“长度”和“宽度”来对不同的“细胞”进行分类,则观察值被绘制在二维空间中,而决策边界是一条线。
支持向量是最接近决策边界的数据点。以到支持向量的距离最大化的方式绘制决策边界。
决策边界和支持向量(图片由作者提供)
如果决策边界太靠近支持向量,它将对噪声高度敏感,并且不能很好地推广。即使特征上非常小的变化也可能改变预测。
决策边界的错误选择(图片由作者提供)
如果数据点不是线性可分的,SVM 使用核技巧来测量高维空间中数据点的相似性(或接近性)。具有核的 SVM 实际上并没有将数据点转换到更高维度的空间,这是没有效率的。它只度量高维空间中的相似性。
标准 SVM 会尝试将所有数据点分为不同的类,并且不允许任何点被错误分类。这导致过度拟合模型,或者在某些情况下,无法使用标准 SVM 找到决策边界。
一个更好的选择是软边际 SVM,它试图解决一个优化问题,目标如下:
- 增加决策边界到类别(或支持向量)的距离
- 最大化训练集中正确分类的点数
该算法允许一些数据点的错误分类,以便确定更鲁棒和更一般化的决策边界。
在上面列出的两个目标之间有一个权衡。这种折衷由 C 参数控制,该参数为每个错误分类的数据点增加一个惩罚。如果 c 很小,则对误分类点的惩罚也很低,因此以更大数量的误分类为代价选择了具有大余量的决策边界。如果 c 很大,SVM 试图最小化由于高惩罚导致的错误分类的例子的数量,这导致了具有较小裕度的决策边界。对于所有错误分类的例子,惩罚是不同的。它与到决策边界的距离成正比。
4.朴素贝叶斯
朴素贝叶斯是一种用于分类任务的监督学习算法。
朴素贝叶斯假设特征是相互独立的,特征之间没有相关性。然而,现实生活中并非如此。这种特征不相关的天真假设是这种算法被称为“天真”的原因。
顾名思义,这个算法的核心元素是贝叶斯定理。
(图片由作者提供)
p(A|B):给定事件 B 已经发生的概率
p(B|A):给定事件 A 已经发生,事件 B 发生的概率
p(A):事件 A 的概率
p(B):事件 B 的概率
朴素贝叶斯计算给定一组特征值的类的概率(即 p(yi | x1,x2,…,xn))。在特征独立的假设下,我们可以使用这个概率和贝叶斯定理来实现:
(图片由作者提供)
该算法将复杂的条件概率转换为简单得多的条件概率的乘积。
所有特征都是独立的假设使得朴素贝叶斯算法比复杂算法更快。在某些情况下,速度优先于更高的精度。另一方面,相同的假设使得朴素贝叶斯算法不如复杂算法准确。速度是有代价的!
5.k-最近邻
k-最近邻(kNN)是一种受监督的学习算法,可用于解决分类和回归任务。主要思想是一个数据点的值或类是由其周围的数据点决定的。
kNN 分类器通过多数表决原则确定数据点的类别。例如,如果 k 设置为 5,则检查 5 个最近点的类。根据多数类进行预测。类似地,kNN 回归取 5 个最近点的平均值。
kNN 的最大挑战是确定 k 的最佳值。非常小的 k 值往往会导致过度拟合,因为模型对于训练集来说过于具体,并且不能很好地概括。另一方面,k 值非常大的模型在训练集和测试集上都不是很好的预测器。他们往往吃不饱。
kNN 简单且易于解释。它不做任何假设,因此可以在非线性任务中实现。随着数据点数量的增加,kNN 变得非常慢,因为模型需要存储所有的数据点。因此,它也不是内存高效的。kNN 的另一个缺点是它对异常值很敏感。
6.决策图表
决策树是一种监督学习算法。它通过反复提问来划分数据点(即行)。
(图片由作者提供)
分割不是随机确定的。选择导致最高信息增益的那些。增加节点纯度的分割更能提供信息。
节点的纯度与该节点中不同类的分布成反比。要问的问题是以增加纯度或减少杂质的方式选择的。
算法不断提问,直到所有节点都是纯的。纯节点仅包含一个特定类别的观测值。然而,这将是一个过于具体的模型,不能很好地概括。如果不对深度设置限制,决策树算法很容易溢出。树的深度由 max_depth 参数控制。
决策树算法通常不需要归一化或缩放特征。它也适用于处理混合的要素数据类型(连续、分类、二进制)。
7.随机森林
随机森林是一种监督学习算法。随机森林是结合了一种叫做装袋技术的决策树的集合。
在 bagging 中,决策树被用作并行估计器。并行组合多个决策树大大降低了过度拟合的风险,并产生更加精确的模型。
随机森林的成功高度依赖于使用不相关的决策树。如果我们使用相同或非常相似的树,总体结果将不会比单个决策树的结果有太大的不同。随机森林通过自举和特征随机性来实现不相关的决策树。
Bootsrapping 是从带有替换的训练数据中随机选择样本。它们被称为 bootstrap 样本。
通过为随机森林中的每个决策树随机选择特征来实现特征随机性。可以使用 max_features 参数控制随机森林中每棵树使用的要素数量。
随机森林算法的工作原理(图片作者提供)
随机森林是许多不同问题的高度精确的模型,不需要标准化或缩放。
8.梯度推进决策树(GBDT)
GBDT 是一种监督学习算法,它是通过将决策树与一种称为 boosting 的技术相结合而构建的。因此,GBDT 也是一种系综方法。
Boosting 是指将一个学习算法串联起来,从许多顺序连接的弱学习器中实现一个强学习器。
每棵树都试图最小化前一棵树的错误。boosting 中的树是弱学习器,但是连续添加许多树,并且每个树集中于前一个树的错误,使得 boosting 成为高效且准确的模型。与装袋不同,增压不涉及自举取样。每次添加新树时,它都适合初始数据集的修改版本。
GBDT 算法的工作原理(图片作者提供)
由于树是按顺序添加的,boosting 算法学习起来很慢。在统计学习中,学习速度慢的模型表现更好。
学习率和 n 估计量是 GBDT 的两个关键超参数。学习率,表示为α,简单地表示模型学习的速度。每个新的树修改整个模型。修改的幅度由学习速率控制。N_estimator 是模型中使用的树的数量。如果学习率低,我们需要更多的树来训练模型。然而,我们需要非常小心地选择树的数量。使用太多的树会产生过度适应的高风险。
与随机森林相比,GBDT 在分类和回归任务上都非常高效,并且提供了更准确的预测。它可以处理混合类型的特征,并且不需要预处理。GBDT 要求仔细调整超参数,以防止模型过度拟合。
GBDT 算法非常强大,已经实现了许多升级版本,如 XGBOOST、LightGBM、CatBoost。
9.LightGBM
由微软研究人员创建的 LightGBM 是梯度推进决策树的一种实现。
决策树是通过基于特征值拆分观察值(即数据实例)来构建的。决策树就是这样“学习”的。该算法寻找导致最高信息增益的最佳分割。
寻找最佳分割是决策树学习过程中最耗时的部分。随着数据量的增加,这成为一个瓶颈。LightGBM 旨在解决这个效率问题,尤其是对于大型数据集。
为了解决这个问题,LightGBM 使用了两种技术:
- 梯度单侧采样
- EFB(独家功能捆绑)
我不会详细介绍,但我写了一篇更详细的文章来解释 LightGBM 是如何工作的。
10.CatBoost
Yandex 的研究人员创建的 LightGBM 是梯度增强决策树的另一种实现。
由于我们已经介绍了 GBDT,我将只提及 CatBoost 的特征。
CatBoost 实现了一个特定版本的增强,称为有序增强。它为处理过拟合提供了一种更好的方法。CatBoost 在处理分类特征方面也有很好的性能。另一个与众不同的特点是使用对称树。
官方文档和本教程为理解和使用 CatBoost 算法提供了全面的指导。
11.XGBoost
XGBoost 是 GBDT 的另一个实现。它如此强大,以至于统治了一些主要的 kaggle 比赛。XGboost 的目标,正如它在文档中所说,“是将机器的计算极限推向极致,以提供一个可伸缩的、可移植的和精确的库”。
XGBoost、LightGBM 和 CatBoost 的一个共同特征是它们需要仔细调整超参数。模型的性能很大程度上取决于选择最佳的超参数值。
例如,下面是 XGBoost 模型解决多类分类任务的典型超参数列表。
params_xgb = {
'boosting_type': 'dart',
'objective':'multi:softmax',
'num_class':9,
'max_depth':7,
'min_child_weight':20,
'gamma':1,
'subsample':0.8,
'colsample_bytree':0.7,
'tree_method':'hist',
'eval_metric':'mlogloss',
'eta':0.04,
'alpha': 1,
'verbose': 2
}
- Max_depth:一棵树的最大深度。
- Min_child_weight:一个孩子所需的实例权重的最小总和。将它保持在较高的位置可以防止孩子过于具体,从而有助于避免过度适应。
- Gamma:在树的叶节点上进行进一步划分所需的最小损失减少。同样,游戏越大,模型越不可能过度拟合。
- 子样本:在生长树之前随机选择的行的比率。子样也可以用来避免过度拟合。
- Eta:学习率。保持较高的值会使模型快速学习,但同时也会增加过度拟合的机会。
- α:L1 正则化项。
XGBoost 的整个超参数列表可以在这里找到。
12.k 均值聚类
K-means 聚类是一种无监督学习算法。它旨在将数据划分为 k 个簇,使得同一簇中的数据点相似,而不同簇中的数据点相距较远。因此,它是一种基于分区的聚类技术。两点的相似性由它们之间的距离决定。
值得注意的是,这不同于我们为训练集中的数据点附加标签的分类。在聚类分析中,数据点没有标签。该算法被期望找到数据内的结构,以将数据点分组到聚类中。
K-means 聚类试图最小化一个类内的距离,最大化不同类之间的距离。
k-means 聚类的最大挑战是确定聚类数目的最优值。该算法无法确定聚类的数量,因此我们需要指定它。
初始数据点(图片由作者提供)
数据点被分组为簇(图片由作者提供)
K-Means 聚类相对较快且易于解释。它还能够以一种智能的方式选择初始质心(聚类中心)的位置,从而加快收敛速度。
13.分层聚类
分层聚类是一种无监督的学习算法。它通过迭代分组或分离数据点来创建聚类树。有两种类型的分层聚类:
- 凝聚聚类
- 分裂聚类
两种类型的层次聚类(图片由作者提供)
凝聚法是最常用的方法。每个数据点首先被假定为一个单独的聚类。然后迭代地组合相似的聚类。
层次聚类的优点之一是我们不必预先指定聚类的数量。但是,将所有数据点合并到一个聚类中是不明智的。我们应该在某个时候停止组合集群。
分层聚类总是生成相同的聚类。k-均值聚类可能会产生不同的聚类,这取决于质心(聚类的中心)是如何开始的。然而,与 k-means 相比,它是一种较慢的算法。运行分层聚类需要很长时间,尤其是对于大型数据集。
14.DBSCAN 聚类
基于分区和层次聚类技术对于正常形状的聚类非常有效。然而,当涉及到任意形状的聚类或检测异常值时,基于密度的技术更有效。
DBSCAN 代表den sity-basssclustering ofa应用与 n oise。它能够找到任意形状的聚类和带有噪声的聚类(即异常值)。
任意形状的集群(图片由作者提供)
DBSCAN 背后的主要思想是,如果一个点靠近来自该簇的许多点,则该点属于该簇。
DBSCAN 有两个关键参数:
- eps :指定邻域的距离。如果两点之间的距离小于或等于 eps,则认为这两点是相邻的。
- minPts: 定义一个聚类的最小数据点数。
基于这两个参数,点被分类为核心点、边界点或异常点:
- **核心点:**如果一个点在其半径为 eps 的周围区域内至少有 minPts 个数的点(包括该点本身),则该点为核心点。
- **边界点:**如果一个点可以从一个核心点到达,并且其周围区域内的点数少于 minPts,那么这个点就是边界点。
- **离群点:**如果一个点不是核心点并且从任何核心点都不可达,那么这个点就是离群点。
DBSCAN 不需要预先指定簇的数量。它对异常值是鲁棒的,并且能够检测异常值。
在某些情况下,确定适当的邻域距离(eps)并不容易,这需要领域知识。
15.主成分分析
PCA 是一种降维算法,它基本上从现有的特征中获得新的特征,同时尽可能多地保留信息。PCA 是一种非监督学习算法,但它也广泛用作监督学习算法的预处理步骤。
PCA 通过查找数据集中要素之间的关系来获取新要素。
PCA 是一种线性降维算法。也有非线性方法可用。
PCA 的目的是通过使用较少的特征(或列)尽可能多地解释原始数据集中的差异。新的派生特征称为主成分。主成分的顺序根据它们所解释的原始数据集的方差分数来确定。
主成分是原始数据集特征的线性组合。
PCA 的优点是使用比原始数据集少得多的特征保留了原始数据集的大量差异。主成分是根据它们解释的方差大小排序的。
结论
我们已经介绍了数据科学领域中最常用的机器学习算法。我试图为每个模型提供一个体面的介绍。为了掌握每种算法,你需要更深入一点,也需要练习。
感谢您的阅读。如果您有任何反馈,请告诉我。
15 个必须知道的 Python 字符串方法
这并不总是关于数字。
Python 是一门伟大的语言。它相对容易学习,语法直观。丰富的库选择也有助于 Python 的流行和成功。
然而,这不仅仅是关于第三方库。Base Python 还提供了许多方法和函数来加速和简化数据科学中的典型任务。
在本文中,我们将介绍 Python 中的 15 个内置字符串方法。你可能已经对其中一些很熟悉了,但我们也会看到一些罕见的。
这些方法是不言自明的,所以我将更多地关注示例来演示如何使用它们,而不是解释它们做什么。
1.大写
它使第一个字母大写。
txt = "python is awesome!"txt.capitalize()
'Python is awesome!'
2.上面的
它使所有的字母大写。
txt = "Python is awesome!"txt.upper()
'PYTHON IS AWESOME!'
3.降低
它让所有的字母都变成小写。
txt = "PYTHON IS AWESOME!"txt.lower()
'python is awesome!'
4.Isupper
它检查是否所有的字母都是大写的。
txt = "PYTHON IS AWESOME!"txt.isupper()
True
5.Islower
它检查是否所有的字母都是小写的
txt = "PYTHON IS AWESOME!"txt.islower()
False
下面的 3 个方法是相似的,所以我将做包括所有这些方法的例子。
6.Isnumeric
它检查是否所有的字符都是数字。
7.伊萨法
它检查是否所有的字符都在字母表中。
8.伊萨勒姆
它检查所有字符是否都是字母数字(即字母或数字)。
# Example 1
txt = "Python"print(txt.isnumeric())
Falseprint(txt.isalpha())
Trueprint(txt.isalnum())
True
# Example 2
txt = "2021"print(txt.isnumeric())
Trueprint(txt.isalpha())
Falseprint(txt.isalnum())
True
# Example 3
txt = "Python2021"print(txt.isnumeric())
Falseprint(txt.isalpha())
Falseprint(txt.isalnum())
True
# Example 4
txt = "Python-2021"print(txt.isnumeric())
Falseprint(txt.isalpha())
Falseprint(txt.isalnum())
False
9.数数
它计算给定字符在字符串中出现的次数。
txt = "Data science"txt.count("e")
2
10.发现
它返回给定字符在字符串中第一次出现的索引。
txt = "Data science"txt.find("a")
1
我们还可以找到一个字符的第二次或其他出现。
txt.find("a", 2)
3
如果我们传递一个字符序列,find 方法返回序列开始的索引。
txt.find("sci")
5
11.开始于
它检查字符串是否以给定的字符开始。我们可以在列表理解中使用这种方法作为过滤器。
mylist = ["John", "Jane", "Emily", "Jack", "Ashley"]j_list = [name for name in mylist if name.startswith("J")]j_list
['John', 'Jane', 'Jack']
12.末端
它检查字符串是否以给定的字符结尾。
txt = "Python"txt.endswith("n")
True
endswith 和 startswith 方法都区分大小写。
txt = "Python"txt.startswith("p")
Falsetxt.startswith("P")
True
13.替换
它用给定的字符集替换字符串或字符串的一部分。
txt = "Python is awesome!"txt = txt.replace("Python", "Data science")txt
'Data science is awesome!'
14.裂开
它在出现指定字符的位置拆分字符串,并返回包含拆分后每个部分的列表。
txt = 'Data science is awesome!'txt.split()
['Data', 'science', 'is', 'awesome!']
默认情况下,它在空格处分割,但我们可以根据任何字符或字符集来分割。
15.划分
它将一个字符串分成 3 部分,并返回包含这些部分的元组。
txt = "Python is awesome!"
txt.partition("is")
('Python ', 'is', ' awesome!')txt = "Python is awesome and it is easy to learn."
txt.partition("and")
('Python is awesome ', 'and', ' it is easy to learn.')
partition 方法正好返回 3 个部分。如果用于分区的字符多次出现,则考虑第一个字符。
txt = "Python and data science and machine learning"
txt.partition("and")
('Python ', 'and', ' data science and machine learning')
我们也可以通过限制拆分的数量来对拆分方法进行类似的操作。但是,也有一些不同之处。
- split 方法返回一个列表
- 返回的列表不包括用于拆分的字符
txt = "Python and data science and machine learning"
txt.split("and", 1)
['Python ', ' data science and machine learning']
奖金
感谢 Matheus Ferreira 提醒我最伟大的字符串方法之一:join。我也使用 join 方法,但是我忘记在这里添加了。它理应作为额外奖励进入榜单。
join 方法将集合中的字符串组合成一个字符串。
mylist = ["Jane", "John", "Matt", "James"]"-".join(mylist)'Jane-John-Matt-James'
让我们也用一个元组来做一个例子。
mytuple = ("Data science", "Machine learning")" and ".join(mytuple)'Data science and Machine learning'
结论
在执行数据科学时,我们会大量处理文本数据。此外,文本数据比普通数字需要更多的预处理。幸运的是,Python 的内置字符串方法能够高效、流畅地执行这些任务。
最后但同样重要的是,如果你还不是的中级会员,并打算成为其中一员,我恳请你使用以下链接。我将从你的会员费中收取一部分,不增加你的额外费用。
https://sonery.medium.com/membership
感谢您的阅读。如果您有任何反馈,请告诉我。
每个数据科学家都必须知道的 15 个数字功能
讨论开发人员必须学习的十五个最基本的数字函数
JESHOOTS.COM在 Unsplash 上拍照
机器学习的很大一部分是处理数学运算。由于数学是大多数数据科学项目中不可或缺的一部分,对于初学数据的科学家来说,更深入地研究以下主题变得至关重要。Python 是数据科学的最佳编程语言之一,它提供了一个非常有用的工具,那就是 numpy 库。
数值 Python (NumPy)是大多数机器学习和数据科学项目的精华部分。这些 numpy 阵列在计算机视觉的应用中找到了它们的效用,用于处理图像并根据阵列来计算它们。他们还发现,在数组的向量化过程中,自然语言处理任务得到了大量使用,从而使它们与训练 ML 或 DL 模型兼容。
借助 NumPy 数组,您可以相对轻松地完成大多数数学计算。它是大多数与线性代数和计算其他类似操作相关的任务的最佳库。但是,为了简化与 Python 库的集成和区别,您还必须查看另一个库。从下面提供的链接中查看如何使用 sympy 来简化积分和微分。
这篇文章是一个初学者指南,介绍了 15 个必须知道的 numpy 功能,这些功能对各种操作都非常有益。我们将尝试涵盖大部分重要的内容,但还有很多内容需要探索。因此,让我们从作为数据科学爱好者需要学习的所有基本功能开始。
1.创建数组:
x = [1, 2, 3, 4, 5]
y = np.array(x)
y
输出:数组([1,2,3,4,5])
每个计划掌握 numpy 的数据科学家必须知道的第一个基本步骤是如何创建一个。当您可以创建一个数组时,您可以操纵它们来执行许多操作。要创建数组,可以用多种方法执行以下计算。一种方法是使用 Python 中的 list 数据结构存储数值,然后用 numpy 以数组的形式解释它们。
也可以通过使用 np.array()或 np.asarray()函数声明 numpy 数组,后跟方括号来创建一维或多维数组,从而定义数组。一旦创建了这些数组,就可以对它们执行各种操作。在接下来的几节中,让我们看看通常对数组执行什么操作。
2.阵列的形状:
a = np.array([[1, 2, 3], [2, 3, 4]])
print(a.shape)
输出:(2,3)
数组的一个基本概念是它们存在的各种形状。numpy 数组的形状决定了可以对其执行的不同类型的计算和操作。一旦创建了特定的数组,就可以解释 numpy 数组的形状。的。数组的 shape 属性将返回其特定形状的元组。
在 numpy 数组中必须理解的重要主题是 N 维(或 nd 数组)的概念。这些数组具有多个维度(不是行或列维度),包含相同大小和类型的项。n 维数组最常用于执行各种数学运算。
3.数组索引:
a = np.array([[1, 2, 3], [2, 3, 4]])
print("The middle elements are:", a[0][1], "and", a[1][1])
输出:中间的元素是:2 和 3
类似于列表的索引,我们也有一个索引数组的方法来执行和操作 numpy 数组中特定位置的特定元素。使用数组索引,我们可以访问任何知道其位置的所需元素。
在上面的示例中,我们试图从 shape (2,3)的特定数组中接收中间元素的值。数组中的第一个元素从初始索引零开始。特定的行号和列号在方括号中指定,这将允许用户计算数组的索引并接收元素的特定位置。
4.数组切片:
a = np.array([[1, 2, 3], [2, 3, 4]])
print(a[1:2])
输出:[[2 3 4]]
我们可以在类似于列表的 numpy 数组上执行的另一个很酷的操作是切片的概念。在这种技术中,我们试图从特定的 numpy 数组中只获取所需的元素。对于上面显示的示例代码块,我们试图通过相应地切掉第一行来只获取第二行的所有元素。
我建议您自己探索更多这种对 numpy 数组进行切片的操作。尝试许多切片操作,观察不同的结果。还建议您从下面的链接中查阅我以前的一篇关于掌握 Python 中的列表的文章,因为它将帮助您更好地理解索引和切片。
5.数组乘法:
a = np.array([1, 2, 3])
b = np.array([[2],[1], [0]])print(np.matmul(a, b))
输出:[4]
使用 numpy 数组,可以非常简单地计算矩阵的乘法。在上面的例子中,我们注意到形状为 1 X 3 和 3 X 1 的特定数组相乘得到 1 X 1 矩阵的输出结果。使用 numpy 数组可以进行多次这样的计算。
6.点积:
a = np.array([1, 2, 3])
b = np.array([[2],[1], [0]])print(np.dot(a, b))
输出:[4]
numpy 数组可能实现的另一个重要计算是寻找两个变量的点积。点积本质上是两个特定数组的所有倍数之和。点积的概念在机器学习中无处不在。一个例子是权重计算或计算成本函数的用例。
根据下面的参考 , matmul
在两个重要方面不同于dot
。
- 不允许标量乘法。
- 矩阵堆叠一起广播,就好像矩阵是元素一样。
7.数组中元素的总和:
a = np.array([1, 2, 3])print(np.sum(a))
产出:6
计算 numpy 数组中众多元素的总和是一项非常有用的任务,可以借助本库提供的 sum 函数来完成。如果您要在列表的帮助下执行类似的操作,您可能会使用 for 循环来遍历列表中的所有元素,并相应地添加它们。这种方法会增加整体的复杂性,因此,最好使用 numpy 数组来进行这种数学计算。
作为奖励,我想提到另一种方法,它在列表的帮助下执行这种计算,同时保持时间和空间的复杂性。这个操作是在 Python 中的匿名函数的帮助下执行的。您可以利用 functools 库来导入 reduce 函数。导入后,您可以利用这个高级函数在一行中计算整个计算。
from functools import reducea = [1, 2, 3]
sum = reduce(lambda x, y: x+y, a)
print(sum)
如果您想了解更多关于使用多个代码和示例理解高级函数的主题,请随意查看下面的文章。它更详细地介绍了具体的概念。
8.平均:
a = np.array([1, 2, 3])print(np.mean(a))
输出:2.0
Numpy 还允许开发人员相对容易地计算特定数组的平均值。通过将所有元素相加并将总和除以指定数组中存在的元素总数来对平均值进行置换。平均值的计算在若干机器学习算法中是重要的,例如用于计算均方误差的线性回归。
9.幂运算:
x = 5
print(np.exp(x))
输出:14860 . 486868686866
机器学习中执行的一个重要操作是取幂操作。欧拉数“e”的值约为 2.718,在基数对数计算中具有重要意义。因此,该函数有时用于执行数学运算。另一个要考虑的类似函数是 numpy 中可用的 pi 操作。
一个非常流行的使用求幂运算的场景是定义一个 sigmoid 函数。上图是以下内容的代表。要了解更多关于这种激活功能的信息,我推荐从下面的链接中查看我以前的一篇关于一种叫做校正线性单元的流行激活的文章。
10.展平数组:
a = np.array([[1, 2, 3], [2, 3, 4]])
a = np.ndarray.flatten(a)
print(a.shape)
输出:(6,)
每当我们处理多维数据时,我们可能需要为特定的任务展平它们。numpy 中的 flatten 函数将帮助您将 n 维数组缩减为单个实体。数据科学家必须探索的其他类似函数是 numpy 中可用的扩展维度或压缩维度函数。
11.阿兰格:
a = np.arange(5, 15, 2)
a
输出:数组([ 5,7,9,11,13])
arange 函数用于创建通常以指定间隔均匀分布的数组。您可以分别描述起点、终点和步数,以生成所需形状的任何 numpy 数组。要使用 numpy.arange()函数创建所需形状的多维数组,请确保使用 reshape 函数。
12.对数组排序:
a = np.array([3, 1, 2, 5, 4])
np.sort(a)
输出:数组([1,2,3,4,5])
当我们有一个混排值的数组,并且我们想把它们全部按升序排列,也就是说,按数字的升序排列时,sort 函数就相当有用了。虽然也可以对列表执行类似的操作,但值得注意的是,这种操作在 numpy 数组中也是可能的。
在执行各种操作时,您可能会遇到向特定的 numpy 数组追加更多元素的情况,但是一旦您获得了一个值列表,您可能会希望将它们全部排序在一起,以便相应地标识值。在这种用例中,sort()函数非常方便。
13.随机排列:
np.random.rand(2, 2)
输出:数组([[0.21886868,0.09692608],
,[0.60732111,0.85815271]])
numpy 库还允许用户随机生成和创建带有随机值的数组。这个功能类似于 Python 中的随机库。但是,numpy 版本的 random.rand()函数,可以生成 n 维数组来执行大量的计算和运算。
在机器学习和深度学习中,随机数字运算通常用于的一个关键操作是,当我们想要用随机值初始化一堆权重或偏差时。通常,最好的方法是用一个随机值而不是零来初始化某些值。为了通过比例抽样的例子理解随机性的概念,建议您阅读下面的文章。
14.最小值、最大值和绝对值:
a = np.array([1, 2, -3, 4, 5])
print(np.min(a))
print(np.max(a))
print(np.abs(a))
输出:-3
5
[1 2 3 4 5]
看看我们可以用 numpy 数组执行的其他一些基本操作,找出特定 numpy 数组的最小值、最大值和绝对值。np.min()和 np.max()函数是不言自明的,因为这些操作分别用于计算给定 numpy 数组中的最小值和最大值。
其他两个函数返回一个值,或者是一个最小值或者是一个最大值,而 absolute 函数将返回一个数组。但是,返回的所有基值都不考虑负号。我建议用户尝试的其他类似功能是对天花板、地板和其他类似操作的操作。
15.三角函数:
print(np.sin(np.pi/3.))
print(np.cos(np.pi/3.))
产量:0.8660254037844386
0.50000000001
除了使用 numpy 数组完成的所有特殊任务之外,您还可以使用这个库执行三角运算。在上面的例子中,我们对正弦和余弦进行了 60 度的简单三角运算,以获得它们各自的结果。随意探索其他类似的三角函数。
结论:
没有数学,你什么也做不了。你周围的一切都是数学。你周围的一切都是数字。 —夏琨塔拉·戴维
Numpy 是 Python 中可用于各种任务的最好的库之一。虽然机器在文本或视觉信息方面不是最好的,但当这些信息在 numpy 的帮助下被转换成数学阵列时,许多关键任务的计算就成为可能。除了提高兼容性之外,完成某些任务也变得更加容易。因此,numpy 是数据科学家必须努力掌握的最好的库之一。
在本文中,我们了解了每个数据科学家都必须了解的十五个最基本的 numpy 功能。虽然我们讨论的一些函数是可以在 numpy 数组上执行的许多活动,如整形、索引和切片,但其他函数是我们可以在 numpy 数组上执行的各种计算。其中包括 sum()、mean()、arange()和其他类似的运算。
使用这些 numpy 数组,您可以尝试更多的东西。确保探索和深入挖掘以下主题。如果你对这篇文章中提到的各点有任何疑问,请在下面的评论中告诉我。我会尽快给你回复。
看看我的其他一些文章,你可能会喜欢读!
</17-must-know-code-blocks-for-every-data-scientist-c39a607a844d> </6-best-projects-for-image-processing-with-useful-resources-f860f3dfe977> </7-best-free-tools-for-data-science-and-machine-learning-3e630125f87e> [## 数据科学和机器学习的 7 个最佳免费工具
towardsdatascience.com](/7-best-free-tools-for-data-science-and-machine-learning-3e630125f87e) </6-best-programming-practices-f2605c5b469c>
谢谢你们坚持到最后。我希望你们都喜欢这篇文章。祝大家有美好的一天!
我在数据科学候选人中寻找的 15 样东西
给任何寻找或招聘数据科学工作的人的建议
宏向量创建的办公向量—www.freepik.com
数据科学一如既往地受欢迎,但矛盾的是,它似乎比以往任何时候都更加支离破碎,定义也更加模糊。对于新人来说,想知道如何进入这个领域可能是相当困难的,也许更困难的是,经理们想知道如何招聘职位,除非你确切地知道你在寻找什么。
在这篇文章中,我总结了我对数据科学候选人的看法。免责声明:这些是我在生物技术和制药公司工作时的想法,在这些公司,数据科学是支持功能的*,而不是业务的核心部分;也就是说,不是那种专门从事销售预测人工智能架构的职位*,而是你必须端到端地工作,在多个业务领域创造价值的职位。**
1.激情与好奇
当然,激情和好奇心是任何从事技术工作的人都需要的品质。数据科学是一头巨兽,我认为它是这个特定领域中更普遍的先决条件。在许多其他技术领域,你可以专注于一套技能,并利用这些技能连续多年推动商业价值——也许需要每隔 X 年学习一种新的编程语言或工具。然而,数据科学本质上是一门每天都在发展的科学学科。
热情的候选人不断研究新的数据科学发展并与团队分享,这具有巨大的价值。
此外,候选人需要一定程度的热情和坚韧,才能继续希望在数据科学领域工作,而不是一直在沮丧中跳槽;调试为什么一个算法不工作可能比调试为什么一个软件或基础设施不工作更复杂和令人沮丧。你需要成为一个特殊的疯子,才能多次经历这些挫折。🤷♂正如我之前所说的:
如果选择站在一个普通的资深数据科学家和一个眼中充满激情的候选人之间,在其他条件相同的情况下,选择后者。
如果你对数据科学没有热情,就不要进入它;不值得。来自 xkcd.com 的漫画
2.心智能力
数据科学作为一种职业并不适合所有人。我们应该停止假装它是。最近,Alberto Romero 就这个话题写了一篇有趣的帖子,描述了许多人的谬论;如果你付出足够的努力,你可以成为一名数据科学家。这不是真的。这是一项艰巨的工作:
你需要理解数学和算法,你需要做编码和软件开发,你需要理解商业问题,和你需要有良好的讲故事和人际交往能力。不是每个人都能做好所有这些事情,甚至做得更好。
我不是说你需要 130+的智商才能成为数据科学家。我也不想吓唬任何人不要转向数据科学。相反,如果你现在处于另一个学术水平的位置,你可能会在数据科学领域做得很好。但是如果你处在智商钟形曲线的低端,努力理解新概念和新过程,这确实是一场艰苦的战斗;不断学习新事物和挑战现状是数据科学工作的基本内容。注意,我在这里不是在谈论使用低代码/无代码工具的公民数据科学家。
你不必是天才,但一定程度的智力是必需的。来自xkcd.com的漫画
3.转化为 ML 问题的能力
擅长工程机器学习(ML)算法是一回事。善于理解商业问题是另一回事。但是合并这两者并找出如何用 ML 解决商业问题是完全不同的事情。
你需要能够将现实世界的问题转化为你能够解决的机器学习问题。
最近 Brian Kent 写了一篇很棒的帖子更详细地描述了数据科学的这个方面。本质上,当你作为一名数据科学家工作时(至少在我做过的职位上),你将很少得到“这是你的数据集,适合这个目标的回归模型”类型的任务更常见的是,您会面临如下业务问题:
- “我们希望利用一些新的人工智能技术来改善我们的现金流,”
- "我们想用毫升把这种化学品的产量提高 10% . "
- “我们想提高这个或那个过程/机器的效率.”
将这些现实世界的目标转化为可解决的 ML 问题是一项被极度低估的技能——你需要对相关的业务流程和可用的数据有一个透彻的理解,你需要一个坚实的基础,知道 ML 实际上能做什么,最后,你需要一个良好的直觉,知道如何应用不同的技术来有效地解决手头的业务目标。
这种技能很少,但是你可以练习,例如,通过熟悉大量的 ML 应用程序,并花时间思考这类问题。
什么数据?什么型号?弄清楚要解决什么并不容易。来自 xkcd.com的漫画
4.诚实和谦逊
想象一下:企业想要使用 AI/ML 来优化一些流程。他们很兴奋,你也很兴奋,每个人都期待看到结果。你做了一个模型,最初,它看起来很棒,每个人都举起了手。你随后意识到你在评估模型的方式上犯了一个错误,这实际上是可怕的——数据中根本没有信号*。*
如果你犯了错误,不管后果如何,你都需要成为完全负责并承认错误的人
会犯错误。我们都会犯错误。但是没有人会因为被掩盖的错误而受益,或者更糟糕的是,归咎于他人。在展示结果时,始终保持一定程度的谦逊,可以避免上述情况;如果它们是尚未经过同行验证的初步结果,那么在展示它们时要清楚地说明这一点。不要夸大其词。此外,一个优秀的候选人永远是自己最糟糕的批评家:
用你得出结论的时间来证明你自己的结论是错误的。这会建立信心。
诚实是数据科学的基石。漫画作者xkcd.com
5.自动化和优化
每个人都讨厌重复的任务。有些人非常讨厌它,以至于他们想尽一切办法让它自动化。我们一直在谈论诸如 autoML 和 GitHub copilot 之类的时髦东西,到自动化代码环境的设置和一般的一切代码,甚至自动化每日时间注册,等等。对我来说,自动化和优化是伟大的开发人员/数据科学家的一些标志性思维模式。
自动化一切。当有意义的时候。漫画作者xkcd.com
6.实用主义与价值追求
数据科学是一门科学学科。然而,当你被聘为数据科学家时,这份工作通常是关于应用数据科学工具来创造商业价值。很少是关于做研究,提出新算法,开拓新领域等等。有时候是,但很少。我们通常被雇佣来创造商业价值。
我们工作的目标是创造商业价值。
在从事工业数据科学工作时,你必须对这个总体目标持务实态度。我在之前的一篇文章中写了几个要避免的陷阱,这是我在这个行业中所学到的经验;您可以在此阅读更多信息:
*</20-lessons-learned-going-from-junior-data-scientist-to-chief-data-scientist-6fe09ff89d78>
总而言之,我认为务实的方法包括:
- 始终以客户为中心——如果业务不在船上,扼杀项目,它将永远不会创造价值。
- 创造和选择正确的想法——拒绝仅仅因为上级认为这是个好主意就去解决问题/想法。如果技术上不可行,你需要继续前进。
- 避免过度设计——如果一个更简单的方法可以用一半的时间解决问题,那就这样做。
- 专注于执行——不要陷入太多的陈述、讨论、如果这样会怎样、如果那样会怎样。开始做点什么。
我认为在 Medium 上有大量的读物可以帮助你成为一名更加务实的数据科学家。我最近很喜欢的这篇文章,作者是丹尼斯·艾勒斯,描述了如何在工作中变得更有效率和影响力,还有的这篇文章,作者是阿奇·德·伯克关于从学术界到工业界的转变。
务实,创造商业价值。不要专注于不创造价值的事情。漫画作者xkcd.com
7.个性与团队契合度
很明显,候选人的个性及其与团队其他成员的契合度非常重要。所有职位的所有候选人都是如此。这也是为什么许多公司都有人力资源部门,并在雇佣前做性格测试的部分原因。心理学家经常研究“五大”人格特质,我发现这对于评估你刚认识的人来说特别有见地。就这些性格特征而言,我认为有些是非常必要的,例如,一定程度的责任心(高效/有条理)、不友善(说出你的观点,不要做个傻瓜)外向(与企业交谈,举行演示等)。)、以及开放(研究新技术,干掉你的心肝宝贝)。然而,总的来说,我不认为数据科学家有一个“理想”的性格特征,所以这主要是一个避免有害性格的问题。
冷静点,友好点。漫画作者xkcd.com
8.编码经验
编码是数据科学的重要组成部分。通常,您编写的代码必须与同事共享才能投入生产,以便您和未来的同事可以在未来许多年内维护它。因此,一般软件开发和良好实践的经验是数据科学家最重要的素质之一。
如果另一个开发人员不得不花两倍的时间来审查和修复你写的代码,然后才能投入生产,那么你对团队是一种损害,而不是一种资产
请注意,我并不太关心不同的编码范例,也不关心您是喜欢笔记本还是纯脚本等等。这些是单个团队可以设定的标准。我说的是我如何看到初级开发人员编写完全可以理解并且可以在几分钟内审查的代码,我也看到有 30 多年经验的高级开发人员将 2 周的工作浓缩成 4 行难以理解的 R 代码。
如果你有一个公开的 Github 帐户,证明你可以用好的文档编写可理解的代码,这将是一个巨大的加分。
写别人能理解的代码。来自 xkcd.com 的漫画
9.调试技巧
我们经常开玩笑说,工作的一部分就是把所有的时间花在 StackOverflow 寻找代码片段上。虽然你可以用这种方式找到许多解决难题的优秀方案,但是调试的技巧远不止这些。
不要成为唯一的调试技能是堆栈溢出的人
在纯代码方面,您需要阅读文档来了解事情实际上是如何工作的,有时您甚至需要浏览您正在使用的任何开源库的源代码。在数据科学方面,事情会变得更加棘手;你可能需要通读论文,以了解事情应该如何工作,并从那里找出为什么它不工作——这可能真的是一种残酷的经历,尤其是因为人们如何实现算法的所有数字细节并不总是记录在代码或论文中。
我会发现更有趣的是看候选人如何调试一段破损的代码,而不是他们通过查看在线资源解决给定问题的能力。
调试是一种技能,也是一门艺术。漫画来自xkcd.com
10.适应性
适应性大概已经被务实和个性这两点涵盖了。即便如此,适应性是如此重要,以至于我想把它作为一个单独的点。这个领域发展很快,我们必须能够杀死我们的宝贝。在一个项目上花了几百个小时,结果却没有创造商业价值?杀了它。花了几百个小时用 Tensorflow,现在整个团队都想用 PyTorch?放下它,学习 PyTorch。花了几千个小时在 Python 上,但现在对你正在做的事情来说还不够?放下它,学习一门足够的新语言。不要纠结于你做某事花了多少时间;那只会让你慢下来。
你停止适应的那一天,就是你开始输掉数据科学游戏的那一天
保持开放的心态,保持适应性。xkcd.com漫画
11.全堆叠势
我已经在前面的中描述了我认为典型的数据科学建议是非常糟糕的建议,这种建议是为了避免成为“万事通,无所不能”。相反,一个人应该努力成为“万事通,几个大师”
不要回避“数据科学独角兽”的想法,而是努力成为其中一员。
也就是说,我永远不会寻找数据科学独角兽;人才库太匮乏,定义太不清晰。然而,我要做的是筛选那些抱怨“不可能成为数据科学独角兽”的人。在我的书中,这种在行业中相当普遍的说法是有毒的,表明了对弄脏自己的手和完成事情的厌恶。
自然,你不需要成为一名成熟的前端/后端开发人员和云/数据工程师。但我发现,对涉足其他领域持开放态度的人在交付成果方面要有效得多。
即使你可能不会成为大师,也要对扩展你的视野保持开放。来自 xkcd.com 的漫画
12.背景
当涉足数据科学时,拥有生物信息学、量子物理学或其他科学领域的背景显然是有利的;这意味着你习惯于阅读研究论文,以前做过统计分析,可能会一点编程,等等。然而,接受良好的教育绝不是必要条件。只不过是几年的结构化学习。但是很自然的,你以前做过的事情和取得的成就在申请新工作时会被考虑。
在其他条件都相同的情况下,我会雇用一个从一无所有到接受过任何高级教育的人。
你的背景自然会影响你目前的技能。xkcd.com漫画
13.讲故事
这一点之前已经说过无数次了,所以我不会在这上面花太多时间,尽管它很重要:数据科学家需要讲一个好故事。是什么意思?学会创造吸引人的视觉效果,做漂亮的演示,进行引人入胜的谈话,写博客等。
你做得越多,并试图比上一次做得更好,你就会做得更好
学会讲有影响力的故事。来自xkcd.com的漫画
14.合作
我的一个弱点是我不太擅长合作——我想这是我在得到一份“真正的”工作之前已经一个人呆了 10 多年的结果。然而,这个事实让我更加欣赏那些善于合作的人;用数据科学创造商业价值是一个团队纪律,因此你必须善于与包括以下内容的一切合作;结对编程、适当的文档、明智的 git 提交、冲刺计划、回顾等等。这种体验绝对是优势!如果你是协作的新手,找一个有趣的开源项目并参与进来。
你需要能够在团队中工作!数据科学不能做一个人的军队。漫画作者xkcd.com
15.数据科学经验
我清单上的最后一点是实际的数据科学经验。自然,如果候选人接触过该领域内的各种学科,这是有利的;与计算机视觉、自然语言处理、预测、经典的监督/非监督技术、通用深度学习等相关。
根据我的经验,你很少会多次得到“同一个”任务。因此,拥有尽可能广泛的知识库是一个优势——有一天,你可能在做销售预测,另一天,你可能在预测分子的化学性质或优化生产过程。如果我是为了销售预测而招聘,如果候选人以前从未做过销售预测,如果这个人有做其他类型的机器学习的长期历史,我不会太担心。学习如何解决新问题只是工作中的一天。
获得广泛经验的门槛相对较低;积极参与一些不同领域的 Kaggle 竞赛,然后你应该开始有一个基本的了解。此外,通过这样做,你将建立一个你能做什么的投资组合。我不是说这个容易做*,*只是说入门容易。在这个过程中,每当你遇到一个新的概念时,一定要确保你能完全理解它。
不要仅仅将算法作为黑盒来应用,而是让你明白它们实际上在做什么。
你在游戏中的时间越长,你获得的经验越多;我们都在不断学习。来自 xkcd.com的漫画
结束语
最后我写了一篇相当长的帖子。如果你已经通读了全部,我感谢你🍾我意识到许多提出的观点将适用于许多职业,特别是当涉及到类似的工作时,如数据工程、云工程等。以上是我从数据科学角度的思考。请注意,我从来不会期望一个初级开发人员完全符合所有提到的要点——相反,我会寻找一个能够成长为所有提到的要点的人。最后,我希望获得关于其他人在数据科学候选人中寻找什么的反馈,所以请随时发表评论或通过任何其他渠道联系。*
在数据科学领域取得更大成功的 15 个技巧
意见
作为数据科学家,每个数据科学爱好者都必须努力提高的 15 个因素
吉尔·Á·阿尔瓦雷斯在 Unsplash 上的照片
“成功的人做不成功的人不愿做的事。不要希望它更容易;希望你更好。”
— 吉米·罗恩
数据科学已经成为过去十年中最受欢迎和最具突破性的学科之一。这一新兴趋势将在未来几年持续下去。数据科学正处于发展的巅峰,随着技术的快速发展和进步,数据科学将会在当今时代占据主导地位。
除了被视为向许多数据科学爱好者提供工作的主要前景之一,无论是数据科学还是它的任何其他子领域,数据科学也被称为 21 世纪最性感的工作机会之一。
为了用简单的术语为观众定义数据科学,我们可以将数据科学视为一个包含各种子领域的广阔领域。这些概念的知识,当结合在一起时,可以有效地用于开发一些美好的和神话般的项目,为人类的整体利益。
数据科学包括使用可用的数据元素或数据集,并创建独特的发展模型。当这些模型完成时,我们可以有效地使用它们来解决它被编程来实现的特定任务。根据模型的质量和开发人员的技能,这些项目往往以极高的效率和准确性做出预测。
然而,来自维基百科的更正式的定义方法可以定义如下:
数据科学是一个跨学科领域,它使用科学的方法、流程、算法和系统来从许多结构化和非结构化数据中提取知识和见解。数据科学与数据挖掘、机器学习和大数据相关。数据科学是将统计学、数据分析及其相关方法统一起来,以便用数据来理解和分析实际现象的一个概念。
基本的正式定义和描述已经完成,现在是时候让我们关注 15 个技巧了,这些技巧将使该主题的每个爱好者更成功地成为未来的数据科学家。每个有抱负的数据科学学生都必须遵循本文中提到的步骤,以取得一流的成果,并提高自己,成为未来更好的数据科学家。在我们更深入地阅读本文之前,您需要确保您确实喜欢并享受数据科学。
当每个人都忙着跳上数据科学的宣传列车时,弄清楚数据科学是否是你喜欢学习的东西是极其重要的。如果您对数据科学的众多特性、功能和其他方面不感兴趣或着迷,那么您最好考虑掌握一个不同的领域。数据科学需要坚持不懈的努力和奉献精神,才能坚持不懈地开发出造福当代人和社会的令人惊叹的项目。
</10-wrong-reasons-to-become-a-data-scientist-319531bb874e>
在本文中,我们将尝试涵盖每个数据科学爱好者必须关注并发展其技能以实现最佳结果和成果的技术和心理方面。提到的 15 个要点中的大部分将使浏览者能够衡量一个方面,这是掌握数据科学的基本要求。对数据科学有了基本的了解,并对本文的目标有了现实的期望,让我们深入了解这些概念,并逐一理解这些技巧。
1.做好心理准备
“不做准备,就是在为失败做准备。” ——本杰明·富兰克林
数据科学或任何人工智能话题有时可能会很费力。特定问题的复杂性可能不会吸引你的大脑。你花在分析编程、数学、理论概念等几个方面的时间。,会让你的大脑紧张,产生一种糊里糊涂的感觉。
当你计划直觉地研究一个有趣的话题时,有几次你可能会对同一个话题失去兴趣。出现这些情况的一个主要原因可能是因为缺乏集中和专注,或者仅仅是因为你的思想还没有做好充分的心理准备来面对你计划实现的复杂程度。
因此,理清你的思路,专注于你计划完成的目标是非常重要的。作为一名数据科学爱好者,您的主要目标必须是生成高质量的模型和结果。确保提前计划好你的所有任务,以完美的方式接近你的目标。
在实施项目的过程中,我强烈建议制定一个待办事项清单,不断提醒你需要完成的各种任务,以便准确地完成你想要的结果。下面提供的链接是一个项目构想,它将帮助您实现一个提醒应用程序,该应用程序将不断提醒您执行任务。
基本上,努力保持动力,高度关注数据科学的积极方面。当你开始准备学习新的目标时,要更加乐观。无论您期望的最终结果是什么,都要做好接受失败的心理准备,并以绝对的信心和绝对的意志继续您掌握数据科学的旅程!
2.专门研究重要的课题
数据科学最重要的一个方面是研究该领域中众多重要的主题。试着花一些专门的时间来解码一个你可能喜欢研究、阅读或学习的特别有趣的话题。
例如,让我们考虑一个机器学习主题的例子,如逻辑回归。逻辑回归的概念在机器学习领域具有重要意义。因此,更好地掌握一个基本主题是很重要的。为了以最好的方式掌握这个概念,我强烈建议你深入研究逻辑回归的每个方面的复杂细节。
首先,尝试计算和分析大量可能的数学理论、假设和推导。了解更多关于几何,概率和其他方法的定义和推导。一旦你完成了所有必要的数学方面的分析,是时候继续进行编码和编程了。
下一步是尝试从零开始实现整个逻辑回归函数,而不使用像 scikit-learn 这样的外部库。在我以前的一篇文章中,可以看到一个不使用任何外部库(如 numpy)来实现数学问题(如矩阵乘法)的例子。下面提供了链接。
另一个重要的提示是,当你试图研究和学习某个特定的主题时,试着抓住你力所能及的所有可能的资源。要特别注意深入研究这些资源,以获得尽可能多的知识。
3.发展自信解决问题的任务
布鲁斯·马斯在 Unsplash 上的照片
在一个类似于数据科学的领域获得自信的最好方法是解决大量简单和复杂的问题。你的目标必须是付出 100%的努力来成功完成它们。无论你有多少学习数据科学的动机,在特定任务的计算中反复失败和失败的尝试都会导致动力下降,最终缺乏信心。
为了避免这种情况,一次考虑一个任务并在这段时间内解决特定的任务变得至关重要。总是从简单的编程任务或简单的数据科学项目开始,你有信心可以解决。
如果你在一个特定的问题上反复失败,不要浪费你的宝贵时间去做一些不必要的重复。这可能是一个更好的想法,向前看,在相同的时间框架内,不需要任何外部指导,你就可以潜在地解决其他问题。
此外,如果你能够对一个特定的主题进行广泛的学习、分析和研究,你最终会在解决问题时更加自信。这样做的原因是因为你对概念有一个直观的理解,以及对解决手头的任务有一个清晰和深入的理解。
4.花时间分析复杂的问题陈述
每个数据科学爱好者和追求者应该关注的第一个主要步骤是他们花在分析给定问题陈述或项目想法上的时间。利用你的时间去看问题的方向的最终目的是得到一个想法,并为解决这个问题建立一个框架。
在开始你的问题陈述或项目想法之前,通常最好的事情是确保你已经在你的头脑或一本书(一张纸也可以)或你的电脑上的目录中建立了一个完美的计划。规划是从事数据科学项目的重要阶段。因此,提前计划好所有的步骤来有效地开始你的工作。
我建议您花时间分析相应的问题,通常必须按照这些特定的步骤顺序如下:
- 试着获得对你计划处理的问题陈述的视觉感知和直觉理解。花几分钟到几小时的时间,直到你确信自己对如何完成任务有了基本的了解。
- 在开始着手一个项目或一个复杂的问题之前,看看一些解决方案或研究论文以及它们提供的有用信息。Kaggle 解决方案和笔记本是获取更多相关知识的绝佳来源。
- 在收集了大量的信息资源后,制定一个完美的计划和时间表来决定你处理问题陈述的计划。做一份完整的待办事项清单,它会指引你走上正确的道路,直到你的目标成功达成。
这些基本步骤将帮助你更好地分析你的项目。对于在 12 个月内掌握数据科学的学习计划,我强烈建议从下面提供的链接中查看下面的文章。是初学者入门的简明指南。
</12-steps-for-beginner-to-pro-in-data-science-in-12-months-c6f6ba01f96e>
5.致力于提高特定的数学和编程技能
编程和数学技能在掌握数据科学方面发挥着重要作用。虽然数学对于从直觉上和理论上理解与数据科学相关的各种概念是必不可少的,但编程对于这些主题各自的实际实现是至关重要的。
为了更深入地理解这两个领域(即编程和数学)的必要性,让我们分别看一下这两个方面并对它们进行分析。首先,我将查看与数学相关的提示,供所有级别的数据科学爱好者沉迷和学习。
数学是数据科学的重要组成部分。为了完美地利用掌握数据科学和机器学习所需的技能,数学是一个突出的优势。你需要主要关注数学的子领域,如线性代数、概率和统计以及降维技术。
线性代数对于理解数据科学的许多概念是必不可少的,尤其是像 numpy 这样重要的 python 库模块。为了更直观地理解 numpy,您还需要理解一些理论概念,比如点积、可以通过 numpy 数组计算的矩阵相关运算等等。
概率和统计对于数据科学也是至关重要的,因为这些领域的理论实现几乎被用于数据科学的每个方面。其中包括像朴素贝叶斯这样的机器学习算法,其中使用了条件概率的概念,或者在深度学习主题中,如生成式对抗网络(GANs)。
像主成分分析(PCA)和 t-分布随机邻居嵌入(TSNE)这样的降维技术也是有用的数学概念。它们用于将复杂的维度从大的视图框架减少到较小的维度范围。例如,这些技术可以用来将 MNIST 从 784 维转换到 100 维。
编程是数据科学最好的部分,它将为您的项目注入活力。因此,专注于编码将永远是你必须掌握的数据科学的一个组成部分。为了提高编程水平,作为初学者,您对数据科学领域的主要关注点应该仍然是 Python,其次是 SQL。
你可以在对数据科学这门学科建立了更简洁的理解之后,再去学习其他编程语言,慢慢完善你的简历。SQL 在数据科学中的重要性以及为什么应该给予它高度的优先权是因为它允许您存储大型数据库和数据信息集,这对于数据科学项目是至关重要的。
为了获得掌握数据科学 Python 的能力,我强烈推荐阅读下面的文章,其中包括从头开始掌握数据科学 Python 的十个步骤。这是一个循序渐进的指导过程,下面提供了链接。
</10-steps-to-master-python-for-data-science-f54199bb328d>
6.尝试多种可视化技术
作者图片
数据可视化在数据科学项目建设中发挥着重要作用。通过查看大量图像,我们可以确定我们所拥有的数据或数据集的一些基本特征和特性。
探索性数据分析是数据科学的一个重要方面,在处理任何类型的任务时都应该考虑。当你将数据可视化时,你获得了直观的理解,你的大脑可以感知到他们工作标准的各种概念。您还可以获得关于如何处理这些数据集的一些想法和反馈。
可视化的主要优势是,它们让您能够为您的数据科学项目探索最佳的直观想法。除了为开发中的项目提供基本的背景和工作空间之外,它们对于项目的长期集成和改进也很有用。
这些形象化对于你的理论工作的其他观众理解你的精确想法和为你解决特定任务的方法确定一个清晰的概念是有用的。这有助于你轻松地向他人解释你对当时正在从事的特定项目的观点。
任何数据科学项目的可视化都绝对可以改变游戏规则。我将确保在我的下一篇文章中更详细地讨论这个主题,因为数据可视化是一个庞大的主题,不能在这篇文章中讨论。请继续关注我即将发表的文章,在这篇文章中,我将讨论八种最佳可视化技术,以及如何在您的数据科学项目中利用它们。
7.奉献和坚持
处理数据并成功完成数据科学项目并不总是那么容易。在许多情况下,您可能会遇到复杂的任务,您将努力找出精确的模式或解决方案。
此外,对于数据科学爱好者来说,知道一个特定的概念却不能准确找到答案有时会变得非常沮丧。尽管你对题目有所了解,但有时你无法解决问题,这种情况发生在我们当中最优秀的人身上。
在这些令人沮丧的时期,似乎最好的选择是放弃数据科学,继续生活中更好的事情。然而,这里是奉献和坚持的地方。虽然数据科学可能令人沮丧,某些任务可能看起来很难处理和解决,但这并不是世界末日。
数据科学中最令人满意的时刻是当你能够用你的纯技能和努力解决这些复杂的问题的时候。当你能保持高昂的情绪并完成目标时,它还会给你肾上腺素激增和自信心的提升。
成功的数据科学家最重要的特征之一是他们能够坚持不懈地努力工作,直到达到目标。虽然很容易失去希望,但他们会继续努力,达到最优解。虽然,这个过程可能要花一些时间。
数据科学需要一些耐心和时间来完成特定的任务。特别是在深度学习领域,当你在构建一个特定的模型架构时,有太多不同的参数需要你考虑。
为您的特定任务定义具有许多层的模型体系结构,以及选择适当的激活函数和优化器,需要花费一些时间。老实说,要获得最好的结果和最优的解决方案,需要大量的尝试和方法。
因此,重要的是保持你的镇定,保持专注,直到你的目标达成。我强烈推荐通过下面的链接查看下面这篇关于成功数据科学家的五大品质的文章。
8.需要时寻求帮助
虽然我强调在数据科学项目上花费时间并继续工作,直到您获得最佳解决方案,但这并不表明您总能获得预期的结果。你猜怎么着?—那完全没问题。
在研究数据科学时,你并不意味着是一个完美主义者,老实说,没有人在这方面是完美的。作为数据科学家,进化是必修课。在某些时候,每个人都可能陷入困境,需要帮助以及如何处理问题陈述或任何其他疑问的指导。
当这样的时刻到来时,不要犹豫向更有经验的有志之士、爱好者、业余爱好者和专业人士寻求帮助。数据科学社区和 Python 社区充满了令人敬畏和惊奇的人,他们总是愿意提供帮助。
除了像 Stack Overflow 和 GitHub 这样非常有用并为数据科学家或数据科学爱好者遇到的大多数问题提供一些最佳解决方案的网站之外,像 discord chats 和 slack chats 这样的服务器。
互联网上有大量免费内容可供探索和检查关于数据科学和机器学习的大量细节和功能。查看我以前关于这个主题的一篇文章,了解更多关于一些潜在资源的信息,您可以从中利用信息并获得更多知识。
</10-best-free-websites-to-learn-more-about-data-science-and-machine-learning-f2c6d7387b8d>
你也可以根据你的舒适程度来选择一些免费或付费的课程。如果你对从事数据科学有百分之百的信心,并且你觉得你需要一些外部帮助或资源,确保你在这个主题上做了明显的研究。完成这些步骤后,您可以继续选择您认为对您的长期需求和要求有益的最佳选择。
无论哪种方式,只要你能从朋友、专家或老师那里获得帮助,确保你能获得同等的知识,这些知识是你在获得帮助时至少能完成特定的任务、问题或项目所需要的。以小组或两人一组的方式工作也是一个好主意,因为你们可以互相分享和传递有用的信息,每个人都可以从中受益匪浅。
9.阅读研究论文
威廉·艾文在 Unsplash 上的照片
阅读大量的研究论文!
在数据科学领域,随着不断进步和不断发展,有才华的人和数据科学家提出了创新的作品,并将它们作为研究论文发表。这些研究论文必须仔细查阅,并相应地练习。如果你是一个成功的数据科学家,我强烈建议你查看每周发布的研究论文。
虽然查阅和阅读研究论文应该是获得进一步知识的第一步,但这远远不够。如果你看到一篇关于建模体系结构的研究论文,并且对一个特定的结构是如何构建的有一个完整的解释,你应该自己探索这些概念。
如果您在研究论文中遇到的特定项目或工作是可行的,并且与您的设备兼容,那么开始探索架构构建并开始自己构建它总是一个好主意。如果你能够实现这些结构和模型,这将提高你的整体信心,并帮助你更有效地学习和掌握研究论文中涉及的主题。
除了获得研究论文中发表的特定主题的深入知识外,它还允许读者和从业者探索新技术,并与所有现代新兴趋势保持同步。在数据科学中,变化是永恒的。如果您能够适应数据科学领域的这些不断变化,您就可以完成几乎任何您试图执行的复杂任务或复杂项目。
10.休息一下
不要让你的头脑紧张,也不要让你的身体疲惫!
数据科学有时会很艰难,压力很大。你可能在一个问题上花了几个小时,按照前面提到的所有步骤,尽你所能努力工作,但仍然没有达到你希望达到的预期结果。在处理项目想法或数据科学中的任何一般问题时,很容易陷入困境,无论您遇到的特定问题有多简单或多困难。
对于每个数据科学家或数据科学爱好者来说,定期休息是一个好主意。总的来说,生活中要记住的一个重要方面是不要努力工作,而是要聪明地工作。虽然努力工作会在适当的时候得到回报,但前面的说法对数据科学来说比其他任何东西都更适用。这一评论的理由是因为数据科学是一个庞大的主题,在这个领域中有太多的主题需要学习。
然而,人们必须注意到,学习这个领域的每一个方面并不是一个强制性的要求。通过关注数据科学的基本主题和实现项目目标所需的特定概念就足够了。学习更多或对获得各种概念的进一步知识感兴趣没有坏处,但不要浪费时间在探索问题时陷入不必要的问题中。
我强烈推荐您阅读我以前的一篇文章,这篇文章略微深入地介绍了您必须关注的主题,以便尽快掌握数据科学。您可以通过下面提供的链接访问下面的文章。
有时候,当你在数据科学中处理一个特定的问题、任务或项目时,你可以多次短暂休息,除非你没有偏离你的主要目标。如果你在解决问题的过程中多次失败,那么暂停一项特定的任务也是完全可以的。
即使经过多次尝试,在获得一些额外的外部帮助后,如果你无法解决特定的任务,那么就专注于一些娱乐活动或爱好。不要因为失败的尝试而压力太大或伤透了脑筋。你已经发现了许多解决不了问题的方法,也通过不成功的尝试学到了很多。因此,保持乐观,当你的身体和大脑认为有必要的时候休息一下。
11.保持更新
修改和重温你的作品!
数据科学最棒的地方在于它每天都面临着学科的不断发展。数据科学每天都有新的发现。目前在数据科学领域流行的一种技术在未来几天、几周或几个月内可能不会那么有效。方法的进步和发展日新月异。
技术快速发展的一个例子可以通过生成对抗网络(GANs)中最精彩的神经网络技术之一的曲线急剧增长来理解。从 Ian Goodfellow 和他的同事在 2014 年设计的初始框架开始,这些网络已经走过了漫长的道路,并在过去几年中不断发展。从创建和复制简单的设计,他们现在可以创建完全更新的图形结构。这些技术非常出色,在数据科学和深度学习领域掀起了一场新的革命。
随着数据科学的不断进步,每个爱好者都必须不断学习更多知识,跟上最新趋势。如果不跟上新趋势,数据科学家就很难开发出客户或用户想要的最佳质量的产品。如前所述,研究论文是跟上技术和数据科学最新发展趋势的好方法。
除了研究论文之外,阅读关于数据科学发展和其他新兴技术的文章和新闻也是开始更新知识的绝佳方式。敏锐地研究这些进步将有助于你在数据科学发展的潮流和趋势中保持完整。因此,继续练习和阅读,让自己保持更新,以保持相关性,并成为数据科学爱好者的主导地位。
12.理解你的代码的目的
拉多万·纳基夫·雷汉在 Unsplash 上的照片
在从事数据科学项目或任何其他编程项目时,开发人员了解他们代码的用途是非常重要的。如果没有代码背后推理的基本知识,您就不可能理解概念,更重要的是,操作您最近遇到的代码或代码块。在不了解代码块重要性的情况下盲目编码可能会对您的整个数据科学之旅不利。
我们生活在一个互联网能够为我们提供任何我们正在寻找的解决方案的世界和地方。虽然信息和数据的可用性自然对我们所有人都有好处,并且需要加以利用,但对于数据科学爱好者来说,深入了解他们遇到的代码块背后的基础知识和推理是至关重要的。特定的编程项目需要对代码进行小的修改,以完美地完成特定的任务。
花一些时间了解你正在学习的库模块的必要性,并自己分析这些概念和代码块。例如,scikit-learn 库有如此多的功能和操作。确保查看每个单独的组件,并尝试理解这些代码块的用途。此外,了解每个单独参数的更多信息是一个好主意,因为它们对您的开发项目可能是必要的。
13.尝试各种架构、模型、优化器等。
如果您完成了特定数据科学项目的模型结构的构建,就没有时间放松了!有了这些模型,您可以实现更多的目标。既然你已经解决了如何解决特定任务或项目的问题,那么这是你开始探索构建模型的众多选项的最佳时机。
说起来,在深度学习方面,我们有三种主要架构的可用性,即顺序、功能 API 和模型子类(或定制模型)结构。一旦你完成了你的整个建筑结构,如果你打算参加像 Kaggle 这样的比赛,并希望产生最佳质量的模型,建议你尝试这些建筑结构,以达到最佳效果。
无论您是在构建机器学习模型还是深度学习模型,在构建代码块时开始探索众多可用的选项总是一个好主意。例如,像 VGG-16 体系结构这样的特定迁移学习模型可能比像 Inception 体系结构这样的其他迁移学习模型表现得更好。对于更好的任务,使用 LSTMs 可能比 CNN 更好。对数据科学家来说,分析这些因素极其重要。
最后一点是用于解决特定问题的激活函数和优化器。虽然 ReLU 通常被认为是最好的激活函数,Adam 是执行大多数任务的首选优化器,但探索其他激活函数和优化器,看看哪一个为特定任务产生最好的结果,总是一个好主意。下面是一篇在五分钟左右解释 ReLU 激活功能的文章。如果你想了解更多关于这个话题的信息,请查看。
14.只是探索和享受乐趣
Artem Kniaz 在 Unsplash 上拍摄的照片
在一天结束时,学习数据科学和从事众多项目的主要目的是为了获得乐趣。在探索这些概念、主题和项目时,确保你喜欢你正在努力完成的工作。当你对数据科学的众多惊人元素着迷时,你喜欢这个学科的可能性会更高。因此,完成你的任务的结果和成功率也会增加。
动机是成为一名成功的数据科学家的主要因素。随着数据科学领域的挑战和困难越来越多,您需要保持动力和信心来解决这些问题,并找到这些问题的持续解决方案。只有当你对各自的工作领域真正充满热情和兴趣时,动力的驱动力才会保持不变,在这种情况下,就是数据科学。
动机和兴趣是两个因素,只有当你每天都从探索众多概念和学习新事物中获得乐趣时,它们才会留在一个主题中。虽然陷入困境和遇到困难是很常见的,但只要你玩得开心,你就会继续表达自己,并更加努力地推动自己,直到实现所有各自的目标和主要目的。所以,尽情享受数据科学,随意尝试任何能给你带来满足感和幸福感的项目、算法或模型架构。
15.坚持练习!
实践是取得成功的一个重要方面。特别是作为一名数据科学家或数据科学爱好者,你的主要目标必须是获得尽可能好的结果,同时保持努力和聪明。定期练习可以让开发人员习惯不同的数据科学模式,并帮助他们成长为更独特、更完美的数据科学家。
我认为对于数据科学开发人员来说,不断回顾和修改他们的概念以及数据科学领域的众多主题是非常重要的。虽然跟上数据科学主题的发展同样重要,但数据科学家跟上实践的步伐也同样重要。当需求认为有必要的时候,你不想忘记或不记得一个重要的主题。
数学概念和数据科学的其他主题可以每月或每周查找一次,但我强烈建议将编码和编程实践融入到您的日常生活中。请查看下面的文章,其中我涵盖了每个数据科学家必须考虑的五个原因,包括在日常生活中编码的各个方面,以实现最佳结果并变得更加成功。
</5-reasons-why-you-should-code-daily-as-a-data-scientist-fa7fc6dc92c4>
在练习期间,你不需要像人们通常建议的那样非常努力。只要聪明地练习,继续尽可能有效地完成你的其他任务。你不需要从头开始一遍又一遍地重写和重新分析每一个概念或主题。快速浏览一下你想再次回顾的主题就足够了。最后,我想说,坚持练习,尽你最大的努力来结束我的演讲。你会实现你想要的一切!
结论:
由 Unsplash 上的 krakenimages 拍摄的照片
“有两种人会告诉你,你在这个世界上无法有所作为:一种是害怕尝试的人,另一种是害怕你会成功的人。”
— 雷·戈福斯
数据科学是一门奇妙的学科。如果您对学习数据科学的众多方面非常感兴趣,并希望继续探索这一领域的美妙之处,请尽可能享受其中的乐趣。如果一个概念让你着迷,那么欣赏这个特殊主题的壮观性质,并享受学习它的乐趣。随着您在数据科学领域的不断进步,您一定会取得尽可能好的结果,最终,您将成为一名成功的数据科学家。
在本文中,我们详细讨论了十五个技巧,这些技巧将使每个数据科学爱好者在开发新技能和实现心理和理论上的赢家心态方面更加成功。继续努力培养你的习惯和技能。本文中讨论的所有要点的主要目标是能够提供一个坚实的基础,并且在尝试实现您的数据科学梦想时不会引起混乱。
我相信这些提示将能够帮助大多数偶然发现这篇文章的观众。如果你觉得这篇文章有用,请告诉我,如果你认为我可能跳过或忘记了任何其他要点,也请随意评论。每一个人都可以克服生活中的障碍,为自己的目标和成功之路指明方向。
如果你对这篇文章中提到的各点有任何疑问,请在下面的评论中告诉我。我会尽快给你回复。
看看我的其他一些文章,你可能会喜欢读!
</5-unique-use-cases-of-ai-that-might-surprise-you-22478aaaabaf> </10-best-free-websites-to-learn-programming-939ec029009b> </5-reasons-why-you-should-develop-a-game-with-python-and-ai-9f5f276e7637>
谢谢你们坚持到最后。我希望你们喜欢阅读这篇文章。我希望你们都有美好的一天!
16 种被低估的熊猫系列方法以及何时使用它们
Hasnans、pct_change、is_monotonic、repeat 以及许多其他
来自 Pixabay
在本文中,我们将探索一些鲜为人知但非常有用的 pandas 方法来操作系列对象。其中一些方法仅与系列相关,而其他方法则与系列和数据框架都相关,然而,当与两种结构类型一起使用时,它们具有特定的功能。
1.is_unique
顾名思义,该方法检查一个系列的所有值是否都是唯一的:
import pandas as pd
print(pd.Series([1, 2, 3, 4]).is_unique)
print(pd.Series([1, 2, 3, 1]).is_unique)**Output:**
True
False
2 & 3.is_monotonic
和is_monotonic_decreasing
使用这两种方法,我们可以检查一个系列的值是否按升序/降序排列:
print(pd.Series([1, 2, 3, 8]).is_monotonic)
print(pd.Series([1, 2, 3, 1]).is_monotonic)
print(pd.Series([9, 8, 4, 0]).is_monotonic_decreasing)**Output:** True
False
True
这两种方法也适用于具有字符串值的序列。在这种情况下,Python 使用字典顺序,逐字符比较两个后续字符串。这不仅仅是字母排序,实际上,上面的数字数据的例子是这种排序的一个特例。正如 Python 文档所说,
字符串的词典排序使用 Unicode 码位号来排序单个字符。
实际上,这主要意味着还考虑了字母大小写和特殊符号:
print(pd.Series(['fox', 'koala', 'panda']).is_monotonic)
print(pd.Series(['FOX', 'Fox', 'fox']).is_monotonic)
print(pd.Series(['*', '&', '_']).is_monotonic)**Output:** True
True
False
当一个序列的所有值都相同时,会发生一个奇怪的异常。在这种情况下,两种方法都返回True
:
print(pd.Series([1, 1, 1, 1, 1]).is_monotonic)
print(pd.Series(['fish', 'fish']).is_monotonic_decreasing)**Output:** True
True
4.hasnans
此方法检查序列是否包含 NaN 值:
import numpy as np
print(pd.Series([1, 2, 3, np.nan]).hasnans)
print(pd.Series([1, 2, 3, 10, 20]).hasnans)**Output:** True
False
5.empty
有时,我们可能想知道一个系列是否完全为空,甚至不包含 NaN 值:
print(pd.Series().empty)
print(pd.Series(np.nan).empty)**Output:** True
False
对序列进行一些操作后,序列可能会变空,例如过滤:
s = pd.Series([1, 2, 3])
s[s > 3].empty**Output:** True
6 & 7.first_valid_index()
和last_valid_index()
这两种方法返回第一个/最后一个非 NaN 值的索引,对于具有许多 NaN 的系列对象特别有用:
print(pd.Series([np.nan, np.nan, 1, 2, 3, np.nan]).first_valid_index())
print(pd.Series([np.nan, np.nan, 1, 2, 3, np.nan]).last_valid_index())**Output:** 2
4
如果一个序列的所有值都是 NaN,两个方法都返回None
:
print(pd.Series([np.nan, np.nan, np.nan]).first_valid_index())
print(pd.Series([np.nan, np.nan, np.nan]).last_valid_index())**Output:** None
None
8.truncate()
该方法允许截断某个索引值前后的序列。让我们截断上一节中的序列,只留下非 NaN 值:
s = pd.Series([np.nan, np.nan, 1, 2, 3, np.nan])
s.truncate(before=2, after=4)**Output:** 2 1.0
3 2.0
4 3.0
dtype: float64
该系列的原始索引被保留。我们可能希望重置它,并将截断的级数赋给一个变量:
s_truncated = s.truncate(before=2, after=4).reset_index(drop=True)
print(s_truncated)**Output:** 0 1.0
1 2.0
2 3.0
dtype: float64
9.convert_dtypes()
正如熊猫文档所说,这种方法用于
使用支持
*pd.NA*
的数据类型将列转换为最佳数据类型。
如果只考虑 Series 对象而不考虑 DataFrames,那么该方法的唯一应用是转换所有可空的整数(即小数部分等于 0 的浮点数,如 1.0、2.0 等)。)还原为“正常”整数。当原始序列同时包含整数和 NaN 值时,就会出现这种浮点数。因为 NaN 在 numpy 和 pandas 中是一个浮点型,所以它导致带有任何缺失值的整个系列也变成浮点型。
让我们看一下上一节中的例子,看看它是如何工作的:
print(pd.Series([np.nan, np.nan, 1, 2, 3, np.nan]))
print('\n')
print(pd.Series([np.nan, np.nan, 1, 2, 3, np.nan]).convert_dtypes())**Output:** 0 NaN
1 NaN
2 1.0
3 2.0
4 3.0
5 NaN
dtype: float640 <NA>
1 <NA>
2 1
3 2
4 3
5 <NA>
dtype: Int64
10.clip()
我们可以在输入阈值(lower
和upper
参数)处裁剪一个序列的所有值:
s = pd.Series(range(1, 11))
print(s)
s_clipped = s.clip(lower=2, upper=7)
print(s_clipped)**Output:** 0 1
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10
dtype: int640 2
1 2
2 3
3 4
4 5
5 6
6 7
7 7
8 7
9 7
dtype: int64
11.rename_axis()
对于 Series 对象,此方法设置索引的名称:
s = pd.Series({'flour': '300 g', 'butter': '150 g', 'sugar': '100 g'})
print(s)
s=s.rename_axis('ingredients')
print(s)**Output:** flour 300 g
butter 150 g
sugar 100 g
dtype: objectingredients
flour 300 g
butter 150 g
sugar 100 g
dtype: object
12 & 13.nsmallest()
和nlargest()
这两个方法返回一个序列的最小/最大元素。默认情况下,它们返回 5 个值,对nsmallest()
按升序,对nlargest()
按降序。
s = pd.Series([3, 2, 1, 100, 200, 300, 4, 5, 6])
s.nsmallest()**Output:** 2 1
1 2
0 3
6 4
7 5
dtype: int64
可以指定另一组要返回的最小/最大值。此外,我们可能希望重置索引并将结果赋给一个变量:
largest_3 = s.nlargest(3).reset_index(drop=True)
print(largest_3)**Output:** 0 300
1 200
2 100
dtype: int64
14.pct_change()
对于 Series 对象,我们可以计算当前元素和前一个元素之间的百分比变化(或者更准确地说,分数变化)。例如,当处理时间序列时,或者创建以百分比或分数表示的瀑布图时,这种方法会很有帮助。
s = pd.Series([20, 33, 14, 97, 19])
s.pct_change()**Output:** 0 NaN
1 0.650000
2 -0.575758
3 5.928571
4 -0.804124
dtype: float64
为了使结果系列更具可读性,让我们将其四舍五入:
s.pct_change().round(2)**Output:** 0 NaN
1 0.65
2 -0.58
3 5.93
4 -0.80
dtype: float64
15.explode()
该方法将一个序列(列表、元组、集、系列、ndarrays)中的每个类似列表的元素转换为一行。空名单-喜欢将在一排与南转换。为了避免结果序列中的重复索引,最好重置索引:
s = pd.Series([[np.nan], {1, 2}, 3, (4, 5)])
print(s)
s_exploded = s.explode().reset_index(drop=True)
print(s_exploded)**Output:** 0 [nan]
1 {1, 2}
2 3
3 (4, 5)
dtype: object0 NaN
1 1
2 2
3 3
4 4
5 5
dtype: object
16.repeat()
此方法用于将一个序列中的每个元素连续重复定义的次数。同样在这种情况下,重置索引是有意义的:
s = pd.Series([1, 2, 3])
print(s)
s_repeated = s.repeat(2).reset_index(drop=True)
print(s_repeated)**Output:** 0 1
1 2
2 3
dtype: int640 1
1 1
2 2
3 2
4 3
5 3
dtype: int64
如果重复次数被指定为 0,将返回一个空序列:
s.repeat(0)**Output:** Series([], dtype: int64)
结论
总之,我们研究了 16 种很少使用的 pandas 方法及其一些应用案例。如果你知道其他一些操纵熊猫系列的有趣方法,欢迎在评论中分享。
感谢阅读!
你会发现这些文章也很有趣:
</5-pandas-methods-youve-never-used-and-you-didn-t-lose-anything-37277fae7c55> [## 在 Python 中对两个字典执行逻辑运算的最简单方法
towardsdatascience.com](/the-easiest-ways-to-perform-logical-operations-on-two-dictionaries-in-python-88c120fa0c8f) https://medium.com/geekculture/emojize-your-data-science-projects-8f19d447f03c