You are on page 1of 3

REGRESJA LOGISTYCZNA

Regresja logistyczna jest podobna do regresji liniowej, ale krzywa jest


konstruowana przy użyciu logarytmu naturalnego „prawdopodobie ństwa”
zmiennej docelowej, a nie prawdopodobieństwa. Co więcej, predyktory nie
muszą być normalnie dystrybuowane ani nie muszą mieć takiej samej
wariancji w każdej grupie.

1 / (1 + e ^ -value)

Gdzie e jest podstawą logarytmów naturalnych (numer Eulera lub funkcja EXP
() w arkuszu kalkulacyjnym), a wartość to rzeczywista wartość liczbowa, któr ą
chcesz przekształcić.

Wartości wejściowe (x) są łączone liniowo przy użyciu wag lub wartości
współczynników (nazywanych grecką literą Beta) w celu przewidywania
wartości wyjściowej (y). Kluczową różnicą od regresji liniowej jest to, że
modelowana wartość wyjściowa jest wartością binarną (0 lub 1), a nie
wartością liczbową.

Poniżej znajduje się przykład równania regresji logistycznej:


y = e ^ (b0 + b1 x) / (1 + e ^ (b0 + b1 x))

Gdzie y jest przewidywaną wartością wyjściową, b0 jest wartością początkową


lub przechwyconą, a b1 jest współczynnikiem dla pojedynczej warto ści
wejściowej (x). Każda kolumna w danych wejściowych ma powiązany
współczynnik b (stała wartość rzeczywista), którą należy poznać na podstawie
danych treningowych.
from IPython.display import Image
Image(filename="img/log1.png")

Regresja logistyczna jest jednym z najprostszych i najczęściej stosowanych


algorytmów uczenia maszynowego dla klasyfikacji dwóch klas. Jest łatwa w
implementacji i może być użyta jako punkt odniesienia dla dowolnego
problemu klasyfikacji binarnej. Regresja logistyczna opisuje i szacuje zwi ązek
między jedną zależną zmienną binarną i zmiennymi niezależnymi.

Rodzaje regresji logistycznej:


 Binarna regresja logistyczna: zmienna docelowa ma tylko dwa
możliwe wyniki, takie jak spam lub nie spam, rak lub brak raka.

 Wielomianowa regresja logistyczna: zmienna docelowa ma trzy lub


więcej kategorii nominalnych, takich jak przewidywanie typu wina.

 Zwykła regresja logistyczna: zmienna docelowa ma trzy lub więcej


kategorii porządkowych, takich jak restauracja lub ocena produktu od
1 do 5.

Image(filename="img/log3.png")
Do tego klasyfikacyjnego problemu użyjemy danych kart kredytowych z banku
i postaramy sie wykryć oszustwo:
import numpy as np
import pandas as pd
data = pd.read_csv(r'C:\Users\VFW863\Desktop\en\
creditcard.csv');data.head()

Amou
TimeV1 V2 V3 V4 V5 V6 V7 V8 V9 … V21V22V23V24V25V26V27V28 Class
nt

- - - - - - -
2.5363
1.3781 0.4623
0.2395
0.0986
0.3637 0.2778 0.0669
0.1285 0.1335
0 0.0 1.3598
0.0727 0.3383 … 0.0183 0.1104 0.1891 0.0210
149.62
0
47 55 88 99 98 87 38 28 39 58
07 81 21 07 74 15 53

- - - - - - -
1.1918
0.2661
0.1664
0.4481
0.0600 0.0851 0.1012 0.1671
0.1258 0.0147
1 0.0 0.0823
0.0788 0.2554
… 0.2257
0.6386 0.3398 0.0089 2.690
57 51 80 54 18 02 88 70 95 24
61 03 25 75 72 46 83

- - - - - - - - -
1.7732
0.3797 1.8004
0.7914
0.2476 0.2479
0.7716
0.9094
2 1.0 1.3583
1.3401 0.5031 1.5146
… 0.6892
0.3276
0.1390
0.0553
0.0597
378.66
0
09 80 99 61 76 98 79 12
54 63 98 54 81 42 97 53 52

- - - - - - - - -
1.7929 1.2472
0.2376
0.3774 0.0052 0.6473 0.0627
0.0614
3 1.0 0.9662
0.1852 0.8632
0.0103 1.3870
… 0.1083 0.1903
1.1755 0.2219 123.50
0
93 03 09 36 74 76 23 58
72 26 91 09 24 00 21 75 29

- - - - - -
0.8777
1.5487
0.4030 0.0959
0.5929 0.8177 0.7982 0.1412 0.5022
0.2194
0.2151
4 2.0 1.1582 0.4071 0.2705 … 0.0094 0.1374 0.2060 69.99
0
37 18 34 21 41 39 78 67 92 22 53
33 93 33 31 58 10

5 rows × 31 columns
Dane dzielimy na zmienne niezależne (X) i zmienną zależną (y), zobaczmy ile
obserwacji jest w każdej kategorii:
X = data.iloc[:,:-2]
y = data['Class']
y.value_counts()
0 284315
1 492
Name: Class, dtype: int64
Jak widać klasy nie są równe i trzeba uwzględnić tę nierówność, ale zanim do
tego dojdziemy, podzielimy dane na treningowe i testowe:
from sklearn import model_selection
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X,y, test_size = 0.20)
Znormalizujemy dane:
from sklearn.preprocessing import StandardScaler
sc_x = StandardScaler()
X_train = sc_x.fit_transform(X_train)
X_test = sc_x.transform(X_test)
Modelujemy dane:
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(X_train, y_train)

y_predicted = model.predict(X_test)
I sprawdźmy jak dobry jest nasz model:
from sklearn.metrics import accuracy_score
accuracy_score(y_test, y_predicted)
0.9991748885221726
99% chyba zbyt dobry… zasługa niezrównoważonych klas
from sklearn.metrics import confusion_matrix
confusion_matrix(y_test, y_predicted)
array([[56862, 10],
[ 37, 53]], dtype=int64)
Podobnie jak wiele innych algorytmów, regresja logistyczna ma wbudowan ą
metodę obsługi klas niezrównoważonych. Jeśli mamy wysoce
niezrównoważone klasy i nie uwzględniamy ich podczas wstępnego
przetwarzania, mamy opcję użycia parametru class_weight do ważenia klas,
aby upewnić się, że mamy zrównoważoną mieszankę każdej klasy. W
szczególności zbalansowany argument automatycznie waży klasy odwrotnie
proporcjonalne do ich częstotliwości. Modelujemy dane ponownie:
bal = LogisticRegression(random_state=0, class_weight='balanced')
bal.fit(X_train, y_train)
y_predicted = bal.predict(X_test)
accuracy_score(y_test, y_predicted)
0.9777746567887363
confusion_matrix(y_test, y_predicted)
array([[55617, 1255],
[ 11, 79]], dtype=int64)
Wyniki są trochę bardziej prawdopodobne. Warto wspomnieć, że accuracy jako
metodę ewaluacji nie powinno stosować się w przypadku dużej nierównowagi.

You might also like