2022 年数据科学家 50+统计面试问答
一个更新的资源,为你的面试刷统计知识!
由 Unsplash 上的 Edge2Edge 媒体拍摄
请务必 订阅此处 千万不要错过另一篇关于数据科学指南、诀窍和技巧、生活经验等的文章!
介绍
你可能已经听我说过无数次了,但是数据科学家实际上是统计学家的现代术语,机器学习是统计学的现代术语。
因为统计学如此重要,https://medium.com/u/ab636cbf3611?source=post_page-----24f886221271--------------------------------StrataScratch的创始人内森·罗西迪和我合作写了 50 多个统计学面试问题和答案。
说到这里,让我们开始吧!
问:什么时候应该使用 t 检验和 z 检验?
Z-检验是一种使用Z-统计量的正态分布假设检验。当您知道总体方差或不知道总体方差但样本量很大时,可以使用 z 检验。
T-检验是一种假设检验,带有使用T-统计量的 T-分布。当不知道总体方差并且样本量很小时,可以使用 t 检验。
您可以查看下图,作为参考来指导您应该使用哪种测试:
作者创建的图像
问:对于一个非技术人员来说,你如何描述“p 值”是什么?
用简单的术语描述 p 值的最好方法是用一个例子。实际上,如果 p 值小于α值,比如说 0.05,那么我们说这个结果偶然发生的概率小于 5%。类似地,p 值为 0.05 相当于说“在 5%的时间里,我们会偶然看到这种情况。”
问:什么是摘樱桃、P-hacking、意义追逐?
摘樱桃指的是只挑选支持自己想要的结论的数据或信息的做法。
P-hacking 指的是一个人操纵他/她的数据收集或分析,直到不重要的结果变得重要。这包括决定测试中期不再收集数据。
重要性追逐指的是当研究人员报告无关紧要的结果时,好像它们“几乎”是重要的。
问:常态的假设是什么?
根据中心极限定理,正态性的假设是抽样分布是正态的,并且以总体参数为中心。
问:什么是中心极限定理,为什么它如此重要?
中心极限定理是非常强大的——它指出样本均值的分布近似于正态分布。
举个例子,你可以从一个数据集中抽取一个样本,然后计算这个样本的平均值。一旦重复多次,你就可以把所有的平均值和它们的频率绘制到一个图表上,你会看到一个钟形曲线,也就是众所周知的正态分布,已经被创建出来了。该分布的平均值将非常类似于原始数据的平均值。
中心极限定理很重要,因为它用于假设检验和计算置信区间。
问:经验法则是什么?
经验法则表明,如果数据集呈正态分布,68%的数据将落在一个标准差内,95%的数据将落在两个标准差内,99.7%的数据将落在 3 个标准差内。
问:中心极限定理成立必须满足什么一般条件?
- 数据必须随机抽样
- 样本值必须相互独立
- 样本量必须足够大,通常应大于或等于 30
问:平均值和比例的置信区间的等式是什么?
问:组合和排列的区别是什么?
n 个元素的排列是这 n 个元素以确定顺序的任意排列。有 n 个阶乘(n!)排列 n 个元素的方式。注意粗体字:顺序很重要!
另一方面,组合指的是从 n 个对象中选择 r 的方式的数量,其中顺序与无关。一次取 r 个的 n 个事物的组合数定义为一个有 n 个元素的集合中有 r 个元素的子集的个数,等于下式:
问:一个 6 位数的车牌有多少种排列?
问:从一副 52 张牌中抽出 6 张牌有多少种方法?
如果你想要更多类似这样的技术面试问题,可以在这里找到更多!
问:信心测试和假设测试有什么相似之处?它们有什么不同?
置信区间和假设检验都是用于进行统计推断的工具。
置信区间建议未知参数的值的范围,然后与真实参数在建议范围内的置信水平相关联。置信区间在医学研究中通常非常重要,可以为研究人员的估计提供更有力的基础。举例来说,置信区间可以显示为“10 +/- 0.5”或[9.5,10.5]。
假设检验是任何研究问题的基础,通常归结为试图证明一些事情不是偶然发生的。例如,你可以试着证明当滚动一种染料时,一个数字比其他数字更有可能出现。
问:观察数据和实验数据有什么区别?
观察数据来自观察研究,即观察某些变量并试图确定它们之间是否存在关联。
实验数据来自实验研究,即当你控制某些变量并保持它们不变,以确定是否存在因果关系。
实验设计的一个例子如下:将一组分成两个。对照组正常生活。测试组被告知在 30 天内每天晚上喝一杯酒。然后可以进行研究,看看酒是如何影响睡眠的。
问:举一些随机抽样技术的例子
简单随机抽样要求使用随机生成的数字选择一个样本。更具体地说,它最初需要一个抽样框架,一个群体所有成员的列表或数据库。然后,您可以使用 Excel 为每个元素随机生成一个数字,并获取您需要的前 n 个样本。
系统采样甚至更简单,只需从样品中取出一种元素,跳过预定的数量(n ),然后取出下一种元素。回到我们的例子,你可以选择列表中的第四个名字。
整群抽样从将一个群体分成几个组开始,或者叫做**群。**分层抽样的不同之处在于,每个聚类必须能够代表总体。然后,随机选择整个集群进行采样。例如,如果一所小学有五个不同的八年级班级,可以使用整群随机抽样,例如,只选择一个班级作为样本。
整群抽样示例
分层随机抽样从将人群分成具有相似属性的组开始。然后从每组中随机抽取一个样本。这种方法用于确保群体中的不同部分得到平等的代表。举个例子,假设在一所学校进行了一项调查,以确定总体满意度。这里使用分层随机抽样来平等地代表每个系学生的意见可能是有意义的。
分层随机抽样示例
问:1 型错误和 2 型错误有什么区别?
第一类错误是当你错误地拒绝了一个真的零假设。这也叫做假阳性。
第二类错误是你没有拒绝一个错误的零假设。这也被称为假阴性。
问:测试的力量是什么?提高测试能力的两种方法是什么?
测试的能力是当假设为假时拒绝零假设的概率。它也等于 1 减去β。
要提高测试的能力,您可以做两件事:
- 您可以增加 alpha,但是它也增加了类型 1 错误的机会
- 增加样本大小,n。这保持了类型 1 误差,但减少了类型 2 误差。
问:什么是大数定律?
大数定律是一种理论,它指出随着试验次数的增加,结果的平均值将越来越接近期望值。
正面硬币 100,000 次的翻转次数应该接近 0.5 次而不是 100 次。
问:什么是帕累托原理?
帕累托原则,也称为 80/20 法则,指出 80%的结果来自 20%的原因。80%的销售额来自 20%的顾客。
问:什么是混杂变量?
混杂变量或混杂因素是一种既影响因变量又影响自变量的变量,导致虚假关联,即两个或更多变量相关但无因果关系的数学关系。
问:线性回归需要哪些假设?
有四个主要假设:
- 因变量和回归变量之间存在线性关系,这意味着您创建的模型实际上符合数据
- 数据的误差或残差是正态分布的,并且彼此独立
- 解释变量之间的多重共线性最小
- 同质性。这意味着回归线周围的方差对于预测变量的所有值都是相同的。
问:如果一个模型是异方差的,这意味着什么?那 homoscedastic 呢?
当误差方差不一致时,模型是异方差的。相反,当误差方差一致时,模型是同方差的。
问:内插法和外推法是什么意思?一般哪个更准确?
插值是使用一组观察值内的输入进行的预测。外推是指使用一组观察值之外的输入进行预测。
一般来说,插值更准确。
问:解释选择偏差(关于数据集,而不是变量选择)。为什么重要?丢失数据处理等数据管理程序如何使情况变得更糟?
选择偏倚是指在选择个人、群体或数据进行分析时,没有实现适当的随机化,最终导致样本不能代表总体的现象。
理解和识别选择偏差是很重要的,因为它会严重扭曲结果,并提供关于特定人群的错误见解。
选择偏差的类型包括:
- 抽样偏差:非随机抽样导致的有偏差样本
- 时间间隔:选择支持预期结论的特定时间范围。例如,在临近圣诞节时进行销售分析。
- 暴露:包括临床易感性偏倚、原发性偏倚、适应症偏倚。此处阅读更多https://en.wikipedia.org/wiki/Selection_bias。
- 数据:包括摘樱桃、压制证据、证据不全的谬误。
- 流失:流失偏倚类似于生存偏倚,即只有那些在长期过程中“幸存”的人才会被纳入分析,或者类似于失败偏倚,即那些“失败”的人才会被纳入分析
- 观察者选择:与人择原理相关,这是一种哲学上的考虑,我们收集的关于宇宙的任何数据都要经过过滤,为了让它可以被观察到,它必须与观察它的有意识和有智慧的生命兼容。
处理缺失数据会使选择偏差变得更糟,因为不同的方法会以不同的方式影响数据。例如,如果您用数据的平均值替换空值,您就增加了偏差,因为您假设数据并不像实际可能的那样分散。
问:缺失数据的均值插补是可接受的做法吗?为什么或为什么不?
均值插补是用数据的均值替换数据集中的空值的做法。
均值插补通常是不好的做法,因为它没有考虑特征相关性。例如,假设我们有一个显示年龄和健康分数的表格,并假设一个 80 岁的老人缺少健康分数。如果我们从 15 岁到 80 岁的年龄范围内取平均健康分数,那么 80 岁的人看起来会有一个比他实际应该有的高得多的健康分数。
第二,均值插补减少了数据的方差,增加了数据的偏倚。由于方差较小,这导致模型不太精确,置信区间较窄。
问:自相关是什么意思?
自相关是指未来的结果依赖于之前的结果。当存在自相关时,误差显示为序列模式,模型不太准确。
问:当你取样时,你会造成什么样的潜在偏见?
潜在的偏见包括:
- ***抽样偏倚:*由非随机抽样引起的有偏倚的样本
- ***覆盖偏差不足:*采样太少的观测值
- ***生存偏差:*忽略观察的错误,没有通过一种形式的选择过程。
问:如何评估洞察力的统计显著性?
您将执行假设检验来确定统计显著性。首先,你要陈述零假设和替代假设。
其次,您将计算 p 值,即假设零假设为真,获得测试观察结果的概率。
最后,您将设置显著性水平(alpha ),如果 p 值小于 alpha,您将拒绝 null 换句话说,结果具有统计显著性。
问:解释什么是长尾分布,并提供三个具有长尾的相关现象的例子。为什么它们在分类和回归问题中很重要?
长尾分布的例子
长尾分布是一种重尾分布,它有一条(或多条)逐渐渐近消失的尾巴。
3 实际例子包括幂定律、帕累托原则(通常称为 80-20 法则)和产品销售(即最畅销的产品与其他产品相比)。
在分类和回归问题中注意长尾分布是很重要的,因为出现频率最低的值构成了总体的大多数。这最终会改变您处理异常值的方式,并且它也与一些假设数据正态分布的机器学习技术相冲突。
问:什么是异常值?解释如何筛选异常值,如果在数据集中发现异常值,您会怎么做。此外,解释什么是内联体,如何筛选内联体,如果在数据集中发现了内联体,你会怎么做。
一个异常值是一个明显不同于其他观察值的数据点。
根据异常值的原因,从机器学习的角度来看,它们可能是坏的,因为它们会降低模型的准确性。如果异常值是由测量误差引起的,那么将它们从数据集中移除是非常重要的。有几种方法可以识别异常值:
***Z 值/标准偏差:*如果我们知道一个数据集中 99.7%的数据位于三个标准偏差之内,那么我们可以计算一个标准偏差的大小,将其乘以 3,并确定超出该范围的数据点。同样,我们可以计算给定点的 z 分数,如果它等于+/- 3,那么它就是异常值。
注意:使用该方法时,需要考虑一些意外情况;数据必须呈正态分布,这一点不适用于小数据集,过多异常值的存在会影响 z 值
四分位距(IQR): IQR,用于构建箱线图的概念,也可用于识别异常值。IQR 等于第三个四分位数和第一个四分位数之差。然后,如果一个点小于 Q1-1.5 * IRQ 或大于 Q3 + 1.5IQR,则可以确定该点是否为异常值。这达到大约 2.698 个标准偏差。*
其他方法包括 DBScan 聚类、隔离森林和稳健随机采伐森林。
什么是内球?
一个内联者是一个数据观察,它位于数据集的其余部分内,是不寻常的或错误的。由于它位于数据集中,通常比异常值更难识别,需要外部数据来识别它们。如果您发现了任何内联者,您可以简单地将它们从数据集中删除以解决它们。
问:泊松分布代表什么?
泊松分布是一种离散分布,它给出了在固定时间内独立事件发生的概率。使用这种方法的一个例子是,如果您想确定在给定的一个小时内有 X 个病人来医院的可能性。
均值和方差都等于λ。
问:实验设计是什么意思?
实验设计也称为 DOE,它是在假设反映变量的条件下,旨在描述和解释信息变化的任何任务的设计。本质上,实验的目的是根据一个或多个输入(独立变量)的变化来预测结果。
问:你正在为每个月上传的用户内容编写一份报告,并注意到 10 月份的上传量有一个峰值。特别是图片上传的高峰。您可能认为这是什么原因造成的,您将如何测试它?
照片上传数量激增的潜在原因有很多:
- 一项新功能可能已经在 10 月份实施,它涉及上传照片,并获得了用户的大量关注。例如,提供创建相册能力的功能。
- 同样,有可能之前上传照片的过程不直观,在 10 月份得到了改善。
- 可能有一场病毒式的社交媒体运动,包括持续了整个 10 月的上传照片。八月天,但更具扩展性的东西。
- 这有可能是因为人们上传了自己穿着万圣节服装的照片。
测试的方法取决于尖峰的原因,但是您可以进行假设测试来确定推断的原因是否是实际原因。
问:医院的感染率高于每 100 人-日感染 1 例被认为是高的。某医院在过去的 1787 人/天中有 10 例感染风险。给出医院是否低于标准的正确片面检验的 p 值。
由于我们查看的是给定时间段内发生的事件数量(感染数量),因此这是一个泊松分布问题。
在一个区间内观察到 k 个事件的概率
零(H0):每人每天 1 例感染
替代(H1): >每人每天 1 例感染
*k(实际)= 10 次感染
λ(理论)= (1/100)1787
p = 0.032372 或 3.2372%
因为 p 值< alpha (assuming 5% level of significance), we reject the null and conclude that the hospital is below the standard.
Q: You roll a biased coin (p(head)=0.8) five times. What’s the probability of getting three or more heads?
Use the General Binomial Probability formula to answer this question:
General Binomial Probability Formula
p = 0.8
n = 5
k = 3,4,5
P(3 头以上)= P(3 头)+ P(4 头)+ P(5 头)= 0.94 或 94%
问:一个随机变量 X 是正态的,均值为 1020,标准差为 50。计算 P(X>1200)
使用 Excel…
p =1-norm.dist(1200,1020,50,true)
p= 0.000159
问:假设出现在公交车站的人数为泊松分布,平均值为 2.5 人/小时。四小时内最多出现三人的概率是多少?
x = 3
平均值= 2.54 = 10*
使用 Excel…
p = poisson.dist(3,10,true)
p = 0.010336
问:艾滋病毒检测的敏感性为 99.7%,特异性为 98.5%。患病率为 0.1%的人群中的受试者获得阳性测试结果。测试的精确度是多少(即他是 HIV 阳性的概率)?
精度方程(PV)
精度=阳性预测值= PV
PV =(0.001 * 0.997)/[(0.001 * 0.997)+((1–0.001)(1–0.985))]
PV = 0.0624 或 6.24%*
更多关于这个方程的内容参见 这里的 。
问:你正在竞选公职,你的民意调查机构调查了数百人。他们中的 60 个人声称他们会投你的票。你能放松吗?
- 假设只有你和另一个对手。
- 另外,假设我们想要 95%的置信区间。这使我们的 z 值为 1.96。
置信区间公式
p-hat = 60/100 = 0.6
z * = 1.96
n = 100
这就给了我们一个[50.4,69.6]的置信区间。因此,给定 95%的置信区间,如果你可以接受最糟糕的捆绑情形,那么你可以放松了。否则,你不能放松,直到 100 分中有 61 分说是。
问:苏格兰的谋杀率从前年的 115 下降到了去年的 99。这种报道的变化真的值得注意吗?
- 因为这是一个泊松分布问题,均值=λ=方差,这也意味着标准差=均值的平方根
- 95%的置信区间意味着 z 值为 1.96
- 一个标准偏差= sqrt(115) = 10.724
因此置信区间= 115+/- 21.45 = [93.55,136.45]。由于 99 在这个置信区间内,我们可以假设这个变化不是很值得注意。
问:考虑双亲异性恋家庭的流感流行。假设父母中至少有一方患病的概率是 17%。父亲感染流感的概率为 12%,而母亲和父亲都感染该疾病的概率为 6%。母亲感染流感的概率有多大?
利用概率中的一般加法法则:
P(母亲或父亲)= P(母亲)+ P(父亲)— P(母亲和父亲)
P(母亲)= P(母亲或父亲)+ P(母亲和父亲)— P(父亲)
P(母亲)= 0.17+0.06–0.12
P(母亲)= 0.11
问:假设 35-44 岁男性的舒张压(DBPs)呈正态分布,均值为 80(毫米汞柱),标准差为 10。随机选择一个 35-44 岁的人,其 DBP 低于 70 的概率是多少?
因为 70 比平均值低一个标准差,所以取一个标准差左边的高斯分布的面积。
= 2.3 + 13.6 = 15.9%
问:在感兴趣的人群中,9 名男性的样本产生了 1,100cc 的样本平均脑容量和 30cc 的标准偏差。这个新群体的平均脑容量的 95%学生 T 置信区间是多少?
样本的置信区间
假设置信度为 95%,自由度等于 8,t 值= 2.306
*置信区间= 1100±2.306 (30/3)
置信区间= [1076.94,1123.06]
问:在六周的时间里,9 名受试者服用了减肥药。体重的平均差异(随访-基线)为-2 磅。要使 95% T 置信区间的上端点达到 0,体重差异的标准偏差必须是多少?
上限=平均值+ t 得分(标准偏差/sqrt(样本大小))
0 =-2+2.306 (s/3)
2 = 2.306 * s/3
s = 2.601903
因此,标准偏差必须至少约为 2.60,95% T 置信区间的上限才能达到 0。
问:在一项关于急诊室等待时间的研究中,调查人员考虑了一种新的标准的分流系统。为了测试系统,管理员选择了 20 个晚上,并随机分配新的分流系统在 10 个晚上使用,标准系统在其余 10 个晚上使用。他们计算了每晚看医生的平均等待时间(MWT)。新系统的平均 MWT 为 3 小时,方差为 0.60,而旧系统的平均 MWT 为 5 小时,方差为 0.68。考虑与新系统相关的平均 MWT 差异的 95%置信区间估计。假设方差不变。间隔是多少?按此顺序减去(新系统—旧系统)。
点击这里查看寻找两个独立样本的置信区间的完整教程。
置信区间=均值+/- t 分数标准误差*(见上文)**
均值=新均值-旧均值= 3–5 =-2
给定 df = 18(20–2)和 95%的置信区间,t 得分= 2.101
标准误差= sqrt((0。⁶ 9+0.⁶⁸ 9)/(10+10–2)) sqrt(1/10+1/10)
标准误差= 0.352*
置信区间= [-2.75,-1.25]
问:为了进一步测试医院的分诊系统,管理员选择了 200 个晚上,并随机分配了一个新的分诊系统用于 100 个晚上,一个标准系统用于其余的 100 个晚上。他们计算了每晚看医生的平均等待时间(MWT)。新系统的平均 MWT 为 4 小时,标准偏差为 0.5 小时,而旧系统的平均 MWT 为 6 小时,标准偏差为 2 小时。考虑与新治疗相关的平均 MWT 降低的假设。相对于这一假设,方差不等的 95%独立组置信区间说明了什么?(因为每组有如此多的观察值,所以用 Z 分位数代替 t 分位数。)
假设我们按照这个顺序减去(新系统—旧系统):
两个独立样本的置信区间公式
均值=新均值-旧均值= 4–6 =-2
z 得分= 1.96 95%的置信区间
st. error = sqrt((0。⁵ 99+* 99)/(100+100–2))* sqrt(1/100+1/100)
标准差= 0.205061
下界=-2–1.96 * 0.205061 =-2.40192
上界= -2+1.960.205061 = -1.59808
置信区间= [-2.40192,-1.59808]
问:有一个盒子——有 12 张黑色和 12 张红色卡片,第二个盒子有 24 张黑色和 24 张红色卡片;如果你想从 2 个盒子中随机抽取 2 张卡片,哪个盒子获得相同颜色的概率更高?你能直观地说出为什么第二个盒子有更高的概率吗
有 24 张红卡和 24 张黑卡的盒子获得两张同色卡片的概率更大。让我们走过每一步。
假设你从每副牌中抽出的第一张牌是红色的 a。
这意味着在有 12 个红和 12 个黑的牌组中,现在有 11 个红和 12 个黑。因此,你再抽一张红色的几率等于 11/(11+12)或 11/23。
一副牌中有 24 个红和 24 个黑,那么就有 23 个红和 24 个黑。因此,你再抽一张红色的几率等于 23/(23+24)或 23/47。
由于 23/47 > 11/23,所以卡数较多的第二副牌有较大概率得到相同的两张牌。
问:举一个例子,中间值比平均值更好衡量
当有许多异常值正或负地扭曲了数据时。
问:给定两个公平的骰子,得分总和为 4 的概率是多少?到 8?
滚动 a 4 有 4 种组合(1+3,3+1,2+2):
P(滚动 a 4) = 3/36 = 1/12
有滚安 8 的组合(2+6,6+2,3+5,5+3,4+4):
P(滚安 8) = 5/36
问:如果一个分布向右倾斜,并且中位数为 30,那么平均值会大于还是小于 30?
如果给定的分布是右偏分布,那么平均值应该大于 30,而众数仍然小于 30。
问:你即将登上飞往西雅图的飞机。你想知道你是否应该带一把伞。你打电话给住在那里的三个朋友,分别问他们是否在下雨。你的每个朋友都有 2/3 的机会对你说真话,1/3 的机会用谎言来搞乱你。三个朋友都告诉你“是的”下雨了。西雅图真的下雨的概率有多大?
你可以看出这个问题与贝叶斯理论有关,因为最后一个陈述本质上遵循这样的结构,“假设 B 为真,A 为真的概率是多少?”因此,我们需要知道某一天伦敦下雨的概率。假设是 25%。
P(A) =下雨的概率= 25%
P(B) =三个朋友都说在下雨的概率
P(A|B)假定他们说在下雨的概率
P(B|A)假定在下雨的情况下三个朋友都说在下雨的概率= (2/3) = 8/27
第一步:求解 P(B)
P(A | B)= P(B | A) P(A)/P(B),可以改写为
P(B)= P(B | A)* P(A)+P(B | not A)* P(not A)
P(B)=(2/3)* 0.25+(1/3)* 0.75 = 0.25 * 8/27+0.75 * 1/1*
*第二步:求解 P(A | B)
P(A | B)= 0.25 (8/27)/(0.25 * 8/27+0.75 * 1/27)
P(A | B)= 8/(8+3)= 8/11
因此,如果三个朋友都说在下雨,那么有 8/11 的几率是真的在下雨。
如果你想要更多的数据科学面试问题和答案来备考,你可以在这里找到更多的https://platform.stratascratch.com/?utm_source=blog&utm_medium=click&utm_campaign=terenceshin&utm_content=statistics-interview-questions-article***!*****
感谢阅读!
如果你坚持到了最后,恭喜你!我希望这有助于你更新和修补你的统计知识。我知道有很多东西要记,但是你用得越频繁,就越不容易丢失。
一如既往,我祝你在数据科学的努力中一切顺利。如果你喜欢这篇文章,我会很感激你给我一个关注!😃
如果您喜欢这篇文章,请务必点击 订阅此处 或至我的 独家快讯 千万不要错过另一篇关于数据科学指南、技巧和提示、生活经验等的文章!
不确定接下来要读什么?我为你选了另一篇文章:
***</10-statistical-concepts-you-should-know-for-data-science-interviews-373f417e7d11>
又一个!
特伦斯·申
- 如果你喜欢这个, 订阅我的媒介 获取内容!
- 同样,您也可以订阅我的独家简讯
- 跟我上LinkedIn其他内容***
6 个令人惊讶的数字函数可能会让你大吃一惊
提高性能,检查平等,重塑,等等
NumPy 是科学应用的基础 Python 模块。它是各种领域中最广泛使用的统计分析软件包之一,包括数据科学家、高级分析和统计分析。
接下来的文章将讨论令人惊奇的功能和使用 NumPy 可以做的事情。
1。allclose()函数
一个比较函数,检查两个数组是否相等或非常相似。这个函数逐项比较两个数据数组,看它们是否在某个阈值内相等,然后返回一个布尔值作为结果。
如果两个数组的项在指定的容差内不相等,则返回 false 否则,它返回 true。值得注意的是,默认的容忍度是相当适度和有利的。
a = np.array([0.16,0.26,0.365])
b = np.array([0.15,0.25,0.36])tolerance1 = 0.1
tolerance2 = 0.05print(np.allclose(a,b,tolerance1))
print(np.allclose(a,b,tolerance2))
输出
True
False
2. where()函数
其中()是一个函数,它从满足一组条件的数组中返回元素。此外,该函数返回满足一组标准的元素的索引位置。这与 SQL 中的 where 子句基本相同。
list1 = np.array([1,4,7,6,1,7,3,8,9])# Where the elements in list1 are less than 7, returns the index position
np.where(list1<7)
输出
(array([0, 1, 3, 4, 6]),)
3. extract()函数
顾名思义,Extract()用于根据条件用数组检索特定成员。我们也可以使用 and、or 或 extract()这样的标准。
让我们定义一个随机数组。
# Random integers
array_test = np.random.randint(18, size=12)#Output: array_test
array([ 2, 13, 16, 9, 2, 8, 12, 6, 6, 1, 15, 3])
让我们根据特定的条件从数组中构造一个布尔数组。
# Divide by 2 and check if the remainder is 1
cond = np.mod(array_test, 2)==1
**Output:** cond
array([False, True, False, True, False, False, False, False, False, True, True, True])
现在让我们看看 extract()如何帮助我们。
# Use extract to get the values
np.extract(cond, array_test)**Output**
array([13, 9, 1, 15, 3])
我们也可以在提取函数中直接应用条件。
# Apply condition on extract directly
np.extract(((array_test < 2) | (array_test > 14)), array_test)**Output**
array([16, 1, 15])
4. reshape()函数
NumPy 中的 reshape 数组函数用于给数组一个新的形式。这是 NumPy 最受欢迎的功能之一。整形功能非常有用;我们可以用它给数组一个新的形式或者我们想要的形状。
它可以增加或减少数组维数,同时保持项目总数不变。
arr = np.arange(1,36,2)
print(arr)*#reshape* print("reshape1\n",arr.reshape(3,6))
print('reshape2\n',arr.reshape(2,3,3))
输出
[1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35]reshape1
[[ 1 3 5 7 9 11]
[ 13 15 17 19 21 23]
[25 27 29 31 33 35]]reshape2
[[[ 1 3 5]
[ 7 9 11]
[ 13 15 17]][[19 21 23]
[25 27 29]
[31 33 35]]]
5. einsum()函数
Numpy 最有用的函数之一是 einsum()函数,通常称为爱因斯坦求和约定。由于它的表达能力和巧妙的循环,它可以在性能和内存经济方面胜过我们传统的数组函数。
困难的方面是学习符号需要时间,并且可能需要多次尝试才能有效地将它应用到复杂的情况中。einsum()提供了数组np.multiply
、np.addition
、np.transpose
和np.diag
等 NumPy 函数来加速和简化我们的工作。
当我们第一次开始使用 einsum()时,我们将经历一些我们需要知道的基本操作。
*find array diagonal, transpose using einsum*a = np.array([[1,2,3],[4,5,6],[7,8,9]])
a_diag = np.einsum('ii->i', a)print("option1\n",a_diag)
print('option2\n',np.einsum(a,[0,0],[0]))
a_transpose = np.einsum("ij->ji",a)print("option1\n",a_transpose)
print("option2\n",np.einsum(a,[1,0]))
6.剪辑()功能
Clip()是一个将数组中的值保持在指定范围内的函数。我们有时需要将数字保持在一定的范围内。给定间隔时,外部值将被修剪到间隔边缘。
x = np.array([3, 4, 12, 20, 2, 2, 3, 7, 1, 2, 12, 0])
print(np.clip(x,2,5))
输出
array([3, 4, 5, 5, 2, 2, 3, 5, 2, 2, 5, 2])
这里有一本 书 ,我一定会推荐给所有 Python &数据科学初学者。一定要去看看!
结论
Numpy 不仅仅是一个更快更方便的 Python 数组计算包。除了其明显的科学用途之外,NumPy 还可以用作普通数据的多维存储。
可以定义的数据类型数量没有限制。因此,NumPy 可以简单高效地与各种数据库进行交互。
文章中提到的各种令人惊奇的函数在使用 Numpy 库时会非常有用。
注: 本文包含代销商链接。这意味着,如果你点击它,并选择购买我上面链接的资源,你的订阅费的一小部分将归我所有。
然而,推荐的资源是我亲身经历的,并在我的数据科学职业生涯中帮助了我。
在你走之前……
如果你喜欢这篇文章,并且想继续关注更多关于 Python &数据科学的激动人心的文章,请点击这里https://pranjalai.medium.com/membership考虑成为一名中等会员。
请考虑使用我的推荐链接注册。通过这种方式,会员费的一部分归我,这激励我写更多关于 Python 和数据科学的令人兴奋的东西。
还有,可以随时订阅我的免费简讯: Pranjal 的简讯 。
使用 Python 列表可以做 6 件惊人的事情
对您的脚本任务非常有用
我们在 Python 中使用的最常见的数据结构之一是列表,我们在 Python 中做的几乎每个项目中都使用这种数据结构。因此,了解一些与列表相关的技巧不仅会使您的工作更容易,而且有时它们比我们经常编写的简单代码更有效。
在这篇文章中,我将讨论 6 个使用 python 列表的技巧和诀窍,它们肯定会让你的生活变得更轻松。这些技巧包括 Python 中的一些内置函数和一些列表理解。
1。检索列表的某一部分
假设我们想获取一个列表的某个部分,并从中创建一个新的列表。我们可以使用 Python 中的 slice() 方法来实现。该方法将起始索引值、结束索引值和增量顺序作为参数,并按该顺序检索元素。
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]elements = slice(4 ,10 ,1)list2 = list1[elements]print(list2)
输出:
[5, 6, 7, 8, 9, 10]
这个方法也可以用来反转列表,但是我们有另一个很酷的方法,我们将在本文的第三点看到。
2。对列表中的每个元素执行类似的操作
如果您想对列表中的每个元素执行一组操作,可以使用 Python 中的 map() 函数。
您只需要编写包含这些操作的函数,然后使用 map() 函数,该函数将一个函数和一个 iterable(本例中为 list)作为参数,并对列表的所有元素执行操作。
例子
mylist = [1,2,3,4,5]def multi(x):
return 10*xlist(map(multi, mylist))
在这种情况下, map() 函数将用户定义函数 multi() 应用于mylist[]
的所有元素并返回值。
输出
[10, 20, 30, 40, 50]
3。倒序列表
这是一个几乎所有 python 程序员都知道的相当常见的技巧,但是值得一试。在这种情况下,我们使用[]运算符,通过将第三个参数设置为-1 来反向遍历列表。
示例
str=”strings are cool”print(str[::-1])
输出
looc era sgnirts
想 敬请期待 同更多类似 精彩 文章上 Python &数据科学 —做会员考虑使用我的推荐链接:【https://pranjalai.medium.com/membership。
4。同时迭代多个列表
假设您有两个想要同时访问其元素的列表。Python 中的 zip()函数允许您使用一行代码来完成这项工作。该函数将多个列表作为参数,并同时遍历它们。当较小的列表用尽时,迭代停止。
zip 函数最棒的地方在于它可以用来同时遍历多个列表。
例子
colour = [“red”, “yellow”, “green”]fruits = [‘apple’, ‘banana’, ‘mango’]price = [60,20,80]**for colour, fruits, price in zip(colour, fruits, price):
print(colour, fruits, price)**
在这里,我们遍历了三个列表来打印其中的值。
输出
red apple 60yellow banana 20green mango 80
5。连接字典中的列表
当字典中的键值对的值是一个列表时,这个技巧会很有用。如果我们想要合并所有在字典中作为值出现的列表,我们可以借助内置的 sum()函数来完成。
示例
dictionary = {“a”: [1,2,3], “b”:[4,5,6]}numbers = sum(dictionary.values(), [])print(numbers)
输出
[1, 2, 3, 4, 5, 6]
6。将两个列表合并成一个列表
假设您有两个列表,并且您想要合并这两个列表以形成一个字典,即一个列表中的元素将是键,而另一个列表中的元素将是值。使用 python 中的 zip()函数,我们只用一行代码就可以完成这项任务。
示例
items = [“footballs”, “bats”, “gloves”]price = [100, 40, 80]dictionary = dict(zip(items, price))print(dictionary)
输出
{‘footballs’: 100, ‘bats’: 40, ‘gloves’: 80}
结论
这些是一些提示和技巧,你可以在处理列表时应用,使你的工作更容易。这些技巧不仅需要较少的代码行,其中一些对提高性能也有帮助。
除了这些技巧,您还可以使用列表理解来使您的代码更加紧凑和高效。在我们接下来的文章中,我将讨论更多与 python 相关的技巧和诀窍。
敬请期待!!了解更多与 Python 和数据科学相关的技巧。
走之前……
如果你喜欢这篇文章,并希望关注更多关于 Python &数据科学的精彩文章**——请考虑使用我的推荐链接https://pranjalai.medium.com/membership成为中级会员。**
还有,可以随时订阅我的免费简讯: Pranjal 的简讯 。
每个数据科学家都应该知道的自动编码器的 7 种应用
自动编码器及其使用基本指南
自动编码器是一种流行的无监督人工神经网络,它采用未标记的数据,并学习关于数据结构的有效编码,可用于另一个上下文。自动编码器近似于将数据从全输入空间映射到较低维度坐标的函数,并且进一步近似于具有最小损失的输入空间的相同维度。
对于分类或回归任务,可以使用自动编码器从原始数据中提取特征,以提高模型的稳健性。自动编码器网络还有各种其他应用,可以用于一些其他环境。我们将在本文中介绍自动编码器的 7 种应用:
***Checklist:***
**1) Dimensionality Reduction
2) Feature Extraction
3) Image Denoising
4) Image Compression
5) Image Search
6) Anomaly Detection
7) Missing Value Imputation**
在深入研究自动编码器的应用之前,让我们简单讨论一下自动编码器网络到底是什么。
什么是自动编码器?
Autoencoder 是一种无监督的神经网络,它尝试将输出层重建为与输入层相似。自动编码器架构有两个部分:
- **编码器:**从输入空间到低维空间的映射
- **解码器:**从低维空间重构到输出空间
自动编码器首先将输入向量压缩到低维空间,然后试图通过最小化重构误差来重构输出。自动编码器会尝试重建与输入层尽可能相似的输出向量。
(来源),自动编码器架构
有各种类型的自动编码器,包括正则化的、具体的和变化的自动编码器。参考自动编码器的维基百科页面来详细了解自动编码器的变化。
1)降维:
自动编码器训练网络将数据中的自然结构解释为有效的低维表示。它通过使用解码和编码策略来最小化重建误差。
(来源),自动编码器的编码器-解码器架构
输入和输出维度有 3000 个维度,期望的缩减维度是 200。我们可以开发一个 5 层网络,其中编码器有 3000 和 1500 个神经元,类似于解码器网络。
压缩输入层的矢量嵌入可以被认为是输入层的降维嵌入。
2)特征提取:
自动编码器可以用作分类或回归任务的特征提取器。自动编码器获取未标记的数据,并学习可用于监督学习任务的关于数据结构的有效编码。
在使用训练数据的样本来训练自动编码器网络之后,我们可以忽略自动编码器的解码器部分,并且仅使用编码器来将较高维的原始输入数据转换到较低维的编码空间。这种较低维度的数据可用作监督任务的特征。
(图片由作者提供),AutoEncoder 作为特征提取器
跟随我的另一篇文章,逐步实现作为特征提取器的 autoencoder:
3)图像去噪:
真实世界的原始输入数据通常在本质上是有噪声的,并且训练健壮的监督模型需要干净和无噪声的数据。自动编码器可用于数据去噪。
图像去噪是自动编码器试图从有噪声的输入图像重建无噪声图像的流行应用之一。
(图片由作者提供),使用自动编码器架构对图像进行去噪
将有噪声的输入图像作为输入馈入自动编码器,并通过最小化来自原始目标输出(无噪声)的重建损失来重建无噪声输出。一旦训练了自动编码器权重,它们可以进一步用于对原始图像去噪。
4)图像压缩:
图像压缩是自动编码器网络的另一个应用。原始输入图像可以被传递到编码器网络,并获得编码数据的压缩维度。可以通过使用解码器网络从压缩编码中重构图像来学习自动编码器网络权重。
(图片由作者提供),使用自动编码器进行图像压缩
通常,自动编码器不太适合数据压缩,基本的压缩算法效果更好。
5)图片搜索:
自动编码器可用于压缩图像数据库。压缩嵌入可以与搜索图像的编码版本进行比较或搜索。
(图片由作者提供),使用 AutoEncoder 进行图片搜索
6)异常检测:
异常检测是自动编码器网络的另一个有用的应用。异常检测模型可用于检测欺诈性交易或任何高度不平衡的监督任务。
这个想法是仅在一个类(多数类)的样本数据上训练自动编码器。这样,网络能够以良好的或更少的重建损失来重建输入。现在,如果另一个目标类的样本数据通过自动编码器网络,则会导致相对较大的重建损失。
可以确定重建损失(异常分数)的阈值,大于该阈值可以被认为是异常。
7)缺失值插补:
去噪自动编码器可用于估算数据集中缺失的值。其思想是通过在输入数据中随机放置缺失值来训练自动编码器网络,并通过最小化重建损失来尝试重建原始原始数据。
一旦训练了自动编码器权重,具有缺失值的记录可以通过自动编码器网络来重构输入数据,该输入数据也具有估算的缺失特征。
(图片由作者提供),使用去噪自动编码器输入缺失值
结论:
在本文中,我们简要介绍了自动编码器的各种应用。对于图像重建,我们可以使用一种称为卷积自动编码器的自动编码器,它通过学习最佳滤波器来最小化重建误差。
在我即将发表的文章中,我将实现上面讨论的每个应用程序。
喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一小部分会员费,不需要你额外付费。
https://satyam-kumar.medium.com/membership
感谢您的阅读
提高 Python 代码速度的 6 种方法
快速编码的简单步骤
照片由 Guillaume Jaillet 在 Unsplash
在过去的几年里,Python 已经证明了自己是一种简单易学、多才多艺、功能强大的编程语言。如果你是编程世界的新手,或者你对科学编程、数据科学或普通计算机科学感兴趣,它成为学习的首选之一。
由于这种受欢迎程度的提高,开发人员和公司在日常工作中使用 Python 来构建应用程序、进行研究和开发供他人使用的包。现在,有超过 200,000 个 Python 包,涵盖了从简单的字符串操作到完整的机器学习和人工智能包的广泛应用。
Python 是一个完整的框架,适合任何想进入编程领域,尤其是任何数据科学分支的人。Python 提供了许多优势来帮助人们建立他们的投资组合和职业生涯。毕竟,一旦你掌握了一门编程语言,学习另一门就不是那么复杂的任务了。
虽然 Python 的优点大于缺点,但当有人反对 Python 时,一个缺点似乎是许多讨论的中心,“ Python 太慢了。“如今,速度对我们所有人都至关重要;科技让我们变得不耐烦;如果一个应用程序需要多一秒钟才能打开,或者一个网页需要几秒钟才能加载,我们会感到沮丧,因为它太慢了。
事实是,与其他编程语言相比,Python 相对较慢。Python 速度慢有各种原因,但最主要的原因是它作为一种解释型语言的特性。这是我们无法改变的。那么如何才能加快 Python 的速度呢?
在编写代码时,我们可以采取一些简单的步骤来提高执行速度。也许没有 C、C++或 Java 那么快,但足够让 Python 代码做得更好。
</7-tips-for-data-science-newbies-d95d979add54>
方法 1:保持最新
Python 开发人员正在努力保持 Python 的相关性、功能性,并在未来的版本中以更有效的方式实现其核心功能。通过使用最新的 Python 版本来保持您的代码是最新的,这将确保您使用在该版本中实现的新的优化技术。
因此,只要这个版本与您所有的依赖项兼容,使用最新的版本来规划您的下一步总是一个好主意。
保持最新也适用于您正在使用的软件包和库。库提供者总是致力于修复错误、添加新特性和优化现有特性。
方法 2:有效地使用数据结构
数据结构是计算机科学的基本构件。Python 中实现了很多不同的数据结构,比如列表、元组、字典、集合等等。但是,通常,人们倾向于继续使用列表来完成他们所有的可迭代任务。
知道正确的数据结构用于您的应用程序可以使它更快。例如,在搜索应用中使用字典和集合比列表更有效,因为它们是基于哈希表构建的,并且总是需要O(1)
时间来查找任何项目。
确保使用正确的数据结构是一项技能,它要求您更多地了解不同类型的数据结构以及每种数据结构的最佳应用。
方法 3:仅在绝对需要时循环
循环是任何编程语言的重要组成部分;没有没有循环的代码。但是,循环通常在执行中占用最多的时间。有时,我们在使用循环时会使它过期,这最终会使我们的代码明显变慢。
因此,我们需要减少代码中的循环次数。这可以通过使用不同的变量对列表进行排序来实现,而不是遍历列表或使用像交集和联合这样的重构技术来优化我们的代码。
更有效地使用循环的另一种方法是尽可能使用列表理解;例如,创建和填充列表通过理解比使用 append 方法更好。最后,while
循环比for
循环更加静态和高效,如果可能的话,用 while 循环替换 for 循环。
方法 4:不要建造已经存在的东西
Python 提供了如此多的内置函数,那些没有提供的函数通常是使用 Python 开发人员或任何其他公司开发的包来提供的。所以,使用提供的东西,而不是重建它。
我看到许多人喜欢自己实现函数,如果你正在学习语言或者只是为了扩展你的编程知识,这没什么不好。但是,如果您正在使用 Python 构建一个大型应用程序,那么实现现有的大部分功能可能会浪费时间,并导致您的代码变得更大、更慢。
像sum
、max
、any
、filter
、map
这样的内置函数都是用 C 实现的,速度快,效率高。此外,Python 集合模块提供了各种各样的数据结构,您可以立即使用这些数据结构来优化您的代码。在你开始建造它之前,一定要先看看那里有什么。
方法 5:使用节省内存的技术
占用大量执行时间的事情之一是内存交互。因此,使用一些节省内存的技术可以显著提高代码的速度。您可以使用不同的方法来节省内存时间,包括:
- 使用发生器生成范围值,因为它们需要较少的内存使用。
- 使用
sort()
而不是sorted()
,因为 sorted 创建了 iterable 的新副本。在大型数据集的情况下,使用排序更有效。 - 使用插槽。
__slots__
是声明变量的一种特殊方式,它采用变量的实例,并且只保留足够的空间来存放变量的值。 - 使用 math 和 Numpy 处理和执行大数和矩阵运算。这些库的构建是为了提高内存效率。
- 使用
format
或join
方法连接字符串,而不是使用+
操作符。
方法 6:使用加速应用程序
可以使用各种应用程序来加速 Python 代码。然而,这些应用程序要求您重写部分代码以提高效率。
例如,您可以使用Cython
用 C 语言编写部分代码,或者使用 C 函数。Cython 生成的代码被编译成机器语言,执行起来更快。另一种选择是使用Numba
,它是一个即时编译器。Numba 基本上是把 Python 代码变成更快的机器码,实现更快的执行。
PyPy
也是一个加速代码的选项。它为 Cython 提供了一个很好的替代品。PyPy 唯一的缺点是它不能与所有 Python 包兼容,所以在决定使用 PyPy 之前,要确保所有的依赖项都得到支持。
外卖食品
Python 是最流行的编程语言之一;对于初学者和专业人士来说,它更容易学习,易于阅读和理解,并且几乎可以用在你能想到的所有应用程序中。2019 年, SlashData 估计使用 Python 作为主要编程语言的开发者数量达到 820 万,数字每天都在上升。
Python 的许多优势使它这些年来一直保持活力,并鼓励许多开发人员和公司构建和开发许多包,任何人都可以使用这些包来构建和部署来自广泛领域的应用程序。
</5-data-science-programming-languages-not-including-python-or-r-3ad111134771>
尽管 Python 很成功,但它总是有一个缺点,那就是速度慢。由于 Python 是一种基于解释器的语言,它默认比编译语言慢,因为它逐行执行和运行代码。
我们不能改变 Python 的本质,但是我们可以在相对更快更有效地编写代码时实现简单的步骤。在本文中,我们介绍了 6 种可以提高 Python 代码速度的方法。这并不是说这些是加速代码的唯一方法,但它们是开始优化代码库的好方法。
作为数据科学家,你不应该应用的 6 个糟糕的数据工程实践
你应该做什么
照片由 Yan Krukov 从 Pexels
数据科学工作的竞争越来越激烈,拥有数据科学和数据工程技能会让你比缺乏这两种技能的数据科学家更有优势。作为一名数据工程师,为了学习最佳实践,我还必须学习不好的实践,并在此过程中处理后果。这些是我作为一名数据工程师的心得,当我成为一名数据科学家时,它们让我的生活变得更轻松,我希望它们也能帮助你。
1.不必要的基础设施
团队负责人决定标准化文件名,因为程序员倾向于使用不能反映代码实际功能的文件名。文件名将被放入一个带有文件名和代码用途描述的查找表中。我们被告知按顺序使用字母数字名称,如 a1 、 a2 、 a3 等等。每当一段新代码需要一个名字时,我们必须找到序列中的最后一个名字,并使用下一个。
值得庆幸的是,这个系统从未投入生产,只是在一个中途取消的项目中实现。一想到我不得不在查找表中找到 a1 的用途,我就不寒而栗。
外卖:不要过度复杂数据工程基础设施。部门主管可能已经建立了一个标准的文件命名约定,该约定对于代码或其他不涉及查找表的协议来说是不言自明的。
2.调试困难
我的团队继承了动态创建代码并在执行后被删除的遗留代码。调试这段代码的不幸任务落到了我的身上。这是一场噩梦,因为我必须编辑程序来写出代码,以确保它不会消失,以解决问题。
要点:不要让代码更难为自己和他人排除故障。必要时添加注释来解释代码的作用。设置代码的格式,使其更易于阅读。这将减少故障排除时间,并腾出时间从事比调试更有趣的其他任务(除非这确实是您整天喜欢做的事情)。
3.缺乏数据质量保证
作为一名数据工程师,我觉得自己对数据的了解不足以验证质量。分析师通常会要求我们解决一些常见的问题,这些问题可能是在数据工程师将数据传递给分析师进行审查之前,通过一些 QA 检查发现的。这增加了分析师在我们将 ETL 变更投入生产之前签署的时间。
要点:在将 ETL 变更投入生产之前,为数据工程师或您自己建立一个常见的 QA 检查列表。我们建立的几个检查是为了寻找主键字段中的重复值和缺失值,这有助于我们减少分析人员返回的 QA 问题的数量。
4。没有备份
当我第一次成为数据工程师时,我们没有源代码控制。如果您意外删除了一个文件或更改了代码,并且想要恢复它,您唯一的选择是请求它从备份磁带中提取一份副本。这延误了我们的工作,因为我们必须等待它检索文件。
一位分析师曾经更改了我们没有备份的表中的数据。我们只有 changelog,我必须手动将表更新回原始值。不用说,如果有备份的话,这花费的时间是不必要的。
在一个主要的代码改变之前,确保最新的版本保存在源代码控制中,或者只是将原始文件复制到一个备份文件夹中。如果您决定修改表中的数据,请将您计划更改的数据复制到另一个表中作为备份,以防出错。
5.增量更新前不删除原始数据
作为一名数据工程师,我们在生产中通常有两种类型的表更新管道。第一个是完全刷新,删除所有表记录,并用最新数据插入一组新记录。第二种是增量更新,即在前一天或指定时间段(如过去七天)更新数据。
当重新运行管道时,会为具有增量更新的表插入重复记录,因为 ETL 在插入之前没有删除正在更新的同一时间段的数据。这导致了报告和下游流程的许多问题,特别是当它直到后来才被发现时。
要点:在插入增量更新的表之前,总是添加代码来删除同一时期的记录。如果没有及早发现重复数据,这将防止重复数据和不正确的报告。
6.部署它,然后忘记它
您可能会认为没有必要检查已经通过 QA 并部署到生产环境中的代码。这就是你错的地方。通常情况下,在开发过程中使用样本文件和开发数据库运行的流程并不模拟真实世界,也没有在代码中考虑。我在生产中遇到过管道失败,尽管它们通过了 QA,因为我没有考虑开发环境中不存在的用例。
**要点:**在 ETL 管道被部署到生产环境中之后,一定要检查它的数据输出,尤其是前几天,以确认一切都如预期的那样。当您实际需要使用数据时,您不想意识到有问题。
最后的想法
无论您是与数据工程师一起工作的数据科学家,还是身兼两职的人,了解不好的实践也有助于学习好的实践。我无法完全毫发无损地逃脱这些糟糕的做法,但我希望了解它们有助于让您作为数据科学家的工作变得轻松一些。
你可能也会喜欢…
</6-best-practices-i-learned-as-a-data-engineer-9d3ad512f5aa>
让你的 Python 程序变慢的六个坏习惯
Python 代码中通常被忽视的常见问题
随着 Python 越来越受欢迎,Python 用户的数量也在激增。Python 确实是比较好学的。它也非常灵活,因此有更多可能的方法来实现一个功能。
然而,每当有多种方法来做一件特定的事情时,就意味着每种方法都有利弊。在本文中,我收集了 6 种编写 Python 代码的典型方法,它们可能会导致相对较差的性能。
1.不要导入根模块
图片来自 Pixabay 的 Andreas Riedelmeier
使用 Python 时,我们无法避免的一件事就是导入模块,无论是内置模块还是第三方模块。有时,我们可能只需要那个模块中的一个或几个函数或对象。在这种情况下,我们应该尝试只导入我们需要的函数或对象,而不是导入根模块。
这里有一个简单的例子。假设我们需要在程序中计算一些数字的平方根。
较慢的例子
import math
math.sqrt(100)
在这个糟糕的例子中,我们导入了math
模块,并使用math.sqrt()
来访问函数。当然,它完成工作没有任何问题,但是如果我们能导入sqrt()
函数,性能会更好。
更快的例子
from math import sqrt
sqrt(100)
这比原来快了 25%。同样,如果我们需要在程序中多次使用平方根函数,代码会更整洁。
2.避免使用点/点链接
图片由 anncapictures 从 Pixabay 获得
在 Python 中使用点.
来访问对象的属性或函数是非常直观的。大多数时候,没有问题。然而,如果我们能避免使用点,甚至是一串点,性能实际上会更好。
下面的例子显示了在列表中添加一个数字,然后删除它。
较慢的例子
my_list = [1, 2, 3]my_list.append(4)
my_list.remove(4)
更快的例子
my_list = [1, 2, 3]append = my_list.append
remove = my_list.removeappend(4)
remove(4)
如果你不相信实际上做同样的事情,我们可以验证它。
考虑
我可以预料许多 Python 开发者会跳出来说这个例子中的技术有点可笑。其实就算是对我自己来说,我也很少像上面那样写代码。然而,很高兴知道我们可以这样编程,甚至可以让它更快。
如果我们想在一个列表中添加和删除数百万次,我们应该考虑使用这个技巧。这就是为什么我们需要平衡代码的性能和可读性。
3.不要使用+来连接字符串
Python 中的字符串是不可变的。因此,当我们使用“+”将多个字符串连接在一起作为一个长字符串时,每个子字符串都是单独操作的。
较慢的例子
strs = ['Life', 'is', 'short,', 'I', 'use', 'Python']def join_strs(strs):
result = ''
for s in strs:
result += ' ' + s
return result[1:]
具体来说,对于每个子字符串,它需要请求一个内存地址,然后将它与该内存地址中的原始字符串连接起来。这就变成了一种开销。
更快的例子
def join_strs_better(strs):
return ' '.join(strs)join_strs_better(strs)
然而,当我们使用join()
函数时,该函数预先知道所有的子字符串,并且分配的内存地址的长度将适合最终连接的字符串。因此,没有为每个子字符串分配内存的开销。
考虑
强烈建议尽可能使用join()
功能。然而,有时我们可能只想连接两个字符串。或者说,只是为了方便起见,我们想用“+”。在这种情况下,使用“+”符号可以提高可读性,减少代码长度。
4.不要使用临时变量进行值交换
许多算法需要两个变量的值交换。在大多数其他编程语言中,这通常是通过引入临时变量来实现的,如下所示。
较慢的例子
a = 1
b = 2
temp = a
a = b
b = temp
非常直观的是,我们需要一个临时变量作为缓冲区。因此,当变量b
的值被传递给变量a
时,保存变量a
的值会有所帮助。然后,缓冲器中a
的值可以赋给变量b
。
更快的例子
然而,在 Python 中,我们不必使用 temp 变量。Python 有内置语法来实现这种值交换,如下所示。
a = 1
b = 2
a, b = b, a
它不仅快了一点,而且使我们的代码更加整洁干净。
5.If 条件下使用短路
“短路”评估存在于许多编程语言中,Python 也是如此。基本上,它指的是某些布尔运算符的行为,其中只有当第一个参数不足以确定整个表达式的值时,才执行或计算第二个参数。
让我们用一个例子来证明这一点。假设我们有一个如下的列表。
my_dict = [
{
'name': 'Alice',
'age': 28
},
{
'name': 'Bob',
'age': 23
},
{
'name': 'Chris',
'age': 33
},
{
'name': 'Chelsea',
'age': 2
},
{
'name': 'Carol',
'age': 24
}
]
我们的工作是过滤列表,找出所有姓名以“C”开头、年龄大于或等于 30 岁的人。
较慢的例子
需要满足两个条件:
- 名字以“C”开头
- 年龄≥ 30 岁
因此,我们可以编写如下代码。
filtered_list = []
for person in my_dict:
if person['name'].startswith('C') and person['age'] >= 30:
filtered_list.append(person)
更快的例子
嗯,上一个例子中的代码没有问题。然而,在这个特别编造的例子中,只有“克里斯”的年龄超过了 30 岁。
所以,如果先写出查名字的条件,有 3 个名字满足(克里斯、切尔西、卡罗尔)。然后,关于年龄的第二个条件将对所有这 3 个人进行双重检查。
但是因为短路评估,如果先写年龄条件,只有克里斯的年龄在 30 以上,会被反复检查名字是否以“C”开头。
在这种情况下,它几乎快了 100%。
6.如果可以使用 For 循环,请不要使用 While 循环
图片由 anncapictures 来自 Pixabay
Python 使用了大量的 C 来提高性能,即 CPython。就循环语句而言,Python 中 For 循环的步骤相对较少,而作为 C 代码运行的步骤比 While 循环多。
所以在 Python 中可以使用 For 循环的时候,就不应该使用 while 循环。这不仅是因为 For-Loop 在 Python 中更优雅,而且性能更好。
较慢的例子
result = 0
max_number = 10i = 0
while i < 10:
result += i
i +=1
更快的例子
result = 0
max_number = 10for i in range(max_number):
result += i
摘要
在这篇文章中,我列出了 6 个可以让你的 Python 程序更快的技巧。但是,也需要注意的是,我们不应该总是把性能放在第一位。有时,可读性和简洁性也应该考虑在内。
都是关于平衡的:)
https://medium.com/@qiuyujx/membership
如果你觉得我的文章有帮助,请考虑加入 Medium 会员来支持我和成千上万的其他作者!(点击上面的链接)
管理 BigQuery 数据访问的 6 个最佳实践
在 BigQuery 中设置数据环境时,在安全性方面需要了解什么。
杰森·登特在 Unsplash 上拍摄的照片
我们都看到了,也听说了数据泄露及其可能造成的财务和声誉损失。随着我们越来越依赖数据来做出更好的决策,数据正成为任何组织的重要资产。因此,与公司的任何其他资产一样,控制对数据的访问对于保护您的数据至关重要。
幸运的是,现代数据仓库具有强大的内置功能,可以精确控制谁可以访问什么。这通常被称为身份和访问管理或 IAM。云提供商通常设计多个层来控制数据访问,这篇文章旨在揭示 Google 是如何使用 BigQuery 的。
然而,要知道在许多控制层中控制访问的最佳实践可能是一个挑战。这篇文章试图列出我多年来遇到的一些推荐做法。
谷歌云中的资源是如何组织的
BigQuery 是 Google 选择的数据仓库技术。要了解如何控制对 BigQuery 的访问,首先必须了解资源在 Google Cloud 中是如何组织的。
图片来自谷歌云的文档
Google Cloud 的构建方式是,我们可以在资源级别或任何层级授予访问权限,比如项目、文件夹和组织。
如果不需要资源级别的细粒度访问,可以在层次级别授予许可 IAM。换句话说,如果允许所有人访问项目中的每个数据集和表,就没有必要在资源级别明确定义权限。
但是,如果您仍在阅读本文,您很可能希望控制谁可以访问项目中的内容。
BigQuery 的访问控制模式
授予资源级别的细粒度访问权限
Lutz Wernitz 在 Unsplash 上拍摄的照片
要在 BigQuery 中查询一个表,需要两个权限:运行查询的权限和查看数据的权限和查看数据的权限。
运行查询的权限可以在任何层次级别上定义。您可以战略性地设置查询运行权限,以获得更好的可见性。例如,如果数据处理被划分到不同的项目中,您可以分别查看与数据转换和使用相关的所有查询开销、查询日志和数据访问日志。
查看数据的权限也可以在分层级别上设置。但是,强烈建议您在项目或资源级别(数据集和表)设置此权限。经验法则是,如果一个角色应该可以访问项目中的所有数据,那么就在项目级别授予它。如果需要限制对某个数据集或表的访问,请在资源级别授予权限。
BigQuery 还能够设置行级和列级安全性,从而允许更细粒度的访问控制。这将成为另一篇文章的好话题。
最小特权
通俗地说,最小特权就是给予履行职责所需的最少权限。该原则有助于为实体(用户、组和服务帐户)和 GCP 资源创建职责分离。在许多系统上,最低特权是安全的推荐做法。
例如,数据分析师的职责是查询和汇总转换后的数据。对于这个角色,她应该被授予对转换后的数据的只读访问权限,以执行她的工作。授予写访问权限可能意味着数据完整性面临风险。本例中的数据分析师可能会错误地删除或更改生产数据。同样,运营数据分析师只需要访问运营数据,而不需要访问完整的财务或客户数据。
将项目的完全访问权限(所有者或编辑权限)授予每个人通常是一个错误。默认情况下,Google Cloud 创建一个具有编辑权限的计算服务帐户,以在项目中启用计算 API。该帐户非常宽松,可能是一个潜在的安全威胁。最佳做法是禁用此帐户的自动创建,或者在以后删除它。
服务的用户服务帐户。
你可以在 Google Cloud 中使用两种主要的认证方式:用户账户和服务账户。用户帐户是您用来登录控制台的 Google 帐户。另一方面,服务帐户是一个 JSON 密钥文件,您可以用它来认证服务。
这两种身份验证方法的区别在于谁在执行操作。对于用户帐户,用户使用其用户名/密码登录并执行操作。对于服务帐户,它是执行操作的服务(ETL 作业、可视化工具、元数据目录工具)。
这里一个常见的错误是使用一个用户帐户来认证服务。这样做会遇到配额问题,并使控制访问和审计日志变得更加困难。
另一个常见的错误是对每个服务使用一个服务帐户。这也不是推荐的做法,因为您不知道什么服务执行什么操作。此外,由于该帐户用于所有服务,它将是许可的,并增加了违规的机会。
授予组而不是个人帐户访问权限
在 Unsplash 上 Margarida CSilva 拍摄的照片
这样做的主要原因是为了更好地控制项目中的 IAM 权限。想象一下,如果你有十个人需要访问一个项目中的数据+五个不同的服务帐户,维护谁有权访问什么可以很快失控。
然而,角色的数量将显著低于(或者,在最坏的情况下,等于)人员的数量。因此,更好的方法是基于角色创建一个不同的组,并相应地添加权限,以便更加清晰。
您还可以将一个群组添加为另一个群组的成员,以获得额外的控制层。例如,您可以有一个数据分析师小组。在这个组中,你可以有一个市场分析师组,一个运营分析师组,等等。
使用基础设施即代码(IaC)
丹尼尔·科鲁奇在 Unsplash 上的照片
IaC 使您能够轻松地创建不同的环境,尤其是当您的项目很复杂并且有许多活动部分时。在大型项目中,您可以拥有具有复杂权限和策略的环境。只需为一个环境编写一次代码,并为试运行和开发环境提供同样的东西,就可以节省您的时间。
有了 IaC,您环境中的每一个更改都被版本化,因此您知道谁做了什么更改(假设您将管理权限限制为仅您的 IaC 服务)。您还可以定期扫描您的环境,查看配置和实际环境之间的差异。如果大多数 IaC 服务检测到任何变更,它们会将您的环境恢复到配置。
下面看看我关于这个主题的其他一些文章。
资源分离
Guillaume Bolduc 在 Unsplash 上拍摄的照片
加强安全性的最佳方式之一是分离资源。这意味着为您不想存储在一起的数据创建不同的项目。
一个好的起点是将接收、处理和访问之间的资源分开,以确保只在需要的时候访问数据。通过这种设计,您可以锁定原始数据的接收,并控制哪些数据在访问层可用。一个常见的用例是在将表暴露给数据仓库之前屏蔽或散列个人身份信息(PII)。
结论
在现代云平台中,比如 Google Cloud,有许多层来限制数据访问。我讨论了使用以下最佳实践来确保您有一个安全的数据环境:
- 授予资源级别的细粒度访问权限
- 最小特权
- 服务的用户服务帐户。
- 授予组而不是个人帐户访问权限
- 使用基础设施即代码(IaC)
- 资源分离
在以后的文章中,我将分享如何使用行级安全性、列级安全性和 VPC 服务控制来获得更加安全的数据环境。
干杯✌️
我作为数据工程师学到的 6 个最佳实践
以及作为数据科学家如何应用它们
图片由皮克斯拜的 Gerd Altmann 提供
当我第一次成为一名数据工程师时,我很幸运(或者很不幸,这取决于你如何看待它)有一位经理,他编写了概述数据库表设计和文件命名约定的开发指南。它甚至为编码语法设置了标准。我当时并不喜欢这些限制,但多年后,我很感激学到了这些对我这个数据科学家有帮助的最佳实践。
1.文件名
作为一名数据工程师,我必须排除其他数据工程师编写的 ETL 代码的故障。我们没有使用 Git 进行源代码控制,文件命名约定使得找到需要调试的源代码变得很容易。
从那以后,我所在的公司中,文件名遍布整个地图,代码分散在多个位置。这种混乱导致了本可以避免的故障诊断延迟。
作为一名数据科学家,你如何应用这一点:
- 标准化您的文件名,以便您自己和他人可以轻松找到它们。例如,为客户流失模型清理和聚合数据的 Python 脚本可以命名为customer _ churn _ data _ prep . py。作为一名数据科学家,我建立了一百多个模型。当涉众有问题时,标准的命名约定帮助我快速找到我的模型代码。
- 以数字为前缀表示运行顺序。如果你需要运行 SQL 查询,用 Python 处理数据,训练模型你可以有 3 个文件——1_ customer _ churn pull _ data。sql, **2** 客户流失 _ 聚集准备。py、和**3 _**customer _ churn _train. py。我已经将模型投入生产,在评分之前我有 6 个步骤,数字前缀帮助我正确地安排了 ETL 过程。
2.表名
作为一名数据工程师,我们遵循表格命名标准,使用户在没有任何文档的情况下也能容易地找到数据。
例如,所有与电子邮件相关的表格都以 电子邮件 开头,后面跟类型。一个带有 email 打开和点击数据的表格被命名为email _ open _ click。
从原始数据(如按电子邮件活动汇总的电子邮件打开和点击数)导出的汇总表具有一个 agg 后缀,如email _ campaign _ open _ click _ agg。
以***【VW】***开头的视图名称和以 开头的查找表 。
临时表以 temp 开头,后面是用户的名和姓,即 temp_vyu ,当数据库接近最大存储容量时,如果需要删除表,可以很容易地找到表的所有者。
所有这些命名标准都减少了数据工程师的问题数量,因为表名是不言自明的,并且在我们需要删除旧表时有助于维护。
作为一名数据科学家,你如何应用这一点:
- 与数据工程师就表格命名标准达成一致,以便您和其他数据科学家能够轻松地理解表格内容。如果您也是数据工程师,请确定命名约定,以便自己和他人更容易找到正确的数据。
- 如果您在数据库中创建临时表,请使用前缀**【temp _**,即使这不是必需的,因为有一天您可能会被要求帮助删除数据库中的旧表,这将使您很容易快速创建列表。
3.列名
不仅表名应该不言自明,列名也应该如此。当我刚开始做数据工程师时,我从事整个数据库的 ETL 重写工作。这允许我们在所有表中将标识字段重命名为相同的名称。例如,根据您的创意,客户 ID 字段可以命名为 custID 、 cust_id 、 customer_id 等等。跨表使用相同的名称意味着任何查询客户 ID 的人都自动知道字段名称,而不必查看表模式。
作为一名数据科学家,你如何应用这一点:
- 与数据工程师一起工作,或者如果您是数据工程师,请在不同的表中使用相同的字段名称作为常见的标识字段,如客户 ID 和电子邮件地址。这将使字段不言自明,并且易于跨表查找。
4。代码变更
我在没有源代码控制的公司工作过。在这种情况下,我会将代码的副本保存在另一个位置,带有一个 readme.txt 文件和日期,以指示在进行进一步编辑之前我保存的代码的日期和版本。
作为一名数据工程师,这种做法节省了我大量的时间。
有一次,我不小心删除了一段花了一天时间更新的代码,但幸运的是,我保存了一个旧版本,不需要从头重写。
另一次,我将代码推向生产,它崩溃了,尽管我在测试期间没有任何问题。直到我将新代码与我的备份进行比较并找到原因后,我才发现问题所在。
作为一名数据科学家,你如何应用这一点:
- 如果你没有或者不想使用源代码控制,养成在修改代码时备份代码的习惯。如果您在当前代码中遇到了意外的错误,使用旧版本进行比较可以帮助您发现问题。
5.质量保证
每次我对现有的 ETL 作业进行更新时,我都必须将新的输出与原始输出进行比较,以确认只有预期的值发生了变化。我们能够在许多问题到达我们的最终用户之前发现它们。这迫使我学会如何查看数据和发现问题,这个过程至今让我受益匪浅。
作为一名数据科学家,你如何应用这一点:
- 如果您要对现有流程进行更改,请务必比较结果。你永远不知道你会遇到什么意想不到的问题。传递错误的结果不值得你的名声。
6.生产
作为一名数据工程师,我总是编写代码,期望它最终会投入生产。我们很少有不需要自动化的特殊任务。
作为一名数据科学家,你如何应用这一点:
- 保持一种生产心态,编写代码,期待有一天它会被自动化。如果可能的话,不要硬编码值和使用变量,请记住,您可能需要在以后的某个时间点使用不同的值重新运行代码。
- 如果您的模型需要投入生产,请注意软件包和软件版本。我曾经用 Python 3.7 构建了一个模型,但是产品只安装了 Python 2.7 版本。在将我的模型部署到生产环境之前,我不得不花更多的时间在较低的版本上重新训练它。我团队中的另一位数据科学家需要一个 Python 包,但这个包不可用,必须等待它安装好,然后模型才能投入生产。如果您的模型有截止日期,那么由于缺少包和 Python 版本不匹配造成的延迟需要提前考虑。
现在,您已经知道如何作为一名数据科学家应用数据工程最佳实践,我希望这对您的帮助和对我的帮助一样多。
你可能也会喜欢…
* *
6 最佳编程实践
每个程序员和数据科学家都应该遵循的六个编程技巧
由 Pakata Goh 在 Unsplash 上拍摄的照片
“编程不在于你知道什么;而是你能想出什么。”*——*克里斯·派恩
软件行业中众多趋势的演变使得编码成为一个开发人员所拥有的最重要的技能之一。在现代世界中,编程是程序员和开发人员专注于特定任务以完成预期结果并将其公开给广泛的公众受众以从中受益和利用的能力。
掌握基本的编码技能对于成功大多数面试和开发一系列可以添加到你的简历或文件夹中的酷项目来说是非常棒的。然而,为了达到预期的结果并有效地完成您的目标,个人必须注意的最佳编程实践是什么?
在本文中,我们将介绍六种最佳编程实践和技巧,每个程序员和数据科学家都应该遵循这些实践和技巧,以从编码中获得最佳结果。在我们开始阅读这篇文章之前,我建议读者阅读下面这篇文章,它涵盖了学习编程的十个最佳免费网站。
</10-best-free-websites-to-learn-programming-939ec029009b>
1.完善你的缩进,利用注释行:
缩进是 Python 中用来区分不同代码块的空格。在其他编程语言中,比如 Java,我们使用花括号“{ }”来达到这个目的。适当缩进代码在项目工作中起着至关重要的作用。确保你相应地记录你的间距。通常,键盘上的 tab 键(或四个空格)用于 Python 代码的缩进。
另一方面,注释行在编程中也起着至关重要的作用。尽管您在注释行中编写的文本不会以任何方式影响您的代码块或程序,但它在大型项目的开发中起着至关重要的作用。在代码块的帮助下,您可以将您的思维过程和想法传达给其他想要查看您的代码以便更好地阅读和理解它们的熟练开发人员和爱好者。
您应该使用注释行的另一个原因是,当您在很长一段时间后重新访问自己的代码和代码块时,您可能无法立即理解为什么要执行某个特定的操作。在这些情况下,注释行通常会帮助你回忆你的思维过程和想法,使你更快更有效地回忆代码。
2.代码的简化:
当你经常被分配一个复杂的问题时,你的第一个想法通常会导致一个复杂的解决方案,有一个冗长而笨拙的代码块。虽然这并不完全是消极的一面,因为你最终找到了解决问题的方法之一,但重要的是要意识到这还不够。你需要深入思考,探索更多独特的方法来获得解决方案。
在技术或编程面试中,测试你的方式之一是你简化代码的方式。修剪代码并使它们看起来更有效的主要目的是减少问题的整体时间和空间复杂性。在部署阶段,删除额外和不必要的代码块以在更高的级别编写更好的代码,从而以更少的硬件消耗获得更好的性能,这一点至关重要。
举个例子,你的编程水平越高,尽量限制不必要的 for 循环的使用。相反,尝试有效地使用类、函数和匿名函数来产生尽可能好的预期结果。您可以随意查看我的文章《理解 Python 中的高级函数》,以及下面提供的链接中的代码和示例。
3.规划您的方法:
在您一头扎进问题并接触一些代码之前,对于编程爱好者来说,相应地规划他们的方法是至关重要的。对你来说,对一个复杂的问题进行编码并不总是最好的主意。有效地计划你的行动过程并详述细节通常是一个更好的建议。
当你在处理一个你觉得会导致复杂的问题或编程任务时,写下你为这个特殊问题计划的方法通常是一个好主意。你可以选择做更多的研究,更深入地了解如何解决这个问题,或者你可以选择自己尝试在纸上解决这个问题。这样做将有助于你找到如何处理特定任务的方向,而不是一味地编码并希望得到正确的答案。
假设你想解决二分搜索法问题。如果你是一个编程的初学者,你想实现二分搜索法算法的代码,对你来说,了解这个项目的直观理解和工作是必不可少的。如果没有先验知识和对方案背后的模式的基本理解,您将很难理解确切的编码设计。下面提供的文章链接应该是理解二分搜索法算法在 Python 中的实现的一个极好的起点。
4.有效调试:
编程的一个重要方面是遇到和处理错误。有效的调试是每个程序员都必须习惯的一个重要方面,因为无论你在解决程序块或问题上有多擅长,你总是会陷入一个困境,你不知道如何继续。
调试代码有许多方法。对于程序员来说,调试可能涉及一些步骤或方法来找出特定任务的正确解决方案。你可以用谷歌搜索来找出实际错误发生的原因,并访问一些网站来纠正你的错误。
你也可以不断尝试各种解决方案来自己破解答案。我鼓励读者阅读我以前的一篇文章,这篇文章介绍了如何利用 Python 中的内置工具来调试代码。
5.开发项目:
使用任何编程语言进行编码的最大好处是可以用它们开发大量精彩的项目。你可以创建一大堆独特而令人惊叹的项目来添加到你的文件夹或简历中,或者你可以构建这些项目只是为了好玩,来学习一些新的东西并获得进一步的知识。
从零开始完成一个成熟的项目后,你获得的知识量是首屈一指的。在你开始从事大量项目之后,你获得了如此多的经验,并作为一名开发人员和程序员得到了发展。在研究、批判性思维和改进的编程技能的指导下,您获得了将问题可视化并找到适当解决方案的能力。
如果你对自己想要探索什么想法或者想要构建什么独特的项目感到困惑,那么我有一个十五个令人敬畏的 Python 和数据科学项目的列表,你可以开发它们。这些项目将有助于增加你 2021 年及以后的简历和作品集!
</15-awesome-python-and-data-science-projects-for-2021-and-beyond-64acf7930c20>
6.每天编码:
这一点无疑是本文列出的所有其他点中最好的编程实践。实践是在大多数领域取得成功的重要一步。编程就是这样一个领域,你写得越多,你就能想出越多的东西。在编码时,你一定会犯错误。改正这些错误的精神,会让你不会更经常的重复错误,会让你作为程序员的整体发展。
即使你一天都很忙,也要尽量坚持每天至少花几分钟写代码。通过每天编码并保持你的练习时间表,你将使你的大脑不犯重复性错误并提高你的整体效率。除了持续改进,你还将获得更多的知识,发现新的方法和思路来处理不同类型的问题。
我们已经知道每天编码对程序员来说是非常重要的。不管你是什么级别的程序员。不管你是一个刚刚开始学习编码的新手,还是一个正在寻找高水平项目的高级开发人员。每天编码必须被视为你系统中固有的日常活动。查看下面这篇文章,它揭示了为什么每个数据科学家都应该每天编码的五个原因。
</5-reasons-why-you-should-code-daily-as-a-data-scientist-fa7fc6dc92c4>
结论:
“任何傻瓜都能写出计算机能理解的代码。优秀的程序员会写出人类能理解的代码。”—马丁·福勒
不可否认,编程是当代人需要掌握的最酷、最好的技能之一。对于每一个希望提高编码技能来设计新职业的个人来说,都有广泛的机会。然而,必须利用一些最佳的编程实践来最佳地利用这项技能。
在本文中,我们了解了一些最佳编程实践,它们将帮助大多数程序员随机应变,提高他们的整体编码技能,成为更有才华、更有技能的开发人员。本文中提到的要点对于您选择使用的任何编程语言取得最大成功都是至关重要的。
如果你对这篇文章中提到的各点有任何疑问,请在下面的评论中告诉我。我会尽快给你回复。
看看我的其他一些文章,你可能会喜欢读!
</5-essential-skills-to-develop-as-a-data-scientist-16442f094c09> </5-nlp-topics-and-projects-you-should-know-about-65bc675337a0> </7-tips-to-crack-data-science-and-machine-learning-interviews-38b0b0d4a2d3> </8-best-visualizations-to-consider-for-your-data-science-projects-b9ace21564a>
谢谢你们坚持到最后。我希望你们都喜欢这篇文章。祝大家有美好的一天!
6 个最佳图像处理项目和有用的资源
六个最好的图像处理和机器学习项目,提供有用的链接和技术资源
我们被美丽的视觉效果和丰富多彩的图像所包围。观看自然环境和拍摄照片是一段有趣的时光。虽然我们的眼睛可以轻松地想象图像的颜色和各种概念,但计算机识别这些相同的图像是一个复杂的过程。为了分析这些图像视觉效果,我们利用机器学习或深度学习的图像处理算法来创建精彩的项目。
计算机视觉是现代世界中最有趣的研究领域之一。使用最新的 CV 算法和技术,曾经被认为几乎不可能由更纯粹的机器来执行和计算的任务可以相对容易地实现。随着计算机视觉的所有元素在现代计算时代的兴起,我们可以创建一些高质量的项目。
从我们周围的众多选项和各种图像视觉选择中,我们可以从头开始创建一些顶级项目。在本文中,我们的目标是列出六个最好的图像处理项目,如果需要,可以借助计算机视觉、机器学习或神经网络来实现。
本文中列出的所有项目都是我个人为任何计算机视觉爱好者挑选的六个项目。确保您参考了本文中陈述的有用链接、资源和引用,以获得进一步的指导。他们将带你经历你在处理这些项目时可能遇到的大部分问题。
1.PIL 和 OpenCV 入门
作者截图。原文来源维基
首先,理解图像在自然世界中是如何工作的,以及计算机如何感知它们来处理和分析这些数字视觉效果是非常重要的。所有图像都以 0 的格式和直到 255 的范围来解释。彩色图像的格式是 RGB 格式,其中一个值以三维数组来解释。类似地,对于灰度图像,我们只有由白色和黑色对应物组成的两个光谱。
Python 图像库(PIL)是向 Python 解释器添加图像处理功能的主要方法之一。由于这个库提供了广泛的文件格式支持,您可以有效地执行大多数任务。它具有有效的内部表示和相当强大的图像处理能力。整个核心图像库旨在更快地访问以几种基本像素格式存储的数据元素。因此,这个库是一个很好的起点,因为它为用户提供了一个可访问的通用图像处理工具(查看下面提供的文档链接以了解更多信息)。
下面是一个简单的代码块,用来理解 PIL 库的一些基本特性。
# Importing the required libraries
import numpy as np
from PIL import Image
import PIL# Opening and analyzing an image
image1 = Image.open('Red.png')
print(image1.format)
print(image1.size)
print(image1.mode)
为了进一步实验和理解 pillow library,我建议查看一下官方文档,用这个工具实验更多的图片和模块。
下一个学习创建精彩项目的库是在 open-cv 计算机视觉库的帮助下。一旦您熟悉了枕头库,您就可以在 cv2 库的帮助下开始尝试这些图像的知识。在这个工具的帮助下,您可以操作图像,通过改变它们的尺寸来调整大小,将它们的颜色从一种格式转换为另一种格式,等等。从零开始探索并从这个图书馆中获取尽可能多的知识是值得的。
如果你有兴趣从零开始学习计算机视觉的大部分基本方面,以及解决一些复杂任务的所有相应代码,我建议大家看看下面提供的文章。它涵盖了初学者入门计算机视觉并最终掌握它所需的大部分要素。
2.基于图像的考勤系统
在教室里举手说“请讲,女士”或“是的,女士”或其他你想说的话的传统方式正在逐渐消失。随着在线课程的引入,学生和教师可以通过在线平台进行互动,以更传统的方式进行出勤将变得更加困难。然而,计算机视觉来拯救我们,帮助我们创建一个基于图像的考勤系统,在你的像素化图片的帮助下进行在线考勤!
让我们来讨论一些方法,在这些方法中你可能会处理这个问题。一个经典的方法是确保你有一些所有学生和同学的照片。如果无法包含更大的数据集,可以使用数据扩充方法来增加存储的数据量。一旦你能够为这个特定的任务收集到相当数量的数据集,你就可以处理这些图像,并建立一个深度学习模型,以实现顶级的结果。
如果你有兴趣探索与基于图像的考勤系统的任务相关的理论方面,那么研究论文应该是你探索更多理论知识和理解概念的一个梦幻般的起点。然而,如果你对该过程的实际编码实现更感兴趣,那么这篇文章指南应该也能帮助你实现自己的解决方案。
3.面罩检测
照片由安娜斯塔西娅·切平斯卡在 Unsplash 拍摄
在疫情期间,有一些严格的规定需要遵守,以保持城市、州或国家的礼仪。由于我们不能总是让官方机构关注一些不遵守规则的人,我们可以构建一个面具检测项目,使我们能够判断特定的人是否戴着面具。在此期间,在严格的封锁规定下,实施这个项目来维护社会将是一个绝妙的主意。
因此,一个可以通过跟踪路上或街道上的人来分析他们是否戴着面具来处理整个地区或区域的图像的项目将是一个非常棒的想法。在图像处理算法和深度学习技术的帮助下,你可以计算出戴面具的人的图像。以下用于人脸面具检测的 Kaggle 数据集将是分析训练图像以实现整体高准确度的良好起点。
解决这个问题的最好方法之一是利用迁移学习模型,如 VGG-16、face-net、RESNET-50 和其他类似的架构,看看什么方法可以帮助你达到最佳效果。作为起点,我强烈推荐查看我以前的一篇关于智能人脸锁定系统的文章,其中我们构建了一些高级人脸识别系统。对于没有遮罩的面和有遮罩的面,可以使用类似的方法来解决此类任务。
4.车牌识别
使用字母数字字符识别的最佳项目之一是借助车牌图像。有几种方法可以用来解决图像中嵌入字母、数字和数字的问题。我们可以使用深度学习技术、光学字符识别(OCR)技术、图像处理和自然语言处理(NLP)的结合、计算机视觉方法等等。
您可以处理这个问题的大量方法为您提供了一个机会,让您可以用自己开发的模型探索所有这些方法。找出什么技术将帮助你达到最佳效果是相当有趣的。通过深度学习方法,您可以从 Kaggle 收集所需的数据集和信息,用于车辆牌照检测。一旦你收集了足够的信息,你就可以建立你自己的定制模型或者使用迁移学习模型来看看是什么给了你想要的结果。
如果你想用一种更独特的方法来解决问题,建议你看看我以前的一篇关于光学字符识别(OCR)的文章。使用 OCR 技术,您可以相对轻松地解释图像中的大部分数据。OCR 引擎会尝试分析图像中的字符,并找到合适的解决方案。要详细了解这个主题,请查看下面提供的链接。您还可以尝试其他独特的方法,看看哪种技术产生的效果最好。
5.医学图像分割
Robina Weermeijer 在 Unsplash 上的照片
图像处理、计算机视觉、机器学习和深度学习最重要的贡献之一是在医疗领域。它们有助于分析和可视化许多可能发生在人类身上的高度复杂的异常现象。诸如糖尿病视网膜病变、癌症检测、x 射线分析和其他关键医疗处理任务等任务需要使用深度学习模型和图像处理来获得高度准确的结果。
虽然大多数项目需要高精度的预测,但这种说法在医学领域的图像分割任务中变得更加重要。自 2015 年使用 U-Net 架构进行生物医学图像分割以来,该架构出现了更多变化,并且不断构建许多不同类型的模型,以在每种情况下获得最佳结果。
从 DICOM 库可以获得接收与医学图像分割相关的任何任务的图像和视频文件的最佳位置之一。通过访问这个链接,你将被引导到一个可以下载医学图像和视频进行科学计算的地方。
您还可以利用 Kaggle 的糖尿病视网膜病变数据集开始一项流行的挑战,即计算眼睛的图像分割以及检测一个人是否患有眼睛疾病。除了上面提到的任务,还有大量的生物医学图像处理和任务可供您使用。请随意测试它们,用它们做实验。
6.情绪和手势识别
雅各布·欧文斯在 Unsplash 上的照片
看着上面的图像,人们可能会想知道这个特殊的手势可以被归类为什么。有几种手势是人们作为一种交流方式扔掉的。借助于适当的图像,人们可以找出对手势进行相应分类的最佳方法。类似地,你可能想弄清楚一张脸上的情绪。无论这个人表现出快乐、悲伤、愤怒或任何其他类似情绪的迹象,你都可以建立一个人工智能模型来执行以下分类。
情绪和手势是人类活动的组成部分。尽管与本文提到的其他一些项目相比有点困难,但我们可以构建一个计算机视觉和深度学习模型来执行以下任务。为了解决这个问题,你可以利用面部情绪识别( Kaggle 的 fer2013 数据集)进行情绪分类,利用美国手语( ASL 字母表数据集)进行手势计算。
一旦我们拥有了所有需要的数据集,你就可以在计算机视觉的帮助下构建你的深度学习架构来实现这些项目。借助神经网络和图像处理的结合,您可以开始研究情绪和手势检测,以获得高质量的结果,同时具有体面的损失和准确性。
下面提供的链接是两个最好的指南,您可以在其中从头开始执行人类情感和手势识别活动。我几乎涵盖了完美计算这些任务所需的每个方面,包括数据集的预处理、数据的可视化以及从头开始构建架构。请随意参考它们,以获得关于执行这些任务的最佳信息。
结论:
5 亿多年前,视觉成为进化“大爆炸”的主要驱动力,寒武纪大爆发导致了动物王国的爆炸性物种形成。5 亿年后,人工智能技术即将改变人类生活、工作、交流和塑造环境的方式。——费——李非
使用人工智能和计算机视觉来处理图像、图片和任何其他类型的视觉效果目前在多个领域都具有巨大的意义。除了本文提到的六个项目之外,还有数百万个项目想法可以让您自己从头开始实施,使您能够更加精通图像处理和计算机视觉任务。
对于任何与图像处理相关的任务,理解图像在核心中是如何工作的变得至关重要。有了这些基础知识和对基本概念的理解,您可以更轻松地实现更复杂的图像处理算法、机器学习方法和深度学习技术。
随着现代应用对图像处理和计算机视觉项目的需求越来越大,对于任何一个热衷于以下领域的人来说,这是投入其宝贵努力和资源的最佳时机。你不仅可以解码图像的特征和工作原理,还可以在高度复杂的任务中运用你的技能,如自动驾驶汽车,以全面改善和提高人们的生活方式。
如果你对这篇文章中提到的各点有任何疑问,请在下面的评论中告诉我。我会尽快给你回复。
看看我的其他一些文章,你可能会喜欢读!
</6-best-programming-practices-f2605c5b469c> </5-essential-skills-to-develop-as-a-data-scientist-16442f094c09>
谢谢你们坚持到最后。我希望你们都喜欢这篇文章。祝大家有美好的一天!
数据科学应用的 6 个最佳 Python IDEs 和文本编辑器
在动态、结构化的开发环境中构建您的应用程序。
程序员问自己的一个问题,尤其是在使用什么编程语言之后的职业生涯之初,是什么 IDE 或文本编辑器会让他们的生活变得更好、更高效。无论您从事什么样的编程,无论是 web 开发、移动/桌面应用程序开发还是数据科学,您对 IDE 的选择都会对您完美完成工作的能力产生巨大的影响。
IDE 和文本编辑器是特殊的开发环境,程序员使用它们来编写代码、测试代码、调试代码,并将其上传到 g itHub——或任何其他 Git 托管网站。正确的 IDE 或文本编辑器应该对大多数编程语言都是灵活的,让你可以很容易地分类和组织你的文件,并允许你轻松地共享它们。
尽管许多 IDE 和文本编辑器提供了许多属性和选项来定制您的开发环境,但是没有绝对最好的 IDE。一切都回到个人喜好上来。有些人喜欢完整的 ide,而有些人喜欢轻量级的文本编辑器。
</5-data-science-programming-languages-not-including-python-or-r-3ad111134771>
本文将介绍开发人员经常使用的 6 大 Python IDEs 和文本编辑器,以使他们的工作流程尽可能的流畅和高效。因此,如果您正在寻找一个 IDE 或文本编辑器,请尝试这些工具,直到找到符合您偏好的为止。
№1:崇高
让我们从我最喜欢的文本编辑器 Sublime 开始吧。Sublime 是一个带有付费版本的免费文本编辑器,您可以使用它来编写、编辑和调试几乎任何编程语言的代码。当你第一次下载并安装 Sublime 的时候,它是一个普通的,有点无聊的文本编辑器。但是,Sublime 的优势来自于你可以根据你打算使用的编程语言安装的附加组件。
Sublime 附加组件最好的部分是,你可以定制它们来满足你的需求,从颜色到整体外观,以及与 GitHub 或其他平台的连接。将 Sublime 设置为完美的开发环境将花费您不到 30 分钟的时间,然后您就可以开始工作了。我将很快写一篇关于为 Python 和数据科学完美设置 Sublime 的文章。
№2: Spyder
接下来是科学 Python 开发环境 Spyder 。Spyder 是一个免费的开源 IDE 开发,尤其是针对 Python。Spyder 最好的一点是与其他 ide 相比它是多么的轻量级。Spyder 是数据科学和机器学习应用程序的一个很好的选择,因为它有一个交互式编码模式,允许您实时分析数据。
Spyder 还让您能够检查整个代码库,或者将其分成几个部分,以便更仔细地查看。它还集成了许多常用的数据科学包,如 NumPy、Pandas、SciPy 和 IPython。但是,也许使用 IDE 的最大优势是它们的集成调试器。Spyder 有一个非常棒的图形调试器,可以让您的测试和错误定位任务变得流畅和容易。
</5-python-debugging-tools-that-are-better-than-print-1aa02eba35>
№3:原子
我们的下一个文本编辑器是原子。Atom 是 GitHub 开发的开源文本编辑器。开发 Atom 是为了支持许多常用的编程语言,如 Java 和 Ruby on Rails。但是,可以对其进行定制,以在编写 Python 代码时提供出色的用户体验。此外,Atom 提供了许多插件,可以使其成为构建数据科学应用程序时使用的最佳编辑器之一,例如允许您执行 SQL 查询的数据 Atom 包。
除了优秀的软件包,Atom 的优势之一是它的社区。Atom 有一个最活跃的社区,该社区一直致力于开发 atom,并使之更好地为开发者服务。不用说,Atom 具有很好的 Git 集成,可以让您的项目版本控制跟踪变得轻而易举。
№4: Visual Studio 代码
其中最完整、应用最广泛的 ide 是 Visual Studio 代码 (VS 代码)。VS Code 是 Python、C、C#和 JavaScript 开发人员非常流行的 IDE。VS 代码是免费的、轻量级的、开源的。但它也为公司提供付费版本。
VS 代码有很多优点,特别是对于初学者,因为当你定义一个函数或者一个类或者有一个小的语法错误时,它提供了点击和指针来帮助你。VS 代码还与 PyLint 有很好的集成,PyLint 是一种 Python linter,用于检查代码中的错误。使用 VS 代码的另一个优点是执行单元测试和 REPL(读取-评估-打印循环)操作非常容易。
</5-new-data-science-books-that-you-should-consider-reading-c90aec1d5b0d>
№5:皮查姆
如果你正在学习 Python,那么你可能会使用我们列表中下一个 IDE。PyCharm 可能是最著名的 Python IDE。它最初是为 Python 开发的,这是它最大的优势。虽然支持多种编程语言很好,但是为一种语言构建特定的 IDE 通常可以提供更健壮的开发环境。
PyCharm 提供了许多 Python 特性,比如代码/错误突出显示、Git 集成和强大的图形调试器。PyCharm 代码编辑器还允许您自定义其外观和颜色,以符合您的舒适。此外,PyCharm 有许多插件,您可以添加这些插件来扩展它的功能。
№6: Jupyter 笔记本
最后,也是最受数据科学社区欢迎的是 Jupyter 笔记本。如果不提到 Jupyter 笔记本,我就无法创建这个列表。Jupyter 代表 Julia、Python 和 r。Jupyter Notebooks 是一个开源、免费的开发环境,广泛应用于编程社区,因为它功能多样、健壮,并使代码文件易于共享。
Jupyter Notebook 使开发人员能够将代码位与 markdown、HTML 和 LaTeX 文本混合在一起。Jupyter notebook 是一个基于服务器的结构,易于在浏览器中使用和操作。由于 IPython 的使用,它强大的可视化能力使它成为人们的最爱,特别是在数据科学和量子计算方面。Jupyter Notebook 的扩展是 Jupyter Lab ,它提供了更多的功能,就像一个可视化调试器。
</9-comprehensive-cheat-sheets-for-data-science-46005d72b485>
外卖食品
当您必须编写、读取和调试数百行甚至数百万行代码时,您选择的 IDE 或文本编辑器将对您的工作流程产生重大影响。拥有正确的 IDE 或文本编辑器意味着你将有语法高亮,容易的文件编辑和组织,以及容易的共享和上传你的作品。
但是,现在有数百种 ide 和文本编辑器,尝试所有这些并不是最可行或最省时的解决方案。因此,在这篇文章中,我向您推荐了 6 种 Python IDEs 和文本编辑器,如果您想购买 IDE 或文本编辑器,可以从中选择。
本文中提出的 6 个 ide 和文本编辑器是通用的、灵活的,并且提供了大量的选项,您可以使用它们来定制构建一个高效、流畅的工作环境,使您能够轻松地执行任务。所以,试试这些 ide 和文本编辑器,看看哪一个最适合你的个性和需求。
每个有抱负的数据科学家都应该了解的 6 个特征
由 envato elements 的 Chanut_industries 使用图像创建(经许可)。
根据 ACM 数据科学任务组的研究
大数据和计算进步的优势导致数据科学成为一个无所不包的领域,可以帮助从数据中提取知识和价值。近年来,这种受欢迎的程度已经见证了指数级的增长和炒作,促成了对数据专业人员的巨大市场需求。有鉴于此,培训新一代数据科学家的最佳课程存在巨大空白。数据科学是一个如此独特的领域,因为它是跨学科的,并且可能根据观察者的不同而呈现不同的含义。
2017 年,计算机械协会的教育委员会成立了 ACM 数据科学任务组,以集思广益的方式为数据科学本科生推荐课程。在本文中,我们将探讨该计划所建议的数据科学毕业生的一些理想特征。
1.培养面向数据的思维方式
建议学习数据科学的人接受一种非常注重数据的心态,特别是数据的收集和数据的应用,以通过适当的分析做出有益的发现和改进。
数据科学给人类带来的好处包括:
- 一个城市的空气质量数据可能导致危险污染的消除或哮喘预警信号的发布。
- 患者数据收集可以为疾病诊断和治疗提供新的见解。
- 实时交通数据收集可以导致主动的交通缓解措施。
可能性是无限的,数据科学对改善企业、社会以及最终建设更美好未来的贡献是巨大的。
尽管有其优势,人们也应该意识到其意想不到的后果的可能性。
因此,任何数据科学家也应该有强烈的职业和道德责任感。因此,道德和负责任的人工智能等术语探索了这一重要领域。
2.数据科学是一个跨学科领域
数据科学从根本上说是一个跨学科领域,包含以下关键要素的集成:
- —为数据分析提供数据和上下文
- —为数据分析、探索性数据分析、建模和推理提供基础
- 计算机科学 —构成用于数据处理、数据结构和算法、机器学习以及模型部署的计算机硬件和软件
数据科学的跨学科性质。图片来自[1]。
数据科学不是这三部分的随意集合。为了交付有意义的结果,数据科学需要这三个组件的正确集成。
因此,这仍然是任何教授数据科学的教育项目的核心挑战。不可能把这三个元素的每一个都包含进来,但是我们的目标是创造一些独特的东西,把每个元素的 关键 元素都包含进来。因此,不了解这些元素中的每一个都是可以的,但是要抓住它们的核心。
数据科学的魅力可能在于其多样性,从业者拥有独特的技能组合,不仅可以从数据中提取知识和见解,还可以传达和练习引人入胜的故事,以便利益相关者可以了解分析结果。
3.探索当前的数据科学前景
为了探索数据科学领域的当前发展水平,ACM 数据科学工作组在 2018 年初对来自学术界(672)和工业界(297)的总共 969 名 ACM 成员进行了一项调查。
3.1.学术部门
当被问及该机构是否提供数据科学的学术项目时,结果如下:
- 47%的受访者表示他们不提供数据科学本科课程,而其余 53%的受访者提供数据科学的全学士学位。
- 提供数据科学学士学位的学院已经开设了编程和统计方面的必修课程。这些程序中的大多数还需要数据管理原则、概率、数据结构和算法、数据可视化、数据挖掘和机器学习。此外,这些课程还涵盖了伦理学、微积分、离散数学和线性代数等主题,以及一门与上下文中的数据科学相关的必修课。
- 这些数据科学的学术项目中的很大一部分位于计算机科学系。
- 超过一半的项目报告称,每年从该项目毕业的学生不超过 10 人。
3.2.工业部门
当被问及公司希望应聘者在数据科学和计算方面有什么经验时,结果如下:
- 48%的人表示,他们寻找拥有数据科学、分析或相关教育背景学位的候选人。
- 行业受访者报告的经验或技能与学术数据科学项目提供的经验或技能不谋而合。值得注意的一点是,雇主报告说,他们需要更多的计算技能,而不是数学或统计。
4.数据科学知识体系
4.1.知识领域
这些知识构成了数据科学的计算能力。它主要由以下 11 个知识领域组成:
- 分析和演示
- 人工智能
- 大数据系统
- 计算和计算机基础
- 数据获取、管理和治理
- 数据挖掘
- 数据隐私、安全性、完整性和安全性分析
- 机器学习
- 职业化
- 编程、数据结构和算法
- 软件开发和维护
ACM 数据科学任务组定义的数据科学知识体系。图片来自[2]。
4.2.为子领域主题分配能力级别
由于数据科学是一个广阔的领域,因此期望有抱负的数据科学家拥有所有主题的完整和全面的知识是不合理的。因此,子领域的这种分级有助于现实地设定对他们在不同主题上的能力水平的期望。
应该注意的是,这些知识领域可以进一步划分为子领域。接下来,这些知识领域的子领域的推荐能力等级按以下方式分级:
- Tier 1 (T1) —所有数据科学毕业生都应该掌握这些主题
- Tier 2(T2)——数据科学专业的毕业生应该掌握大部分 T2 项目。
- 选修(E)——代表重要但被视为构成选修一部分的项目
5.能力框架
在上一节中,我们简要地提到了将 11 个知识领域的子领域划分为能力等级的能力这一术语,以便提供一个学生在毕业时应该掌握这些主题的程度的总体概念。
那么能力到底是什么?
韦氏词典将 能力 定义为
具有足够的知识、判断、技能或力量的品质或状态(如对特定的职责或在特定的方面)
实际上,我们可以认为能力是一个人在工作中表现出来的工作表现的高级水平。
人们普遍认为,大学的成功和职业准备需要学生发展属于三个关键维度的各种属性,包括知识、技能和性格。
因此,
能力=知识+技能+性格
在能力的背景下,
知识 →证明对数据科学中的核心概念和内容的熟练程度,以及将新发现的知识应用到新情况中。
技能 →随着时间的推移而成熟的能力和策略,这是通过刻意练习和与他人互动(即向他人学习)而实现的。它可以通过实践活动获得,如基于问题的作业和真实世界的项目。
性格 →执行任务的倾向,以及知道何时以及如何参与任务的判断。舒斯勒[3]对处置的定义如下:
“关心的不是人们有什么能力,而是人们倾向于如何使用这些能力.”
总之,基于能力的数据科学课程方法有助于大学和学术机构设计能够赋予学生能力并实现 学习成果 (学生在完成一门课程后应该了解和展示的内容)的计划。
6.数据科学毕业生的 6 个特征
建议有抱负的数据科学家或数据科学专业的毕业生在知识体系描述的所有领域都具备基本能力。还应注意的是,知识主体中未明确列出的其他能力也是可取的,这主要包括(即沟通、数据讲述等软技能。).**
6.1.数学、统计和计算的基本技能
数据科学专业毕业生应具备以下 计算 技能:
- 对计算有基本的了解(编程、数据库和互联网使用)。
- 能够用一种或两种通用语言(Python 或 R)编程。
- 熟悉一些常见的库,如 Python 中的 scikit-learn、R 包和一些特定于方法或领域的库。
- 根据需要,愿意学习新的语言和库。
在数学方面,他们还应该精通:
- 应用数学原理,如多元微积分、线性代数、最优化和图论
就统计数据而言:
- 概率和基本统计方法。
在高层次上,他们应该能够轻松阅读面向从业者的出版物,其中包括与基础数学和统计术语相关的技术描述,以及对算法和实验数据的高层次讨论。他们还应该熟悉在数据项目的实现中使用许多公共数据存储库。
6.2.适应在快节奏的学科中工作
随着数据科学的不断发展,新的方法、工具和应用领域不断涌现。有抱负的数据科学家也应该通过各种媒介(如会议、研讨会等)在终身学习追求中茁壮成长。)以及与他们的专业同行和同事一起学习。
6.3.对应用领域的兴趣
数据科学专业的毕业生应该理解应用领域的使命、困难和限制,以便引导分析的重点以及选择适当的方法。这要求有抱负的数据科学家有广泛的兴趣、强烈的好奇心、快速的学习能力、强大的沟通能力、对客户主要问题的同情和关注。
6.4.意识到更广泛和非技术性的影响
除了构建模型,数据科学家还应该了解时事,以及潜在数据可能具有的社会和道德含义。这将有利于规划项目的行动过程,以便不违反任何隐私或安全问题。
6.5.很强的沟通技巧
拥有强大的沟通技巧也将使数据科学家向客户和利益相关者传达复杂的发现以及问题的技术基础。因为归根结底,如果数据科学家不能有效地沟通,他们就无法说服相关方做出明智的、由分析驱动的决策。
6.6.对专业责任的承诺
作为数据专业人员,数据科学家必须对其分析中使用的数据集的社会、文化和法律影响有良好的公众意识。此外,他们还应该了解在他们的分析中使用的工具的技术限制以及他们自己的个人限制,以便客观地规划他们的项目。
结论
数据科学教育中最具挑战性的问题之一是跨学科元素的无缝集成,以便所有部分可以和谐地一起工作来支持决策过程。我们希望,对 ACM 数据科学任务组提出的本文中讨论的 6 个特征的认识,将为有抱负的数据科学家提供建设性的指导,使他们能够适应自己的数据科学之旅。随着时间的推移,随着他们承担更多的责任、项目和管理角色,他们会自然而然地成熟为初级、中级和最终高级数据科学家。有鉴于此,这条路不会一帆风顺,可能会有弯路、挫折和障碍。客观、开放和成长的心态将有助于数据科学家在数据之旅中学习和成熟。
参考
[1]丹尼卢克 A,雷迪格 A,巴克 S,卡塞尔 L,麦克盖特里克 A,钱 W,塞尔温 C,王 H. 2019。大学本科生的计算能力
数据科学课程(初稿),ACM 数据科学任务组,计算机械协会。可在http://dstf.acm.org/DSReportInitialFull.pdf买到
[2] Danyluk A 和 Leidig P. 2021。大学数据科学课程的计算能力,ACM 数据科学任务组,计算机械协会。可从 https://www . ACM . org/binaries/content/assets/education/courses-recommendations/dstf _ ccdsc 2021 . pdf 获得
[3]舒斯勒法学博士,2006 年。定义处置:涉过浑水。《教师教育家》,第 41 卷第 4 期。
订阅我的邮件列表,获取我在数据科学方面的最佳更新(偶尔还有免费赠品)!
关于我
我是泰国一所研究型大学的生物信息学副教授和数据挖掘和生物医学信息学负责人。在我下班后的时间里,我是一名 YouTuber(又名数据教授)制作关于数据科学的在线视频。在我做的所有教程视频中,我也在 GitHub 上分享 Jupyter 笔记本(数据教授 GitHub page )。
**https://www.youtube.com/dataprofessor
在社交网络上与我联系
✅YouTube:http://youtube.com/dataprofessor/
♇网站:http://dataprofessor.org/(在建)
♇LinkedIn:https://www.linkedin.com/company/dataprofessor/
♇Twitter:https://twitter.com/thedataprof/
♇Facebook:http://facebook.com/dataprofessor/
♇github:https://github.com/dataprofessor/
♇insta**
下一个回归项目的 6 个通用指标
优势、劣势和主要陷阱
你训练了一个模特,现在呢?或者,你已经训练了多个模型;你如何决定哪一个是最好的?好吧,我们问问谷歌。嗯,谷歌推荐了许多可以用来评估你的模型的指标。但是现在,这变成了一个元问题,我应该使用什么度量来确定使用什么模型?因此,这里列出了一些常用指标,以及它们的优点、缺点和细微差别:
由 Kelly Sikkema 在 Unsplash 上拍摄的照片
对于下面的部分,y 是真实值,y-hat 是预测值,n 是测试实例的数量,并且 i 从 1 到 n。此外,所有指标都是在一个看不见的测试集上评估的。
绝对平均误差
图片作者。由 latex2png 生成
平均绝对误差是一个非常直观的指标,因此也是一个流行的指标。它只是预测值和真实值之间的平均距离。为了避免误差相互抵消,我们计算每个误差的绝对值。最好的模型通常是 MAE 最低的模型。然而,当选择 MAE 作为您的度量标准时,有一些特性需要考虑。
虽然它很容易理解,但是 MAE 也有一些缺点。例如,它不能告诉你你的模型是倾向于高估还是低估,因为任何方向信息都被绝对值破坏了。此外,该指标可能对大的异常值不敏感。看看下面的例子。
图片作者。由 latex2png 生成
在左边,这个模型在这里和那里有一点偏差。然而,在右边,模型以更大的差距错过了尾端的标记,而在开始和中间是完美的。然而,两者的 MAEs 是相同的。如果您决定使用这个度量标准,那么绘制误差图来查看任何异常值是一个好主意,就像案例 2 一样。总而言之,如果你想要一个惩罚大错误的标准,你在别的地方会有更好的运气。
均方误差
图片作者。使用 latex2png 生成。
这让我想到了均方误差。像 MAE 一样,当我们平方每一个计算误差时,我们正在破坏方向信息。MSE 也总是大于或等于 0。然而,我们现在能够区分上述两种模型。
图片作者。使用 latex2png 生成。
有趣的是,MSE 与臭名昭著的偏差-方差权衡有关。可以看出,给定测试点的预期测试 MSE 可以写成[1]:
图片作者。使用 latex2png 生成。
其中下标 0 是测试数据点的索引,ϵ是数据中的不可约或噪声。
方差是指当我们改变训练集时 y-hat 改变的量。通常,更灵活的方法具有更高的变化程度。方差也取决于我们有多少数据。训练数据集越大,方差越低。因此,我们可以在大量数据的限制下,根据模型的偏差和随机噪声来解释给定测试数据点的 MSE。
当我们试图用简单的东西来估计预测因子和目标之间的复杂关系时,就会产生偏差。例如,我们经常假设 x 和 y 具有线性或多项式关系,因为我们知道这些方程的形式,这将问题简化为我们可以估计的几个参数。实际上,x 和 y 可能没有这样的关系。
最后,MSE 的一个主要缺点是 y 的单位是平方的,这意味着很容易误解最终结果。
鲁尔均方误差
图片作者。使用 latex2png 生成。
我们开平方根怎么样?RMSE 和 MSE 非常相似,除了 RMSE 更方便,因为它和 y 有相同的单位。
图片作者。使用 latex2png 生成。
然而,你有没有尝试过转换你的目标,看看你是否得到一个更好的适合?比如取 y 的对数。然后你计算两种方法的 RMSE,你会发现一个比另一个高。这不是一个公平的比较,因为这两个值有不同的单位。解决这个问题的一个方法是除以 y 的某个属性,得到一个无单位的度量,称为归一化均方根误差。
归一化均方根误差
我这里没有任何方程,因为有很多东西可以用来除均方根。一些常见的选择是 y 的平均值、y 的最大值和最小值之差、标准差和四分位距。何时选择什么是微妙的事情,如果你感兴趣的话,[2]可以提供更深入的解释。
均方根对数误差
图片作者。使用 latex2png 生成。
我认为这个度量标准是几年前由 Kaggle 提出的[3]。当您想要增加如何惩罚错误的方向时,应该使用此指标。在这种情况下,我们告诉度量标准对低估的惩罚要多于高估。例如,假设 y=1。如果我们的模型给出 y-hat = 0,那么误差就是[log(1/2)] = 0.09。但是,如果模型给出 y-hat=2,那么误差就是[log(3/2)] = 0.03。如果我们使用 MSE,那么我们的误差无论如何都是 1。
此外,该指标还考虑了真实值和预测值的相对比例。例如,如果 y=9,y-hat=99,则误差为 1。另一方面,如果 y=99,y-hat=999,那么误差仍然是 1。因此,当目标值的范围很大时,这种度量很方便,并且当预测值和真实值都很大时,您不希望惩罚大的错误。
然而,我在这里还没有找到关于一些陷阱的讨论。如果你看看 log(x)图,你会发现 x 不能等于或小于 0。这意味着我们的对数(y-hat+1 / y+1)内部的自变量不能等于或小于 0。然后,还有一个附加的约束,y 不能是-1。否则,整件事就完了。
平均绝对百分比误差
图片作者。使用 latex2png 生成。
MAPE 看起来像 MAE 的表亲,额外的好处是它是无单位的。然而,引入除法也有一些主要的缺点。例如,在非常小的 y_i 或 y_i = 0 的情况下,MAPE 可以爆炸或根本不可计算。它还继承了 MAE 的一个问题,即每个误差的大小是否没有上限(尽管名字上写着“百分比”)。
总结
我希望你喜欢这个列表,并且学到了一些新的东西。接下来的只是我的看法。当我阅读这些指标时,我经常看到提到“可解释性”。我不太确定“可解释性”是什么意思,也不知道是否已经达成共识。我对这些指标的解释和理解通常基于它们在特定情况下的表现。总而言之,当有其他指标更像我们想要的方式,但更难解释时,我们应该在多大程度上强调一个指标的“可解释性”?
保持联系
我喜欢写关于数据科学和科学的文章。如果你喜欢这篇文章,请在 Medium 上关注我,加入我的电子邮件列表,或者成为 Medium 会员(如果你使用这个链接,我将收取你大约 50%的会员费),如果你还没有的话。下一篇帖子再见!😄
来源
[1] Gareth James,Daniela Witten,Trevor Hastie,Robert Tibshirani。统计学习导论:在 R (2013)中的应用
[2]奥托,S.A. (2019 年 1 月 7 日)。如何使 RMSE 正常化。https://www . marinedata science . co/blog/2019/01/07/normalizing-the-RMSE/
[3]https://www . ka ggle . com/carlolepelaars/understanding-the-metric-rmsle
[4]https://en . Wikipedia . org/wiki/Mean _ absolute _ percentage _ error
我最近遇到的 6 个很酷的 Python 库
图片由 Free-Photos 来自 Pixabay
面向机器学习的出色 Python 库
Python 是机器学习不可或缺的一部分,库让我们的生活更简单。最近,我在做我的 ML 项目时遇到了 6 个很棒的库。他们帮我节省了很多时间,我将在这个博客中讨论他们。
1.纯文本
一个真正不可思议的库,当你需要处理抓取或社交媒体数据时,纯文本应该是你的首选。最酷的是,它不需要任何冗长的代码或正则表达式来清理我们的数据。让我们看一些例子:
装置
!pip install cleantext
例子
#Importing the clean text library
from cleantext import clean# Sample texttext = """ Zürich, largest city of Switzerland and capital of the canton of 633Zürich. Located in an Al\u017eupine. ([https://google.com](https://google.com)). Currency is not ₹"""# Cleaning the "text" with clean textclean(text,
fix_unicode=True,
to_ascii=True,
lower=True,
no_urls=True,
no_numbers=True,
no_digits=True,
no_currency_symbols=True,
no_punct=True,
replace_with_punct=" ",
replace_with_url="",
replace_with_number="",
replace_with_digit=" ",
replace_with_currency_symbol="Rupees")
输出
从上面,我们可以看到单词 Zurich 中有 Unicode(字母“u”已被编码),ASCII 字符(在 Al\u017eupine 中。)、卢比货币符号、HTML 链接、标点符号。
您只需在 clean 函数中提到所需的 ASCII、Unicode、URL、数字、货币和标点符号。或者,可以用上述函数中的替换参数来替换它们。例如,我把卢比符号换成了卢比。
完全没有必要使用正则表达式或长代码。非常方便的图书馆,特别是如果你想清理刮或社会媒体数据的文本。根据您的需求,您也可以单独传递参数,而不是将它们组合在一起。
更多详情,请查看这个 GitHub 库。
2.drawdata
Drawdata 是我发现的另一个很酷的 python 库。你遇到过多少次需要向团队解释 ML 概念的情况?这种情况一定会经常发生,因为数据科学就是团队合作。这个库可以帮助你在 Jupyter 笔记本中绘制数据集。就我个人而言,当我向我的团队解释 ML 概念时,我真的很喜欢使用这个库。向创建这个库的开发人员致敬!
Drawdata 只针对四类的分类问题。
装置
!pip install drawdata
例子
# Importing the drawdata
from drawdata import draw_scatterdraw_scatter()
输出
作者图片
执行 draw_Scatter()后,上述绘图窗口将打开。很明显,有四类,即 A、B、C 和 d。你可以点击任何一类,画出你想要的点。每个类别代表绘图中的不同颜色。您还可以选择将数据下载为 csv 或 json 文件。此外,数据可以复制到你的剪贴板,并从下面的代码读取
#Reading the clipboardimport pandas as pd
df = pd.read_clipboard(sep=",")
df
这个库的局限性之一是它只给出了四个类的两个数据点。但除此之外,绝对是值得的。更多详情请查看这个 GitHub 链接。
3.Autoviz
我永远不会忘记我使用 matplotlib 进行探索性数据分析的时间。有许多简单的可视化库。然而,我最近发现了 Autoviz,它可以用一行代码自动可视化任何数据集。
装置
!pip install autoviz
例子
我在这个例子中使用了虹膜数据集。
# Importing Autoviz class from the autoviz library
from autoviz.AutoViz_Class import AutoViz_Class#Initialize the Autoviz class in a object called df
df = AutoViz_Class()# Using Iris Dataset and passing to the default parametersfilename = "Iris.csv"
sep = ","graph = df.AutoViz(
filename,
sep=",",
depVar="",
dfte=None,
header=0,
verbose=0,
lowess=False,
chart_format="svg",
max_rows_analyzed=150000,
max_cols_analyzed=30,
)
以上参数为默认参数。更多信息,请点击查看。
输出
作者图片
我们可以看到所有的视觉效果,并用一行代码完成我们的 EDA。有许多自动可视化库,但我真的很喜欢熟悉这一个。
4.米托
大家都喜欢 Excel 吧?这是在第一个实例中探索数据集的最简单的方法之一。几个月前我偶然发现了米托,但只是最近才尝试,我绝对喜欢它!
这是一个 Jupyter-lab 扩展 python 库,支持 GUI,增加了电子表格功能。您可以加载 csv 数据并以电子表格形式编辑数据集,它会自动生成 Pandas 代码。非常酷。
米托真的值得一整篇博文。不过,今天就不多赘述了。这里有一个简单的任务演示。更多详情,请点击查看。
装置
**#First install mitoinstaller in the command prompt** pip install mitoinstaller**# Then, run the installer in the command prompt**
python -m mitoinstaller install**# Then, launch Jupyter lab or jupyter notebook from the command prompt** python -m jupyter lab
有关安装的更多信息,请点击查看。
**# Importing mitosheet and ruuning this in Jupyter lab**import mitosheet
mitosheet.sheet()
执行上述代码后,mitosheet 将在 jupyter 实验室中打开。我在用虹膜数据集。首先,我创建了两个新列。一个是平均萼片长度,另一个是总萼片宽度。其次,我改变了平均萼片长度的列名。最后,我为平均萼片长度列创建了一个直方图。
遵循上述步骤后,代码会自动生成。
输出
作者图片
为上述步骤生成了以下代码:
from mitosheet import * # Import necessary functions from Mito
register_analysis('UUID-119387c0-fc9b-4b04-9053-802c0d428285') # Let Mito know which analysis is being run# Imported C:\Users\Dhilip\Downloads\archive (29)\Iris.csv
import pandas as pd
Iris_csv = pd.read_csv('C:\Users\Dhilip\Downloads\archive (29)\Iris.csv')# Added column G to Iris_csv
Iris_csv.insert(6, 'G', 0)# Set G in Iris_csv to =AVG(SepalLengthCm)
Iris_csv['G'] = AVG(Iris_csv['SepalLengthCm'])# Renamed G to Avg_Sepal in Iris_csv
Iris_csv.rename(columns={"G": "Avg_Sepal"}, inplace=True)
5.格拉姆 former
另一个令人印象深刻的库是 Gramformer,它基于生成模型,帮助我们纠正句子中的语法。这个库有三个型号,它们有一个检测器、一个荧光笔和一个校正器。检测器识别文本是否具有不正确的语法。荧光笔标出错误的词类,校正器改正错误。Gramformer 是一个完全开放的源代码,目前处于早期阶段。但它不适合长段落,因为它只在句子层面上起作用,并且已经针对 64 个长句子进行了训练。
目前,校正器和荧光笔模型有效。让我们看一些例子。
装置
!pip3 install -U git+https://github.com/PrithivirajDamodaran/Gramformer.git
实例化 Gramformer
gf = Gramformer(models = 1, use_gpu = False) # 1=corrector, 2=detector (presently model 1 is working, 2 has not implemented)
例子
#Giving sample text for correction under gf.correctgf.correct(""" New Zealand is island countrys in southwestern Paciific Ocaen. Country population was 5 million """)
输出
作者图片
从上面的输出中,我们可以看到它纠正了语法甚至拼写错误。一个非常神奇的库,功能也非常好。我在这里没有试过荧光笔,你可以试着查看这个 GitHub 文档来获得更多的细节。
6.造型器
我在 Gramformer 的积极经历鼓励我寻找更多独特的图书馆。我就是这样找到了 Styleformer,另一个非常吸引人的 Python 库。Gramformer 和 Styleformer 都是由 Prithiviraj Damodaran 创建的,并且都基于生成模型。向开源 it 的创造者致敬。
Styleformer 帮助将非正式句子转换为正式句子,正式句子转换为非正式句子,主动句子转换为被动句子,被动句子转换为主动句子。
让我们看一些例子
装置
!pip install git+https://github.com/PrithivirajDamodaran/Styleformer.git
实例化 Styleformer
sf = Styleformer(style = 0)# style = [0=Casual to Formal, 1=Formal to Casual, 2=Active to Passive, 3=Passive to Active etc..]
例子
# Converting casual to formal sf.transfer("I gotta go")
# Formal to casual
sf = Styleformer(style = 1) # 1 -> Formal to casual# Converting formal to casual
sf.transfer("Please leave this place")
# Active to Passive
sf = Styleformer(style = 2) # 2-> Active to Passive# Converting active to passive
sf.transfer("We are going to watch a movie tonight.")
# passive to active
sf = Styleformer(style = 2) # 2-> Active to Passive# Converting passive to active
sf.transfer("Tenants are protected by leases")
看到上面的输出,它转换准确。在我的一次分析中,我使用这个库将休闲转换为正式,尤其是社交媒体帖子。更多详情,敬请查看 GitHub 。
您可能对前面提到的一些库很熟悉,但是像 Gramformer 和 Styleformer 这样的库是最近才出现的。它们被极度低估了,当然也值得被了解,因为它们节省了我很多时间,我在 NLP 项目中大量使用了它们。
感谢阅读。如果你有什么要补充的,欢迎随时留言评论!
你可能也喜欢我以前的文章 五个用于数据科学的酷 Python 库
你喜欢阅读这个博客吗?然后, 成为 的一员,加入好奇心灵的社群!
你应该知道的 6 个很酷的 Python 技巧
超越常规
近年来,数据科学经历了巨大的发展。Python 作为数据科学领域最常见的编程语言,也越来越受欢迎。
在本文中,我将提到 6 个我认为非常酷的 Python 技巧。它们还会通过提供完成某些任务的实用方法,让你的生活变得更轻松。
要成为一名优秀的程序员,仅仅编写代码来完成给定的任务是不够的。你的程序应该在时间和计算复杂度方面高效。此外,代码应该是干净的,易于阅读和调试,并可维护。
本文中的技巧将帮助您实现编写干净高效代码的最终目标。
1.部分
切片是对象,因此可以存储在变量中。一些数据结构允许索引和切片,例如列表、字符串和元组。
我们可以使用整数来指定切片的上下限,或者使用切片对象。
s = slice(3,6)lst = [1, 3, 'a', 'b', 5, 11, 16]
text = 'DataScience'
tpl = (1,2,3,4,5,6,7)print(lst[s])
['b', 5, 11]print(text[s])
aScprint(tpl[s])
(4, 5, 6)
切片 s 表示从第四元素到第六元素的切片。我们将相同的切片对象应用于列表、字符串和元组。
2.交换变量
我们很可能会遇到需要交换两个变量的值的情况。一种方法是使用中间变量来临时保存值。
a = 'John'
b = 'Emily'c = a
a = b
b = cprint(a)
'Emily'print(b)
'John'
这种方式有点乏味。Python 提供了一种更好的交换方式。
a = 20
b = 50a, b = b, aprint(a)
50print(b)
20
3.对列表进行排序
假设我们有一个列表列表。
lst = [[2, 7], [7, 3], [3, 8], [8, 7], [9, 7], [4, 9]]
我们可以通过使用带有 lambda 函数的 sort 函数,根据内部列表的第一项或第二项对列表进行排序。
lst.sort(key = lambda inner:inner[1])print(lst)
[[7, 3], [2, 7], [8, 7], [9, 7], [3, 8], [4, 9]]
列表根据第二项排序。我们可以对第一个项目做同样的事情,只需将 1 改为 0。
lst.sort(key = lambda inner:inner[0])print(lst)
[[2, 7], [3, 8], [4, 9], [7, 3], [8, 7], [9, 7]]
4.参数解包
假设我们有一个给定数字相乘的函数。
def mult(a, b, c):
return a * b * cmult(2, 3, 4)
24
如果我们只需要将三个数相乘,这个函数就能很好地工作。必须给出正好三个数字。通过使用参数解包,我们可以使函数更加灵活。
def mult(*args):
result = 1
for i in args:
result *= i
return result
现在 mult 函数能够乘以任意数量的值。
mult(2, 3)
6mult(2, 3, 4)
24mult(2, 3, 4, 5)
120
参数解包在 Python 中非常常用。如果你阅读一个包或库的文档,你一定见过 *args 和**kwargs 。
5.分解收藏
假设我们有一个返回两个值的元组的函数,我们想将每个值赋给一个单独的变量。一种方法是使用如下索引:
tpl = (1, 2)x = tpl[0]
y = tpl[1]print(x, y)
1 2
有一个更好的选项,允许我们在一行中执行相同的操作。
x, y = tplprint(x, y)
1 2
它可以扩展到具有两个以上值的元组或一些其他数据结构,如列表或集合。
x, y, z = {1, 2, 3}print(x, y, z)
1 2 3x, y, z = ['a', 'b', 'c']print(x, y, z)
a b c
6.f 弦
在字符串中添加变量是一种常见的做法。f 弦是迄今为止最酷的做法。为了更好地欣赏 f 字符串,让我们先用 format 函数执行操作。
name = 'John'
age = 15print("{} is {} years old".format(name, age))
John is 15 years old
我们通过在最后使用 format 函数来指定花括号内的变量。f 字符串允许在字符串中指定变量。
print(f"{name} is {age} years old")
John is 15 years old
f 字符串更容易理解和输入。此外,它们使代码更具可读性。
结论
我们已经介绍了 6 个简单却非常实用的技巧。它们引起微小的变化,但微小的改进会累积起来。你最终会写出更高效、更易于阅读和调试、更易于维护的代码。
感谢您的阅读。如果您有任何反馈,请告诉我。