Hồi quy và dự báo

Phân tích dữ liệu Bayesian với Python

Michal Oleszak

Machine Learning Engineer

Hồi quy tuyến tính

$$y = \beta_0 + \beta_1x_1 + \beta_2x_2 + ...$$

$$\text{sales} = \beta_0 + \beta_1\text{marketingSpending}$$

 

  • Suy diễn tần suất:

    • $\text{sales} = \beta_0 + \beta_1\text{marketingSpending} + \varepsilon$

    • $\varepsilon \sim \mathcal{N} (0, \sigma)$

 

  • Suy diễn Bayes:

    • $\text{sales} \sim \mathcal{N} (\beta_0 + \beta_1\text{marketingSpending}, \sigma)$
Phân tích dữ liệu Bayesian với Python

Phân phối chuẩn

normal_0_1 = np.random.normal(0, 1, size=10000)




sns.kdeplot(normal_0_1, shade=True, label="N(0,1)") plt.show()

Mật độ phân phối chuẩn chuẩn hóa, đỉnh tại 0 và đối xứng quanh 0.

Phân tích dữ liệu Bayesian với Python

Phân phối chuẩn

normal_0_1 = np.random.normal(0, 1, size=10000)
normal_3_1 = np.random.normal(3, 1, size=10000)


sns.kdeplot(normal_0_1, shade=True, label="N(0,1)")
sns.kdeplot(normal_3_1, shade=True, label="N(3,1)")


plt.show()

Mật độ phân phối chuẩn, đỉnh tại 3 và đối xứng quanh đó.

Phân tích dữ liệu Bayesian với Python

Phân phối chuẩn

normal_0_1 = np.random.normal(0, 1, size=10000)
normal_3_1 = np.random.normal(3, 1, size=10000)
normal_0_3 = np.random.normal(0, 3, size=10000)

sns.kdeplot(normal_0_1, shade=True, label="N(0,1)")
sns.kdeplot(normal_3_1, shade=True, label="N(3,1)")
sns.kdeplot(normal_0_3, shade=True, label="N(0,3)")

plt.show()

Mật độ phân phối chuẩn chuẩn hóa, đỉnh tại 0 và đối xứng quanh 0.

Phân tích dữ liệu Bayesian với Python

Định nghĩa mô hình hồi quy Bayes

$$\text{sales} \sim \mathcal{N} (\beta_0 + \beta_1\text{marketingSpending}, \sigma)$$

$$\beta_0 \sim \mathcal{N} (5, 2)$$

$$\beta_1 \sim \mathcal{N} (2, 10)$$

$$\sigma \sim \mathcal{Unif} (0, 3)$$

 

  • Kỳ vọng 5000 doanh số khi không chi marketing.
  • Kỳ vọng tăng 2000 doanh số cho mỗi 1000 chi thêm.
  • Tiên nghiệm đều cho độ lệch chuẩn, vì chưa biết giá trị.
Phân tích dữ liệu Bayesian với Python

Ước lượng tham số hồi quy

  • Xấp xỉ lưới → không khả thi khi nhiều tham số
  • Chọn tiên nghiệm liên hợp và mô phỏng từ hậu nghiệm đã biết → tiên nghiệm thiếu trực quan
  • Cách 3: mô phỏng từ hậu nghiệm ngay cả khi không liên hợp!
  • Tạm giả định đã có các mẫu tham số
Phân tích dữ liệu Bayesian với Python

Vẽ hậu nghiệm

$$\text{sales} = \beta_0 + \beta_1\text{marketingSpending}$$

print(marketing_spending_draws)
array([9.6153, 8.9922, ..., 4.59565])
import pymc3 as pm

pm.plot_posterior(
  marketing_spending_draws, 
  hdi_prob=0.95
)

Biểu đồ mật độ với trung bình và khoảng tin cậy có đánh dấu.

Phân tích dữ liệu Bayesian với Python

Phân tích mẫu hậu nghiệm

posterior_draws_df = pd.DataFrame({
    "intercept_draws": intercept_draws,
    "marketing_spending_draws": marketing_spending_draws,
    "sd_draws": sd_draws
})

print(posterior_draws_df)
       intercept_draws  marketing_spending_draws      sd_draws
count     10000.000000              10000.000000  10000.000000
mean          2.972130                  5.999146      1.337621
std           3.008565                  2.020708      0.471723
min          -8.562093                 -2.842438      0.029643
25%           0.972832                  4.621807      1.003229
50%           3.002940                  5.975067      1.427617
75%           5.020615                  7.362572      1.736310
max          15.228549                 13.258955      1.999834
Phân tích dữ liệu Bayesian với Python

Phân phối dự báo

Kỳ vọng doanh số bao nhiêu nếu chi $1000 cho marketing?

$\text{sales} \sim \mathcal{N} (\beta_0 + \beta_1\text{marketingSpending}, \sigma)$

# Lấy ước lượng điểm của tham số
intercept_mean = intercept_draws.mean()
marketing_spending_mean = marketing_spending_draws.mean()
sd_mean = sd_draws.mean()


# Tính trung bình của phân phối dự báo predictive_mean = intercept_mean + marketing_spending_mean * 1000
# Mô phỏng từ phân phối dự báo prediction_draws = np.random.normal(predictive_mean, sd_mean, size=10000)
Phân tích dữ liệu Bayesian với Python

Phân phối dự báo

Kỳ vọng doanh số bao nhiêu nếu chi $1000 cho marketing?

Mật độ chuông của doanh số dự báo, đỉnh khoảng 5986.

Phân tích dữ liệu Bayesian với Python

Hồi quy và dự báo!

Phân tích dữ liệu Bayesian với Python

Preparing Video For Download...