Tạo dự đoán trực giao (không tương quan) với một biến đã cho


8

Tôi có một Xma trận, một ybiến và một biến khác ORTHO_VAR. Tôi cần dự đoán ybiến bằng cách sử dụng X, tuy nhiên, các dự đoán từ mô hình đó cần phải trực giao ORTHO_VARtrong khi càng tương quan với ycàng tốt.

Tôi muốn các dự đoán được tạo bằng phương pháp không tham số như xgboost.XGBRegressornhưng tôi có thể sử dụng phương pháp tuyến tính nếu thực sự cần thiết.

Mã này:

import numpy as np
import pandas as pd
from sklearn.datasets import make_regression
from xgboost import XGBRegressor

ORTHO_VAR = 'ortho_var'
TARGET = 'target'
PRED = 'yhat'

# Create regression dataset with two correlated targets
X, y = make_regression(n_features=20, random_state=245, n_targets=2)
indep_vars = ['var{}'.format(i) for i in range(X.shape[1])]

# Pull into dataframe
df = pd.DataFrame(X, columns=indep_vars)
df[TARGET] = y[:, 0]
df[ORTHO_VAR] = y[:, 1]

# Fit a model to predict TARGET
xgb = XGBRegressor(n_estimators=10)
xgb.fit(df[indep_vars], df[TARGET])
df[PRED] = xgb.predict(df[indep_vars])

# Correlation should be low or preferably zero
pred_corr_w_ortho = df.corr().abs()[PRED][ORTHO_VAR]
assert pred_corr_w_ortho < 0.01, "Correlation score: {0} is superior to the given threshold.".format(pred_corr_w_ortho)

Trả về cái này:

---------------------------------------------------------------------------
AssertionError                           
      1 pred_corr_w_ortho = df.corr().abs()[PRED][ORTHO_VAR]
----> 2 assert pred_corr_w_ortho < 0.01, "Correlation score: {0} is superior to the given threshold.".format(pred_corr_w_ortho)

AssertionError: Correlation score: 0.5895885756753665 is superior to the given threshold.

... và tôi muốn một cái gì đó duy trì độ chính xác dự đoán càng nhiều càng tốt trong khi vẫn trực giao với ORTHO_VAR


2
Mối tương quan của TARGET với ORTHO_VAR là gì?
Esmailian

Câu hỏi hay. Chúng thực sự có mối tương quan (giả sử 50%) các dự đoán có thể sẽ bị ảnh hưởng về độ chính xác bằng cách được thực hiện trực giao.
Chris

Câu trả lời:


5

Yêu cầu này có thể được thỏa mãn bằng cách thêm tiếng ồn vào dự đoán y^ để giải mã chúng từ các giá trị trực giao v. Lý tưởng nhất lày^ đã được giải mã từ v, không có tiếng ồn sẽ được thêm vào y^, do đó y^ sẽ được tương quan tối đa với y.

Về mặt toán học, chúng tôi muốn tạo ra y^'= =y^+ε từ ε~N(0,σε), để thỏa mãn

ry^'v= =σy^'vσy^'σv<δ
cho ngưỡng tùy ý δ. Bây giờ, hãy mở rộng sự bất bình đẳng này để tìm giới hạn thấp hơn cho std của tiếng ồnε, I E σε.
σy^'2= =σy^2+σε2,σy^'v= =E[(y^+ε-μy^-με= =0)(v-μv)]= =E[(y^-μy^)(v-μv)]+E[ε(v-μv)]= =0= =σy^v,ry^'v= =σy^'vσy^'σv= =σy^vσvσy^2+σε2<δσy^(ry^vδ)2-1<σε

Vì tất cả các biến ở phía bên trái của bất đẳng thức có thể được tính toán, chúng tôi có thể lấy mẫu tiếng ồn từ N(0,σε) và thêm chúng vào y^ để thỏa mãn sự bất bình đẳng ban đầu.

Đây là một mã thực hiện chính xác điều tương tự:

import numpy as np
import pandas as pd
from sklearn.datasets import make_regression
from xgboost import XGBRegressor

ORTHO_VAR = 'ortho_var'
IND_VARNM = 'indep_var'
TARGET = 'target'
CORRECTED_VARNM = 'indep_var_fixed'

seed = 245
# Create regression dataset with two correlated targets
X, y = make_regression(n_samples=10000, n_features=20, random_state=seed, n_targets=2)
indep_vars = ['var{}'.format(i) for i in range(X.shape[1])]

# Pull into dataframe
df = pd.DataFrame(X, columns=indep_vars)
df[TARGET] = y[:, 0]
df[ORTHO_VAR] = y[:, 1]

# Fit a model to predict TARGET
xgb = XGBRegressor(n_estimators=10)
xgb.fit(df[indep_vars], df[TARGET])
df['yhat'] = xgb.predict(df[indep_vars])

delta = 0.01

# std of noise required to be added to y_hat to bring the correlation
# of y_hat with ORTHO_VAR below delta
std_y_hat = np.std(df['yhat'], ddof=1)
corr_y_hat_ortho_var = np.corrcoef(df['yhat'], df[ORTHO_VAR])[1, 0]
corr_y_hat_target = np.corrcoef(df['yhat'], df[TARGET])[1, 0]
std_noise_lower_bound = std_y_hat * np.sqrt((corr_y_hat_ortho_var / delta)**2 - 1.0)
std_noise = max(0, std_noise_lower_bound) + 1
print('delta: ', delta)
print('std_y_hat: ', std_y_hat)
print('corr_y_hat_target: ', corr_y_hat_target)
print('corr_y_hat_ortho_var: ', corr_y_hat_ortho_var)
print('std_noise_lower_bound: ', std_noise_lower_bound)
print('std_noise: ', std_noise)

# add noise
np.random.seed(seed)
noises = np.random.normal(0, std_noise, len(df['yhat']))
noises -= np.mean(noises)  # remove slight deviations from zero mean
print('noise_samples: mean:', np.mean(noises), ', std: ', np.std(noises))
df['yhat'] = df['yhat'] + noises

# measure new correlation
corr_y_hat_ortho_var = np.corrcoef(df['yhat'], df[ORTHO_VAR])[1, 0]
corr_y_hat_target = np.corrcoef(df['yhat'], df[TARGET])[1, 0]
print('new corr_y_hat_target: ', corr_y_hat_target)
print('new corr_y_hat_ortho_var: ', corr_y_hat_ortho_var)
# Correlation should be low or preferably zero
assert corr_y_hat_ortho_var < delta, corr_y_hat_ortho_var
assert -delta < corr_y_hat_ortho_var, corr_y_hat_ortho_var

đầu ra nào:

delta:  0.01
std_y_hat:  69.48568725585938
corr_y_hat_target:  0.8207672834857673
corr_y_hat_ortho_var:  0.7663936356880843
std_noise_lower_bound:  5324.885500165032
std_noise:  5325.885500165032
noise_samples: mean: 1.1059455573558807e-13 , std:  5373.914830034988
new corr_y_hat_target:  -0.004125016071865934
new corr_y_hat_ortho_var:  -0.000541131379457552

Bạn có thể thử nghiệm với các deltas khác . Bằng cách so sánh std_y_hatvới std_noise_lower_bound, bạn có thể thấy rằng một tiếng ồn lớn phải được thêm vàoy^ để giải mã nó từ v dưới đây 0,01, mà giảm đáng kể y^ từ y quá.

Lưu ý: Assertioncó thể thất bại cho các ngưỡng quá nhỏδ do số lượng mẫu không đủ.


Là sự thiếu tương quan giữa yhat và biến mục tiêu có liên quan đến mối tương quan cao giữa hai biến mục tiêu (ví dụ như lỗi của tôi)? Lý tưởng nhất là chúng ta muốn new corr_y_hat_targetcàng cao càng tốt với new corr_y_hat_ortho_varmức thấp nhất có thể
Chris

@Chris Gián tiếp có. Nếu targetcó tương quan thấp với orth, y_hat(có tương quan cao với target) cũng sẽ có tương quan thấp với orth. Kết quả là, một tiếng ồn thấp sẽ được thêm vào y_hatvà mối tương quan của nó với targetsẽ thay đổi một chút.
Esmailian
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.