[ad_1]
Chào mừng bạn đến với loạt bài của tôi về Causal AI, nơi chúng ta sẽ khám phá sự tích hợp của lý luận nhân quả vào các mô hình học máy. Mong đợi khám phá một số ứng dụng thực tế trong các bối cảnh kinh doanh khác nhau.
Trong bài viết trước chúng tôi đã đề cập nâng cao mô hình hỗn hợp tiếp thị với Causal AI. Trong bài viết này chúng ta sẽ chuyển sang bảo vệ dự báo nhu cầu bằng biểu đồ nhân quả.
Nếu bạn bỏ lỡ bài viết cuối cùng về mô hình advertising combine, hãy xem thử tại đây:
Trong bài viết này, chúng tôi sẽ đi sâu vào cách bạn có thể bảo vệ dự báo nhu cầu (hoặc thành thật mà nói là bất kỳ trường hợp sử dụng dự báo nào) bằng biểu đồ nhân quả.
Các lĩnh vực sau đây sẽ được khám phá:
- Dự báo nhanh 101.
- Dự báo nhu cầu là gì?
- Ôn lại kiến thức về biểu đồ nhân quả.
- Làm thế nào đồ thị nhân quả có thể bảo vệ dự báo nhu cầu?
- Một nghiên cứu điển hình về Python minh họa cách biểu đồ nhân quả có thể bảo vệ dự báo của bạn khỏi các mối tương quan giả.
Sổ ghi chép đầy đủ có thể được tìm thấy ở đây:
Dự báo 101
Dự báo chuỗi thời gian liên quan đến việc dự đoán các giá trị tương lai dựa trên các quan sát lịch sử.
Để bắt đầu, có một số thuật ngữ mà bạn cần làm quen:
- Tự tương quan — Sự tương quan của một chuỗi với các giá trị trước đó của nó ở các độ trễ thời gian khác nhau. Giúp xác định xem có xu hướng hiện tại hay không.
- Đứng im — Đây là khi các đặc tính thống kê của một chuỗi không đổi theo thời gian (ví dụ: giá trị trung bình, phương sai). Một số phương pháp dự báo giả định tính dừng.
- Khác biệt — Đây là khi chúng ta trừ quan sát trước đó khỏi quan sát hiện tại để biến đổi một chuỗi không dừng thành chuỗi dừng. Một bước quan trọng đối với các mô hình giả định tính dừng.
- Tính thời vụ — Một chu kỳ lặp lại đều đặn xảy ra ở một khoảng thời gian cố định (ví dụ hàng ngày, hàng tuần, hàng năm).
- Xu hướng — Sự chuyển động dài hạn theo chuỗi.
- Lỗi – Số bước thời gian giữa một quan sát và một giá trị trước đó.
- dư lượng – Sự khác biệt giữa giá trị dự đoán và giá trị thực tế.
- Đường trung bình động — Được sử dụng để làm phẳng những biến động ngắn hạn bằng cách tính trung bình một số lượng cố định các quan sát trong quá khứ.
- Làm mịn theo hàm mũ — Trọng số được áp dụng cho các quan sát trong quá khứ, nhấn mạnh hơn vào các giá trị gần đây.
- phân hủy theo mùa — Đây là lúc chúng ta tách một chuỗi thời gian thành các thành phần theo mùa, theo xu hướng và theo dư thừa.
Có một số phương pháp khác nhau có thể được sử dụng để dự báo:
- ETS (Lỗi, Xu hướng, Theo mùa) — Một phương pháp làm mịn theo hàm mũ mô hình hóa các thành phần lỗi, xu hướng và tính theo mùa.
- Mô hình hồi quy tự động (mô hình AR) — Mô hình hóa giá trị hiện tại của chuỗi dưới dạng tổ hợp tuyến tính của các giá trị trước đó.
- Mô hình trung bình động (mô hình MA) — Mô hình hóa giá trị hiện tại của chuỗi dưới dạng kết hợp tuyến tính của các lỗi dự báo trong quá khứ.
- Đường trung bình động tích hợp tự hồi quy (mô hình ARIMA) — Kết hợp các mô hình AR và MA với việc sử dụng phép tính vi phân để làm cho chuỗi dữ liệu trở nên dừng.
- Mô hình không gian trạng thái — Phân tích chuỗi thời gian thành các thành phần riêng lẻ như xu hướng và tính thời vụ.
- Mô hình phân cấp — Một phương pháp xử lý dữ liệu được cấu trúc theo thứ bậc như vùng.
- Hồi quy tuyến tính — Sử dụng một hoặc nhiều biến (đặc điểm) độc lập để dự đoán biến phụ thuộc (mục tiêu).
- Học máy (ML) — Sử dụng các thuật toán linh hoạt hơn như tăng cường để nắm bắt các mối quan hệ phức tạp.
Nếu bạn muốn tìm hiểu sâu hơn về chủ đề này, tôi thực sự khuyên bạn nên sử dụng nguồn tài nguyên sau đây, vốn được biết đến là hướng dẫn hữu ích về dự báo (phiên bản bên dưới miễn phí 😀):
Về việc áp dụng một số mô hình dự báo bằng Python, tôi khuyên bạn nên khám phá Nixtla, nơi có danh sách mô hình được triển khai rộng rãi và API dễ sử dụng:
Dự báo nhu cầu
Dự đoán nhu cầu về sản phẩm của bạn là rất quan trọng.
- Nó có thể giúp quản lý hàng tồn kho của bạn, tránh tình trạng thừa hoặc thiếu hàng.
- Nó có thể khiến khách hàng của bạn hài lòng, đảm bảo sản phẩm luôn có sẵn khi họ muốn.
- Giảm chi phí lưu kho và giảm thiểu chất thải mang lại hiệu quả về mặt chi phí.
- Cần thiết cho việc hoạch định chiến lược.
Việc duy trì dự báo nhu cầu chính xác là điều cần thiết — Ở phần tiếp theo, chúng ta hãy bắt đầu suy nghĩ về cách biểu đồ nhân quả có thể bảo vệ dự báo của chúng ta…
Ôn tập lại biểu đồ nhân quả
Tôi đã đề cập đến biểu đồ nhân quả một vài lần trong loạt bài của mình, nhưng trong trường hợp bạn cần xem lại, hãy xem bài viết đầu tiên của tôi, nơi tôi trình bày chi tiết về nó:
Biểu đồ nhân quả có thể bảo vệ dự báo nhu cầu như thế nào?
Lấy biểu đồ bên dưới làm ví dụ, giả sử chúng ta muốn dự báo biến mục tiêu của mình. Chúng tôi thấy rằng chúng tôi có 3 biến tương quan với nó, vì vậy chúng tôi sử dụng chúng làm đặc điểm. Tại sao việc bao gồm cả mối tương quan giả lại là một vấn đề? Chúng tôi càng đưa vào nhiều tính năng thì dự báo của chúng tôi càng chính xác hơn phải không?
Ừm, không thực sự….
Khi nói đến dự báo nhu cầu, một trong những vấn đề chính là sự trôi dạt dữ liệu. Bản thân sự trôi dạt dữ liệu không phải là vấn đề nếu mối quan hệ giữa đặc điểm quan tâm và mục tiêu vẫn không đổi. Nhưng khi mối quan hệ không đổi, độ chính xác dự báo của chúng ta sẽ giảm sút.
Nhưng đồ thị nhân quả sẽ giúp chúng ta như thế nào… Ý tưởng là các mối tương quan giả có nhiều khả năng bị lệch hơn và có nhiều khả năng gây ra vấn đề hơn khi chúng xảy ra.
Bạn vẫn chưa tin ư? Được rồi, đã đến lúc bắt đầu nghiên cứu tình huống rồi!
Lý lịch
Bạn của bạn đã mua một chiếc xe bán kem. Họ đã trả cho một nhà tư vấn rất nhiều tiền để xây dựng cho họ một mô hình dự báo nhu cầu. Nó hoạt động rất tốt trong vài tháng đầu, nhưng trong vài tháng gần đây, bạn của bạn đã thiếu kem! Họ nhớ rằng chức danh công việc của bạn là “dữ liệu cái gì đó hoặc cái khác” và tìm đến bạn để xin lời khuyên.
Tạo dữ liệu nghiên cứu trường hợp
Tôi xin bắt đầu bằng cách giải thích cách tôi tạo dữ liệu cho nghiên cứu tình huống này. Tôi đã tạo một biểu đồ nhân quả đơn giản với các đặc điểm sau:
- Doanh số bán kem là nút mục tiêu (X0)
- Du lịch ven biển là nguyên nhân trực tiếp thúc đẩy doanh số bán kem (X1)
- Nhiệt độ là nguyên nhân gián tiếp gây ra doanh số bán kem (X2)
- Cá mập tấn công là mối tương quan giả (X3)
Sau đó tôi sử dụng quy trình tạo dữ liệu sau:
Bạn có thể thấy rằng mỗi nút bị ảnh hưởng bởi các giá trị trong quá khứ của chính nó và thuật ngữ nhiễu cũng như nút cha trực tiếp của nó. Để tạo dữ liệu, tôi sử dụng một mô-đun tiện dụng từ gói python phân tích nguyên nhân chuỗi thời gian Tigramite:
Tigramite là một gói tuyệt vời nhưng tôi sẽ không đề cập chi tiết về nó lần này vì nó xứng đáng có một bài viết riêng! Dưới đây chúng tôi sử dụng mô-đun structures_causal_process theo quy trình tạo dữ liệu ở trên:
seed=42
np.random.seed(seed)# create node lookup for channels
node_lookup = {0: 'ice cream gross sales',
1: 'coastal visits',
2: 'temperature',
3: 'shark assaults',
}
# information producing course of
def lin_f(x):
return x
links_coeffs = {0: (((0, -1), 0.2, lin_f), ((1, -1), 0.9, lin_f)),
1: (((1, -1), 0.5, lin_f), ((2, -1), 1.2, lin_f)),
2: (((2, -1), 0.7, lin_f)),
3: (((3, -1), 0.2, lin_f), ((2, -1), 1.8, lin_f) ),
}
# time collection size
T = 1000
information, _ = toys.structural_causal_process(links_coeffs, T=T, seed=seed)
T, N = information.form
# create var identify lookup
var_names = (node_lookup(i) for i in sorted(node_lookup.keys()))
# initialize dataframe object, specify time axis and variable names
df = pp.DataFrame(information,
datatime = {0:np.arange(len(information))},
var_names=var_names)
Sau đó chúng ta có thể hình dung chuỗi thời gian của mình:
tp.plot_timeseries(df)
plt.present()
Bây giờ bạn đã hiểu cách tôi tạo dữ liệu, hãy quay lại nghiên cứu điển hình ở phần tiếp theo!
Hiểu về quá trình tạo dữ liệu
Bạn bắt đầu bằng cách cố gắng hiểu quá trình tạo dữ liệu bằng cách lấy dữ liệu được sử dụng trong mô hình. Có 3 tính năng được bao gồm trong mô hình:
- Các chuyến thăm ven biển
- Nhiệt độ
- Cá mập tấn công
Để hiểu rõ về biểu đồ nhân quả, bạn sử dụng PCMCI (có triển khai tuyệt vời trong Tigramite), một phương pháp phù hợp để khám phá chuỗi thời gian nhân quả. Lần này tôi sẽ không đề cập đến PCMCI vì nó cần có bài viết riêng. Tuy nhiên, nếu bạn không quen với khám phá nhân quả nói chung, hãy sử dụng bài viết trước của tôi để có được phần giới thiệu hay:
Đầu ra đồ thị nhân quả từ PCMCI có thể được nhìn thấy ở trên. Những điều sau đây nổi bật:
- Các chuyến thăm ven biển là nguyên nhân trực tiếp thúc đẩy doanh số bán kem
- Nhiệt độ là nguyên nhân gián tiếp ảnh hưởng đến doanh số bán kem
- Các cuộc tấn công của cá mập là một mối tương quan sai lầm
Bạn thắc mắc tại sao bất kỳ ai có chút hiểu biết thông thường nào lại đưa các cuộc tấn công của cá mập vào làm tính năng! Khi xem tài liệu, có vẻ như chuyên gia tư vấn đã sử dụng ChatGPT để có danh sách các tính năng cần xem xét cho mô hình và sau đó sử dụng autoML để đào tạo mô hình.
Vậy nếu ChatGPT và autoML cho rằng các cuộc tấn công của cá mập nên nằm trong mô hình thì chắc chắn nó không thể gây hại được phải không?
Xử lý trước dữ liệu nghiên cứu trường hợp
Tiếp theo, hãy xem cách tôi xử lý trước dữ liệu để phù hợp với nghiên cứu điển hình này. Để tạo các tính năng của mình, chúng tôi cần chọn các giá trị bị trễ cho mỗi cột (xem lại quá trình tạo dữ liệu để hiểu lý do tại sao các tính năng cần phải là giá trị bị trễ):
# create dataframne
df_pd = pd.DataFrame(df.values(0), columns=var_names)# calcuate lagged values for every column
lag_periods = 1
for col in var_names:
df_pd(f'{col}_lag{lag_periods}') = df_pd(col).shift(lag_periods)
# take away 1st obervations the place we do not have lagged values
df_pd = df_pd.iloc(1:, :)
df_pd
Chúng tôi có thể sử dụng các tính năng bị trễ này để dự đoán doanh số bán kem, nhưng trước khi thực hiện, hãy giới thiệu một số dữ liệu liên quan đến mối tương quan giả:
# perform to introduce characteristic drift primarily based on indexes
def introduce_feature_drift(df, start_idx, end_idx, drift_amount):
drift_period = (df.index >= start_idx) & (df.index <= end_idx)
df.loc(drift_period, 'shark attacks_lag1') += np.linspace(0, drift_amount, drift_period.sum())
return df# introduce characteristic drift
df_pd = introduce_feature_drift(df_pd, start_idx=500, end_idx=999, drift_amount=50.0)
# visualise drift
plt.determine(figsize=(12, 6))
sns.lineplot(information=df_pd(('shark attacks_lag1')))
plt.title('Characteristic Drift Over Time')
plt.xlabel('Index')
plt.ylabel('Worth')
plt.legend(('shark attacks_lag1'))
plt.present()
Hãy quay lại nghiên cứu trường hợp và hiểu những gì chúng ta đang thấy. Tại sao số vụ cá mập tấn công lại trôi dạt? Bạn thực hiện một số nghiên cứu và phát hiện ra rằng một trong những nguyên nhân gây ra các cuộc tấn công của cá mập là do số lượng người lướt sóng. Trong những tháng gần đây, việc lướt sóng trở nên phổ biến hơn rất nhiều, khiến các vụ cá mập tấn công cũng gia tăng. Vậy điều này ảnh hưởng thế nào đến việc dự báo doanh số bán kem?
Đào tạo người mẫu
Bạn quyết định tạo lại mô hình bằng cách sử dụng các tính năng tương tự như nhà tư vấn và sau đó chỉ sử dụng các nguyên nhân trực tiếp:
# use first 500 observations for coaching
df_train = df_pd.iloc(0:500, :)# use final 100 observations for analysis
df_test = df_pd.iloc(900:, :)
# set characteristic lists
X_causal_cols = ("ice cream sales_lag1", "coastal visits_lag1")
X_spurious_cols = ("ice cream sales_lag1", "coastal visits_lag1", "temperature_lag1", "shark attacks_lag1")
# create goal, practice and take a look at units
y_train = df_train('ice cream gross sales').copy()
y_test = df_test('ice cream gross sales').copy()
X_causal_train = df_train(X_causal_cols).copy()
X_causal_test = df_test(X_causal_cols).copy()
X_spurious_train = df_train(X_spurious_cols).copy()
X_spurious_test = df_test(X_spurious_cols).copy()
Mô hình được đào tạo chỉ dựa trên nguyên nhân trực tiếp sẽ có kết quả tốt trên cả tập huấn luyện và tập kiểm tra.
# practice and validate mannequin
model_causal = RidgeCV()
model_causal = model_causal.match(X_causal_train, y_train)
print(f'Coefficient: {model_causal.coef_}')yhat_causal_train = model_causal.predict(X_causal_train)
yhat_causal_test = model_causal.predict(X_causal_test)
mse_train = mean_squared_error(y_train, yhat_causal_train)
mse_test = mean_squared_error(y_test, yhat_causal_test)
print(f"Imply Squared Error practice: {spherical(mse_train, 2)}")
print(f"Imply Squared Error take a look at: {spherical(mse_test, 2)}")
r2_train = r2_score(y_train, yhat_causal_train)
r2_test = r2_score(y_test, yhat_causal_test)
print(f"R2 practice: {spherical(r2_train, 2)}")
print(f"R2 take a look at: {spherical(r2_test, 2)}")
Tuy nhiên, khi bạn huấn luyện mô hình bằng tất cả các tính năng, bạn thấy rằng mô hình hoạt động tốt trên tập huấn luyện nhưng không hoạt động tốt trên tập thử nghiệm. Có vẻ như bạn đã xác định được vấn đề!
# practice and validate mannequin
model_spurious = RidgeCV()
model_spurious = model_spurious.match(X_spurious_train, y_train)
print(f'Coefficient: {model_spurious.coef_}')yhat_spurious_train = model_spurious.predict(X_spurious_train)
yhat_spurious_test = model_spurious.predict(X_spurious_test)
mse_train = mean_squared_error(y_train, yhat_spurious_train)
mse_test = mean_squared_error(y_test, yhat_spurious_test)
print(f"Imply Squared Error practice: {spherical(mse_train, 2)}")
print(f"Imply Squared Error take a look at: {spherical(mse_test, 2)}")
r2_train = r2_score(y_train, yhat_spurious_train)
r2_test = r2_score(y_test, yhat_spurious_test)
print(f"R2 practice: {spherical(r2_train, 2)}")
print(f"R2 take a look at: {spherical(r2_test, 2)}")
Khi so sánh các dự đoán từ cả hai mô hình của bộ thử nghiệm, chúng ta có thể hiểu tại sao bạn của bạn lại dự trữ ít kem!
# mix outcomes
df_comp = pd.DataFrame({
'Index': np.arange(99),
'Precise': y_test,
'Causal prediction': yhat_causal_test,
'Spurious prediction': yhat_spurious_test
})# soften the DataFrame to lengthy format for seaborn
df_melted = df_comp.soften(id_vars=('Index'), value_vars=('Precise', 'Causal prediction', 'Spurious prediction'), var_name='Collection', value_name='Worth')
# visualise outcomes for take a look at set
plt.determine(figsize=(12, 6))
sns.lineplot(information=df_melted, x='Index', y='Worth', hue='Collection')
plt.title('Precise vs Predicted')
plt.xlabel('Index')
plt.ylabel('Worth')
plt.legend(title='Collection')
plt.present()
Hôm nay chúng ta đã khám phá mức độ nguy hại của việc bao gồm cả các mối tương quan giả trong các mô hình dự báo của bạn. Hãy kết thúc với một số suy nghĩ kết thúc:
- Mục đích của bài viết này là giúp bạn bắt đầu suy nghĩ về việc hiểu biểu đồ nhân quả có thể cải thiện dự báo của bạn như thế nào.
- Tôi biết ví dụ này có phần hơi cường điệu (tôi hy vọng lý lẽ thông thường sẽ giúp ích trong trường hợp này!) nhưng hy vọng nó minh họa được quan điểm.
- Một điểm thú vị khác cần đề cập là hệ số cho các cuộc tấn công của cá mập là âm. Đây là một cạm bẫy khác vì về mặt logic, chúng ta mong đợi mối tương quan giả tạo này là dương.
- Dự báo nhu cầu trung hạn-dài hạn rất khó — Bạn thường cần một mô hình dự báo cho từng tính năng để có thể dự báo nhiều bước thời gian phía trước. Thú vị là, đồ thị nhân quả (cụ thể là mô hình nhân quả cấu trúc) rất phù hợp với vấn đề này.
[ad_2]
Source link