Regresja liniowa czy test T. Jak wybrać?
\ Często dajemy się porwać szumowi wokół wymyślnych modeli uczenia maszynowego i przełomów w deep learningu, ale nie zapominajmy o skromnej regresji liniowej.
\ ==W świecie LLM i najnowocześniejszych architektur, regresja liniowa cicho odgrywa kluczową rolę i nadszedł czas, aby rzucić światło na to, jak może być przydatna nawet dzisiaj.==
\ Rozważmy scenariusz, w którym firma e-commerce wprowadza nowy baner, a naszym celem jest ocena jego wpływu na średnią długość sesji. Aby to osiągnąć, przeprowadzono eksperyment i zebrano dane do analizy. Przeanalizujmy wyniki.
Zastosujmy znane narzędzie do tego zadania: test t.
Wyniki są bardzo obiecujące:
Wzrost metryki to po prostu różnica między średnimi próby grup kontrolnej i eksperymentalnej. W naszym przypadku szacowany wzrost wynosi 0,56 minuty, co oznacza, że użytkownicy średnio spędzają o 33 sekundy dłużej korzystając z naszego produktu.
Teraz zastosujmy regresję liniową z wektorem traktowania (czy nowy baner jest pokazywany, czy nie) jako zmienną niezależną i średnią długością sesji jako zmienną wyjściową.
Następnie drukujemy podsumowanie naszego modelu:
\
\ Warto zauważyć, że współczynnik dla zmiennej traktowania jest zgodny z naszym wcześniejszym szacunkiem wzrostu wynoszącym 0,56. Warto również zauważyć, że R-kwadrat wynosi zaledwie 0,008 i nie wyjaśniamy zbyt wiele wariancji tym modelem.
Czy to zbieg okoliczności, że wzrost uzyskany z testu t i współczynnik traktowania są takie same? Zagłębmy się w ten związek.
\ Zastanówmy się, co odzwierciedla zmienna traktowania. Gdy równa się 1, oznacza średnią długość sesji dla użytkowników, którzy widzieli baner; gdy równa się 0, oznacza średnią długość sesji dla użytkowników, którzy nie widzieli banera. Oznacza to, że zmienna traktowania (lub nachylenie w terminologii regresji liniowej) oznacza zmianę średniej między grupami kontrolną i eksperymentalną.
Jaka jest hipoteza zerowa dla zmiennej traktowania w regresji liniowej?
Jaka jest hipoteza zerowa, gdy stosujemy test T dla eksperymentu? Jest dokładnie taka sama.
Dlatego obliczając statystyki t i wartość p dla identycznych hipotez, nasze wyniki pozostają spójne i identyczne.
Jednak jaki jest powód stosowania regresji liniowej? Nie chcemy po prostu komplikować spraw.
\ Po pierwsze, zastanówmy się, czy tylko traktowanie jest odpowiedzialne za zmianę naszej głównej metryki.
\ W rzeczywistości może to nie być całkowicie dokładne ze względu na obecność błędu selekcji.
\ Błąd selekcji w testach A/B to rodzaj błędu, gdy istnieje systematyczna różnica między porównywanymi grupami, która nie wynika z przypadku, na przykład:
\
Obserwujemy, że starzy użytkownicy są częściej eksponowani na nowy baner niż nowi klienci.
\
Losowa alokacja, którą stosujemy w testach AB, pomaga nam to złagodzić, ale trudno jest ją całkowicie wyeliminować.
\ Sformułujmy, jak oszacować prawdziwy efekt.
ATE: średni efekt traktowania, który chcemy oszacować.
\ ATT: średni efekt traktowania osób traktowanych. Możemy to również nazwać ACE: średnim efektem przyczynowym. Faktycznie możemy to obliczyć. Jest to różnica między średnimi próby grup kontrolnej i eksperymentalnej.
\ SB: błąd selekcji, który chcemy zminimalizować.
\ Jak możemy go zminimalizować?
\ Regresja liniowa pozwala nam dodać kowariancje/zmienne zakłócające. Wypróbujmy to i dodajmy jako jedną ze zmiennych zakłócających średnią długość sesji użytkowników przed eksperymentem.
I wydrukujmy podsumowanie modelu:
Nasz R-kwadrat wzrósł gwałtownie! Teraz wyjaśniamy 86% wariancji.
\ Nasz efekt traktowania wynosi teraz 0,47.
Mamy więc dwa efekty traktowania: 0,47 i 0,56; który jest prawidłowy?
\ W tym przypadku na pewno znamy prawdziwy efekt, ponieważ zasymulowałem dane i rzeczywisty wzrost: 0,5
import numpy as np import pandas as pd from scipy import stats import statsmodels.api as sm np.random.seed(45) n = 500 x = np.random.normal(loc = 10 ,scale = 3, size= 2 * n) y = x + np.random.normal(loc = 2 , scale = 1 ,size = len(x)) # For 50% of users we simulate treatment effect treat = 1 * (np.random.rand(2 * n) <= 0.5) experiment = pd.DataFrame(x, columns=["covariate"]) experiment['metric'] = y experiment['treatment'] = treat experiment['noise'] = np.random.normal(size = len(experiment)) # Add noise and uplift to 'metric' for rows where 'treat' is equal to 1 # The real uplift is 0.5 experiment['metric'] = experiment.apply(lambda row: row['metric'] + 0.5 * row['treatment'] + row['noise'] if row['treatment'] == 1 else row['metric'], axis=1)
Oznacza to, że 0,47 jest lepsze pod względem różnicy bezwzględnej i bliższe odzwierciedleniu rzeczywistego wzrostu.
Stosowanie regresji liniowej ma następujące zalety:
\ Czy możemy użyć regresji liniowej do innych testów, takich jak test t Welcha lub test chi-kwadrat?
\ Prosta odpowiedź brzmi: tak. Musimy jednak dokonać pewnych dostosowań, o których będziemy dyskutować w kolejnych artykułach!


