Sử dụng trọng số hồi quy khi


8

Giả sử chúng ta quan sát dữ liệu và muốn điều chỉnh mô hình hồi quy cho . Thật không may, đôi khi được đo bằng các lỗi có ý nghĩa khác không.Y,XE[Y|X]Y

Đặt cho biết liệu có được đo bằng các lỗi trung bình không cổ điển hoặc các lỗi không khác biệt tương ứng hay không. Chúng tôi muốn ước tính . Thật không may, thường không được quan sát và . Nếu chúng ta phù hợp với hồi quy của trên , chúng ta sẽ có các dự đoán sai lệch.Z{unbiased,biased}YE[Y|X,Z=unbiased]ZE[Y|X,Z=unbiased]E[Y|X]YX

Giả sử chúng ta thường không thể quan sát , nhưng có quyền truy cập vào một mô hình cho (vì chúng ta đã học Z theo cách thủ công trên một tập huấn luyện nhỏ và khớp với mô hình phân loại với Z làm biến mục tiêu) . Việc điều chỉnh hồi quy của Y trên X bằng \ Pr [Z = \ text {không thiên vị} \, | \, X, Y] làm trọng số hồi quy tạo ra ước tính không thiên vị của \ mathbf {E} [Y \, | \, X, Z = \ text {không thiên vị}] (hoặc, không có điều đó, một ước tính ít sai lệch hơn chúng ta sẽ nhận được mà không sử dụng trọng số)? Là phương pháp này được sử dụng trong thực tế, và nó có một tên?ZPr[Z|X,Y]ZZYXPr[Z=unbiased|X,Y]E[Y|X,Z=unbiased]

Làm rõ: mục tiêu là để phù hợp với một mô hình giảm thiểu lỗi bình phương trung bình trên dữ liệu không nhìn thấy (dữ liệu thử nghiệm) trong đó Z=unbiased . Công cụ dự đoán tối ưu cho mục tiêu đó là E[Y|X,Z=unbiased] , vì vậy đó là chức năng chúng tôi đang cố gắng ước tính. Các phương pháp để giải quyết vấn đề này nên được xếp hạng theo mức độ họ đạt được mục tiêu đó.


Ví dụ nhỏ trong R với df$y_is_unbiasedvai trò của Zdf$y_observedđóng vai trò của Y :

library(ggplot2)
library(randomForest)

set.seed(12345)

get_df <- function(n_obs, constant, beta, sd_epsilon, mismeasurement) {
    df <- data.frame(x1=rnorm(n_obs), x2=rnorm(n_obs), epsilon=rnorm(n_obs, sd=sd_epsilon))

    ## Value of Y if measured correctly
    df$y_unbiased <- constant + as.matrix(df[c("x1", "x2")]) %*% beta + df$epsilon

    ## Value of Y if measured incorrectly
    df$y_biased <- df$y_unbiased + sample(mismeasurement, size=n_obs, replace=TRUE)

    ## Y is equally likely to be measured correctly or incorrectly
    df$y_is_unbiased<- sample(c(TRUE, FALSE), size=n_obs, replace=TRUE)
    df$y_observed <- ifelse(df$y_is_unbiased, df$y_unbiased, df$y_biased)

    return(df)
}

## True coefficients
constant <- 5
beta <- c(1, 5)

df <- get_df(n_obs=2000, constant=constant, beta=beta, sd_epsilon=1.0, mismeasurement=c(-10.0, 5.0))

ggplot(df, aes(x=x1, y=y_observed, color=y_is_unbiased)) + geom_point() + scale_color_manual(values=c("#ff7f00", "#377eb8"))

## For facet_wrap title
df$string_y_is_unbiased <- paste0("y_is_unbiased: ", df$y_is_unbiased)

## Notice that Pr[Y | Z = biased] differs from Pr[Y | Z = unbiased]
ggplot(df, aes(x=y_observed)) + geom_histogram(color="black", fill="grey", binwidth=0.5) + facet_wrap(~ string_y_is_unbiased, ncol=1)

## Recover true constant and beta (plus noise) when using y_unbiased
summary(lm(y_unbiased ~ x1 + x2, data=df))

## Biased estimates when using y_biased (constant is biased downward)
summary(lm(y_biased ~ x1 + x2, data=df))

## Also get biased estimates when using y_observed (constant is biased downward)
summary(lm(y_observed ~ x1 + x2, data=df))

## Now image that we "rate" subset of the data (manually check/research whether y was measured with or without bias)
n_rated <- 1000
df_rated <- df[1:n_rated, ]

## Use a factor so that randomForest does classification instead of regression
df_rated$y_is_unbiased <- factor(df_rated$y_is_unbiased)

model_pr_unbiased <- randomForest(formula=y_is_unbiased ~ y_observed + x1 + x2, data=df_rated, mtry=2)

## Examine OOB confusion matrix (error rate < 5%)
print(model_pr_unbiased)

## Use the model to get Pr[Y is unbiased | X, observed Y] on unrated data
df_unrated <- df[(n_rated+1):nrow(df), ]
df_unrated$pr_unbiased <- as.vector(predict(model_pr_unbiased, newdata=df_unrated, type="prob")[, "TRUE"])

## Train a model on unrated data, using pr_unbiased as regression weights -- is this unbiased?
summary(lm(y_observed ~ x1 + x2, data=df_unrated, weights=df_unrated$pr_unbiased))

Trong ví dụ này, mô hình là một khu rừng ngẫu nhiên với . Nếu mô hình này hoàn toàn chính xác, nó sẽ tạo ra các trọng số 1.0 trong đó không thiên vị, 0,0 trong đó sai lệch và hồi quy có trọng số rõ ràng sẽ không thiên vị. Điều gì xảy ra khi mô hình cho có độ chính xác kiểm tra và thu hồi không hoàn hảo (độ chính xác <100%)? Là hồi quy có trọng số được đảm bảo ít sai lệch hơn so với hồi quy không trọng số của trên ?Pr[Z=unbiased|X,Y]formula=y_is_unbiased ~ y_observed + x1 + x2YYPr[Z=unbiased|X,Y]YX


Ví dụ phức tạp hơn một chút trong đó thay đổi theo (trái ngược với ví dụ đơn giản hơn mà tôi đã đăng ở trên, trong đó ):Pr[Z=unbiased|X]XPr[Z=unbiased|X]=12X

library(ggplot2)
library(randomForest)

set.seed(12345)

logistic <- function(x) {
    return(1 / (1 + exp(-x)))
}

pr_y_is_unbiased <- function(x1, x2) {
    ## This function returns Pr[ Z = unbiased | X ]
    return(logistic(x1 + 2*x2))
}

get_df <- function(n_obs, constant, beta, sd_epsilon, mismeasurement) {
    df <- data.frame(x1=rnorm(n_obs), x2=rnorm(n_obs), epsilon=rnorm(n_obs, sd=sd_epsilon))

    ## Value of Y if measured correctly
    df$y_unbiased <- constant + as.matrix(df[c("x1", "x2")]) %*% beta + df$epsilon

    ## Value of Y if measured incorrectly
    df$y_biased <- df$y_unbiased + sample(mismeasurement, size=n_obs, replace=TRUE)

    ## Note: in this example, Pr[ Z = biased | X ] varies with X
    ## In the first (simpler) example I posted, Pr[ Z = biased | X ] = 1/2 was constant with respect to X
    df$y_is_unbiased <- runif(n_obs) < pr_y_is_unbiased(df$x1, df$x2)

    df$y_observed <- ifelse(df$y_is_unbiased, df$y_unbiased, df$y_biased)

    return(df)
}

## True coefficients
constant <- 5
beta <- c(1, 5)

df <- get_df(n_obs=2000, constant=constant, beta=beta, sd_epsilon=1.0, mismeasurement=c(-10.0, 5.0))

ggplot(df, aes(x=x1, y=y_observed, color=y_is_unbiased)) + geom_point() + scale_color_manual(values=c("#ff7f00", "#377eb8"))

## For facet_wrap title
df$string_y_is_unbiased <- paste0("y_is_unbiased: ", df$y_is_unbiased)

## Notice that Pr[Y | Z = biased] differs from Pr[Y | Z = unbiased]
ggplot(df, aes(x=y_observed)) + geom_histogram(color="black", fill="grey", binwidth=0.5) + facet_wrap(~ string_y_is_unbiased, ncol=1)

## Recover true constant and beta (plus noise) when using y_unbiased
summary(lm(y_unbiased ~ x1 + x2, data=df))

## Biased estimates when using y_biased (constant is biased downward)
summary(lm(y_biased ~ x1 + x2, data=df))

## Also get biased estimates when using y_observed
## Note: the constant is biased downward _and_ the coefficient on x2 is biased upward!
summary(lm(y_observed ~ x1 + x2, data=df))

## Now image that we "rate" subset of the data (manually check/research whether y was measured with or without bias)
n_rated <- 1000
df_rated <- df[1:n_rated, ]

## Use a factor so that randomForest does classification instead of regression
df_rated$y_is_unbiased <- factor(df_rated$y_is_unbiased)

model_pr_unbiased <- randomForest(formula=y_is_unbiased ~ y_observed + x1 + x2, data=df_rated, mtry=2)

## Examine OOB confusion matrix (error rate < 5%)
print(model_pr_unbiased)

## Use the model to get Pr[Y is unbiased | X, observed Y] on unrated data
df_unrated <- df[(n_rated+1):nrow(df), ]
df_unrated$pr_unbiased <- as.vector(predict(model_pr_unbiased, newdata=df_unrated, type="prob")[, "TRUE"])

## Train a model on unrated data, using pr_unbiased as regression weights -- is this unbiased? If not, is it _less_ biased than the unweighted model?
summary(lm(y_observed ~ x1 + x2, data=df_unrated, weights=df_unrated$pr_unbiased))

## What happens if we use pr_unbiased as a feature (aka predictor) in the regression, rather than a weight?
## In this case the weighted regression seems to do better, but neither is perfect
## Note: copied from shabbychef's answer
summary(lm(formula = y_observed ~ x1 + x2 + I(1 - pr_unbiased), data = df_unrated))

Trong ví dụ này, hồi quy có trọng số của trên vẻ ít sai lệch hơn so với hồi quy không trọng số. Điều đó có đúng nói chung không? Tôi cũng đã thử đề xuất của shabbychef (xem câu trả lời bên dưới) về ví dụ này và nó dường như làm tồi tệ hơn hồi quy có trọng số.YX


Đối với những người thích Python hơn R, đây là mô phỏng thứ hai trong Python:

import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LinearRegression

def logistic(x):
    return 1 / (1 + np.exp(-x))

def pr_y_is_unbiased(x1, x2):
    # This function returns Pr[ Z = unbiased | X ]
    return logistic(x1 + 2*x2)

def get_df(n_obs, constant, beta, sd_epsilon, mismeasurement):
    df = pd.DataFrame({
        'x1': np.random.normal(size=n_obs),
        'x2': np.random.normal(size=n_obs),
        'epsilon': np.random.normal(size=n_obs, scale=sd_epsilon),
    })

    df['y_unbiased'] = constant + np.dot(np.array(df[['x1', 'x2']]), beta) + df['epsilon']

    # Note: df['y_biased'].mean() will differ from df['y_unbiased'].mean() if the mismeasurements have a nonzero mean
    df['y_biased'] = df['y_unbiased'] + np.random.choice(mismeasurement, size=n_obs)

    df['y_is_unbiased'] =  np.random.uniform(size=n_obs) < pr_y_is_unbiased(df['x1'], df['x2'])

    df['y_observed'] = df.apply(lambda row: row['y_unbiased'] if row['y_is_unbiased'] else row['y_biased'], axis=1)

    return df


constant = 5
beta = np.array([1, 5])
print(f'true coefficients:\n constant = {constant}, beta = {beta}')

n_obs = 2000

# Note: the mean of the possible mismeasurements is nonzero (this is the source of the bias)
df = get_df(n_obs=n_obs, constant=constant, beta=beta, sd_epsilon=1.0, mismeasurement=[-10.0, 5.0])

lr = LinearRegression()
lr.fit(X=df[['x1', 'x2']], y=df['y_observed'])

print(f'estimates from unweighted regression of Y on X ({df.shape[0]} obs):\n constant = {lr.intercept_}, beta = {lr.coef_}')

# Note: pretend that we only observe y_is_unbiased on a "rated" subset of the data
n_rated = n_obs // 2
df_rated = df.iloc[:n_rated].copy()
df_unrated = df.iloc[n_rated:].copy()

rf = RandomForestClassifier(n_estimators=500, max_features=2, oob_score=True)
rf_predictors = ['y_observed', 'x1', 'x2']

rf.fit(X=df_rated[rf_predictors], y=df_rated['y_is_unbiased'])

print(f'random forest classifier OOB accuracy (for predicting whether Y is unbiased): {rf.oob_score_}')

df_unrated['pr_y_is_unbiased'] = rf.predict_proba(df_unrated[rf_predictors])[:, 1]

lr.fit(X=df_unrated[['x1', 'x2']], y=df_unrated['y_observed'], sample_weight=df_unrated['pr_y_is_unbiased'])
print(f'estimates from weighted regression of Y on X ({df_unrated.shape[0]} obs):\n constant = {lr.intercept_}, beta = {lr.coef_}')

1
Điều này gần như nghe giống như "Biến công cụ", trong đó bạn quan sát một số biến có tương quan với lỗi trong hồi quy của bạn. Tôi sợ rằng điều đó không giúp quá nhiều, mặc dù.
shabbychef

@shabbychef Đúng, nhưng không có công cụ nào có sẵn trong thiết lập này.
Adrian

1
Với vấn đề được cập nhật của bạn, xu hướng bây giờ là một hàm của và chúng ta nên kỳ vọng các hệ số hồi quy sẽ thay đổi. Nghĩa là, thuật ngữ 'bias' là trong đó . Tôi sẽ mở rộng với bản mở rộng Taylor để cho thấy rằng có thêm sự phụ thuộc tuyến tính của vào và . Quay trở lại câu hỏi ban đầu của bạn, thuật ngữ thiên vị bạn thấy và biến bạn quan sát, không thay đổi phương sai theo bất kỳ cách nào, nhưng thay đổi giá trị mong đợi. Vì vậy, họ nên được hack vào các đặc điểm kỹ thuật tuyến tính, tôi nghĩ, và không vào các trọng số. - 0,25 p p = logistic ( x 1 + 2 x 2 ) p y x 1 x 2 zxi0.25pp=logistic(x1+2x2)pyx1x2z
shabbychef

Câu trả lời:


2

Tôi sẽ sử dụng 'xác suất sai lệch' như một biến giả trong hồi quy; nó có thể có thể 'nhấm nháp' sự thiên vị hiện diện trong trường hợp thiên vị. Sử dụng ví dụ của bạn, (nhưng gọi set.seed(1234)trước khi gọi đến get_df), tôi đã thử

summary(lm(y_observed ~ x1 + x2 + I(1-pr_unbiased), data=df_unrated))

và có:

Call:
lm(formula = y_observed ~ x1 + x2 + I(1 - pr_unbiased), data = df_unrated)

Residuals:
   Min     1Q Median     3Q    Max 
-9.771 -2.722 -0.386  2.474 11.238 

Coefficients:
                   Estimate Std. Error t value Pr(>|t|)    
(Intercept)           5.515      0.250   22.07   <2e-16 ***
x1                    1.108      0.169    6.54    1e-10 ***
x2                    4.917      0.168   29.26   <2e-16 ***
I(1 - pr_unbiased)   -3.727      0.383   -9.72   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 5.25 on 996 degrees of freedom
Multiple R-squared:  0.514,     Adjusted R-squared:  0.513 
F-statistic:  351 on 3 and 996 DF,  p-value: <2e-16

Hệ số cho thuật ngữ 1-pr_unbiasednên là kích thước của độ lệch.


Ý tưởng thú vị (+1)! Tôi đã cập nhật bài viết của mình với một ví dụ thứ hai, phức tạp hơn một chút trong đó thay đổi theo X thay vì không đổi. Trong trường hợp này, cả hằng số và hệ số trên x2 đều bị sai lệch khi hồi quy Y trên X và tôi không nghĩ phương pháp của bạn cũng hoạt động tốt (vì nó chỉ loại bỏ sai lệch khỏi hằng số). Có một cái nhìn và cho tôi biết những gì bạn nghĩ! Pr[Z=unbiased|X]XYX
Adrian

2

Đây là một vấn đề biến bị bỏ qua trong đó bạn có một biến chỉ báo Z không quan sát được, nhưng có mối quan hệ với biến trả lời. Vì "bias" là một thuộc tính của công cụ ước tính, không phải là biến hồi quy, tôi sẽ điều chỉnh lại câu hỏi của bạn thành một trong đó bạn muốn tìm hàm hồi quy thực có điều kiện trên Z=0 bằng cách sử dụng dữ liệu hồi quy không bao gồm biến này và một bộ riêng biệt của dữ liệu huấn luyện hồi quy được sử dụng để ước tính xác suất p0(x,y)P(Z=0|X=x,Y=y) .

Cho pY|X biểu thị mật độ có điều kiện của biến trả lời trong bài toán hồi quy với biến trả lời Y và biến giải thích X (nhưng không bao gồm Z ). Từ các quy tắc xác suất có điều kiện, phân phối lợi ích mục tiêu có thể được viết là:

p(Y=y|X=x,Z=0)=p(Y=y,Z=0|X=x)p(Z=0|X=x)=p0(x,y)pY|X(y|x)Rp0(x,y)pY|X(y|x) dyyp0(x,y)pY|X(y|x).

pY|XZp0

YXpY|XZp^Y|Xp^0

p^(Y=y|X=x,Z=0)p^0(x,y)p^Y|X(y|x).

Khi bạn đã thay thế các công cụ ước tính này, tất cả những gì còn lại là cố gắng xác định hằng số tỷ lệ mang lại hàm mật độ thích hợp. Điều này có thể được thực hiện bằng một loạt các phương pháp tích hợp số (ví dụ: quy tắc của Simpson, phương trình bậc hai, Đô thị-Hastings, v.v.).


1
Cảm ơn bạn đã trả lời chi tiết này (+1), tôi sẽ đọc nó cẩn thận và liên lạc lại với bạn. Tôi đồng ý rằng một mô tả chính xác hơn về vấn đề có thể là "Y đôi khi được đo bằng lỗi không khác biệt", thay vì "Y bị sai lệch".
Adrian

Y|X

Vâng, nhưng điều đó không thực sự khó khăn. Bất kỳ mô hình hồi quy nào bạn sử dụng sẽ có dạng mô hình rõ ràng xác định phân phối có điều kiện này.
Ben - Tái lập Monica

1
YXY

1
Tôi không nghĩ rằng Adrian nhất thiết phải quan tâm đến việc phân phối đầy đủ (Y | X, Z = 0), chỉ đơn thuần là ý nghĩa của nó. Nếu người ta muốn biết phân phối đầy đủ của Y | X, Z = 0 thì tất nhiên các phân phối chính xác của Y và X rất phù hợp, nhưng nếu người ta chỉ muốn ước tính E [Y | X, Z = 0] thì đây là không cần thiết: luật số lượng lớn hoạt động cho các phân phối tùy ý.
dùng1111929

1

α<1α

P(Z=biased|X,Y)P(Z=biased|X,Y)<0.01NMnmf=n(N+M)N(n+m)nNmMf1

p=P(Z=biased|X,Y)>βββ=0.01(1pβ)2


Tôi đồng ý rằng hồi quy có trọng số thường sẽ không tạo ra các ước tính không thiên vị trừ khi phân loại chính xác 100%. Có đảm bảo để giảm sự thiên vị? Là cách tiếp cận cắt của bạn nhất thiết phải tốt hơn, hay điều đó phụ thuộc vào kích thước mẫu và độ chính xác của phân loại?
Adrian

Không thực sự chính xác của trình phân loại, chủ yếu là số lượng kết quả của các hàng, vì đối với các bộ dữ liệu rất nhỏ, đôi khi người ta không thể bỏ qua một số lượng lớn các hàng. Nhưng được cung cấp đủ dữ liệu Tôi không thấy một lý do nào để nghi ngờ: cách tiếp cận của bạn cân nhắc các hàng với 50% cơ hội sai lệch bằng một nửa so với các hàng có 0% cơ hội sai lệch. Cá nhân, tôi sẽ không bao giờ làm điều đó, tôi rất thích 1000 hàng sạch được đảm bảo hơn 2000 hàng mà mỗi hàng có 50% cơ hội sai lệch. Lưu ý rằng bạn cũng có thể kết hợp cả hai cách tiếp cận, để áp dụng một hệ thống dần dần hơn là cắt bỏ đơn giản, tôi đã cập nhật câu trả lời của mình để giải thích về vấn đề này.
dùng1111929
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.