Professional Documents
Culture Documents
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ą.
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.