數(shù)據(jù)科學中的常見的6種概率分布(Python實現(xiàn))
介紹
擁有良好的統(tǒng)計背景對于數(shù)據(jù)科學家的日常工作可能會大有裨益。每次我們開始探索新的數(shù)據(jù)集時,我們首先需要進行探索性數(shù)據(jù)分析(EDA),以了解某些特征的概率分布是什么。如果我們能夠了解數(shù)據(jù)分布中是否存在特定模式,則可以量身定制最適合我們的機器學習模型。這樣,我們將能夠在更短的時間內獲得更好的結果(減少優(yōu)化步驟)。實際上,某些機器學習模型被設計為在某些分布假設下效果最佳。因此,了解我們正在使用哪個概率分布可以幫助我們確定最適合使用哪些模型。
不同類型的數(shù)據(jù)
每次我們使用數(shù)據(jù)集時,我們的數(shù)據(jù)集都會代表總體的樣本。然后使用這個樣本,我們可以嘗試了解其概率分布,以便我們可以使用它對總體進行預測。
假設我們要根據(jù)一組數(shù)據(jù)來預測房屋的價格,我們可以找到一個包含舊金山所有房價的數(shù)據(jù)集(我們的樣本),進行一些統(tǒng)計分析之后,我們就可以對美國其他任何城市的房價做出相當準確的預測(我們的總體)。
數(shù)據(jù)集由兩種主要類型的數(shù)據(jù)組成:數(shù)值(例如整數(shù),浮點數(shù))和標簽(例如名字,電腦品牌)。
數(shù)值數(shù)據(jù)還可以分為其他兩類:離散和繼續(xù)。離散數(shù)據(jù)只能采用某些值(例如,學校中的學生人數(shù)),而連續(xù)數(shù)據(jù)可以采用任何實際或分數(shù)值(例如,身高和體重的概念)。
從離散隨機變量中,可以計算出概率質量函數(shù),而從連續(xù)隨機變量中,可以得出概率密度函數(shù)。
概率質量函數(shù)給出了變量可以等于某個值的概率,概率密度函數(shù)的值本身并不是概率,需要在給定范圍內進行積分。
自然界中存在許多不同的概率分布,在本文中,我將向大家介紹數(shù)據(jù)科學中最常用的概率分布。

在本文中,我將提供有關如何創(chuàng)建每個不同概率分布的代碼。首先,讓我們導入所有必要的庫:
- import pandas as pd
- import numpy as np
- import matplotlib.pyplot as plt
- import scipy.stats as stats
- import seaborn as sns
伯努利分布
伯努利分布是最容易理解的分布之一,可用作導出更復雜分布的起點。這種分布只有兩個可能的結果,一個簡單的例子就是拋擲偏斜/無偏硬幣。在此示例中,可以認為結果可能是正面的概率等于p,而對于反面則是(1-p)(包含所有可能結果的互斥事件的概率總和為1)。
- probs = np.array([0.75, 0.25])
- face = [0, 1]
- plt.bar(face, probs)
- plt.title('Loaded coin Bernoulli Distribution', fontsize=12)
- plt.ylabel('Probability', fontsize=12)
- plt.xlabel('Loaded coin Outcome', fontsize=12)
- axes = plt.gca()
- axes.set_ylim([0,1])

均勻分布
均勻分布可以很容易地從伯努利分布中得出。在這種情況下,結果的數(shù)量可能不受限制,并且所有事件的發(fā)生概率均相同。例如擲骰子,存在多個可能的事件,每個事件都有相同的發(fā)生概率。
- probs = np.full((6), 1/6)
- face = [1,2,3,4,5,6]
- plt.bar(face, probs)
- plt.ylabel('Probability', fontsize=12)
- plt.xlabel('Dice Roll Outcome', fontsize=12)
- plt.title('Fair Dice Uniform Distribution', fontsize=12)
- axes = plt.gca()
- axes.set_ylim([0,1])

二項分布
二項分布被認為是遵循伯努利分布的事件結果的總和。因此,二項分布用于二元結果事件,并且所有后續(xù)試驗中成功和失敗的概率均相同。此分布采用兩個參數(shù)作為輸入:事件發(fā)生的次數(shù)和試驗成功與否的概率。二項式分布最簡單的示例就是將有偏/無偏硬幣拋擲一定次數(shù)。
大家可以觀察一下不同概率情況下二項分布的圖形:
- # pmf(random_variable, number_of_trials, probability)
- for prob in range(3, 10, 3):
- x = np.arange(0, 25)
- binom = stats.binom.pmf(x, 20, 0.1*prob)
- plt.plot(x, binom, '-o', label="p = {:f}".format(0.1*prob))
- plt.xlabel('Random Variable', fontsize=12)
- plt.ylabel('Probability', fontsize=12)
- plt.title("Binomial Distribution varying p")
- plt.legend()

二項式分布的主要特征是:
- 給定多個試驗,每個試驗彼此獨立(一項試驗的結果不會影響另一項試驗)。
- 每個試驗只能得出兩個可能的結果(例如,獲勝或失敗),其概率分別為p和(1- p)。
如果獲得成功概率(p)和試驗次數(shù)(n),則可以使用以下公式計算這n次試驗中的成功概率(x)。

正態(tài)(高斯)分布
正態(tài)(高斯)分布是數(shù)據(jù)科學中最常用的分布之一。
我們日常生活中發(fā)生的許多常見現(xiàn)象都遵循正態(tài)分布,例如:經(jīng)濟中的收入分布,學生的平均報告數(shù)量,平均身高等。此外,中心極限定理說明,在適當?shù)臈l件下,大量相互獨立隨機變量的均值經(jīng)適當標準化后依分布收斂于正態(tài)分布。
- n = np.arange(-50, 50)
- mean = 0
- normal = stats.norm.pdf(n, mean, 10)
- plt.plot(n, normal)
- plt.xlabel('Distribution', fontsize=12)
- plt.ylabel('Probability', fontsize=12)
- plt.title("Normal Distribution")

可以看出正態(tài)分布的特征:
- 曲線在中心對稱。 因此,均值,眾數(shù)和中位數(shù)都相等,從而使所有值圍繞均值對稱分布。
- 分布曲線下的面積等于1(所有概率之和必須等于1)
可以使用以下公式得出正態(tài)分布

使用正態(tài)分布時,均值和標準差起著非常重要的作用。如果我們知道它們的值,通過概率分布即可輕松找出預測精確值的概率。根據(jù)正態(tài)分布的特性,68%的數(shù)據(jù)位于均值的一個標準差范圍內,95%的數(shù)據(jù)位于均值的兩個標準差范圍內,99.7%的數(shù)據(jù)位于均值的三個標準差范圍內。

許多機器學習模型被設計為遵循正態(tài)分布有最佳效果。以下是一些示例:
- 高斯樸素貝葉斯分類器
- 線性判別分析
- 二次判別分析
- 基于最小二乘的回歸模型
在某些情況下可以通過對數(shù)和平方根等變換將非正態(tài)數(shù)據(jù)轉換為正態(tài)形式。
泊松分布
泊松分布通常用于查找事件可能發(fā)生或不發(fā)生的頻率,還可用于預測事件在給定時間段內可能發(fā)生多少次。
例如,保險公司經(jīng)常使用泊松分布來進行風險分析(預測在預定時間段內發(fā)生的車禍事故數(shù)),以決定汽車保險的定價。
當使用泊松分布時,我們可以確信發(fā)生不同事件之間的平均時間,但是事件發(fā)生的確切時刻在時間上是隨機間隔的。
泊松分布可以使用以下公式建模,其中λ表示單位時間(或單位面積)內隨機事件的平均發(fā)生率。

泊松分布的主要特征是:
- 事件彼此獨立
- 一個事件可以發(fā)生任何次數(shù)(在定義的時間段內)
- 兩個事件不能同時發(fā)生
- 事件發(fā)生之間的平均發(fā)生率是恒定的。
下圖顯示了改變λ的值是如何影響泊松分布的:
- for lambd in range(2, 8, 2):
- n = np.arange(0, 10)
- poisson = stats.poisson.pmf(n, lambd)
- plt.plot(n, poisson, '-o', label="λ = {:f}".format(lambd))
- plt.xlabel('Number of Events', fontsize=12)
- plt.ylabel('Probability', fontsize=12)
- plt.title("Poisson Distribution varying λ")
- plt.legend()

指數(shù)分布
指數(shù)分布用于對不同事件之間的時間進行建模。
舉例來說,假設我們在一家餐廳工作,并且希望預測不同顧客來就餐的時間間隔。針對此類問題使用指數(shù)分布一個理想的起點。指數(shù)分布的另一個常見應用是生存分析(例如設備/機器的預期壽命)。
指數(shù)分布由參數(shù)λ調節(jié)。λ值越大,曲線的斜率變化越快。
- for lambd in range(1,10, 3):
- x = np.arange(0, 15, 0.1)
- y = 0.1*lambd*np.exp(-0.1*lambd*x)
- plt.plot(x,y, label="λ = {:f}".format(0.1*lambd))
- plt.xlabel('Random Variable', fontsize=12)
- plt.ylabel('Probability', fontsize=12)
- plt.title("Exponential Distribution varying λ")
- plt.legend()

指數(shù)分布使用以下公式建模
