[ad_1]
Chào mừng bạn đến với loạt bài của tôi về AI nhân quả, nơi chúng ta sẽ khám phá sự tích hợp 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ế trên các bối cảnh kinh doanh khác nhau.
Trong bài viết trước chúng tôi đã đề cập đo lường ảnh hưởng nhân quả nội tại của các chiến dịch tiếp thị của bạn. Trong bài viết này chúng ta sẽ chuyển sang xác nhận tác động nhân quả của các biện pháp kiểm soát tổng hợp.
Nếu bạn bỏ lỡ bài viết cuối cùng về ảnh hưởng nhân quả nội tại, hãy xem thử tại đây:
Trong bài viết này, chúng tôi sẽ tập trung vào việc tìm hiểu phương pháp kiểm soát tổng hợp và khám phá cách chúng tôi có thể xác nhận tác động nhân quả ước tính.
Các khía cạnh sau đây sẽ được đề cập:
- Phương pháp điều khiển tổng hợp là gì?
- Thử thách nào nó cố gắng vượt qua?
- Làm thế nào chúng ta có thể xác nhận tác động nhân quả ước tính?
- Một nghiên cứu điển hình về Python sử dụng dữ liệu xu hướng thực tế của Google, chứng minh cách chúng tôi có thể xác thực tác động nhân quả ước tính của các biện pháp kiểm soát tổng hợp.
Sổ ghi chép đầy đủ có thể được tìm thấy ở đây:
Nó là gì?
Phương pháp kiểm soát tổng hợp là một kỹ thuật nhân quả có thể được sử dụng để đánh giá tác động nhân quả của một biện pháp can thiệp hoặc điều trị khi không thể thực hiện thử nghiệm đối chứng ngẫu nhiên (RCT) hoặc thử nghiệm A/B. Ban đầu nó được đề xuất vào năm 2003 bởi Abadie và Gardezabal. Bài viết sau đây bao gồm một nghiên cứu điển hình tuyệt vời để giúp bạn hiểu phương pháp được đề xuất:
https://web.stanford.edu/~jhain/Paper/JASA2010.pdf
Chúng ta hãy cùng tìm hiểu một số vấn đề cơ bản… Phương pháp kiểm soát tổng hợp tạo ra một phiên bản phản thực của đơn vị điều trị bằng cách tạo ra một tổ hợp có trọng số của các đơn vị kiểm soát không nhận được sự can thiệp hoặc điều trị.
- Đơn vị đã xử lý: Đơn vị nhận sự can thiệp
- Đơn vị điều khiển: Một tập hợp các đơn vị tương tự không nhận được sự can thiệp.
- Phản thực tế: Được tạo ra như một sự kết hợp có trọng số của các đơn vị điều khiển. Mục đích là tìm ra trọng số cho mỗi đơn vị đối chứng dẫn đến phản thực tế gần giống với đơn vị được can thiệp trong giai đoạn trước can thiệp.
- Tác động nhân quả: Sự khác biệt giữa đơn vị điều trị sau can thiệp và phản thực tế.
Nếu chúng ta thực sự muốn đơn giản hóa mọi thứ, chúng ta có thể coi đó là hồi quy tuyến tính trong đó mỗi đơn vị điều khiển là một tính năng và đơn vị xử lý là mục tiêu. Giai đoạn trước can thiệp là tập hợp của chúng tôi và chúng tôi sử dụng mô hình này để tính điểm cho giai đoạn sau can thiệp. Sự khác biệt giữa thực tế và dự đoán là tác động nhân quả.
Dưới đây là một vài ví dụ để áp dụng nó vào cuộc sống khi chúng ta có thể cân nhắc sử dụng nó:
- Khi chạy chiến dịch tiếp thị trên truyền hình, chúng tôi không thể phân ngẫu nhiên đối tượng thành những người có thể và không thể xem chiến dịch. Tuy nhiên, chúng tôi có thể cẩn thận chọn một khu vực để thử nghiệm chiến dịch và sử dụng các khu vực còn lại làm đơn vị kiểm soát. Sau khi chúng tôi đo lường được hiệu quả, chiến dịch có thể được triển khai sang các khu vực khác. Điều này thường được gọi là thử nghiệm nâng địa lý.
- Những thay đổi chính sách được áp dụng ở một số khu vực nhưng không áp dụng cho các khu vực khác – Ví dụ: hội đồng địa phương có thể áp dụng thay đổi chính sách để giảm tỷ lệ thất nghiệp. Các khu vực khác không áp dụng chính sách này có thể được sử dụng làm đơn vị kiểm soát.
Thử thách nào nó cố gắng vượt qua?
Khi chúng ta kết hợp tính đa chiều (nhiều tính năng) với khả năng quan sát hạn chế, chúng ta có thể có được một mô hình phù hợp.
Hãy lấy ví dụ geo-lift để minh họa. Nếu chúng tôi sử dụng dữ liệu hàng tuần từ năm ngoái làm giai đoạn trước can thiệp, chúng tôi sẽ có 52 quan sát. Sau đó, nếu chúng tôi quyết định thử nghiệm sự can thiệp của mình trên khắp các quốc gia ở Châu Âu, điều đó sẽ cho chúng tôi tỷ lệ quan sát và đặc điểm là 1:1!
Trước đó chúng ta đã nói về cách thực hiện phương pháp điều khiển tổng hợp bằng hồi quy tuyến tính. Tuy nhiên, tỷ lệ quan sát trên đặc điểm có nghĩa là rất có thể hồi quy tuyến tính sẽ phù hợp quá mức dẫn đến ước tính tác động nhân quả kém trong giai đoạn sau can thiệp.
Trong hồi quy tuyến tính, các trọng số (hệ số) cho từng tính năng (đơn vị điều khiển) có thể âm hoặc dương và chúng có thể có tổng bằng một số lớn hơn 1. Tuy nhiên, phương pháp điều khiển tổng hợp sẽ tìm hiểu các trọng số trong khi áp dụng các ràng buộc dưới đây:
- Ràng buộc trọng số để tổng thành 1
- Ràng buộc trọng số là ≥ 0
Những ràng buộc này giúp chính quy hóa và tránh ngoại suy ngoài phạm vi dữ liệu được quan sát.
Điều đáng chú ý là về mặt chính quy hóa, hồi quy Ridge và Lasso có thể đạt được điều này và trong một số trường hợp là những lựa chọn thay thế hợp lý. Nhưng chúng tôi sẽ kiểm tra điều này trong nghiên cứu điển hình!
Làm thế nào chúng ta có thể xác nhận tác động nhân quả ước tính?
Một thách thức lớn hơn được cho là chúng ta không thể xác thực tác động nhân quả ước tính trong giai đoạn sau can thiệp.
Thời gian trước can thiệp của tôi nên kéo dài bao lâu? Chúng ta có chắc chắn là chúng ta chưa phù hợp quá mức với giai đoạn trước can thiệp không? Làm thế nào chúng ta có thể biết liệu mô hình của chúng ta có khái quát hóa tốt trong giai đoạn sau can thiệp hay không? Nếu tôi muốn thử các cách triển khai khác nhau của phương pháp điều khiển tổng hợp thì sao?
Chúng tôi có thể chọn ngẫu nhiên một số quan sát từ giai đoạn trước can thiệp và giữ lại chúng để xác thực – Nhưng chúng tôi đã nêu bật thách thức đến từ việc hạn chế quan sát nên chúng tôi có thể khiến mọi thứ trở nên tồi tệ hơn!
Điều gì sẽ xảy ra nếu chúng ta có thể chạy một số loại mô phỏng trước khi can thiệp? Điều đó có thể giúp chúng tôi trả lời một số câu hỏi được nêu ở trên và có được niềm tin vào tác động nhân quả ước tính trong mô hình của chúng tôi không? Tất cả sẽ được giải thích trong case Research!
Lý lịch
Sau khi thuyết phục Tài chính rằng tiếp thị thương hiệu đang mang lại một số giá trị quan trọng, nhóm tiếp thị tiếp cận bạn để hỏi về thử nghiệm nâng cao địa lý. Một người nào đó từ Fb đã nói với họ rằng đây là điều quan trọng tiếp theo (mặc dù chính người đó đã nói với họ rằng Prophet là một mô hình dự báo tốt) và họ muốn biết liệu họ có thể sử dụng nó để đo lường chiến dịch truyền hình mới sắp diễn ra hay không.
Bạn hơi lo ngại, vì lần cuối cùng bạn chạy thử nghiệm mức tăng địa lý, nhóm phân tích tiếp thị đã nghĩ rằng bạn nên thử sử dụng khoảng thời gian trước can thiệp cho đến khi chúng có tác động nhân quả lớn.
Lần này, bạn đề nghị họ chạy “mô phỏng trước can thiệp”, sau đó bạn đề xuất thống nhất giai đoạn trước can thiệp trước khi thử nghiệm bắt đầu.
Vậy hãy cùng khám phá “mô phỏng trước can thiệp” trông như thế nào nhé!
Tạo dữ liệu
Để làm cho điều này trở nên thực tế nhất có thể, tôi đã trích xuất một số dữ liệu xu hướng của Google về phần lớn các quốc gia ở Châu Âu. Cụm từ tìm kiếm không liên quan, chỉ cần giả vờ đó là doanh số bán hàng của công ty bạn (và bạn hoạt động trên khắp Châu Âu).
Tuy nhiên, nếu bạn quan tâm đến cách tôi lấy dữ liệu xu hướng trên Google, hãy xem sổ ghi chép của tôi:
Dưới đây chúng ta có thể thấy khung dữ liệu. Chúng tôi đã bán hàng trong 3 năm qua trên 50 quốc gia Châu Âu. Nhóm tiếp thị dự định thực hiện chiến dịch truyền hình của họ ở Vương quốc Anh.
Bây giờ đến phần thông minh. Chúng tôi sẽ mô phỏng sự can thiệp trong 7 tuần cuối cùng của chuỗi thời gian.
np.random.seed(1234)# Create intervention flag
masks = (df('date') >= "2024-04-14") & (df('date') <= "2024-06-02")
df('intervention') = masks.astype(int)
row_count = len(df)
# Create intervention uplift
df('uplift_perc') = np.random.uniform(0.10, 0.20, dimension=row_count)
df('uplift_abs') = spherical(df('uplift_perc') * df('GB'))
df('y') = df('GB')
df.loc(df('intervention') == 1, 'y') = df('GB') + df('uplift_abs')
Bây giờ, hãy lập biểu đồ doanh số bán hàng thực tế và phản thực tế trên toàn GB để biến những gì chúng tôi đã làm thành hiện thực:
def synth_plot(df, counterfactual):plt.determine(figsize=(14, 8))
sns.set_style("white")
# Create plot
sns.lineplot(knowledge=df, x='date', y='y', label='Precise', coloration='b', linewidth=2.5)
sns.lineplot(knowledge=df, x='date', y=counterfactual, label='Counterfactual', coloration='r', linestyle='--', linewidth=2.5)
plt.title('Artificial Management Methodology: Precise vs. Counterfactual', fontsize=24)
plt.xlabel('Date', fontsize=20)
plt.ylabel('Metric Worth', fontsize=20)
plt.legend(fontsize=16)
plt.gca().xaxis.set_major_formatter(plt.matplotlib.dates.DateFormatter('%Y-%m-%d'))
plt.xticks(rotation=90)
plt.grid(True, linestyle='--', alpha=0.5)
# Excessive the intervention level
intervention_date = '2024-04-07'
plt.axvline(pd.to_datetime(intervention_date), coloration='okay', linestyle='--', linewidth=1)
plt.textual content(pd.to_datetime(intervention_date), plt.ylim()(1)*0.95, 'Intervention', coloration='okay', fontsize=18, ha='proper')
plt.tight_layout()
plt.present()
synth_plot(df, 'GB')
Vì vậy, bây giờ chúng ta đã mô phỏng một biện pháp can thiệp, chúng ta có thể khám phá xem phương pháp điều khiển tổng hợp sẽ hoạt động tốt như thế nào.
Sơ chế
Tất cả các quốc gia Châu Âu ngoài GB đều được đặt làm đơn vị kiểm soát (tính năng). Đơn vị xử lý (mục tiêu) là doanh số tính bằng GB khi áp dụng biện pháp can thiệp.
# Delete the unique goal column so we do not use it as a characteristic accidentally
del df('GB')# set characteristic & targets
X = df.columns(1:50)
y = 'y'
hồi quy
Dưới đây tôi đã thiết lập một hàm mà chúng ta có thể sử dụng lại với các giai đoạn trước can thiệp khác nhau và các mô hình hồi quy khác nhau (ví dụ Ridge, Lasso):
def train_reg(df, start_index, reg_class):df_temp = df.iloc(start_index:).copy().reset_index()
X_pre = df_temp(df_temp('intervention') == 0)(X)
y_pre = df_temp(df_temp('intervention') == 0)(y)
X_train, X_test, y_train, y_test = train_test_split(X_pre, y_pre, test_size=0.10, random_state=42)
mannequin = reg_class
mannequin.match(X_train, y_train)
yhat_train = mannequin.predict(X_train)
yhat_test = mannequin.predict(X_test)
mse_train = mean_squared_error(y_train, yhat_train)
mse_test = mean_squared_error(y_test, yhat_test)
print(f"Imply Squared Error prepare: {spherical(mse_train, 2)}")
print(f"Imply Squared Error check: {spherical(mse_test, 2)}")
r2_train = r2_score(y_train, yhat_train)
r2_test = r2_score(y_test, yhat_test)
print(f"R2 prepare: {spherical(r2_train, 2)}")
print(f"R2 check: {spherical(r2_test, 2)}")
df_temp('pred') = mannequin.predict(df_temp.loc(:, X))
df_temp('delta') = df_temp('y') - df_temp('pred')
pred_lift = df_temp(df_temp('intervention') == 1)('delta').sum()
actual_lift = df_temp(df_temp('intervention') == 1)('uplift_abs').sum()
abs_error_perc = abs(pred_lift - actual_lift) / actual_lift
print(f"Predicted elevate: {spherical(pred_lift, 2)}")
print(f"Precise elevate: {spherical(actual_lift, 2)}")
print(f"Absolute error proportion: {spherical(abs_error_perc, 2)}")
return df_temp, abs_error_perc
Để bắt đầu, chúng tôi giữ mọi thứ đơn giản và sử dụng hồi quy tuyến tính để ước tính tác động nhân quả, sử dụng một khoảng thời gian nhỏ trước khi can thiệp:
df_lin_reg_100, pred_lift_lin_reg_100 = train_reg(df, 100, LinearRegression())
Nhìn vào kết quả, hồi quy tuyến tính không hoạt động tốt. Nhưng điều này không có gì đáng ngạc nhiên khi xét đến tỷ lệ quan sát trên tính năng.
synth_plot(df_lin_reg_100, 'pred')
Phương pháp điều khiển tổng hợp
Hãy bắt đầu ngay và xem nó so sánh với phương pháp điều khiển tổng hợp như thế nào. Bên dưới tôi đã thiết lập một chức năng tương tự như trước đây nhưng áp dụng phương pháp điều khiển tổng hợp bằng sciPy:
def synthetic_control(weights, control_units, treated_unit):artificial = np.dot(control_units.values, weights)
return np.sqrt(np.sum((treated_unit - artificial)**2))
def train_synth(df, start_index):
df_temp = df.iloc(start_index:).copy().reset_index()
X_pre = df_temp(df_temp('intervention') == 0)(X)
y_pre = df_temp(df_temp('intervention') == 0)(y)
X_train, X_test, y_train, y_test = train_test_split(X_pre, y_pre, test_size=0.10, random_state=42)
initial_weights = np.ones(len(X)) / len(X)
constraints = ({'sort': 'eq', 'enjoyable': lambda w: np.sum(w) - 1})
bounds = ((0, 1) for _ in vary(len(X)))
outcome = reduce(synthetic_control,
initial_weights,
args=(X_train, y_train),
methodology='SLSQP',
bounds=bounds,
constraints=constraints,
choices={'disp': False, 'maxiter': 1000, 'ftol': 1e-9},
)
optimal_weights = outcome.x
yhat_train = np.dot(X_train.values, optimal_weights)
yhat_test = np.dot(X_test.values, optimal_weights)
mse_train = mean_squared_error(y_train, yhat_train)
mse_test = mean_squared_error(y_test, yhat_test)
print(f"Imply Squared Error prepare: {spherical(mse_train, 2)}")
print(f"Imply Squared Error check: {spherical(mse_test, 2)}")
r2_train = r2_score(y_train, yhat_train)
r2_test = r2_score(y_test, yhat_test)
print(f"R2 prepare: {spherical(r2_train, 2)}")
print(f"R2 check: {spherical(r2_test, 2)}")
df_temp('pred') = np.dot(df_temp.loc(:, X).values, optimal_weights)
df_temp('delta') = df_temp('y') - df_temp('pred')
pred_lift = df_temp(df_temp('intervention') == 1)('delta').sum()
actual_lift = df_temp(df_temp('intervention') == 1)('uplift_abs').sum()
abs_error_perc = abs(pred_lift - actual_lift) / actual_lift
print(f"Predicted elevate: {spherical(pred_lift, 2)}")
print(f"Precise elevate: {spherical(actual_lift, 2)}")
print(f"Absolute error proportion: {spherical(abs_error_perc, 2)}")
return df_temp, abs_error_perc
Tôi giữ nguyên khoảng thời gian trước can thiệp để tạo ra sự so sánh công bằng với hồi quy tuyến tính:
df_synth_100, pred_lift_synth_100 = train_synth(df, 100)
Ồ! Tôi sẽ là người đầu tiên thừa nhận rằng tôi không mong đợi sự cải thiện đáng kể như vậy!
synth_plot(df_synth_100, 'pred')
So sánh kết quả
Chúng ta đừng quá phấn khích. Dưới đây chúng tôi thực hiện thêm một số thử nghiệm để khám phá các loại mô hình và giai đoạn trước can thiệp:
# run regression experiments
df_lin_reg_00, pred_lift_lin_reg_00 = train_reg(df, 0, LinearRegression())
df_lin_reg_100, pred_lift_lin_reg_100 = train_reg(df, 100, LinearRegression())
df_ridge_00, pred_lift_ridge_00 = train_reg(df, 0, RidgeCV())
df_ridge_100, pred_lift_ridge_100 = train_reg(df, 100, RidgeCV())
df_lasso_00, pred_lift_lasso_00 = train_reg(df, 0, LassoCV())
df_lasso_100, pred_lift_lasso_100 = train_reg(df, 100, LassoCV())# run artificial management experiments
df_synth_00, pred_lift_synth_00 = train_synth(df, 0)
df_synth_100, pred_lift_synth_100 = train_synth(df, 100)
experiment_data = {
"Methodology": ("Linear", "Linear", "Ridge", "Ridge", "Lasso", "Lasso", "Artificial Management", "Artificial Management"),
"Knowledge Dimension": ("Giant", "Small", "Giant", "Small", "Giant", "Small", "Giant", "Small"),
"Worth": (pred_lift_lin_reg_00, pred_lift_lin_reg_100, pred_lift_ridge_00, pred_lift_ridge_100,pred_lift_lasso_00, pred_lift_lasso_100, pred_lift_synth_00, pred_lift_synth_100)
}
df_experiments = pd.DataFrame(experiment_data)
Chúng tôi sẽ sử dụng mã dưới đây để hình dung kết quả:
# Set the model
sns.set_style="whitegrid"# Create the bar plot
plt.determine(figsize=(10, 6))
bar_plot = sns.barplot(x="Methodology", y="Worth", hue="Knowledge Dimension", knowledge=df_experiments, palette="muted")
# Add labels and title
plt.xlabel("Methodology")
plt.ylabel("Absolute error proportion")
plt.title("Artificial Controls - Comparability of Strategies Throughout Totally different Knowledge Sizes")
plt.legend(title="Knowledge Dimension")
# Present the plot
plt.present()
Kết quả cho tập dữ liệu nhỏ thực sự thú vị! Đúng như mong đợi, việc chính quy hóa đã giúp cải thiện các ước tính tác động nhân quả. Việc kiểm soát tổng hợp sau đó đã tiến thêm một bước nữa!
Kết quả của bộ dữ liệu lớn cho thấy thời gian trước can thiệp dài hơn không phải lúc nào cũng tốt hơn.
Tuy nhiên, điều tôi muốn bạn lưu ý là việc thực hiện mô phỏng trước can thiệp có giá trị như thế nào. Có rất nhiều con đường bạn có thể khám phá với tập dữ liệu của riêng mình!
Hôm nay chúng ta đã khám phá phương pháp kiểm soát tổng hợp và cách bạn có thể xác nhận tác động nhân quả. Tôi sẽ để lại cho bạn một vài suy nghĩ cuối cùng:
- Sự đơn giản của phương pháp điều khiển tổng hợp khiến nó trở thành một trong những kỹ thuật được sử dụng rộng rãi nhất trong hộp công cụ AI nhân quả.
- Thật không might, nó cũng bị lạm dụng rộng rãi nhất – Hãy chạy gói R CausalImpact, thay đổi giai đoạn trước can thiệp cho đến khi chúng tôi thấy mức tăng mà chúng tôi muốn. 😭
- Đây là lúc tôi thực sự khuyên bạn nên chạy mô phỏng trước can thiệp để thống nhất trước về thiết kế thử nghiệm.
- Phương pháp kiểm soát tổng hợp là một lĩnh vực được nghiên cứu nhiều. Bạn nên kiểm tra các điều chỉnh được đề xuất SC tăng cường, SC mạnh mẽ và SC bị phạt.
Alberto Abadie, Alexis Diamond & Jens Hainmueller (2010) Phương pháp kiểm soát tổng hợp cho các nghiên cứu trường hợp so sánh: Ước tính hiệu quả của Chương trình kiểm soát thuốc lá của California, Tạp chí của Hiệp hội Thống kê Hoa Kỳ, 105:490, 493–505, DOI: 10.1198/jasa.2009 .ap08746
[ad_2]
Source link