TowardsDataScience 博客中文翻译 2020(七百二十三)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

概率必备

原文:https://towardsdatascience.com/probability-must-haves-f5e44e2bf88d?source=collection_archive---------93-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

由安卡在 pixabay.com

理解随机事件

客户和您的应用

假设你有一个用户点击行动号召的随机可能性(从现在开始我称之为 CTA,但这是你邀请读者购买、购物、发送电子邮件等的任何时候。)在您的应用程序中。一旦他们点击了行动号召,随后他们可能会点击提交按钮发送他们的电子邮件信息(在这种情况下)。

现在让我们分配一些概率…点击 CTA: 50%的可能性和提交按钮:10%的可能性。

现在我们的问题是,在这些事件发生之前,两个 T2 事件发生的可能性有多大?

重温经典的概率例子:骰子

现在你可能已经看过了,所以至少这是一个很好的复习。

首先,让我们回答以下问题:掷出两个连续的 6 的概率是多少。

对于你的第一次掷骰子,你可以用以下方式掷骰子:1–2–3–4–5–6。总的来说,你有六个选择。

明显?是的,是的,但是现在我们在这一点上思考得更为关键。如果你掷 1,你的下一个选择是什么?嗯,它是下列任何一个数字:1–2–3–4–5–6。如果你掷了一个 2,你在第二次掷骰子时会有同样的 6 个选项。在这种情况下,你的第二次投掷有 6 个选项。总之,这给了我们 36 (6*6)种不同的结果。

那么回到问题…你连续掷出两个 6 的可能性有多大?

如果我们掷骰子,第一次落在 6 点的可能性是 1/6。一旦发生这种情况,我们又有 1/6 的可能性。在所有 36 种不同的两次掷骰子的组合中,只有一种是连续掷出两次 6。这个问题的数学方法是简单地将两个概率相乘,给你 1/36 的可能性,你会连续掷出两个 6。

回到应用程序示例

让我们将刚刚学到的知识应用到我们最初的例子中。如果用户有 1/2 的机会点击 CTA,并且有 1/10 的机会点击提交按钮;然后我们可以把我们的概率相乘,说有 1/20 或 5%的几率他们会同时按下两个按钮。

抛开理论,让我们写一些代码

在此作序;如果你没有看过我关于统计推断的中型帖子,我详细介绍了rbinom函数:https://towardsdatascience . com/an-introduction-to-binomials-inference-56394956 E1 a4。为了让您快速了解这一点的重要性,您可以使用这个函数来模拟随机发生的二项式事件。

让我们要求两者都使用…和

我们有 5000 张该事件的抽签图,以及相应的概率。我们将看到 5000 个 1 或 0 的平局。当我们指定&时,我们实际上是在说两者都必须为真。当我们对这两种情况的发生率取平均值时,就给出了这两种情况都发生的概率。

CTA <- rbinom(5000, 1, .5) 
SUBMIT <- rbinom(5000, 1, .1) 
mean(CTA & SUBMIT)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以重复这个过程,无论需要多少步骤。从上面我们可以看到,有 5%的时间两种行为同时发生。

从和到或

让我们回到骰子的例子。假设不是两次都是 6 的可能性,而是我们想要计算两次掷骰中任何一次都是 6 的概率。

概念方法

思考这个问题的方法是从它们的独立可能性开始。任何一个都有 1/6 的几率被碾压。我们把这两个 1/6 的可能性加起来。差不多了…但是有一个问题…1/6+1/6 也隐含着一组事件,其中都会发生- 都是这里的关键词。那些事件必须被揭露出来!

这就是我们迄今为止所学知识的汇集之处。

我们将把概率加在一起,然后我们将减去两者的概率。也就是 1/6*1/6。

数学方法

这给了我们一个公式 1/6+1/6–1/6 * 1/6

纲领性方法

让我们像之前一样复制这个。

roll_1 <- rbinom(5000, 1, .17) 
roll_2 <- rbinom(5000, 1, .17)round(mean(roll_1 | roll_2),2) .17 + .17 - .17*.17

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上面你会看到一些和我们第一次看到的非常相似的东西——唯一的区别是OR或者|操作符。我们可以看到,当我们生成许多随机事件时,我们在随机生成的数据集中有 31%的发生率。我们能够通过执行我们刚刚得出的简单等式来复制这个数字,验证这两种方法是一致的。

从条件句到条件句

假设你要模拟五个人来到你的网站,点击或者不点击 CTA,两种结果都有 50%的可能性。与我们之前所做的类似,我们将模拟 5 人组整整 50,000 次。

CTA <- rbinom(50000, 5, .5) 
mean(CTA)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

您可以看到每次试验或模拟中点击 CTA 的次数。当我们取 CTA 的平均值时,我们看到每个试验的平均值为 2.5,这代表了每个试验中 5 的 50%。

既然我们已经走到这一步,假设您想了解 5 个用户中至少有 2 个会点击 CTA 的概率,那么让我们对 5 个中的 3 个,然后 5 个中的 4 个做同样的事情。

mean(CTA >= 2) 
mean(CTA >= 3) 
mean(CTA >= 4)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当你插入这个值为真或假的条件语句时。我们的 mean 函数将 TRUE 视为 1,将 FALSE 视为 0,这样我们就可以获取语句为真时的平均出现次数。

我们现在可以用 OR 和 and 来利用这个想法。

结论

我们在很短的时间内访问了许多想法,我希望这个概率基础的分解是有帮助的!请务必查看我在 datasciencelessons.com 的博客,了解更多信息!

一如既往,祝数据科学快乐!

彩票中奖概率

原文:https://towardsdatascience.com/probability-of-winning-the-lottery-9331080952c4?source=collection_archive---------4-----------------------

使用 Python 来确定你的成功几率

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由来自皮克斯拜杰奎琳·马库拍摄

你有没有想过如果你中了彩票,你的生活会有多大的不同?彩票似乎是许多人梦寐以求的快速致富计划。据 ABC 新闻报道,强力球在 2016 年达到了惊人的【15.86 亿美元(强力球)

显然,要赢得最终的百万或十亿美元的头奖,你必须挑战巨大的赔率。据评论期刊报道,以下事件发生的几率比你中彩票的几率高。

  • 被陨石压碎
  • 成为下一个沃伦·巴菲特
  • 热自来水致死
  • 成为美国总统

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Unsplash 上由 Srikanta H. U 拍摄的照片

假设我们的彩票结构是每次从 1-49 的数字池中抽取 6 个数字。如果你不熟悉彩票的工作原理,选择六个号码的顾客必须得到与中奖号码完全相同的号码。如果有一个数字不同,他们就不会赢得大奖。

首先,我们需要创建一些函数。

阶乘函数:

正整数 n 的阶乘,用 n 表示!,是所有小于等于 n 的正整数的乘积:比如 0 的值!是 1,按照惯例为空产品。

def **factorial**(n):
    final_product = 1
    for i in range(n, 0, -1):
        final_product *= i
    return final_product

组合功能:

组合 区域从集合中选择项目,这样选择的顺序就无关紧要了。如果你想了解更多,这里的是一本好书。

def **combinations**(n,k):
    numerator = factorial(n)
    denominator = factorial(k) * factorial(n-k)
    return numerator / denominator

单张彩票功能:

现在我们来计算一下购买的单张票的中奖概率。

def **one_ticket_probability**(numbers):
    total_outcomes = combinations(49, 6) 
    successful_outcome = 1 / total_outcomes 
    probability_winning = (successful_outcome / total_outcomes) *100
    print(f"You're chances of winning are {probability_winning}%!")

需要注意一些重要的事情,

  1. total_outcomes —使用我们之前制作的组合公式,传入可能的数字总数 49 和选项数量 6
  2. successful_outcomes —正如前面提到的,只有一个赢家,所以只有一张票赢。

正好有 13,983,816 个赢的机会(total_outcomes),

如果我们在为一张票选择的 6 个数字样本上运行这个函数,我们将得到以下结果。

test_ticket = [1,4,32,38,5,18] #random numbers
**one_ticket_probability**(test_ticket)

输出:

“你赢的几率是 0.00000000005113857220%!”

“选择乐观,感觉更好。”

达赖喇嘛

买多张票会怎么样?如果你批量购票,你的胜算会大多少?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自 PixabayAlejandro Garay 的图片

多张彩票功能:

def **multi_ticket_probability**(n_tickets_played):
    total_outcomes = combinations(49, 6)
    successful_outcome = n_tickets_played / total_outcomes
    probability_n_tickets = (successful_outcome / total_outcomes) *100
    **combinations_simplified = round(total_outcomes / n_tickets_played)   
    print('''*Your chances to win the big prize with {:,} different tickets are 1 in {:,} chances to win.*'''.format(n_tickets_played,combinations_simplified))**

如您所见,我保留了与 single_ticket 函数相同的主要代码块,但是现在我添加了代码来简化组合。我还在末尾添加了字符串格式,以帮助生成更具可读性的输出。

让我们使用各种票金额和一个 for 循环来测试代码。

ticket_quantity = [1, 10, 100, 10000, 1000000, 6991908, 13983816]for tickets in ticket_quantity:
    multi_ticket_probability(tickets)
    print("""
    ----------------------
    """)

输出如下所示。

Your chances to win the big prize with **1** different tickets are **1 in 13,983,816** chances to win. ----------------------

Your chances to win the big prize with **10** different tickets are **1 in 1,398,382** chances to win. ----------------------

Your chances to win the big prize with **100** different tickets are **1 in 139,838** chances to win. ----------------------

Your chances to win the big prize with **10,000** different tickets are **1 in 1,398** chances to win. ----------------------

Your chances to win the big prize with **1,000,000** different tickets are **1 in 14** chances to win. ----------------------

Your chances to win the big prize with **6,991,908** different tickets are **1 in 2** chances to win. ----------------------

Your chances to win the big prize with **13,983,816** different tickets are **1 in 1** chances to win.

不出所料,我们可以看到随着购票数量的增加,中奖几率也在增加。最后一行显示,如果我们购买 13,983,816 的股票,我们有 100%的机会获胜,因为我们之前计算过,可能的结果总数是 13,983,816

理解计算彩票概率的过程和代码结构是深入数据科学世界获得无限可能性的垫脚石。

使用概率的其他令人兴奋的方法是什么?

“一个行为的后果影响着它再次发生的可能性.”

  • B. F .斯金纳

用 Python 解释概率抽样方法

原文:https://towardsdatascience.com/probability-sampling-methods-explained-with-python-4c0a19a59456?source=collection_archive---------18-----------------------

概率和统计用 PYTHON

所有数据科学家都必须知道的四种采样方法

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

丘拉斯奎拉·马丁斯在拍摄的照片

为什么我们需要取样?

当我们试图在不知道总体的情况下得出结论时,就会用到抽样。总体指我们想要研究的观测值的完整集合,而样本是目标总体的子集。这里有一个例子。去年 7 月 15 日至 31 日进行的盖洛普民意调查发现,42%的美国人认可唐纳德·特朗普作为总统处理工作的方式。结果是基于对大约 4500 个电话的随机抽样的电话采访(假设每个电话有一个成年人)。约 4500 名成年人),年龄在 18 岁及以上,居住在美国。该民意调查是在特朗普的社交媒体评论引发争议期间进行的。对于这项调查,人口是所有 18 岁以上的美国公民,样本是 4500 名成年人。

如果取样不当,将会导致偏差,影响您的研究/调查结果的准确性。为了避免选择偏差,我们必须仔细选择一个能够代表整个群体的子集。

概率抽样的类型

简单随机抽样

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者使用 Powerpoint 制作的图片

简单随机抽样是指我们从总体中随机选择样本,其中每个单元被选中的概率相同。

**优点:**在随机选择群体成员之前,没有必要将群体分成子群体或采取任何其他额外的步骤。

**缺点:**样本可能不具有代表性,对于大量人群来说,这可能很耗时。

**用例:**在我们不太了解人群的情况下使用。

#let's create a dataframe first!
import numpy as np
import pandas as pd
from numpy.random import randn
# Define total number of customers
number_of_customers = 10
# Create data dictionary
data = {'customer_id':np.arange(1, number_of_customers+1).tolist(),
       'customer_life_time_value':randn(10)}
# Transform dictionary into a data frame
df = pd.DataFrame(data)
# View data frame
df

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

创建了数据框(图片由作者提供)

#only using random(), we can generate 4 samples from this dataset
# Obtain simple random samplesimple_random_sample = df.sample(n=4).sort_values(by='customer_id')
simple_random_sample

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

随机选择的客户(图片由作者提供)

分层抽样

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者使用 Powerpoint 制作的图片

对于分层抽样,人口被分成若干小组(称为阶层),然后从每个阶层中随机选择样本。

**优点:**它捕捉了关键的人口特征,因此样本更能代表人口。

**缺点:**如果不能形成子群,就无效。

**用例:**它通常用于地理采样,其中层可以是州、国家或生态区域。

#Let's add subgroup labels to the datasetdf['strata']=[0, 0, 0, 1, 1, 1, 1, 1, 2, 2]sss = StratifiedShuffleSplit(n_splits=5, test_size=0.5, random_state=0)for x, y in sss.split(df, df['strata']):
    stratified_random_sample = df.iloc[y].sort_values(by='customer_id')
stratified_random_sample

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从每个阶层中随机选择的客户(图片由作者提供)

巢式抽样法

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者使用 Powerpoint 制作的图片

对于整群抽样,总体被分成不同的群。然后随机采样固定数量的群,并且每个所选群内的所有单元都包括在样本中。

优点:它减少了可变性,并且易于实施。

**缺点:**采样时有可能引入偏差。

**用例:**当每个聚类中的所有个体都可以代表总体时使用。

#create 4 different clusters based on customers' lift time valuesdf['cluster'] = pd.cut(df['customer_life_time_value'], bins=4, labels=False) +1

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

增加了“集群”栏(图片由作者提供)

# predefine which clusters/groups we want to select samples fromn=[2,4]def clustering_sampling(df,n):
    df_list=[]
    for i in range(len(n)):
        df1=df[df['cluster']==n[i]]
        df_list.append(df1)
    final_df=pd.concat(df_list, ignore_index=True)

    return final_dfclustering_sampling(df,n)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从样本中的聚类 2 和聚类 4 中选择所有客户(图片由作者提供)

系统抽样

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从人群中选择每一个人(图片由作者使用 Powerpoint 制作)

通过从样本框架中系统地选择单元来抽取系统样本。(即每隔一个单位包括在样本中)

**优点:**可以消除聚类选择,执行起来很简单。

缺点:我们需要预先确定估计的人口数量。如果人口有一种标准化的模式,那就不好用了。

**用例:**当相关数据不呈现模式时使用。

def systematic_sampling(df, step):

    indexes = np.arange(0,len(df),step=step)
    systematic_sample = df.iloc[indexes]
    return systematic_sample

systematic_sampling(df, 1)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

示例中包含所有其他 customer_id(图片由作者提供)

参考

  1. https://news . Gallup . com/poll/262694/latest-trump-job-approval-rating . aspx
  2. https://www.investopedia.com/

用 Python 进行概率采样

原文:https://towardsdatascience.com/probability-sampling-with-python-8c977ad78664?source=collection_archive---------7-----------------------

概率和统计用 Python

了解取样方法

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由国家癌症研究所提供,可在 Unsplash 获取

介绍

什么是抽样?

抽样是从已知总体中选择随机数量单位的过程。它允许基于这些单位(即样本)的统计数据获得关于群体的信息并得出结论,而不需要研究整个群体。

为什么要用抽样?

执行采样有多种原因,包括:

  • 由于人口规模而无法研究全部人口的情况
  • 取样过程涉及样品破坏性试验的情况
  • 有时间和成本限制的情况

取样技术

有两种类型的采样技术:

  • 概率抽样:给定人群中的每个单位被选中的概率相同的情况。这种技术包括简单随机抽样、系统抽样、整群抽样和分层随机抽样。
  • 非概率抽样:来自给定群体的单位不具有相同的被选中概率的情况。该技术包括方便抽样、定额抽样、判断抽样和滚雪球抽样。与概率抽样相比,这种技术更倾向于以不具有代表性的样本组结束,从而导致关于总体的错误结论。

对于以下示例,让我们使用概率抽样从一组 10 个产品中获取样本,以确定感兴趣的特定度量的总体均值。让我们来看看 Python 代码:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

产品数据框架

简单随机抽样

顾名思义,简单随机抽样方法从过程或总体中选择随机样本,其中每个单元被选中的概率相同。这是最直接的概率抽样方法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

简单随机抽样

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

简单随机样本

系统采样

系统采样方法根据固定的采样间隔选择单元(即每第 n 个单元从给定的过程或总体中选择)。这种抽样方法往往比简单的随机抽样方法更有效。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

系统抽样

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

系统抽样

整群抽样

整群抽样方法将人口分成大小相等的群 n 并每 T 次选择一个群。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

巢式抽样法

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

聚类样本

分层随机抽样

分层随机抽样方法将人口划分为子群(即阶层),并选择随机样本,其中每个单元被选中的概率相同。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

分层随机抽样

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

产品数据框架

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

分层随机样本

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

衡量每个产品组的平均值

每种取样方法的测量平均值比较

使用每种抽样技术获得样本后,让我们将样本平均值与总体平均值(通常是未知的,但在本例中并非如此)进行比较,以确定能够获得总体测量平均值最佳近似值的抽样技术。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

每个取样方法表的测量平均值比较

根据每个抽样方法表的测量平均值比较,通过简单随机抽样技术获得的样本的测量平均值最接近真实平均值,绝对误差为 0.092 个单位。

总结想法

抽样是从样本中得出总体结论的一种有用而有效的方法。然而,分析师和工程师必须定义具有足够样本量的采样技术,能够减少采样偏差(例如,方便采样选择偏差、系统采样选择偏差、环境偏差、无响应偏差),以获得给定人群的代表性样本。

如果你觉得这篇文章有用,欢迎在 GitHub 上下载我的个人代码。也可以直接发邮件到rsalaza4@binghamton.edu找我,在LinkedIn找我。有兴趣了解工程领域的数据分析、数据科学和机器学习应用的更多信息吗?通过访问我的媒体 简介 来探索我以前的文章。感谢阅读。

——罗伯特

数据科学是关于概率的

原文:https://towardsdatascience.com/probability-theory-in-data-science-bacb073edf1f?source=collection_archive---------11-----------------------

与数据科学数学混淆?这里是一个开始的好地方

数据科学中最常用的 4 种概率分布

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

卢克·切瑟在 Unsplash 上的照片

P 概率分布是各种现实生活应用中最常用的数学概念之一。从天气预测到股票市场,再到机器学习应用,不同的概率分布是所有这些应用以及更多应用的基本组成部分。如果你想进入数据科学的神奇世界,或者你已经在这个领域,了解概率论的基本知识和最常见的概率分布是必备的知识。

从统计学上来说,我们中的任何一个人出现在这里的概率是如此之小,以至于你会认为仅仅存在的事实就能让我们所有人都沉浸在惊喜的喜悦中——刘易斯·托马斯

概率论基础

概率论是一门成熟的数学分支,研究我们生活中的不确定性。在 PT 中,一个 实验 是任何可以通过实验重复的过程,并且有一组众所周知的不同结果。一个例子是掷骰子;我们可以重复这个实验,骰子可以落在六个不变的面上。每个实验都有一个 样本空间 代表该实验所有可能的结果。在掷骰子的情况下,我们的样本空间将是{1,2,3,4,5,6}。最后,实验的每一次尝试都被称为一个 事件

理论概率与实验概率

理论上,我们可以使用以下公式计算每种结果的概率:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果我们考虑掷骰子的例子,骰子落在六个面中任何一面的概率是 0.166。如果我想知道骰子落在偶数上的概率,那么它将是 0.5,因为在这种情况下,期望的结果是{2,4,6}在整个样本空间{1,2,3,4,5,6}之外。

所有可能结果的概率总和应该总是等于 1。

从外部来看,任何结果的概率都可能与理论上的略有不同;然而,如果我们将实验重复足够的次数,那么实验概率将接近理论概率。

我们可以编写简单的 Python 代码来证明理论概率和实验概率之间的差异。

运行这段代码的结果将接近:

probability of 1 is 0.16
probability of 2 is 0.15
probability of 3 is 0.18
probability of 4 is 0.12
probability of 5 is 0.18
probability of 6 is 0.21
 — — — — — — — — — — — — — — — 
probability of 1 is 0.16
probability of 2 is 0.179
probability of 3 is 0.168
probability of 4 is 0.162
probability of 5 is 0.154
probability of 6 is 0.177

如你所见,我们的试验越多,我们就越接近理论概率值。

随机变量

随机变量(RV)的值由随机实验的结果决定。回到我们掷骰子的例子,如果我们定义一个随机变量 X 为任何结果的概率,那么 P(X=5) = 0.166。

随机变量有两种类型:

  • 离散随机变量:可以取可数个不同值的随机变量,如可能的结果或掷骰子。
  • 连续随机变量:在一个区间内可以取无穷多个值的随机变量,如东京八月任何一天的温度。

概率分布

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

迈克尔·迈耶Flickr 上的任务估计/概率分布

概率分布只是特定随机变量的数据或分数的集合。通常,这些数据集合是按照一定的顺序排列的,并且可以用图形显示。每当我们开始一个新的 DS 项目时,我们通常会获得一个数据集;该数据集代表来自更大数据集人群样本。使用这个样本,我们可以尝试在数据中找到独特的模式,这些模式可以帮助我们对主要的查询主题做出预测。例如,如果我们想从股票市场购买一些股票,我们可以从特定公司的最近 5~10 年中获取一个样本数据集,分析该样本并预测股票的未来价格。

分布特征

数据分布有不同的形状;这些形状是根据用于绘制分布的数据集定义的。每个分布都可以用三个特征来描述:均值、方差和标准差。这些特征可以告诉我们关于分布的形状和行为的不同事情。

  • 的意思是:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者使用 Canva

平均值(μ)就是一组数据的平均值。例如,如果我们有一组离散数据{4,7,6,3,1},则平均值为 4.2。

  • 差异

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者使用 Canva

方差(var(X))是平均值的平方差的平均值。例如,如果我们有来自{4,7,6,3,1}之前的相同数据集,那么方差将是 5.7。

  • 标准偏差

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者使用 Canva

标准差(σ)是对数据集数量分布程度的一种度量。因此,较小的标准偏差表示值彼此更接近,而较大的标准偏差表示数据集值分散。

均值、方差和标准差的属性

  1. 如果数据集中的所有值都相同,则标准差等于 0
  2. 如果数据集的值已经移位(从所有值中增加或减去一个常数),则均值增加或减少移位量,而方差将保持不变。例如,如果我们将数据集移动 3,那么平均值将增加 3。
  3. 如果数据集的值已经被缩放(乘以一个常数),则均值将被缩放相同的因子,而方差将被缩放因子的绝对值。例如,如果我们将数据集缩放 3 倍,那么平均值也将缩放 3 倍。然而,如果我们将它缩放-3,则在两种情况下,平均值将缩放-3,而方差将缩放 3。

4 种最常见的分布

有许多不同的概率分布。其中一些比另一些更常见。在本文中,我们将讨论数据科学中最常用的五种。

正态分布

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者使用 Canva

高斯分布(正态分布)以其钟形而闻名,是数据科学中使用最多的分布之一。此外,许多现实生活中的现象遵循正态分布,如人的身高、机器生产的东西的大小、测量误差、血压和考试分数。

正态分布特征

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者使用 Canva

正态分布的主要特征是:

  • 该曲线在中心对称,这意味着它可以围绕平均值分成两个对称部分。
  • 因为正态分布是一种概率分布,所以分布曲线下的面积等于 1。

当处理正态分布时,有一个重要的规则。这叫做**68,95,99 法则。**该规则规定,正态分布中 68%的数据在-σ和σ之间,95%的数据在-2σ和 2σ之间,99.7%的数据在-3σ和 3σ之间。

各种机器学习模型被设计成在遵循正态分布的数据集上工作,例如高斯朴素贝叶斯分类器、线性和二次判别分析以及基于最小二乘的回归。此外,我们可以将非正态分布的数据集转换为正态分布的数据集,使用一些数学转换算法,如对原始数据求平方根、求逆或自然对数。

使用 Python 生成正态分布。

指数分布

指数分布是正态分布的推广。因此,它也被称为广义正态分布。然而,指数分布还有两个因子λ,它代表正的比例参数(挤压或拉伸分布)和κ,它代表正的形状参数(改变分布的形状)。此外,指数分布不考虑不对称数据,因此,它更像是一种偏斜的正态分布。

二项分布

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者使用 Canva

二项式实验是一种统计实验,其中二项式随机变量是二项式实验的 n 次重复试验的成功次数 x。二项随机变量的概率分布称为二项分布。

二项分布的条件

  1. 它是由独立试验组成的。
  2. 每次试验可以分为成功或失败,其中成功的概率是 p ,而失败的概率是 1-p
  3. 它有固定的试验次数(n)。
  4. 每次试验成功的概率是不变的。

现实生活中二项分布的例子是:如果一种全新的药物或疫苗被引入来治愈一种疾病,它要么治愈该疾病(成功),要么不治愈(失败)。再比如:买彩票,要么中奖,要么不中奖。基本上,任何你能想到的有两种可能结果的事情都可以用二项分布来表示。

考虑二项分布的一种方式是,它们是有限正态分布的离散版本。正态分布是二项分布的多次连续试验的结果。

使用 Python 生成二项分布。

伯努利分布

伯努利分布是二项式分布的一个特例。这是一个只有一次试验的二项分布。

均匀分布

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者使用 Canva

均匀分布,也称为矩形分布,是具有恒定概率的概率分布,例如掷硬币或掷骰子。这种分布有两种类型。基本统计中最常见的类型是连续均匀分布(形成矩形)。第二类是离散均匀分布。

用 Python 生成均匀分布。

泊松分布

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者使用 Canva

泊松随机变量满足以下条件:

  1. 两个不相交时间间隔内的成功次数是独立的,成功次数的平均值是μ。
  2. 在小时间间隔内成功的概率与时间间隔的整个长度成比例。

泊松分布存在于许多现象中,如先天性残疾和基因突变、车祸、交通流量以及页面上的打字错误数量等。此外,泊松分布被商人用来预测一年中某一天或某一季节的购物者人数或销售额。在商业中,如果产品没有售出,库存过多有时会意味着损失。同样,库存不足也会导致商业机会的损失,因为您无法最大限度地提高销售额。通过使用这种分布,商界人士可以预测需求何时会很高,这样他们就可以购买更多的股票。

使用 Python 生成泊松分布。

还有更多的发行版;然而,了解这四个发行版会让你更顺利、更舒服地进入数据科学。

概率与赔率

原文:https://towardsdatascience.com/probability-vs-odds-f47fbc6789f4?source=collection_archive---------3-----------------------

有什么区别?用一个简单的例子来学习它,永远不要忘记它!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来自 Unsplash

许多人认为他们知道什么是概率,也认为他们对什么是赔率有完美的理解:他们一直被用于赌博。

但他们真的这样吗?这两个术语很容易混淆。

在这篇文章中,我们将很快阐明它们是什么,它们的区别,以及它们之间的关系。

我们走吧!

什么是概率?

在我们的日常语言中,当我们说“我不这么认为”或“这不太可能”时,我们总是会用到概率。概率,在一个不严谨的描述中,可以定义为我们对世界事物的相信程度的度量

我们可以通过计算事件的结果来计算概率。例如,如果我们考虑一个掷硬币游戏,其中我们选择正面,因此想要计算有利结果的概率,即预期结果可能出现的次数除以可能结果的总数。

对于我们的例子,这可以用下面的术语来描述。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

获得正面的概率。图片作者。

在某些情况下,统计事件的结果既有用又简单,就像前面的例子一样。然而,很容易看出,当有许多多重组合和可能的结果时,这种技术变得不可行,因为它不适用于大范围的现实生活问题

例如,你能用前面的方法来回答下面的问题吗?

  • 明天下雨的可能性有多大?
  • 你认为皇家马德里赢得冠军联赛的机会有多大?
  • 你认为我们会有时间停下来买个冰淇淋吗?

正如你所看到的,如果跳过二元选项(是或否,或 0 和 1),并试图在两者之间选择一些东西(一种可能性),准确回答这些问题就不那么容易了。然而,我们可以通过使用赔率并将概率表示为信念的比率来做到这一点。

让我们看看如何!

使用赔率来计算概率

正如我们刚刚看到的,我们需要一种有效的方法来计算更一般情况下的概率。为了展示我们如何利用 odds 做到这一点,考虑下面的例子:

想象一下,你和一个朋友正在讨论谁是更好的跑步者。你最近训练很多,过去你总是击败他,老实说,自从他开始频繁外出后,他的状态不是很好。

你如何量化你在比赛中一定会赢他的信念?很多时候,我们通过打赌来做到这一点:我跟你赌 5 美元,我会在一周内的比赛中打败你。如果你赢了,我给你 10 英镑。你说。

**从概率上讲,这意味着什么?**由于这是一场只有两种可能结果的比赛,你要么赢,要么输,赢和输的概率总和必须始终为 1,如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所有概率的总和必须始终为 1。图片作者。

此外,你的声明说,如果你赢了,你会得到 5 美元,如果你输了,给 10 美元,表达了打赌的赔率。

赔率是一种表达对一个事件的信念的方式,它是一个比率,即如果你是错的,你愿意付出多少,如果你是对的,你会得到多少。它们可以用以下方式量化:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

赌注的赔率。

现在,我们如何将它转化为概率呢?容易。由于所有概率的总和必须为 1,我们使用上图中的等式,得到:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最后,如果我们代入我们得到的概率:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

计算我们认为我们赢的概率是多少。

正如我们所看到的,我们认为我们会赢的概率是 0.66%或 66%。当我们决定赌两倍我们会得到的权利时,似乎更多?

根据赔率计算概率的过程可以用下面的等式来概括,其中 H 是某个假设,O(H)是支持该假设的赔率(赌赢与赌输的比率):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

概率和赔率之间的一般关系。

结论和更多资源

就是这样!概率是牛逼的。一如既往,我希望你喜欢这篇文章,并且通过这个简单的日常例子,你已经了解了概率和赔率之间的区别。

如果有,那就看看我其他关于概率、数据科学和机器学习的帖子 这里 。好好读!

如果你想深入了解这个话题,可以看看 StatQuest 的视频:

此外,你可以在这里查看我的其他概率学习文章:

我强烈建议你去读读,因为它们很有趣,充满了关于概率机器学习的有用信息。

如果你想了解更多关于机器学习和人工智能的知识 关注我上媒 ,敬请关注我的下期帖子!还有,你可以查看 这个资源库 获取更多关于机器学习和 AI 的资源!

可能是关于 SQL Server 中的连接、交叉应用、联合、交叉连接等的最佳介绍

原文:https://towardsdatascience.com/probably-the-best-introduction-about-join-cross-apply-union-cross-joins-and-more-in-sql-server-f2ee8f8af957?source=collection_archive---------16-----------------------

在这个故事中,我们将从零开始理解在 SQL Server 中组合两个或多个表的大部分方法。我们将使用 SQL Server 2019,但几乎下面描述的每个查询都可以在旧版本的 SQL Server 上执行,甚至可以在 Oracle 或 MySQL 等其他 SQL 数据库上执行,只需做很小的调整。

在开始之前,一定要知道本文中的结构、数据和所有查询都可以在这个页面上找到<>。你会发现它非常有用,因为它们都是可编辑和可执行的,所以你可以随意尝试你想到的任何东西。

设置环境

我们将在所有查询中使用下面的表格和示例数据。想象一下,你正在查看像 Bird、Lime、Dott 这样的电动滑板车租赁服务的数据仓库(一个非常非常简化的版本)。

我们有以下表格:

  • 表【dbo】。【Trip】:包含所有行程的事务表。它在每次旅行中都有一行,换句话说,每次用户解锁踏板车、使用它通勤并再次锁定它时都会生成一行。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 表【dbo】。【用户】:用户的维度表。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 表【dbo】。【踏板车】:踏板车尺寸表。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 表【dbo】。[RepairedScooter] :这是一个表格,包含至少一次通过维修区的滑板车列表。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

您可以查看从 db <> fiddle 创建和填充数据的代码,但也可以查看预览。

查找不同列的组合

我们可以在不同的情况下使用交叉连接(或笛卡尔连接),但是,它最常用的范围可能是当您想要从一个或多个表中选择两个或多个字段的所有组合时。

在下面的示例中,您可以使用交叉连接对指示器和用户的每种组合进行选择。例如,如果您希望制作第一个表来分析用户是否不止一次租用同一辆小型摩托车,这可能会很有用。

—查询 A001
从【用户】A、【代步车】B
中选择 DISTINCT A【ID】、A【用户名】、B【ID】、B【品牌】、B【型号】
排序按 A【ID】、B【ID】

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用不同表的列

当您想要将另一个表(表 B)中的一列或多列添加到表(表 A)中时,可以使用联接。如果您想使用基于 SQL 的数据库,这可能是需要掌握的最重要的构造。

语法介绍

在理解不同类型的连接之前,让我们快速浏览一下在表之间进行连接时使用的语法。

以下查询是表Trip和表Scooter的基本连接。连接的类型是内部连接,我们将在文章的这一部分的后面理解它的含义。ON 子句后列出了连接条件。这里,列之间有一个简单的等式,但它们可以不止一个(在这种情况下,您应该使用 AND、OR,而不是运算符),或者可以是更复杂的等式,如 between 或 like。在连接条件中,您还可以找到应用于列的函数(例如 LEFT ),但这是一个介绍,因此我们不会找到这些情况。

—查询 B001
选择 A.[ID],A.[DateTimeStart],A.[TripDuration],B.[Brand],B.[Model]
从[Trip] A
内联[Scooter] B
上 A.[ID_Scooter]=B.[ID]

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们在查询中使用了一些别名,但是,我们也可以重复表的完整名称,得到相同的结果。

—查询 B003
选择【行程】。[ID],[Trip]。[日期时间开始],[行程]。[旅行持续时间],[踏板车]。[品牌],[滑板车]。【车型】
从【行程】
内加入【踏板车】
上【行程】。[ID_Scooter]=[Scooter]。[ID]

如果列名只存在于其中一个表中,则指定表名或别名不是强制性的(但建议这样做)。此外,这个查询给出的结果与其他两个相同。

—查询 B002
选择 A.[ID],[DateTimeStart],[TripDuration],[Brand],[Model]
从[Trip] A
内联接[Scooter] B
上[ID_Scooter]=B.[ID]

当然,您可以通过连接三个或更多的表来扩展所有这些规则,这方面没有限制。

—查询 B004
选择 A.[ID],A.[DateTimeStart],A.[TripDuration],B.[Brand],B.[Model],C.*
从[Trip] A
内联接[Scooter]B
ON A .[ID _ Scooter]= B .[ID]
内联接[User]C
ON A .[ID _ User]= C .[ID]

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最后,您可能会发现一些具有不同语法的连接子句(例如,如果您正在使用 SAP Business Objects suite),类似于交叉连接。这也是一种有效的语法,称为 ANSI-92,但在本文中,我们不使用它,所以可以在互联网上找到许多关于它的文章。

完全外部连接

完全外部连接的结果将包括表 A 中的至少一行和表 B 中的至少一行,即使不满足连接条件,在这种情况下,一行空值将来自不匹配的行。

参见下面的例子来阐明这个概念。

—查询 C001
SELECT *
FROM[Trip]A
FULL OUTER JOIN[User]B【T33]ON A .[ID _ User]= B .[ID]

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

左外部连接

左外部联接类似于完全外部联接,但不对称。这意味着结果中至少有一行来自左边的表(下例中的表 A),但是右边的表(下例中的表 B)中不满足连接规则的行不会显示出来。

—查询 D001
SELECT *
从【行程】A
左加入【用户】B
ON A.[ID_User]=B.[ID]

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

请注意,我们可以使用 LEFT OUTER JOIN 构造来查找左边表(表 A)中根据连接规则在右边表(表 B)中没有对应行的行。这是一个非常有用的应用程序,您只需在查询下添加一个 WHERE 子句,如下例所示。

—查询 D002
SELECT A . *
FROM[Trip]A
LEFT JOIN[User]B
ON A .[ID _ User]= B.[ID]
其中 B .[ID]为空

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

右外部联接

正如您可能期望的那样,我们对左外连接的所有考虑可以对称地用于右外连接。

在理解了上一节中的左外连接之后,可以随意看一下下面的两个例子来确认或否定您对右外连接的期望。

—查询 E001
SELECT *
FROM[Trip]A
RIGHT JOIN[User]B
ON A .[ID _ User]= B .[ID]

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

—查询 E002
SELECT B . *
FROM[Trip]A
RIGHT JOIN[User]B
ON A .[ID _ User]= B .[ID]
其中 A.[ID]为空

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

内部连接

从概念上讲,内部连接是左外部连接和右外部连接的组合,因此该连接的结果将只包含符合连接规则的行。

—查询 F001
SELECT *
FROM[Trip]A
INNER JOIN[User]B
ON A .[ID _ User]= B .[ID]

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

反连接

相反,反连接将只显示左侧的表行(表 A)和右侧的表行(表 B ),它们不符合连接规则。

—查询 G001
SELECT *
FROM[Trip]A
FULL OUTER JOIN[User]B
ON A .[ID _ User]= B.[ID]
其中 A.[ID]为空或 B .[ID]为空

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

交叉应用

交叉应用类似于内部连接,但是当您想要指定一些关于连接中的数量或顺序的更复杂的规则时,可以使用它。交叉应用最常见的实际应用可能是当您希望在两个(或更多)表之间建立连接,但您希望表 A 的每一行都是 math,并且只有表 B 的一行是 math。在下面的示例中,更详细地说,每个用户(表 A)将与其最长的行程(表 B)匹配。请注意,没有进行任何旅行的用户不会包括在结果中,因为我们已经说过交叉应用在某种程度上类似于内部连接。

—查询 H001
SELECT A.*,B.[TripDuration],B .[ID]
FROM[User]A
CROSS APPLY(
SELECT TOP 1 *
FROM[Trip]C
其中 C .[ID _ User]= A .[ID]
ORDER BY C .[Trip duration]desc
)B

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外部应用

外部应用与我们刚刚讨论的交叉应用非常接近。主要区别在于,外部 APPLY 还会在结果中包括表 A 中不符合 WHERE 子句中定义的匹配规则的行。

下面的例子类似于我们在交叉应用部分中的例子,但是,正如您可以很容易地看到的,没有任何旅行的用户也包括在结果中。

—查询 I001
SELECT A.*,B.[TripDuration],B .[ID]
FROM[User]A
OUTER APPLY(
SELECT TOP 1 *
FROM[Trip]C
其中 C .[ID _ User]= A .[ID]
ORDER BY C .[Trip duration]desc
)B

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在连接中使用 WHERE 条件

在继续之前,理解使用连接时 WHERE 子句的用法是很重要的。

我们将考虑四个例子,有四个完全不同的结果,我希望这些例子有助于理解如何正确地编写连接和 WHERE 规则。

在查询 L001 中,您可以看到一个关于连接的重要事实,因为数据库将首先根据连接规则在表之间建立连接,然后才使用 WHERE 子句进行过滤。因此结果将只包括 b .[用户名]='Brenda '的行。

—查询 L001
SELECT *
FROM[Trip]A
LEFT JOIN[User]B
ON A .[ID _ User]= B .[ID]
其中 B.[Username]='Brenda ’

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

关于连接的另一个重要事实是,您可以在连接规则中指定一些过滤规则。如果考虑在 WHERE 子句之前应用连接规则,那么这是一个好主意,这样可以限制数据库在筛选之前必须提取的行数。

硬币的另一面是,您必须知道并始终注意,在左出连接中,只有应用于右表(表 B)的过滤规则才会被考虑。

—查询 L002
SELECT *
FROM[Trip]A
LEFT JOIN[User]B
ON A .[ID _ User]= B .[ID]AND B .[Username]= ’ Brenda ’

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

—查询 L003
SELECT *
FROM[Trip]A
LEFT JOIN[User]B
ON A .[ID _ User]= B .[ID]
其中 A.[ID_Scooter]='SR001 ’

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

正如我们在查询 L002 的示例中已经说过的,在左出连接中,只考虑应用于右表(表 B)的过滤规则。在本例中,您可以看到过滤规则 A.[ID_Scooter]='SR001 '被忽略,所有指示器都被提取到结果中。请花一些时间来理解查询 L003 和 L004 的结果之间的差异。

—查询 L004
SELECT *
FROM[Trip]A
LEFT JOIN[User]B
ON A .[ID _ User]= B .[ID]AND A .[ID _ Scooter]= ’ Sr 001 ’

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用不同表格的行

在组合了不同表中的列之后,您可能会问是否有可能组合不同表中的行。答案是肯定的,但是你必须掌握不同的结构。

联合和联合所有

关于组合不同表中的行的第一个重要假设是列名和类型必须相同。例如,如果您尝试将表 Scooter 和 RepairedScooter 与 UNION ALL 组合在一起,您将会得到一个错误,因为它们有不同的列。

—查询 M001
从【代步车】
中选择*
从【维修代步车】中选择*

Msg 205 Level 16 State 1 Line 2 所有使用 UNION、INTERSECT 或 EXCEPT 运算符组合的查询在其目标列表中必须有相同数量的表达式。

无需修改表的结构,只需选择两个表中都存在的列,就可以轻松地合并这两个表。

—查询 M002
从【代步车】
中选择【ID】、【品牌】、【型号】、【制造年份】
从【维修代步车】中选择【ID】、【品牌】、【型号】、【制造年份】

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

UNION 和 UNION ALL 的区别在于,前者只在结果中包含不同的值,因此,它比后者稍慢。

—查询 M003
从【代步车】
中选择【ID】、【品牌】、【型号】、【制造年份】
从【维修代步车】中选择【ID】、【品牌】、【型号】、【制造年份】

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

除…之外

如果我们希望提取第一个表中的行而不是第二个表中的行,我们可以使用 EXCEPT。

—查询 N001
从【代步车】
中选择【ID】、【品牌】、【型号】、【制造年份】
除了
从【维修代步车】中选择【ID】、【品牌】、【型号】、【制造年份】

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

横断

如果我们想提取第一个表和第二个表中的行,我们可以使用 INTERSECT。

—查询 O001
从【代步车】
中选择【ID】、【品牌】、【型号】、【制造年份】
从【维修代步车】中选择【ID】、【品牌】、【型号】、【制造年份】

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用流程图进行简单回顾

我们看到了很多构造,我希望这个故事能帮助你更好地理解它们之间的区别。在下图中,您可以找到一个流程图,您可能会发现在 SQL Server 中组合不同来源的数据的第一步很有帮助。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 [## SQL Server 2019 |数据库小提琴

免费的在线 SQL 环境用于实验和分享。

dbfiddle.uk](https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=bb54aaea7e0a2527a7e5b14b6dc922e6)

可能是面向对象 Python 的最佳实践— Attr

原文:https://towardsdatascience.com/probably-the-best-practice-of-object-oriented-python-attr-d8c26c0e8a4?source=collection_archive---------6-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

daviscoUnsplash 上拍摄的照片

让 Python 面向对象编程变得更加容易

众所周知,Python 非常灵活,可以用函数式、过程式和面向对象的方式编写。老实说,除非万不得已,我很少用 Python 写类,只是因为大多数时候我不想过度设计问题。例如,当我们使用 Python 执行一些特定的数据分析时,使用面向对象编程可能没有太大意义。

然而,当我知道这个名为“Attrs”的图书馆时,事情发生了变化。它让 Python 用面向对象模式编程变得更加容易(我觉得 Python 的面向对象编程已经非常简洁和容易了)。在本文中,我将介绍这个库如何促进 Pythonic 面向对象编程。

[## 属性

版本 19.3.0()。是 Python 包,它将把您从……

www.attrs.org](https://www.attrs.org/)

简单的开始

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由丹妮尔·麦金尼斯Unsplash 上拍摄

像大多数 Python 库一样,我们可以使用pip简单地安装attrs

pip install attrs

现在,让我们用 Python 编写一个没有任何库的类。

class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

p1 = Person('Chris', 32)
p2 = Person('Chris', 32)

请注意,我还用相同的属性值实例化了两个实例。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当我们输出实例时,我们只能得到类名。此外,属性值相同的两个实例不会被视为相等,因为它们没有指向相同的内存地址。

那么,attrs能为我们做些什么呢?让我们在这里做同样的事情。

from attr import attrs, attrib[@attrs](http://twitter.com/attrs)
class Person(object):
    name = attrib()
    age = attrib()

p1 = Person('Chris', 32)
p2 = Person('Chris', 32)

我想有些事情需要一个简单的解释。首先,@attrs是一个注释,它告诉我们这个类将要用attrs库来声明。然后,对于每个属性,我们只需要将它们定义为attrib(),而不需要有一个__init__()方法。之后,我们可以简单地实例化这个类,就像有一个__init__方法一样。

我们也来试试输出和相等测试。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

显然,我们有一个非常有意义的对象输出,以及我们可以测试对象之间的相等性。

非初始化属性

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由诺德伍德主题Unsplash 上拍摄

你现在可能有一个问题。如果有这样一个属性,我们不想在实例化过程中初始化它,但可能在以后给它赋值,那该怎么办?当然,如果你还是用下面的attrib()就不行了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用attrs,您可以通过用False传递init参数来实现这一点。

[@attrs](http://twitter.com/attrs)
class Person(object):
    name = attrib()
    age = attrib()
    skills = attrib(init=False)

p1 = Person('Chris', 32)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如图所示,我们不必一开始就给出skills的值,但是我们可以在以后赋值。

默认值

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Kelly SikkemaUnsplash 上拍摄的照片

你可能还会问,我想给属性赋予默认值怎么样?是的,有了attrs,你可以轻松做到。

[@attrs](http://twitter.com/attrs)
class Person(object):
    name = attrib(default='Chris')
    age = attrib(default=32)

p1 = Person()
p2 = Person('Chris', 32)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如图所示,我们为这两个属性都提供了默认值。然后,没有传入任何参数的实例与另一个用参数显式初始化的实例完全相同。

如果我们希望将一个空集合的属性作为默认值,该怎么办?通常,我们不想传入一个[]作为参数,这是 Python 著名的陷阱之一,可能会导致许多意想不到的问题。别担心,attrs为我们提供了一个“工厂”。

[@attrs](http://twitter.com/attrs)
class Person(object):
    name = attrib(default='Chris')
    age = attrib(default=32)
    skills = attrib(factory=list)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如图所示,属性skills最初是空的,但是后来,我们可以向它追加值。

验证属性

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

马库斯·温克勒在 Unsplash 拍摄的照片

现在,我们想给属性添加一些验证,以确保我们传入的值是有效的。使用attrs也很容易实现。

[@attrs](http://twitter.com/attrs)
class Student(object):
    name = attrib()
    age = attrib()
    student_id = attrib()

    [@student_id](http://twitter.com/student_id).validator
    def check_student_id(self, attribute, value):
        if len(str(value)) != 6:
            raise ValueError(f'student_id must be 6 characters! got {len(str(value))}')

在上面的例子中,我们用属性“student_id”声明了一个“Student”类。假设我们要验证学生 id,它的长度必须是 6 个字符。

注意,我们需要定义一个函数来完成这项工作。该函数需要注释为@<attribute_name>.validator。所以,在我们这里,这个应该是@student_id.validator。然后,我们可以在这个验证函数中引发一个异常,如上所示。

让我们做一个简单的测试。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第一个实例s1没有任何问题,因为它的student_id长度为 6,但是第二个实例s2不会通过,因为长度为 5,并且正确显示了带有预定义错误消息的异常。

子类

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由Clker-Free-Vector-ImagesPixabay 上拍摄

在普通 Python 中,我们必须使用__init__()函数中的super()函数来实现继承。当我们需要多重继承时,这将会非常复杂。使它变得极其容易。

[@attrs](http://twitter.com/attrs)
class Person(object):
    name = attrib()
    age = attrib()

    def get_name(self):
        return self.name

[@attrs](http://twitter.com/attrs)
class User(object):
    user_id = attrib()

    def get_user_id(self):
        return self.user_id

[@attrs](http://twitter.com/attrs)
class Student(Person, User):
    student_id = attrib()

    def get_student_id(self):
        return self.student_idstudent = Student(name='Chris', age=32, user_id='ctao', student_id=123456)

在上面的例子中,Student继承了PersonUser。在Student类中,我们只需要定义它的特定属性student_id,来自PersonUser的其他属性将直接自动继承,无需任何详细定义。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如上所示,函数被继承也没有问题。

连续编入词典

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Pixabaylibellule789 的照片

attrs库还可以帮助我们轻松地将实例序列化到字典中。之后,你可以在 JSON 中使用它,做任何你想做的事情。

attr.asdict(student)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

摘要

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

乔安娜·科辛斯卡在 Unsplash 上拍摄的照片

在这篇文章中,我已经介绍了库attrs和一些基本用法。我喜欢这个库,因为它使 Python 更加简单和简洁。如果你以前没有用过,强烈建议你试用一下。希望你也会喜欢。

[## 通过我的推荐链接加入 Medium 克里斯托弗·陶

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

medium.com](https://medium.com/@qiuyujx/membership)

如果你觉得我的文章有帮助,请考虑加入 Medium 会员来支持我和其他成千上万的作者!(点击上面的链接)

大概是 2020 年学习深度学习最好的资源

原文:https://towardsdatascience.com/probably-the-best-resource-to-learn-deep-learning-in-2020-66d13a8ab1f1?source=collection_archive---------8-----------------------

并且学好它。

网上有这么多的书籍和课程,大部分都是免费的,新人很难选择一本好的,尤其是理论和实践部分。其中的 95%会让你在看完 50%的材料之前就想换一下,这是有原因的——它们的结构不合理。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由莫里茨·金德勒Unsplash 拍摄

糟糕的结构不会让你保持动力——正如理论书籍需要实用的部分只是为了打破单调,而实用的书籍恰恰需要相反的东西。

在我深度学习之旅的大部分时间里,我看的课程或读的书要么是:

  • **到理论:**意思是几乎没有或根本没有实际工作,如果两个领域都没有很好地涵盖,就不可能对这个主题有所了解
  • **实用:**意思是理论部分缺乏,因为这是事先知道的先决条件,即使书/课程一开始没有说明

我对大多数课程和书籍的另一个大问题是过早地进入图书馆——我说的过早是指立即。如果你不手动操作,至少在开始时,你就没有办法真正了解正在发生的事情。

好了,到目前为止,我们已经讨论了大部分网上可用的东西有什么问题。在下一节中,我们将介绍这本书和这门课程,它可能会改变游戏规则,我还会给出几个原因。

NNFS——从零开始的神经网络

免责声明: 我与球场所有者没有任何方式、形状或形式的关联,我个人并不了解他,您阅读的所有内容将纯粹基于个人经验。

如果你一直在研究 YouTube 上任何与数据科学相关的话题,你可能知道频道[sentdex](https://www.youtube.com/channel/UCfzlCWGWYyIQ0aLC5w48gBQ)。我喜欢看他以前关于基本机器学习,甚至是 Go 编程语言的视频。

今年早些时候(我想是在一月份),他宣布了一本即将出版的名为《从头开始的神经网络》的书和课程。

他声称该课程的目的是完全从零开始编码神经元、层、激活函数、优化器、梯度、反向传播——几乎所有的东西—,甚至一开始没有 Numpy。后来代码会被“翻译”成 Numpy,因为纯 Python 对于数学来说不够强大和方便。

你可以看下面完整的介绍视频,虽然我只是给了你两句话的总结:

所以经过一番考虑,我上了这本书的官方网站,买了电子书格式的,我现在正在读。

我必须说,提供了

如果你不想花 30 美元买书,你仍然可以完全免费观看 YouTube 播放列表。它跟随着这本书,但这本书走得更详细——所以记住这一点。

当前状态

现在这本书仍然是草稿格式,如果你问我的话,那就太好了。作为一名读者,你可以对你认为不是 100%清楚的任何部分发表评论,你的评论会得到回应,或者整本书的部分会得到更好的解释。

即使是草稿格式,仍然有大约 250 页供你阅读,因为深度学习是一个复杂的主题,它将需要多次阅读。所以不,你不会很快用完材料。

在陈述了所有的优点之后,我仍然有一些让我担心的事情,如果你决定走这条路的话,可能会让你担心。让我们在下一节讨论它们。

可能的缺点

现在这部分只是我在大声思考,下面列出的事情可能不会影响到你,但是你要意识到。

  1. 没有 CNN 和 RNNs——据我所知,整本书/课程完全基于人工神经网络,所以你必须在别处学习 CNN 和 RNNs。可能以后会盖,但我不确定。
  2. 无库使用 —这既是有利的一面,也是不利的一面。有利的一面是,你将通过从头开始开发东西来更深入地理解底层机制,但在课程结束时,你将不会知道如何使用 TensorFlow 或 py torch——尽管我认为一旦你理解了基础知识,它们将非常容易掌握。

同样,这些对你来说可能不是真正的缺点——也许你不关心卷积或递归神经网络,或者也许你已经知道如何使用 PyTorch 或 TensorFlow,但理论部分是底部的痛苦。

自己判断,但要记住这两点。

判决

好的,我们讨论了这本书和这门课的好的和坏的方面。

所以,我会推荐吗?

简短的回答是——绝对是的。但是先别掏出你的钱包。你很可能不喜欢这门课程——因为我们都是不同的,有不同的学习方法——所以在购买这本书之前,请查看一下 YouTube 播放列表,看看它是否是你想要的。

谁知道呢,也许 YouTube 上的视频对你来说已经足够了,你不想再深究下去了——这也没关系。

但是如果你想更深入地从头开始,我强烈推荐这本书。

感谢阅读。

喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。

** [## 通过我的推荐链接加入 Medium-Dario rade ci

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

medium.com](https://medium.com/@radecicdario/membership)**

数据科学项目中的问题识别

原文:https://towardsdatascience.com/problem-identification-f7db429af6e0?source=collection_archive---------26-----------------------

问自己三个问题来获得聪明的成功。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由皮克斯拜的 Gerd Altmann 提供

解决正确的问题!

你们中的许多人都会熟悉 Kaggle,它是机器学习竞赛的发源地。这是一个可以磨练数据科学技能的地方,对吗?不对。这是你可以磨练机器学习技能的地方。至少以前是这样的。将会有一个包含一列标签的训练数据集和一个缺少所述标签的测试数据集。你训练和改进你最好的机器学习模型,预测测试集上的标签,提交,然后等着看你的名字/团队在排行榜上上升!

抱歉,这不是数据科学。反正不是数据科学的全部。事实上,真的只是最小的部分。一个有趣的部分,当然。可以说是关键部分。但绝对不是全部和终结。如果你最好的机器学习模型预测错了事情,或者只是对业务没有直接用处的事情,那就毫无价值。事实上,正如微软的 Bing 团队(最终)发现的那样,确定一个对你的业务非常不利的问题(或者更确切地说,一个指标)是可能的。你的业务问题是建立一个伟大的搜索引擎。一个好的搜索引擎是用户想更经常使用的,对吗?所以你正确地认识到业务问题是提高用户搜索量的问题之一,对吗?没有。你对搜索引擎的正确问题识别是优化搜索结果,而不是搜索

有了上面的例子,我鼓励你阅读链接的博客,我几乎想在这里结束这篇文章,因为它是如此伟大的一课,简洁地概括了关键信息。识别错误的问题真的会把你引向错误的方向,任何后续的优化尝试只会让你更快地犯更多的错误。但是,撇开有益的战争故事不谈,有什么建设性的技巧可以引导你走向成功呢?

放聪明点!

起草问题陈述时,一个很好的清单是 SMART :

  • 具体,不笼统
  • 可测量的
  • 面向行动
  • (与关键问题)相关
  • 受时间限制的

如果你发现自己写的问题陈述中有诸如“提高销售额”或“减少客户流失”这样的短语,你应该抓住自己并查看智能清单。提高多少?到什么时候?第二季度末?第三?明年?什么是“销售额”——售出的单位或收入?什么是“流失”?当管理“现收现付”客户的团队关注离开他们系统的客户时,如果客户升级到与您公司的 12 个月合同(因此转移到另一个团队的账本),这真的应该被称为流失吗?也许你的公司真的会喜欢更多这样的东西!

够聪明吗?可以说,正如上文所强调的,必应团队认为他们很聪明。不幸的是,他们选错了“具体的”。你可以开始解构一个聪明的问题陈述。你可以开始谈论商业背景、利益相关者、制约因素和风险……如果你是新手,开始头晕,我不能责怪你。当你觉得需要考虑的因素太多时,我会给你三个简单的问题,帮助你找到方向:

  1. 是给谁的?
  2. 他们想要什么?
  3. 你怎么知道你得到了他们想要的东西?

对于所有关于智能措施、环境和利益相关者的花哨说法,这就是它的意义所在。还有“保持真实”。在需要后一周交付一个好的解决方案是没有意义的——及时交付一个足够好的解决方案会更好吗?当你创建一个模型来预测一个月前的客户流失时,你真的考虑清楚了吗?了解什么是想要的,以及如何在满足这种需求的背景下,以一种现实的方式来衡量您的解决方案,这确实是成功建立数据科学项目的关键。

关于这篇文章

这是一个链接系列的第二篇文章,旨在简单介绍如何开始数据科学过程。你可以在这里找到介绍,在这里找到系列的下一篇文章。

问题:过度拟合,解决方案:正则化

原文:https://towardsdatascience.com/problem-overfitting-solution-regularization-b466d3d1f4da?source=collection_archive---------21-----------------------

什么使模型过度拟合,我们如何解决这个问题

我们都有这样的朋友,他们讲述的故事极其详细。当你问他们最近看的一部电影时,你可能不仅会知道这部电影,还会知道电影院卖爆米花的那个人的手表。另一方面,我们有沉默寡言的朋友,他们只会告诉你这部电影是“好”还是“坏”。

就细节的数量而言,过度适应和欠适应与那些不同类型的朋友相似。过度拟合的机器学习模型试图提取训练数据的细节,而欠拟合的模型过于笼统,往往会错过训练数据中的重要趋势。

一个更像机器学习的例子是预测图像中的对象。假设我们正在尝试构建一个模型来预测图像中的西红柿:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由 Soya SoongUnsplash

  • 模型 A:红色,圆形,顶部是绿色的星形,有一些水滴
  • B 型:红色,圆形

A 型的问题是,并不是所有的番茄上都有水滴。这个模型太具体了,很可能会挑湿番茄。它不能很好地推广到所有的番茄。它会寻找水滴,所以无法预测图像中的干番茄。是过拟合

另一方面,B 型认为所有红色圆形的东西都是番茄,这是不正确的。该模型过于一般化,不能检测番茄的关键特征。是欠配合

这些例子并不完全是机器学习模型如何学习和预测的,而是给出了过度拟合和欠拟合的概述。在这篇文章中,我将详细介绍以下概念:

  • 偏差和方差
  • 过度拟合和欠拟合
  • 正规化

偏差和方差

偏差和方差对于理解过度拟合和欠拟合是至关重要的。

偏差衡量平均预测值与实际值的差距。如果我们试图用一个非常简单的模型来模拟一个复杂的关系,就会产生偏差。高偏差模型的预测非常相似。由于它对数据内的变化不敏感,因此该模型在训练数据和测试数据(以前未见过的数据)上的准确性都很低。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

高偏差模型

蓝点是训练集中的观察值,红线是我们的有偏模型,它不关心观察值的两个特征内的波动,并进行相同的预测。

方差是偏差的反义词,对数据内的变化敏感。具有高方差的模型对训练数据中甚至很小的变化都非常敏感。它试图捕捉每一个小细节,因此训练数据的微小变化也会改变模型。具有高方差的模型也倾向于捕捉数据中的噪声。异常值将在模型的范围内。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

高方差模型

如您所见,该模型试图根据数据中的所有变化进行调整。具有高方差的模型的预测被广泛传播。很明显,该模型在训练集上有很高的准确率。然而,它在新的、以前看不到的观测中表现不佳。

机器学习模型是为以前看不到的观察结果而建立的,因此方差很大的模型是不可接受的。我们也永远不能依赖高偏差的模型。因此,找到偏差和方差之间的界限是至关重要的。偏差和方差之间总是有一个权衡。我们很容易找到一个高偏差低方差或者低偏差高方差的模型。然而,你的模型的成功取决于在偏差和方差之间找到最优的方法。例如,下面的模型似乎很适合。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

过拟合和欠拟合

  • 具有高偏差的模型往往会欠拟合。
  • 方差高的模型往往会过度拟合。

当模型试图很好地拟合训练数据,以至于不能推广到新的观察结果时,就会出现过度拟合。广义模型在新的观察上表现得更好。如果一个模型比需要的更复杂,我们很可能会过度拟合。欠拟合模型不能很好地推广到训练和测试数据集。

在监督学习任务中,我们可以通过比较训练和测试数据集上的模型精度来检测过拟合。如果训练数据集(模型看到的观察值)数据集的精度远远高于测试数据集(看不到的观察值)的精度,则模型过度拟合。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

损失表示实际价值和我们的预测之间的差异

损失与实际目标值和预测值之间的差异成比例。监督学习模型执行多次迭代,通过更新特征权重来最小化这种损失。然而,在某个点之后,模型在测试和训练数据上表现不同。损失在训练数据上持续减少,但是在某个点之后在测试数据上开始增加。检测这一点对于创建出色的机器学习模型至关重要。

过度拟合是机器学习模型的一系列问题,但我们如何防止模型过度拟合?答案是正规化。

正规化

过度拟合的主要原因是使模型比必要的更复杂。如果我们找到降低复杂度的方法,那么过拟合问题就解决了。

正则化不利于复杂的模型。

正则化增加了对模型中较高项的惩罚,从而控制了模型的复杂性。如果增加一个正则项,该模型试图最小化损失和模型的复杂性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

正则化减少了方差,但不会导致偏差显著增加。

两种常见的正则化方法是 L1 正则化和 L2 正则化。模型的复杂性取决于:

  • 特征总数(由 L1 正则化处理),或
  • 特征的权重(由 L2 正则化处理)

L1 正规化

它也被称为稀疏正则化。顾名思义,它用于处理稀疏向量。如果我们有高维特征向量空间,模型就变得很难处理。

L1 正则化强制无信息特征的权重为零。L1 正则化的作用类似于在每次迭代中从权重中减去少量的力,从而最终使权重为零。

L1 正则化惩罚|权重|。

L2 正规化

为简单起见,它也被称为正则化。如果我们把模型的复杂度作为权重的函数,那么特征的复杂度与它的权重的绝对值成正比。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

L2 正则化迫使权重趋向于零,但并不使它们完全为零。L2 正则化就像在每次迭代中去除一小部分权重的力。因此,权重永远不会等于零。

L2 正则化惩罚(权重)

有一个额外的参数来调整 L2 正则化项,称为**正则化率(λ)。**正则化率是一个标量并乘以 L2 正则化项。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**注意:**选择λ的最佳值很重要。L2 正则化的目标是简单。然而,如果 lambda 太高,模型就会变得太简单,从而可能会不足。另一方面,如果λ太低,调节的效果变得可以忽略不计,模型可能会过拟合。如果 lambda 设置为零,那么正则化将被完全移除(过度拟合的高风险!).

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

注: 岭回归使用 L2 正则化,而拉索回归使用 L1 正则化。弹性网回归结合了 L1 和 L2 正则化。

结论

过度拟合是机器学习模型的一个关键问题,需要小心处理。我们使用我们已经知道的数据建立机器学习模型,但在新的、以前看不见的数据上尝试或测试它们。我们希望模型了解训练数据中的趋势,但同时不希望模型过于关注训练数据。模型的成功取决于在过度拟合和欠拟合之间找到最佳点。

感谢您的阅读。如果您有任何反馈,请告诉我。

作为数据科学家解决问题:案例研究

原文:https://towardsdatascience.com/problem-solving-as-data-scientist-a-case-study-49296d8cd7b7?source=collection_archive---------2-----------------------

我对数据科学家如何解决问题的想法,以及分享我在第一份工作中使用一个最喜欢的项目的案例研究

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

沃洛季米尔·赫里先科在 Unsplash 上的照片

关于数据科学家如何解决问题,有两个神话:一个是问题自然存在,因此数据科学家面临的挑战是使用算法并将其投入生产。另一个神话认为数据科学家总是试图利用最先进的算法,更好的模型等于更好的解决方案。虽然这些并非完全没有根据,但它们代表了对数据科学家工作方式的两种常见误解:一种过于强调“执行”方面,另一种夸大了“算法”部分。

显然,这些神话并不是我们实际解决问题的方式。在我看来,数据科学家解决问题的方式是:

  • 更多关于“如何将问题从商业背景中抽象出来”,而不仅仅是“被交给一个具体的任务”
  • 更多的是“用算法解决问题”,而不仅仅是“用最好的算法解决问题”
  • 更多的是“迭代地交付商业价值”,而不仅仅是“实现代码并收工”。

说到这里,我注意到解决问题的过程通常包括四个阶段,我想分享一下这四个阶段是什么,以及它如何通过案例研究发挥作用,然后我们如何以正确的心态实现这四个阶段。

故事开始于,从前…

我的第一份工作是在一家经营汽车定价和信息网站的公司,该公司于 2014 年 5 月进行了首次公开募股(IPO)。这是一次很棒的经历,我清楚地记得那天周围的每个人都在为一家上市公司的诞生欢呼。作为一家上市公司,我们的收入开始受到很多关注,尤其是在 8 月份发布了第一份季度收益报告。7 月初,税收部门的主管来到数据科学家的座位区,看起来他没有好消息要分享。

“我们有麻烦了,销售收入的一个百分比不能适当地记入贷方;我们需要你的帮助。”

这里有一些相关的背景:公司的收入是基于它向汽车经销商介绍更多的销售这一事实而产生的。为了获得应得的佣金,我们需要将车辆的销售与正确的客户相匹配。如果我们的数据提供者可以告诉我们哪个客户买了哪辆车,那么匹配就完成了,不需要额外的努力;然而,问题是一个数据提供商决定不提供一对一的销售记录:它必须批量完成(如下所示的“批量”的可视化),那么要知道哪个客户买了哪辆车就更加困难和不确定了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

收入团队对这一变化感到惊讶,在花了一个月的时间试图解决该问题后,该数据提供商只有 2%的销售额可以手动恢复。这对第一个盈利电话来说是个坏消息,所以他们开始向数据科学家寻求帮助。这显然是一个急需解决的问题,所以我们马上着手处理。

第一阶段。理解问题,然后用数学术语重新定义它

这是数据科学中解决问题的第一阶段。关于“理解问题”部分,一个人需要清楚地识别痛点,这样一旦痛点被解决,问题就应该消失了;关于“重新定义”问题部分,这通常是问题需要数据科学家帮助的原因。

对于我们的收入团队询问的具体问题,问题是:我们不能将每辆售出的车辆分配给一个客户,这样我们就失去了收入。

痛点是:在给定的批次中查找谁购买了车辆是手动的且不准确,考虑到有数千个批次需要匹配销售,这非常耗时且不可持续。

这个“重新定义”的问题用数学术语来说就是:给定一批有客户 C1、C2、…,Cn,以及售出车辆信息,V1,V2,…,Vm,我们需要一个自动化的解决方案来准确识别正确的匹配对(Ci,Vj ),以反映实际的购买活动。

第二阶段。分解问题,确定一个逻辑算法解决方案,然后构建出来

对于重新定义的问题,我们可以看到这是一个在约束条件下的“匹配”练习,给定客户和批量车辆。所以我把问题进一步分解成两步:

  • 第一步。给定车辆 P(C|V ),计算客户的购买可能性
  • 第二步。根据可能性,将汽车归属于该批中最有可能的客户

现在,我们可以进一步确定每个问题的解决方案。

第一步。概率计算

为了简单起见,让我们假设在这个批次中有三个客户(c1、c2、c3),并且提供一个车辆(v1)信息作为销售。

  • P(C=c1)代表 c1 购买任何一辆车的可能性。假设没有关于每个客户的先验知识,他们购买任何汽车的可能性应该是相同的:P(C=c1) = P(C=c2) = P(C=c3),这等于一个常数(例如,在这种情况下是 1/3)
  • P(V=v1)是 v1 被出售的可能性,假设它显示在该批次中,这应该是 1 (100%被出售的可能性)

由于只有一个顾客进行购买,这种概率可以扩展为:

P(V=v1) = P(C=c1,V=v1) + P(C=c2,V=v1) + P(C=c3,V=v1) = 1.0

对于每一项,给出以下公式

P(C=c1,V = v1)= P(C = C1 | V = v1)* P(V = v1)= P(V = v1 | C = C1)* P(C = C1)

我们可以看到 P(C=c1|V=v1)与 P(V=v1|C=c1)成正比。所以现在,我们可以得到概率计算的公式:

P(C = C1 | V = v1)= P(V = v1 | C = C1)/(P(V = v1 | C = C1)+P(V = v1 | C = C2)+P(V = v1 | C = C3))

关键是得到每个 P(V|C)的概率。这样的公式可以口头解释为:特定客户购买车辆的可能性与该客户购买该特定车辆的可能性成比例。

上面的公式可能看起来太“数学”了,所以让我把它放到一个直观的上下文中:假设三个人在一个房间里,一个是音乐家,一个是运动员,一个是数据科学家。有人告诉你这个房间里有一把属于他们其中一个人的小提琴。现在猜猜,你认为谁是这把小提琴的主人?这很简单,对吧?鉴于音乐家拥有小提琴的可能性很高,而运动员和数据科学家拥有小提琴的可能性较低,小提琴更有可能属于音乐家。“数学”思维过程如下图所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在,让我们把概率放到业务环境中。作为一个在线汽车定价平台,每个客户需要生成至少一个车辆报价,因此,我们假设客户可以合理地表示为他/她报价的车辆。然后,这种 P(V|C)概率可以从公司在历史中已经积累的现有数据中获知,包括谁在何时生成了车辆报价,以及他们最终购买了什么车辆。细节我就不进一步细说了,关键是我们可以学习 P(V|C),然后计算每一批需要的概率 P(C|V)。

第二步。车辆属性

一旦我们获得了每辆车销售给客户的预期概率,第二步就是归属过程。假设该批中只有一辆售出的车辆,这样的过程是琐碎的;但是,如果该批次中有多辆售出的车辆,则以下任一方法都适用:

  • (直接归因)仅使用计算出的概率 P(C|V),始终将车辆归因于可能性最高的客户。根据这种方法,可以将两辆车归属于同一个客户。
  • (循环法)假设每个客户最多购买一辆车:一旦一辆车被分配给一个客户,在下一轮车辆分配之前,两辆车都被删除。

现在我们已经设计了两步算法来解决关键挑战,是时候测试性能了!给定历史报价和销售数据,直接模拟“创建随机批次”、“将销售附加到批次”的过程,并尝试“从给定的批次信息中恢复销售”。这种模拟提供了一种评估模型性能的方法,我们估计超过 50%的销售额可以以高精度(> 95%)恢复。我们为真实数据集部署了该模型,结果与我们的预期非常匹配。

收入团队对上述解决方案非常满意:与 2%的回收率相比,50%超过了 25 倍!从业务影响的角度来看,这一收入直接增加了我们第一份季度收益报告的底线,数据科学团队贡献的价值是巨大的。

第三阶段。深入思考,寻求进一步改进的机会

我们将上述解决方案再运行一个月,看到性能相当稳定,现在是时候考虑下一步了。我们收回了 50%的销售额,但剩下的 50%呢?有没有可能进一步改进算法才能达到?

通常,我们作为数据科学家,有过于关注算法细节的倾向;在这种情况下,围绕如何更好地对 P(V|C)建模进行了一些讨论:我们是否应该使用深度学习模型来使这个概率变得更好,等等。然而,根据我的理解,这些纯粹的算法改进通常只会带来性能的提升,而我们不太可能缩小剩下的 50%的差距。

然后,我开始与收入团队进行更深入的交谈,试图找出我们对问题的理解中缺少的东西,结果是我们可以控制如何将客户分组到一个批次中!虽然有一些限制(例如,客户必须从同一家经销商处生成报价),但这给了我们进一步优化的自由,我认为这是缩小其余 50%销售差距的方向。

为什么我对这个方向充满信心?想一下这个情况:如果你有 4 个人要分批,每批有 2 个人。最好的批处理策略是将最不同的人放在同一个批处理中,这样一旦返回一个项目,归属将更加准确。下面的可视化展示了这个概念。在左边,如果你把两个音乐家放在同一个批次,两个运动员放在同一个批次,很难知道谁拥有小提琴或篮球。而在右边,如果你有一个音乐家和一个运动员的每一批,它更容易告诉音乐家 A 拥有小提琴,运动员 D 拥有篮球,有很高的信心。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

要实现上述概念,需要两个步骤:

  • (相似度定义)如何定义客户对客户的相似度?然后把一批的熵作为优化的目标函数?
  • (批次优化)基于以上相似性,如何设计一个优化策略来达到最优批次?

第一步。相似性定义

在第一阶段解决方案中,我们已经找到了一种计算 P(V|C) 的方法,在这里,我将做一个直接的概括:两个客户之间的相似性与双方客户购买对方报价车辆的平均可能性成正比。如果每个客户只对一辆车报价(c1 对 v1 报价,c2 对 v2 报价),则简化版本如下:

相似度(C1,C2)= 0.5 *(P(V = v1 | C = C2)+P(V = v2 | C = C1))

一旦我们有了两个客户之间的成对相似性,我们就可以将一个批次的熵定义为该批次中客户之间的相互成对相似性的总和。现在,我们有一个优化的目标函数:我们想要最大熵的批次

第二步。批量优化

在看了一些类似的研究后,我决定使用 2-opt 算法,这是一种用于解决旅行商问题的简单局部搜索算法。

2-opt 算法的基本概念是:在每一步中,随机选取两条边并尝试“交换”,如果交换后目标函数更好,则执行交换;否则,重新选择两条边。该算法继续进行,直到目标函数收敛或达到最大迭代次数。下图说明了拾取两条边(红色)并将其交换到新边(蓝色)中,从而缩短距离的情况。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为了在我的例子中应用 2-opt 算法,我对旅行推销员问题(TSP)进行了类比:

  • 在 TSP 中,随机选择两条边;在我的案例中,随机选择了两批,然后每批随机挑选一名顾客进行交换
  • 在 TSP 中,总距离作为目标函数,越短越好;在我这里,所有批次的熵就是目标函数,越高越好。

太好了,我们拥有优化批次的所有要素!在实现算法后,我们进一步对现有数据进行回测,发现:85%以上的销售额可以恢复。在接下来的一个月中,当我们将此应用于真实数据集时,发现恢复率处于类似的水平。这种方法果然有效!

第四阶段。设计解决方案,使其具有可扩展性和可维护性

我上面描述的主要是算法设计部分;与此同时,还有工程开发部分,简单地编写代码并期望它具有可扩展性和可维护性并不容易。

在项目发展过程中,我们逐渐注意到在所需的模块之间存在一种依赖模式。车辆由多个特征表示,客户由一组车辆表示,批次由一组客户表示。有了这种高级表示,我们可以将依赖关系构建为 Vehicle -> Customer -> Batch。

与此同时,作为一个数据产品,我们需要确保系统可以不断发展,以更新所需的参数,并始终评估沿途的性能。因此,该架构是按照以下方式设计的

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用这种体系结构,数据科学家需要定期做的事情有:

  • 重新训练 P(V|C)模型,以确保它包含最近的客户购买行为
  • 对整个过程进行模拟,包括批次优化和销售归属,以确保系统性能高于阈值
  • 每月批量优化,为我们的收入团队和销售归属准备数据,以将客户与销售匹配

现在,我们已经构建了一个可维护的可持续数据产品。鉴于数据科学团队建立了良好的声誉,在接下来的一年中,我们大量参与了销售匹配系统的重新设计,这进一步扩大了数据科学在公司的足迹。由于这种架构的卓越运营,我们可以腾出更多资源来应对下一个挑战。

用正确的心态解决问题的一般流程

数据科学领域非常广泛,设计算法数据产品只是许多潜在项目的一部分。其他常见的数据科学项目有实验设计、因果推理、推动战略变革的深度分析等。尽管他们可能没有严格遵循或者甚至不需要我上面列出的所有阶段,四阶段流程仍然有助于展示一种思考解决问题的方法:

  • 第一阶段(问题识别)是帮助你专注于关键问题,而不是在深入研究数据时迷失方向
  • 第二阶段(第一个合理的解决方案)是让你快速取胜,并保持与业务伙伴建立信任的势头
  • 第三阶段(迭代改进)是帮助您将解决方案向前推进,并成为该领域的所有者
  • 第 4 阶段(卓越运营)是帮助您消除技术债务,将您从日常维护工作中解放出来

四阶段流程不一定是一个应该遵循的严格规则,但如果数据科学家在面对任何即将到来的挑战时拥有正确的心态,它更像是一个自然的结果。在我看来,这些心态是:

  • 业务驱动,而不是算法驱动。纵观全局,了解数据科学在业务中的位置,理解为什么需要数据科学以及它如何提供价值。不要太执着于任何特定的算法:“如果你只有一把锤子,那么一切看起来都像钉子”。
  • 拥有问题,而不仅仅是接受订单。成为问题的主人意味着一个人会积极主动地思考如何现在就解决它,更好地解决它,用更少的努力解决它。人们不会停留在一个次优的解决方案,并认为它已经完成。
  • 虚心,永远在学习。作为一个跨学科的领域,数据科学与统计学、计算机科学、运筹学、心理学、经济学、市场营销、销售等学科重叠!提前了解所有领域几乎是不可能的,所以要虚心学习,一路走来不断学习。总会有比你已经知道的更好的解决方案。

希望以上分享对你有所帮助:快乐解决问题,数据科学之道。

— — — — — — — — — — — — — —

如果你喜欢这篇文章,通过点赞、分享和评论来帮助传播。潘目前是 LinkedIn 的数据科学经理。可以看以前的帖子,关注他上 LinkedIn

之前有两篇分享潘数据科学经验的文章:

我的第一个数据科学项目

数据科学如何创新

多元线性回归的问题,R

原文:https://towardsdatascience.com/problems-with-multiple-linear-regression-in-r-bef5940518b?source=collection_archive---------17-----------------------

如果你以任何形式滥用数学,它就不会站在你这边

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

小心直线…图片由 Unsplash 上的阿塔瓦·图尔西拍摄

线性回归是一种流行的、古老的、充分发展的方法,用于估计测量结果和一个或多个解释(独立)变量之间的关系。例如,线性回归可以帮助我们建立一个模型,代表心率(测量结果)、体重(第一个预测因素)和吸烟状况(第二个预测因素)之间的关系。在这篇博客中,我们将了解如何进行参数估计,探索如何使用基于美国人口普查局数据创建的数据集进行多元线性回归,并讨论在我们试图简化模型时,由于删除“坏预测因素”而出现的一些问题。

线性模型的典型表示方式可能是人们所熟悉的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这里, y 表示由斜率为 m 且截距为 b 的直线估计的测量结果。我们可以重新排列等式,得到:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以进一步改变变量,用贝塔系数来表示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这是线性回归模型的典型表示方式。注意,我们使用 y_hat 来表示估计,而不是观察。我们可以扩展该模型,使其包含多个预测变量:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中 x_1,x_2,…,x_p 为预测值(其中有 p )。在这种情况下,可以调用线性代数中的一个概念——线性组合!请注意,β和预测值 x_i ( i 是预测值的索引)可以表示为单独的向量,为我们提供了模型的一般矩阵形式:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

假设我们有N个结果,我们想找出结果和单个预测变量之间的关系。除了N结果,我们还会有单个预测因子的N观察。此外,假设结果和观察结果都存储在矩阵中。由于结果是一个单一的数字,并且有N个,我们将有一个N x 1矩阵来表示结果— Y (在本例中是一个向量)。此外,观察值将存储在一个N x (p + 1)矩阵中,其中p是预测值的数量(在我们的例子中是一个)。我们将一列 1s 添加到观察矩阵中,因为它将帮助我们估计与模型截距相对应的参数——矩阵 X 。请注意,我们添加了一个误差项——epsilon,它表示预测值( Y_hat )和实际观测值( Y )之间的差异。

术语 β 是包含线性模型的参数/系数的(p + 1) x 1 向量。附加项 ε 是一个表示测量误差的n x 1 矢量。

假设

与大多数(如果不是全部)统计工具类似,线性回归有几个必须满足的假设,以便使用其原理对问题建模:

  1. 线性(duh)——特征和结果之间的关系可以线性建模(如果数据是非线性的,可以进行转换以使其线性,但这不是本文的主题);
  2. 同方差——误差项的方差是常数;
  3. 独立性——观察相互独立,即结果 i 不会影响结果I+1
  4. 正态性——对于 X 的任意固定值, Y 呈正态分布。

如何获得β

拟合模型时,目标是最小化测量观察值和该观察值的预测值之间的差异。在线性回归中,我们通常会尝试最小化均方误差,即独立观察值与其预测值之间的平方差总和的平均值:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以通过获取关于β(参数)的梯度并将其设置为 0 来最小化 MSE,从而得到β的公式:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

了解了β是如何得出的,我们就可以开始练习了。

我们将使用一个由美国人口普查局收集的不同类型指标汇总而成的数据集。我们将尝试基于 7 个预测因素来预测预期寿命——人口估计、文盲率(人口百分比)、每 10 万人口中的谋杀和非过失杀人率、高中毕业生百分比、平均气温为 32 华氏度的天数以及按州分组的土地面积(平方英里)。请注意,该数据集来自 1975 年左右,不代表当前趋势,并且用于练习如何创建线性模型:

在众多统计工具中,r 是一个很好的工具(Python 也很好),所以我们将在这里利用它。首先,我们可以创建一个简单的回归模型,并检查每个预测变量的显著性:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

语法很有趣,所以让我们来看一下:

  1. lm —创建线性模型的命令;
  2. Life.Exp~. —我们正在预测的变量Life.Exp,由(~)所有预测者(.)解释;
  3. data —我们用来创建模型的数据矩阵。

我们得到以下总结(仅显示系数的显著性):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

创建模型时,R 为我们执行显著性检验,并报告与每个预测值的相应检验相关的 p 值。如果我们假设 p 值截止值为 0.01,我们会注意到,考虑到模型中包含的其他预测值,大多数预测值都是无用的。在这种情况下,我们可以通过创建一个仅使用预测器子集的模型来执行类似于手动降维的操作(逐步回归)。我们可以按 p 值降序丢弃预测值,从最没用到最没用:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

强烈建议在每次模型更新后执行一次summary调用——在其中一个特征被删除后,再次执行每个系数估计的显著性测试,这会影响最终的 p 值,从而决定我们是否继续删除特征。为了节省空间,我在这里跳过了它。该模型的最终总结为我们提供了:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们设法将功能的数量减少到只有 3 个!然而,这种方法存在一些问题。

意义

与我们在本练习中所做的类似,执行变量的反向消除,只会帮助我们简化模型以实现计算目的,并有可能提高通过残差平方和等指标衡量的性能。从模型中剔除的变量并不意味着该变量在现实生活中不重要。例如,我们剔除了收入,这可能是一个人预期寿命的“重要”因素。这个世界非常复杂,一个简单的模型,比如我们创建的这个,有几个缺点:

  1. 由 R 执行的显著性测试本质上是有偏差的,因为它们是基于创建模型所依据的数据。这与测试有关,与 R 本身无关;
  2. 有多种指标可以用来衡量一个模型有多“好”。例如,R(决定系数)是一个度量标准,通常用于解释预测变量的变化比例(范围 0 到 1 ),如预测因子所解释的。调整后的 R 值考虑了模型使用的变量数量,因为它表示模型的复杂性。然而,一个模型有可能显示出作为其一部分的变量的高显著性(低 p 值),但是具有表明较低性能的 R 值。根据下表,我们可以认为,我们应该选择第三个模型是“最好的一个”,并接受平衡“无关紧要”的变量和较高的 R 值之间的折衷;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然而,请注意,添加一个无关紧要的变量将始终增加 R 值并减少 MSE。尽管不重要,变量的增加仍然可以解释响应变量中的一小部分变化,这导致 R 更高,MSE 更低;

3.正如已经提到的,像这样的模型可能是对现实世界的过度简化。有许多因素可以影响一个人的整体生活,从而影响预期寿命。我们必须留意这些因素,并始终以怀疑的态度解读这些模型。这特别适用于这个模型,因为它试图模拟一个代表人们生计的因素。然而,这可以扩展到我们构建的任何通用模型;无论是模拟气候、制造过程中化学物质的产量等等。此外,怀疑主义原则适用于任何模型架构,而不仅仅是回归。

多重共线性

回想一下我们在开始时提到的线性组合,它们在多重共线性中也发挥了作用。当数据集显示多重共线性时,一个或多个测量特征可以用同一数据集中的其他特征来表示。这意味着关于特征(列向量)的信息由其他特征编码。从技术上讲,矩阵没有满秩,这意味着并非所有列都是线性独立的。其结果是数值不稳定和潜在的膨胀系数——即β!让我们集中讨论 X 的转置与 X 本身相乘所得到的矩阵的逆矩阵。

求矩阵 A逆涉及计算矩阵的行列式。然后将行列式的倒数乘以另一项,得到倒数。注意我提到了“行列式的逆”;也就是1/determinant(A)。当矩阵不是满秩时,行列式通常是比 1 小得多的值,导致行列式的倒数是一个巨大的值。这是求逆的要素,最终导致系数膨胀!在 R 中,我们可以通过自己写出矩阵乘法来检查行列式是否小于 1。给定我们在练习中使用的数据集,我们可以写出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

让我们来分解命令:

  1. cbind命令用data的指定特征列创建一个矩阵,并将该矩阵存储在mtx
  2. t(mtx)mtx的转置;
  3. %*%是 r 的矩阵乘法运算符。

事实证明,对于我们在示例中使用的数据集,行列式约为 3e+41,因此我们得到TRUE作为输出!在执行多元线性回归时,这是一个需要检查的重要元素,因为它不仅有助于更好地理解数据集,而且还表明应该后退一步,以便:(1)更好地理解数据;(2)潜在地收集更多数据;(3)或者使用主成分分析或岭回归进行维数减少。

线性回归仍然是一种非常流行的建模方法。像任何统计工具一样,应该注意:(1)理解数据,以避免虚假的参数估计;(2)开发如何执行参数估计的意识,以便能够在潜在问题发生之前对其进行诊断;(3)解释为什么一个系数很重要,而另一个可能不重要,以及这如何反映我们试图模拟的世界现象。下面是最终的代码示例:

NBA 中与 PER 的问题

原文:https://towardsdatascience.com/problems-with-per-in-the-nba-fa0e611543e2?source=collection_archive---------16-----------------------

您可以轻松避免的 3 个常见数据科学错误

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Unsplash 上由棕柽柳拍摄的照片

如果你是 NBA 篮球的粉丝,也是分析的粉丝,那你一定听说过 PER。

PER 是霍林格开发的一种综合统计。约翰目前为《运动报》撰稿,曾是孟菲斯灰熊队的篮球运营副总裁,也是《ESPN》和《体育画报》的专栏作家。他是四本篮球分析书籍的作者,是 NBA 分析社区的巨人。

根据霍林格的说法:

玩家效率等级(PER)是玩家每分钟生产力的等级。

PER 被正确地称为篮球高级分析运动的教父级统计数据之一。这是第一个调整比赛节奏、调整比赛时间和跨赛季标准化数据的篮球测量方法之一(该测量方法为每个赛季分配了 15%的平均球员)。《公共关系条例》仍然经常在广播和媒体中被引用。

它也有很大的缺陷。

有人说 PER 过于复杂。有人说它不足以解释防御。其他人说它高估了得分。

虽然上述说法可能是正确的,但真正的问题在于方法——这与数学无关,而与导致其不完善的数据分析方法有关。今天,我想把重点放在霍林格的 PER 研究方法上,希望我们所有人——作为数据科学家——在未来避免类似的错误。

方法学

在研究中,科学家遵循几个一般步骤:

  1. **观察一种现象。**你看到了世界上的一些东西,想知道更多关于它是如何运作的。
  2. 开发研究问题。基于你所看到的,你提出你想要得到答案的问题。
  3. 寻找现有理论,必要时发展一种理论。对于大多数研究领域,有人已经做了一些工作。通过找到现有的理论,你就有了一个理解你所观察到的现象的很好的起点。有时候,你只需要现有的理论,但是——如果你找不到任何适合这种情况的理论——你可以发展自己的理论来恰当地描述世界上正在发生的事情。
  4. **创造一个可证伪的假设。**这通常是最难的一步。为了测试一个理论,你必须找到一种表达方式,这样你就可以*证明这个理论是错误的。*例如,如果你的假设是“披头士是有史以来最伟大的乐队”,就没有办法证明或反驳这一说法。然而,如果你说“披头士是有史以来最畅销的乐队”,你可以看看实际的衡量标准,看看这种说法是否正确。确保你的假设遵循这个公式。
  5. **确定措施。**现在,您已经创建了一个可证伪的假设,您可以确定哪些可观察的测量将有助于您测试该假设。
  6. 收集数据。前进并测量那边的变量。
  7. **分析数据。**分析这些测量值,看看你的理论是否能准确解释观察到的数据,如果它们确实有解释力,你可以看看它们对你的数据集有多大的影响。
  8. 更新你的信念。如果你的数据符合某个理论,你现在就有了该理论的工作证据。如果你的数据不符合某个理论,那么你应该改变你对该理论真实性的信念(如果你不直接拒绝它的话)。
  9. 如果需要,运行更多测试。进行一次测试很少足以证实你的信念,而且你最终会根据你的发现提出更多的问题,这些问题可以在未来的分析中得到解答。

现在我们已经对研究方法有了基本的了解,让我们从理论上来看一下如何计算 NBA 的每分钟生产率。

我们理论上的 NBA 生产力研究项目

  1. 我们观察到一些 NBA 球员帮助他们的球队比其他人赢得更多。
  2. 我们想知道我们是否可以用一个单一的指标来衡量 NBA 球员每分钟的生产率。我们想看看我们是否能根据这个标准预测他们的团队有多成功。换句话说,我们想要创建一个预测团队胜利的玩家指标。
  3. 迪安·奥利佛斯有一个篮球成功的四因素理论。但是,它由四个因素组成,而不是一个,而且与团队成功更相关。因此,我们发展了一个理论,即个人球员的生产力可以通过基于我们对篮球运动的一系列信念的 boxscore 统计的综合测量来衡量。
  4. 我们陈述了我们的假设,玩家的生产力可以用一个单一的指标来衡量。如果这是真的,我们假设我们创建的玩家指标将显著预测玩家团队的生产力(即,玩家在我们的指标上的分数将预测他们的团队赢了多少场比赛)。
  5. 我们使用 boxscore 统计数据和我们对篮球的信念创建了一个我们的指标版本。这是我们的独立变量。我们用团队获胜的数量来衡量生产率,这是我们的因变量。
  6. 我们收集衡量指标和团队胜利的数据。
  7. 我们分析数据,看看我们的指标是否能预测团队获胜,以及我们的度量的效果大小(即,它预测实际团队获胜的“多少”),如果它确实能预测团队获胜的话。
  8. 我们根据指标与数据的吻合程度对指标进行修改,或者因为指标不符合数据而完全停止使用。
  9. 我们对我们的指标进行了更多的测试,并开发了更多的研究问题来回答我们的指标作为感兴趣的变量。

让我们把这个和我们看到的霍林格和佩尔的作品进行比较。

霍林格 PER 法

  1. 约翰观察到一些球员帮助球队比其他人赢得更多。
  2. 约翰想看看是否一个单一的指标可以预测球员的生产力。
  3. 约翰的工作基于迪安·奥利弗的四个因素,同时也根据他对篮球的信念增加了自己的权重。
  4. John 提出了一个关于单个衡量标准的假设——后来成为 PER——但没有对此做出可证伪的陈述(例如,PER 预测团队获胜)
  5. John 创建了他的 PER measure。他没有具体说明任何结果变量。
  6. 约翰收集他的测量数据。
  7. John 没有提供任何统计分析来验证 PER 是否能有效地预测生产率,因为他没有具体说明结果变量。我们也没有任何规定的 PER 效果大小。
  8. 尚未根据分析更新 PER。
  9. 那些仍然使用 PER 作为衡量球员生产力的标准的人没有对 PER 进行额外的测试。

霍林格写道:

然而,PER 能做的是用一个数字总结一个球员的统计成绩。这让我们能够统一我们试图在头脑中跟踪的每个球员的不同数据[……],这样我们就可以继续评估统计数据中可能缺少的东西。

本质上,霍林格着手:

  • 用一种方法总结 NBA 球员的统计成绩
  • 确保该方法能够有效地测量每分钟的生产率

他用 PER 实现了前一个目标,但在这个过程中,他未能进行基本的科学分析,以确保他的指标在实现后一个目标时在统计上是有效的。

数据科学需要遵循科学的方法

为霍林格说句公道话,他可能不认为自己是数据科学家。见鬼,他可能认为 PER 主要是他用来写作的工具,他可能已经更新了他对 PER 的个人信念。

但是他用 PER 所做的工作肯定属于数据科学的范畴,并且 PER 还没有作为一种统计方法被更新。如果他从一开始就遵循了基本的科学方法原则,那么他就可以很容易地避免一些错误。

此外,因为 PER 如此受欢迎,篮球分析社区的许多其他数据科学家也在犯霍林格犯的同样的错误。

让我们试着阻止它。以下是如何轻松地从 PER 中学习(并避免)数据科学错误的方法。

你应该避免的 3 个数据科学错误

1.不够具体

在数据分析中,非常重要的一点是要明确项目的各个方面。确保您:

  • 对你的假设有一个可证伪的陈述
  • 记住具体的因变量和自变量,以便进行有效的分析

如果你在开始提取数据之前不这样做,你基本上是在瞎跑,浪费很多时间。

如果霍林格对他的 PER 方法有更具体的描述,我们将很容易看到 PER 是否是一个有效的度量。就目前情况而言,我们不知道约翰所说的“生产力”在 PER 的上下文中是什么。我们都有自己的想法——我的想法是生产率应该以团队的胜利来衡量——但这都是基于我们个人的定义,而不是进行研究的科学家的明确定义。

2.未报告显著性和效应大小

这与前一点有联系——因为霍林格没有具体的结果变量,所以没有报道的发现。仍然使用 PER 的网站不报告 PER 是否能有效预测胜率,它预测胜率的百分比,或者任何其他关于潜在结果变量的发现。

对于你做的任何项目,必须报告你感兴趣的任何因变量的显著性和影响大小。

3.不基于数据更新

Basketball-Reference.com 和 ESPN 网站的 PER 值保持不变——这个指标从一开始就没变过。如果你打算做数据科学,你必须准备好基于你的发现进行迭代。

仅仅因为你以前对某件事有信念,并不意味着如果你发现了与此相反的证据,你就不应该更新这些信念。让数据引导你找到更好的理论和模型。

为什么 PER 仍然如此受欢迎?

尽管有缺陷,PER 仍然是一个被大量使用的 NBA 数据。这是为什么呢?

嗯,首先,我很确定它确实预测了团队胜利中的一些数量的差异(即使效果大小还没有明确说明)。还有文化相关性的问题——PER 现在已经深深地融入了 NBA 文化。

它的文化相关性归结为两件主要的事情:

  1. 这是第一个试图回答所有 NBA 球迷都感兴趣的问题的综合指标之一:谁是联盟中最有生产力的球员?
  2. 它以一种能引起普通 NBA 球迷共鸣的方式抓住了人们的兴趣。

15——平均每分——是一个相关的篮球得分。如果有人在篮球比赛中得了 15 分,我们认为他是一个好球员。如果有人得分在 20 多或 30 多,我们认为他们是伟大的球员。

从这个意义上说,PER 是聪明的。霍林格了解 NBA 球迷的心理,并确保他的测量是他的读者很容易认同的。

你应该在研究中使用 PER 吗?

见鬼。是的。

同样,PER 不是一个完美的衡量标准。但是通过将它包含在你的研究中,我们可以更好地理解它作为一种衡量标准的有效性——由于我们上面提到的问题,这是目前所缺乏的。您还可以将其他指标的功效与 PER 进行比较,为我们提供一个指标效率的基线。

解决 PER 问题的唯一方法是在数据科学环境中实际观察 PER——即使我们发现它不是我们所依赖的指标。

结论

就像乔治郝佳不应该被认为是有史以来最伟大的篮球运动员一样,我们也不应该被认为是篮球分析的目标。聪明的球队似乎已经不再用它来衡量球员的评价。希望广播公司和媒体成员也会远离它,因为我们对篮球比赛应该如何用统计方法来衡量有了更多的了解。

同时,PER 是篮球分析的文化基石。当我说我认为它应该被载入奈史密斯篮球名人堂时,我不是在开玩笑。

它可能不符合一些简单的科学原理,但如果没有它,我们可能仍然停留在篮球统计的黑暗时代。

作为数据科学家,我们应该尊重霍林格的所作所为,然后学会做得更好。

来源

根据 Basketball-reference.com 计算

霍林格,什么是 PER? (2007),ESPN

四大因素、Basketball-reference.com

开始 ML 项目前你需要知道的 8 件事。

原文:https://towardsdatascience.com/process-of-creating-an-effective-machine-learning-pipeline-815ecce30e98?source=collection_archive---------30-----------------------

从心中的目标开始。斯蒂芬·科维

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

弗兰基·查马基Unsplash 上拍摄的照片

尝试为你的 ml 项目创建一个管道,这样其他人就可以从你的工作中获益。

为什么管道这个词有误导性,因为它意味着单向的,但是让我们看看如何以循环的方式思考 ML 管道。

注意:- 本文旨在指导您思考过程(Python 模块)以及创建有效管道所需回答的正确问题。 这是一篇更高级的文章,提供了创建生产级管道的示例技术 ,但是我建议您在开始之前浏览一下。

要以互动的方式了解 ML 管道,请查看资源管理器

🌀有一段时间,我认为 ML 管道是这些复杂的设计架构,只能由具有高编码和系统设计技能的软件工程师来完成,但在最近的技术如亚马逊 SageMakerApache Kafka微软 Azure 等的帮助下,这完全不是事实。管道可以以简单且经济的方式实现自动化和维护。🌀

管道是一种组织和自动化你的代码的方式,这样不仅你未来的自己,而且其他人也可以很容易地理解和集成它。ML 管道的一些目标是:

新错误 *⦿实时处理。 *****计算工作量 平衡 ⦿可扩展消息驱动 **

在你开始深入研究、建立模型和预测未来之前,问自己这些问题。

① ML 问题框架:

你想解决的商业问题是什么?

你真的需要机器学习的方法来解决这个问题吗?

这里有一些提示,让你知道你是否需要一种机器学习方法。

  • 有没有你想了解的重复模式?
  • 您有理解这些模式所需的数据吗?
  • 了解要进行的预测类型,无论是二元/多分类问题,还是需要预测连续值(回归),如股票价格。

现在是时候询问领域期望并测试您的假设了。

在这个阶段,你问的问题越多,你的模型就越好。

  • 影响你预测的重要特征是什么?
  • 它们有重叠的特征吗?
  • 如何测试你的模型(这个不像拆分数据那么简单)?
  • 可以帮助您理解您正在解决的领域和问题的问题。

让我们继续无聊的部分,开始预测未来吧。

②数据收集与整合:

无论你或你的团队在哪里收集数据,都可能存在一些干扰。因此,您应该配备能够帮助您正确清理和集成数据的工具,并且应该能够处理所有类型的数据。

虽然这样做并不有趣,但却能产生有趣的结果。因为真实数据不是由数字和分类特征组成的,而是由垃圾和其他特征组成的。

便捷的数据清理工具:制表Scrubadubftfy更多链接

获取您的数据状态:

  • 加载数据pd.read_{filetype}('filename')
  • 获取数据的形状data.shape
  • 得到数据的统计信息data.describe()
  • 了解数据类型和信息data.info()data.dtypes
  • 了解缺失值的数量data.isnull().sum()

呜呜!我的数据看起来惊人,我迫不及待地运行我的模型并得到预测。没那么快!

③资料准备:

这就是数据科学家的真正技能发挥作用的地方。

从你的训练数据中随机抽取一个样本(任何不需要太多时间的大小),你需要深入挖掘,并且应该能够回答你的所有问题,例如。

  • 有什么特点?
  • 它符合你的期望吗?
  • 有足够的信息做出准确的预测吗?
  • 你应该删除一些功能吗?
  • 有没有什么特征没有被恰当地表现出来?
  • 标签在训练数据中分类正确吗?
  • 数据不正确会发生什么?
  • 是否有任何缺失值或异常值等。

如果你做了适当的功课,你将能够建立你的模型,而不用担心错误的预测。

我们如何通过编程来回答这些问题?这将带我们进入下一步👇

④数据可视化与分析:

我喜欢可视化,当你在图表上绘制你的数据时,它揭示了看不见的模式、异常值和我们直到现在才能够看到的东西。直方图和散点图等基本图可以告诉您许多关于数据的信息

你需要知道的一些事情是:

你不想伤害你的模特吧。如果您的数据包含缺失值或异常值是不正确的数据类型,您的模型将受到影响。为了顺利运行您的模型,您需要承担清理它的负担。

需要考虑的事项:

现在是你期待已久的部分。选择要运行的模型。

选择一个模型并不容易,因为模型的范围很广,而且所有的模型都有自己的基本假设。选择符合数据集假设的模型也是数据科学家的工作。

机器学习模型

下一步是什么?我现在可以运行我的模型了吗?是的,如果你不想要更好的结果(你不愿意冒任何代价的风险)。下一个部分可以说是机器学习管道中关键且耗时的部分。这只是经验之谈,但我会尽可能多的解释来帮助你开始。准备好!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

雷切尔·亨宁在 Unsplash 上的照片

⑤特征选择和工程:

特征工程的主要思想来自于提问和你从上面的可视化过程中学到的东西。

值得问的问题有:

  • 这些特征有意义吗?
  • 我如何设计基于可视化的新特性?
  • 我可以通过合并旧特征来创建新特征吗?

特征工程技巧:

  • 将相似的列组合成一列。
  • 将分类转换为数字变量,如一个单词中的字母计数或一键编码、LabelEncoder 等。
  • 将时间转换成天数或月数。
  • 缩放数字特征,以便模型容易找到局部最小值。
  • 宁滨把数据列成组。(它对于处理异常值也很有用)

深挖——ML 精通中等Kaggle精英Elite2

终于……哇哦!终于准备好接受训练了吗? 排序 :

⑥模型训练:

训练模型的步骤:

1.将数据分成训练、开发、测试:

  • 运行模型时,确保随机化数据以克服偏差。
  • 创建一个测试集,该测试集接近地代表训练集(分层测试集,相同的日期范围,等等…)
  • 使用交叉验证。

2.偏差方差:

  • 拟合不足=低方差和高偏差=简单模型
  • 过度拟合=低偏差和高方差=复杂模型
  • 超参数调整帮助您平衡模型偏差和方差。

万岁,你做到了………!

该领工资了。运行模型。

库: MxnetScikit-LearnTensorFlowPyTorchCloud AutoMLPycaretTheanoKerasSciPyNLTKMLlibxgboos

抱歉!还没完成。有一些细节需要评估和解释,让你脱颖而出,例如:

⑦模型评估:

有不同的指标来评估你的模型,有时你可能必须想出你自己的指标来评估模型的性能。无论如何,这里有一些通用的度量标准,可以帮助你理解模型中哪里出错了,或者模型对于现实世界的准确性如何,或者理解为什么模型会在第一时间工作。选择正确的指标

不要只运行单个模型,运行多个回归/分类模型,并根据这里的指标选择最佳模型。

回归度量:

RMSE,MSE,调整后的挖深视角

分类指标:

混淆矩阵、精确度、召回率、F1 分数、ROC、AUC 深入挖掘

结尾:

面对它你已经框定了问题,清理了数据,做了数据可视化,选择了重要的特性,做了特性工程。你一次又一次地通过调整超参数和在开发设备上测试来训练你的模型,还剩下什么?

⑧预测:

**Model.Predict(Test_Data)**和部署(这是一个完全独立的主题)

你的脑海中仍然会有一个疑问。

一切都很好,但这一切都只是理论,我该如何实施?

答:正如我之前所说,管道只是一个以系统方式解决问题的思考过程,以便将来易于调试:有一些工具,如Amazon SageMaker这些工具在高层次上处理所有这些步骤,并为您提供额外的功能和工具来组织、监控和跟踪您的模型

技巧

  • 当您想要测试多个模型时,建议在小数据集上测试模型,而不是在整个数据集上运行。
  • 检查对模型有帮助的重要特征,并继续在这些特征上进行工程设计。
  • 删除与目标变量没有任何关联的特征。
  • 使用最大投票或百分比集成不同的模型以实现更好的预测和随机化。
  • 建模不仅仅是一个一次性的步骤,你需要正确的可执行代码来重新运行你的模型,以适应当前的需求。

查看这个博客(即将发布),在这里这些步骤被用来解决一个真实世界的例子。

参考:

  1. 如何构建你的代码
  2. Github 给你的必备文件

👏在链接下方评论你的最佳项目。👏

带 R 的过程稳定性分析

原文:https://towardsdatascience.com/process-stability-analysis-with-r-9ec41ec5fc0d?source=collection_archive---------22-----------------------

r 代表工业工程师

解释质量控制图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由 Lukas 拍摄,可在 Pexels 获得

质量控制图

质量控制图是工程师监控一个过程是否在统计控制下的重要工具。它们有助于可视化变化,发现并纠正出现的问题,预测预期的结果范围,并分析特殊或常见原因导致的流程变化模式。

通过注意控制图上出现的某些类型的模式,可以在控制图上发现变化的特殊原因。为了真正抓住控制图的好处,必须认识到这种模式——以及它们在给定过程中所代表的东西——以找到变异的特殊原因背后的原因。为此,评估 8 个控制图规则来分析它们。

控制图区域

为了识别给定测量中的变化程度,控制图被分成平均值上下三个相等的区域。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 中线:对应被分析测量的平均值。
  • A 区:对应于中心线以上/以下 2 sigma 到 3 sigma 的区域。
  • B 区:对应于中心线以上/以下一个西格玛到两个西格玛的区域。
  • C 区:对应于从中心线到中心线上下一个西格玛的区域。
  • UCL(控制上限):对应于平均值以上的最大公差。
  • LCL(控制下限):对应于平均值以下的最大公差。

为了在统计控制下考虑一个过程,它的大部分点必须在中心线附近,而一些点可以更接近控制极限——全部没有模式——但是没有超出控制极限。

控制图规则

以下控制图规则用于识别给定过程中出现变化的特殊原因(即模式):

  • 规则#1 —超出限值:一个或多个点超出控制限值。
  • 规则# 2——A 区:A 区或更远的连续 3 分中的 2 分。
  • 规则# 3—B 区:B 区或 B 区以外的 5 个连续点中的 4 个。
  • 规则# 4—C 区:平均值一侧的 7 个或更多连续点(在 C 区或 C 区以外)。
  • 规则 5——趋势 : 7 个连续的向上或向下的点。
  • 规则 6 —混合物 : 8 个连续点,c 区没有点。
  • 规则#7 —分层:c 区 15 个连续点。
  • 规则# 8——超控:上下交替的 14 个连续点。

规则关联模式和可能的原因

  • 规则 1 和规则 2 :偏离平均值很大。 可能 c 原因 :执行工作的新操作员;错误的设置;测量误差;跳过了流程步骤;流程步骤未完成;停电;设备故障。
  • 规则#3 和#4 :平均值的小偏移。 可能 c 原因 :原材料变更;工作指令的变更;不同的测量设备/校准;不同班次;工人获得了更多的工作经验;维护计划的变更;安装程序的变更。
  • 规则五:趋势。 可能的 c 原因 :工装磨损;温度影响(例如冷却、加热)。
  • 规则 6 :混合物。 可能的 c 原因 :存在多个流程(如班次、机器、原材料)。
  • 规则 7 :分层。 可能的 c 原因 :存在多个流程(如班次、机器、原材料)。
  • 规则#8 :过度控制。 可能 c 原因 :操作员篡改;交替原材料。

虽然列出每种模式的可能原因很复杂,因为特殊原因高度依赖于过程的类型,但是上面列出的原因可以作为质量保证工程师进行头脑风暴会议的参考,以找出变化的特殊原因背后的原因。

对于下面的例子,让我们使用 R 软件分析 31 个随机点的过程稳定性控制。将对 8 条控制图规则中的每一条进行评估,以确定是否存在可归因于特殊原因引起的变化的趋势。我们来看看 R 代码!

首先,让我们从构建包含所有必要信息的数据框开始:

数据框如下所示:

接下来,让我们建立相应点的控制图:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作为第一印象,这个过程似乎在统计控制之下;所有点都位于控制上限和下限内。但是,有必要评估控制图规则,以确定数据中是否有任何趋势。

在接下来的步骤中,让我们将每个控制图规则的布尔值初始化为 true。 注意 :规则#1 到#5 被分成“上”和“下”规则,这取决于被分析的图表的哪一侧。

现在让我们构建每个控制图规则逻辑背后的代码。每个数据点的每个规则评估结果(即)将存储在一个新列中。

  • 规则一:

  • 规则二:

  • 规则三:

  • 规则四:

  • 规则五:

  • 规则六:

  • 规则 7:

  • 规则八:

最后一步,让我们创建控制图摘要数据框架,从最近日期开始按降序排列规则评估:

最终结果如下所示:

正如最初建议的那样,可以说这个过程是在统计控制之下的;所有数据点都位于控制范围内,并且不存在由于特殊原因导致的变化趋势。

总结想法

不受监控的流程无法改进。能够解释和理解质量控制图提供的信息是质量和工业工程师的一项重要任务,以识别由特殊原因产生的变化趋势。只有在它们被确定之后,过程改进的想法和项目才能在头脑风暴会议和质量圈里被计划,并最终被执行。

基于控制图规则评估数据点可能是检测过程中变化的最佳策略之一。然而,即使控制图规则在不同行业和统计学家之间可能略有不同,但它们几乎是相同的。质量和工业工程师必须精通阅读和解释质量控制图,以确保向客户交付符合其要求和规格的高质量产品。

— —

如果你觉得这篇文章有用,欢迎在GitHub上下载我的个人代码。你也可以直接在 rsalaza4@binghamton.edu 给我发邮件,在LinkedIn上找到我。有兴趣了解工程领域的数据分析、数据科学和机器学习应用的更多信息吗?通过访问我的介质 简介 来探索我以前的文章。感谢阅读。

-罗伯特

用 Python 处理和可视化多个分类变量——NBA 的赛程挑战

原文:https://towardsdatascience.com/processing-and-visualizing-multiple-categorical-variables-with-python-nbas-schedule-challenges-b48453bff813?source=collection_archive---------6-----------------------

使用平行分类图和树形图来可视化、识别和比较数据中多个输入变量的影响:NBA 中的休息、旅行和主场。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可视化多个分类变量

今天,我想讨论处理、可视化和回顾分类变量的各种方法。当有多个分类变量时,处理和可视化数据可能会很棘手。

你可能见过有多种颜色和标记形状的交叉线条图,或者可能是支线剧情的网格。这些解决方案可以工作(并且工作得很好),但是它们远不是这个特定任务的唯一可用的绘图类型,今天我们将探索一些其他的方法。

至于数据,我们将使用篮球(NBA)输赢数据。更具体地说,我们将着眼于三个据说影响篮球比赛结果的关键外部因素;主场优势,旅行,休息日。

一如既往,虽然这篇文章利用了篮球数据,但它首先是一篇数据分析和可视化的文章。因此,专门针对篮球的讨论保持在相对最小的范围内,之前的篮球/NBA 知识是不必要的(尽管欣赏鼓励😉).

在开始之前

数据

我将代码和数据包含在我的 GitLab repo here (在 nba_travel_impact 目录中)中,如果您愿意,您应该能够通过下载/克隆 repo 来轻松跟进。

包装

我假设您熟悉 python。即使你相对来说是新手,这个教程也不应该太难。(请在 twitter 上找到我,并告诉我您是否想要更多指导。)

你需要pandasplotly。用一个简单的pip install [PACKAGE_NAME]安装每一个(在你的虚拟环境中)。

显然,你可以使用任何图形包,但我个人更喜欢你用 Plotly 得到的简单和强大。

NBA 赛程—影响

每个 NBA 常规赛在十月和四月之间进行。(例如,2019-20 赛季将在 10 月 22 日至 4 月 15 日之间举行。)在这段时间里,每支球队打 82 场比赛,平均每场比赛只有 2.15 天。比赛之间勉强算一天休息。

不仅如此,NBA 球场遍布美国和多伦多。为了平衡赛程,他们有一半的比赛要在客场进行,球队必须像乘地铁一样往返于两地之间。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所有 29 个 NBA 球场都在一张地图上

事实上,NBA 球队每年的行程大约在 60,000 到 85,000 公里(37,000-53,000 英里/年)之间,他们的飞行总的来说是这样的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所有 30 支 NBA 球队的旅行日程-可视化

(我关于可视化旅行数据的文章,以及一个交互式的 html 版本的地图)

所有这一切的结果是,旅行,比赛和休息的场地是 NBA 日程的重要组成部分。

82 场比赛中,每支球队有一半在主场进行,另一半在客场进行。甚至许多主场比赛也不总是需要休息——可能需要旅行一夜才能回来,他们甚至可能为了下一场比赛而马上离开。

对于我们这些不得不乘坐商业航班的凡人来说,这将是一场噩梦。然而,现代 NBA 球员乘坐私人团队飞机,他们的健康和福祉管理得如此之好,以至于旅行不会对他们产生重大影响。让我们找出答案。

加载/获取数据

在我们分析休息、比赛和主场优势的影响之前,我们需要收集或加载我们的数据。为了方便起见,我用上一季的,但是(你也可以用这一季的,或者几季的。

虽然您可以简单地加载我已经预处理过的数据(如果您愿意,可以跳到我加载box_df的地方),但是如果您感兴趣的话——我是这样编译数据的:

我从basketball-reference.com获得了时间表数据,你可以简单地从我的回购中加载如下数据:

schedule_df = pd.read_csv('srcdata/2019_nba_schedule.csv', index_col=0)

该数据包括 EST ( est_time)中的游戏提示时间,因此我创建了一个 date 列。

schedule_df = schedule_df.assign(game_date=schedule_df.est_time.dt.date)

然后,game_dates = schedule_df.game_date.unique()获得一个独特的比赛日期列表,之后用basketball_reference_web_scraper包下载我们每个日期的数据。如果你想尝试这段代码,你需要用pip来安装它。

我在这里做的是下载数据,将每场比赛标记为主场比赛或客场比赛,并保存数据帧。

无论如何,让我们加载一个我之前为保持一致性而准备的文件:

box_df = pd.read_csv('srcdata/2019_nba_team_box_scores.csv', index_col=0)

看一下box_df,你会看到它包含 2460 行,与 30 支球队的 82 场比赛相匹配,因为每一行都显示一支球队的盒子分数。

简单的故障

我在这里处理了数据,以包括布尔列,表示球队是否在home比赛,他们是否有travelled,以及他们是否赢了(win)。我还为休息日的数量创建了一个分类变量(rest_cats),任何超过 2 天的都被归在一起,包括开幕日。

对于我们的第一次可视化,让我们看看有多少游戏属于休息日和旅行的每一个类别。我会跳过主客场平分,这是 50:50。

import plotly.express as px

# How many games in each category?
temp_grp_df = box_df.groupby('rest_cats').count().reset_index(drop=False)

fig = px.bar(temp_grp_df, y='rest_cats', x='outcome', orientation='h')
fig.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2018-19 赛季,按休息日

# How many games in each category? Rest days & travel.
temp_grp_df = box_df.groupby(['rest_cats', 'travelled']).count().reset_index(drop=False)
temp_grp_df = temp_grp_df.assign(travelled=temp_grp_df.travelled.astype(str))
fig = px.bar(temp_grp_df, y='rest_cats', x='outcome', orientation='h', color='travelled', barmode='group')
fig.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2018-19 赛季,按休息日&是否涉及旅行

这很简单,分类变量在这里可以简洁地表示为成组的条形。

至于产出,有几个观察要做 NBA 的时间表是这样的,大多数比赛有 1 天的休息,没有多少背靠背(0 天休息)的比赛。

即使有,也似乎主要是主场比赛(因为不涉及旅行),这对球队来说是好事。

对成功百分比的总体影响

现在,让我们来看看休息和旅行对胜利的影响。这样做的代码与前面的基本相同,除了现在为每个组创建一个WIN%列,它成为我们的因变量。

travel_cats = ['rest_cats', 'travelled']
travel_grp_df = box_df.groupby(travel_cats).sum()
travel_grp_df = travel_grp_df.assign(games=box_df.groupby(travel_cats)['minutes_played'].count())
travel_grp_df['WIN%'] = travel_grp_df.win/travel_grp_df.games * 100
travel_grp_df.reset_index(drop=False, inplace=True)
travel_grp_df = travel_grp_df.assign(travelled=travel_grp_df.travelled.astype(str))fig = px.bar(travel_grp_df, y='rest_cats', x='WIN%', orientation='h', color='travelled', barmode='group')
fig.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

趋势正如所料——旅行不利于获胜,多休息更好。但是,有趣的是——旅行过的队伍(红色)在休息 2 天以上的情况下赢得了几乎一半的比赛!

现在,增加这些图表的复杂性是分析开始变得具有挑战性的地方。

我们有三个分类变量,我们试图分析,我们需要选择如何可视化它们,同时也表明因变量(例如,win %)。对于条形图,一种选择是使用上面提到的支线剧情:

travel_cats = ['home', 'rest_cats', 'travelled']
...
fig = px.bar(travel_grp_df, y='rest_cats', x='WIN%', facet_col='home', orientation='h', color='travelled', barmode='group')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作为支线剧情

这很好,但是它仍然缺少相当多对我们有用的信息。例如,它没有向我们展示这些分类变量是如何重叠或相互作用的。此外,支线剧情并不容易沿着轴线进行比较。

相反,让我们探索一个平行的类别图表。

平行类别图

创造

因为它们有些不寻常,所以让我们画一个,然后讨论它们包含的内容。幸运的是,用 Plotly 绘制平行分类图相对容易。事实上,Plotly Express 只是将原始的 box score 数据帧作为参数,并根据我们传递的类别来编译数据。

看看这个简单的例子,用二进制类别表示hometravelled

# PARALLEL CATEGORIES - THREE CATEGORIES AND WIN %
box_df = box_df.assign(win_num=box_df.win.astype(int))
travel_cats = ['home', 'travelled']
fig = px.parallel_categories(box_df, dimensions=travel_cats, color='win_num')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

平行类别图—显示“家庭”和“旅行”

你可能以前没有见过很多平行分类图表。它们看起来很复杂,但是一旦你掌握了窍门,它们就非常简单。

每个垂直柱代表一个类别,每个带显示了沿着每个柱的分类变量的排列。上面的图表代表两个分类变量,我也根据结果(赢或输)将它们分开,代表三个变量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

平行类别图—显示“家庭”和“旅行”

在这里,它显示有 329 场比赛(乐队)球队在主场(左栏),在比赛前旅行(右栏),并取得胜利(彩色)。

图表的本质是,每增加一个类别都会增加图表的复杂性,潜在地呈指数增长。看看下面的图表,增加了休息日长度的类别。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

平行类别图—显示“家”、“旅行”和“休息 _ 猫”变量。

下面的示例显示了两条高亮显示的路径。

最上面的深色路径显示了球队在客场(home==false)、前往比赛(travel==true)以及休息 2 天或更长时间(rest_cats == 2+ Days)的比赛失败的次数。

下方的黄色路径显示了相同标准的比赛数量,但是球队赢得了比赛。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

平行类别图—显示鼠标悬停弹出窗口

(这里有一个互动版的这个给你试试&玩一玩。)

一旦我们习惯了这种格式,通过平行类别图表探索多维分类关系会令人耳目一新。在这里,每一个竖线显示了总的胜率,简单地跟随粗线揭示了强共现的位置。

举例来说,让我们来看看球队没有休息,并且旅行的比赛。这张截图突出显示了在客场比赛的球队的记录。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

团队记录—出门在外,没有休息日

已经很清楚的是,损失远远大于收益。客队在这些比赛中只赢了大约 32%(总共 237 场)。

另一方面,反过来说,一个主场球队在无休日赢得了 83 场比赛中的 69%(我将把它作为一个练习——你自己看看这里)。

我发现平行分类图非常有用,尤其是对于数据探索。例如,我发现这张图表非常有用,视觉效果也很突出(我为本文准备了这张图表)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我早些时候创建的一个——通过区域和助攻显示克莱的投篮(灰色:无帮助)

这张图表显示了克莱·汤普森的所有射门,按照射门位置,以及助攻来自谁。虽然最初看起来很复杂,但看看找出类别的主要组合是多么容易。如图所示,平行分类图可以很容易地发现趋势和共现。

诚然,虽然平行类别图表在某些情况下很有用,但它也有其局限性。根据我的经验,它可能需要读者做一些工作来理解正在发生的事情,并且对许多人来说,它可能是视觉上的对抗和恐吓。

另一个很好的、可能更简单的可视化这类数据的方法是树形图。

树状图

树形图是探索分级、分类数据集的一种奇妙方式。看一看这个例子,就知道它有多容易理解了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一个树形图的例子( Plotly )

尽管树形图通常用于评估分层数据结构的影响,但它也是一个很好的工具,适用于像这样的多变量情况。

我们可以在这里生成树形图,方便地显示每个组的大小,以及随着我们越来越深入地研究每个类别,胜率的变化。

因为树状图需要层次结构,所以我们在这里通过绘制两种不同的树状图来探索:

首先,层级基于回家/离开旅行/不旅行休息日

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

树状图 1:回家->旅行->休息

在第二种情况下,层级被更改为基于回家/离开休息日出差/未出差

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

树状图 2:回家->休息->旅行

树形图布局很好地显示了每个子集样本大小的差异,以及颜色百分比的变化。

在这两个图中,很明显,对胜率的更大影响通常来自于休息的时间,以及仅仅是在家还是在外,而不是来自于他们是否旅行。

看看上面的图表,在第二层的方框中(标有“旅行/停留”),是主场比赛。主队在比赛前回家(即旅行)的比赛的总赢/输百分比与他们没有旅行的比赛非常相似。

在第二张图中,所有盒子在休息日的总体胜率有很大不同,例如休息日为 0 的客场比赛是最差的(正如我们前面在平行类别图中看到的)。

让我们再探讨一点,结束今天的分析。到目前为止,我们是从一个球队的角度来看这些数据的(除了主客场数据,这是一个补充)。如果对手的休息数据也是会怎么样?

出于这个原因,我得到了另一个数据集——对手的休息日被添加到opp_rest_cats列中。

box_df = pd.read_csv('srcdata/2019_nba_team_box_scores_2.csv', index_col=0)travel_cats = ['home', 'rest_cats', 'opp_rest_cats']
travel_grp_df = box_df.groupby(travel_cats).sum()
travel_grp_df = travel_grp_df.assign(games=box_df.groupby(travel_cats)['minutes_played'].count())
travel_grp_df.reset_index(drop=False, inplace=True)

chart_cats = ['home_str', 'rest_cats', 'opp_rest_cats']
home_away = pd.Series(['Home ' * i for i in travel_grp_df.home.values]) + pd.Series(['Away ' * (1-i) for i in travel_grp_df.home.values])
travel_grp_df['home_str'] = home_away
travel_grp_df['rest_cats'] = travel_grp_df['rest_cats'] + "' Rest"
travel_grp_df['opp_rest_cats'] = 'Opponent: <BR>' + travel_grp_df['opp_rest_cats'] + "'<BR>Rest"
travel_grp_df['WIN%'] = travel_grp_df.win/travel_grp_df.games * 100

fig = px.treemap(
    travel_grp_df, path=['home_str', 'rest_cats', 'opp_rest_cats'], values='games', color='WIN%', color_continuous_midpoint=50, color_continuous_scale=px.colors.diverging.Portland
)
fig.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

树状图 3:主场->休息->对手休息

看那个!最佳和最差的赢/输百分比发生在其余差异最大的时候。

看看左边的“客场”统计,我们的球队休息 0 天,对手休息 2 天以上,相反,我们的球队休息 2 天以上,对手休息 0 天。他们代表了极端的对立面。这种模式一直存在,休息的差异是获胜几率的一个重要因素。

即使主队背靠背,他们平均也能击败其他背靠背的球队,显示了家常菜的价值。最中立的安排似乎是让主队背靠背,而客队长时间休息。

那不是很有趣吗!?事实证明,旅行是一个相对较小的因素,赢/输百分比的最大因素是休息差和主场/客场。通过这些树形图很容易发现这一点。

总而言之,我希望以上展示了一些有用的例子和技术,用于钻取包含多个分类变量的数据集。

在我看来,平行分类图和树形图是这样做的有用工具,也是潜在未被充分利用的工具。

当数据被细分时,树形图在可视化数据方面是有效的,在属性的向下钻取和变化方面,而平行类别图在识别数据点的同现和流动方面是极好的。用你自己的数据集来尝试这些,我很乐意听到更多关于它们的信息。

如果你喜欢这个,请说👋/关注 twitter ,或点击此处获取更新。我还写了这篇关于使用 Plotly 绘制 NBA 旅行数据的文章,如果你以前没有读过的话:

[## 交互式和动画旅行数据可视化—绘制 NBA 旅行地图

了解如何使用 Python 和 Plotly 创建位置和路径数据的精彩互动和动画可视化。

medium.com](https://medium.com/swlh/interactive-animated-travel-data-visualizations-mapping-nba-travel-a154a2e7c18d)

还有这篇关于我最喜欢的数据可视化书籍的文章。

[## 用这些书创建有影响力的数据可视化

如果没有交流,好的分析没有什么意义。数据可视化会有所帮助。以下是我对…的建议

towardsdatascience.com](/create-impactful-data-visualizations-with-these-books-ca9fbfecfde5)

谢谢,下次再见!

智慧消防安全与应急管理是现代城市安全管理的重要组成部分,随着城市化进程的加速,传统消防安全管理面临着诸多挑战,如消防安全责任制度落实不到位、消防设施日常管理不足、消防警力不足等。这些问题不仅制约了消防安全管理水平的提升,也给城市的安全运行带来了潜在风险。然而,物联网和智慧城市技术的快速发展为解决这些问题提供了新的思路和方法。智慧消防作为物联网和智慧城市技术结合的创新产物,正在成为社会消防安全管理的新趋势。 智慧消防的核心在于通过技术创新实现消防安全管理的智能化和自动化。其主要应用包括物联网消防安全监管平台、城市消防远程监控系统、智慧消防平台等,这些系统利用先进的技术手段,如GPS、GSM、GIS等,实现了对消防设施的实时监控、智能巡检和精准定位。例如,单兵定位方案通过信标点定位和微惯导加蓝牙辅助定位技术,能够精确掌握消防人员的位置信息,从而提高救援效率和安全性。智慧消防不仅提升了消防设施的管理质量,还优化了社会消防安全管理资源的配置,降低了管理成本。此外,智慧消防的应用还弥补了传统消防安全管理中数据处理方式落后、值班制度执行不彻底等问题,赋予了建筑消防设施智能化、自动化的能力。 尽管智慧消防技术在社会消防安全管理工作中的应用已经展现出巨大的潜力和优势,但目前仍处于实践探索阶段。相关职能部门和研究企业需要加大研究开发力度,进一步完善系统的功能与实效性。智慧消防的发展既面临风险,也充满机遇。当前,社会消防安全管理工作中仍存在制度执行不彻底、消防设施日常维护不到位等问题,而智慧消防理念与技术的应用可以有效弥补这些弊端,提高消防安全管理的自动化与智能化水平。随着智慧城市理念的不断发展和实践,智慧消防将成为推动社会消防安全管理工作与城市化进程同步发展的关键力量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值