Regresja logistyczna jest algorytmem klasyfikacji uczenia maszynowego.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import StandardScaler, Normalizer, scale
from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier, GradientBoostingClassifier, ExtraTreesClassifier
from sklearn.svm import SVC, LinearSVC
from sklearn.metrics import confusion_matrix, log_loss, auc, roc_curve, roc_auc_score, recall_score, precision_recall_curve
from sklearn.metrics import make_scorer, precision_score, fbeta_score, f1_score, classification_report
from sklearn.model_selection import cross_val_score, train_test_split, KFold, StratifiedShuffleSplit, GridSearchCV
from sklearn.linear_model import LogisticRegression
from sklearn import metrics
from sklearn.metrics import classification_report, confusion_matrix
df = pd.read_csv('c:/1/creditcard.csv')
df.head(3)
Zbiór zmiennych zależnych jest zbilansowany wtedy, gdy stany 1 i 0 ma podobną liczbę wystąpień. Zazwyczaj zmienne wynikowe nie są zbilansowane, ponieważ zwykle bada się jakieś rzadkie zjawisko reprezentowane przez zmienną wynikową 1 na tle ogromnej liczby 0. Gdy zbiór zmiennych wynikowych jest niezbilansowany, wtedy możemy mieć do czynienia ze zjawiskiem, kiedy model będzie ignorował wystąpienia 1 a i tak zachowa bardzo wysoki wskaźnik kompletności wyników (recall). Przy drastycznej asymetrii występowania 0 i 1, nawet jeżeli model regresji logistycznej zignoruje wszystkie wystąpienia 1 i tak zachowa recall na bardzo wysokim poziomie. Sprawdzenie poziomu zbilansowania wartości wynikowych Wykres nie jest zbyt czytelny, warto więc sprawdzić strukturę procentową zmiennych wynikowych. Widzimy, że skala malwersacji reprezentowana przez 1 w kolumnie ‘Class’ stanowi niespełna 0,46% . Zbiór jest więc głęboko niezbilansowany. Według wymienionych wcześniej założeń do Modelu Regresji Logistycznej W pierwszej kolejności zbadamy jaki wpływ na zmienna zależną mają poszczególne zmienne niezależne. Wektor korelacji pomiędzy zmienną zależną a poszczególnymi zmiennymi niezależnymi wykazał, że niektóre zmienne mają bardzo niskie, graniczące z zerem poziomy korelacji. Teraz wyświetlimy statystyki kilku zmiennych w próbie. Zmienne typu V mają bardzo podobne charakterystyki więc nie wyświetliłem tylko kilka z pośród nich. Wyraźnie widać, że zmienne typu V znacznie różnią się od zmiennych niezależnych ‘Time’ i ‘Amount’. Sprawdźmy jaki wpływ na zmienną zależną maja obie te zmienne. Widać, że istnieje istotna różnica w stanie średnich pomiędzy zmienną wynikową 1 i 0. Dzieje się tak mimo wyraźnego braku korelacji między zmianną ‘Amount’ i zmienną zależną ‘Class’. Zmienna ‘Time’ wykazuje małe różnice pomiędzy 0 a 1, nie wykazuje też korelacji ze zmienną zależną, dlatego nie bierzemy jej pod uwagę w budowaniu modelu. Zmienną ‘Amount’ należy użyć przy tworzeniu Modelu Regresji Logistycznej pomimo braku korelacji ze zmienną zależną. Aby użyć zmienną niezależną ‘Amount’ należy ją najpierw zestandaryzować. Korelacja zmiennych wynikowych nie jest dobrym zjawiskiem przy budowie Modelu Regresji Logistycznej. Brak jakiejkolwiek wysokiej korelacji pomiędzy zmiennymi niezależnymi. Na wykresie widać poszczególne wysokie korelacje zmiennych niezależnych ze zmienną zależną. Wszystko jest OK. Przed rozpoczęciem tworzenia modelu usuwamy wszystkie rekordy z pustymi komórkami. Wskazuje na zmienne egzogeniczne i na kolumnę wynikową zmienną endogeniczną. Wskazuje na podział na zbiór treningowy i zbiór testowy. Tworzymy ustawianie siatki Grid. Wyjaśnienia do kodu: Parameteres = {'C': np.power(10.0, np.arange(-3, 3))} array([1.e-03, 1.e-02, 1.e-01, 1.e+00, 1.e+01, 1.e+02]) Czyli typowe ustawienia dla siatki. warm_start – algorytm wykorzystuje poprzednie wyniki modelu. Gdy warm_start =True, istniejące atrybuty dopasowanego modelu są używane do inicjalizacji nowego modelu w kolejnym wezwaniu do dopasowania w celu przyspieszyć konwergencji. warm_start jest przydatny przy wielokrotnym dopasowaniu tego samego estymatora z tymi samymi danymi, ale przy różnych parametrach. scoring = 'roc_auc' Wykres ROC ocenia najlepsze ustawienie klasyfikacji. Wyszukuje obszar pod „zakrzywioną” krzywą ROC, która jest prawdopodobnie najlepszym sposobem do pomiaru wydajności klasyfikacji w ramach wyszukiwania siatki. jobs = 5 Liczba zadań do uruchomienia równoległego. cv = 2 Oznacza ilość weryfikacji krzyżowych. Model przyjmuje postać równania: Sprawdzam, jaką konfigurację superparametru wygrał Grid. Proszę wprowadzić do kodu blok diagnostyczny. Model Regresji Logistycznej dobrze estymuje zdarzenia oznaczone jaki 0, gorzej ze zdarzeniami 1 (malwersacje). Poziom recall dla malwersacji wynosi zaledwie 65%. Precision było na poziomie 77%. Pamiętajmy, że model został stworzony głębokim niezbilansowaniu zbioru zmiennej zależnej. Wykorzystaliśmy równie z wszystkie zmienne mimo że część z nich nie wykazywała korelacji ze zmienną zależną. Aby wyświetlić same zmienne o wysokim poziomie (powyżej 0.2) korelacji ze zmienną zależną ‘Class’trzeba wpisać: Teraz podstawimy wyłącznie te zmienne do modelu. Wynik okazuje się rozczarowujące, model pogorszył swoje właściwości. Wracam więc od wcześniejszych ustawień modelu. W kolejnych odcinkach będę starał się polepszyć model aby efektywnie wyłapywał wszystkie malwersacje Kolejne kroki w tym procesie to : df.columns
Analiza zbilansowania zmiennych zależnych
df.Class.value_counts(dropna = False)
sns.countplot(x='Class',data=df, palette='GnBu_d')
plt.show()
df.Class.value_counts(dropna = False, normalize=True)
Analiza zmiennych niezależnych Modelu Regresji Logistycznej
CORREL = df.corr().sort_values('Class')
CORREL['Class']
Analiza statystyczna zmiennych niezależnych
df.groupby('Class').Amount.mean()
pd.pivot_table(df, index='Class', values = 'Amount', aggfunc= [np.mean, np.median, min, max, np.std])
pd.pivot_table(df, index='Class', values = 'Time', aggfunc= [np.mean, np.median, min, max, np.std])
scaler = StandardScaler()
df['Amount'] = scaler.fit_transform(df['Amount'].values.reshape(-1, 1))
Analiza korelacji zmiennych
sns.heatmap (df.corr (), cmap="coolwarm")
Tworzenie Modelu Regresji Logistycznej
feature_cols = ['V1', 'V2', 'V4', 'V5', 'V6', 'V8', 'V9', 'V10', 'V11', 'V12', 'V13', 'V14', 'V15', 'V16', 'V17', 'V18', 'V19', 'V20',
'V21', 'V22', 'V23', 'V24', 'V25', 'V26', 'V27', 'V28', 'Amount']
X = df[feature_cols]
y = df.Class
Xtrain, Xtest, ytrain, ytest = train_test_split(X, y, test_size = .33, stratify = y, random_state = 148)
Parameteres = {'C': np.power(10.0, np.arange(-3, 3))}
LR = LogisticRegression(warm_start = True)
LR_Grid = GridSearchCV(LR, param_grid = Parameteres, scoring = 'roc_auc', n_jobs = 5, cv=2)
LR_Grid.fit(Xtrain, ytrain)
print("The Best parameter:",LR_Grid.best_params_)
print("The Best estimator:",LR_Grid.best_estimator_)
Ewaluacja Modelu Regresji Logistycznej
print("\n------Training data---------------------------------------------------")
print("The RECALL Training data: ", np.round(recall_score(ytrain, LR_Grid.predict(Xtrain)), decimals=3))
print("The PRECISION Training data: ", np.round(precision_score(ytrain, LR_Grid.predict(Xtrain)), decimals=3))
print()
print("------Test data-------------------------------------------------------")
print("The RECALL Test data is: ", np.round(recall_score(ytest, LR_Grid.predict(Xtest)), decimals=3))
print("The PRECISION Test data is: ", np.round(precision_score(ytest, LR_Grid.predict(Xtest)), decimals=3))
print()
print("The Confusion Matrix Test data :--------------------------------------")
print(confusion_matrix(ytest, LR_Grid.predict(Xtest)))
print("----------------------------------------------------------------------")
print(classification_report(ytest, LR_Grid.predict(Xtest)))
# PLOT
y_pred_proba = LR_Grid.predict_proba(Xtest)[::,1]
fpr, tpr, _ = metrics.roc_curve(ytest, y_pred_proba)
auc = metrics.roc_auc_score(ytest, y_pred_proba)
plt.plot(fpr, tpr, label='Logistic Regression (auc =
#plt.axvline(0.5, color = '#00C851', linestyle = '--')
plt.xlabel('False Positive Rate',color='grey', fontsize = 13)
plt.ylabel('True Positive Rate',color='grey', fontsize = 13)
plt.title('Receiver operating characteristic')
plt.legend(loc="lower right")
plt.legend(loc=4)
plt.plot([0, 1], [0, 1],'r--')
plt.show()
kot = CORREL[(CORREL['Class']>0.2)|(CORREL['Class']<-0.2)][['Class']]
kot.index
Next part: