diff --git a/PraceDomowe/PracaDomowa2/Sinski_Bartosz/pd2wb_sinski.html b/PraceDomowe/PracaDomowa2/Sinski_Bartosz/pd2wb_sinski.html new file mode 100644 index 0000000..0c2f113 --- /dev/null +++ b/PraceDomowe/PracaDomowa2/Sinski_Bartosz/pd2wb_sinski.html @@ -0,0 +1,274649 @@ + + +
+ + +W poniższej pracy domowej wyliczymy dekompozycję predykcji modelu dla wybranych obserwacji korzystając z narzędzia LIME. Sprawdzimy także, czy potwierdzają się nasze wnioski z poprzedniej pracy domowej, dotyczące zmiennych najbardziej wpływających na predykcje naszego modelu.
+ +import pandas as pd
+import numpy as np
+from matplotlib import pyplot as plt
+import seaborn as sns
+import dalex as dx
+import pickle
+np.random.seed = 46
+
df_wines = pd.read_csv('./src/winequality-red.csv')
+df_wines["is_good"]=df_wines.apply(lambda row: 1 if row.quality > 5 else 0, axis = 1)
+X = df_wines.drop(columns = ['quality','is_good'])
+y = df_wines[['is_good']]
+from sklearn.model_selection import train_test_split
+X_train, X_test, y_train, y_test = train_test_split(X, y, random_state = 1613)
+
xgb_model = pickle.load(open('tunned_xgb.sav', 'rb'))
+
explainer = dx.Explainer(xgb_model, X_train, y_train)
+
Preparation of a new explainer is initiated + + -> data : 1199 rows 11 cols + -> target variable : Parameter 'y' was a pandas.DataFrame. Converted to a numpy.ndarray. + -> target variable : 1199 values + -> model_class : sklearn.model_selection._search.RandomizedSearchCV (default) + -> label : Not specified, model's class short name will be used. (default) + -> predict function : <function yhat_proba_default at 0x0000027EE9FA3160> will be used (default) + -> predict function : Accepts pandas.DataFrame and numpy.ndarray. + -> predicted values : min = 0.0298, mean = 0.533, max = 0.989 + -> model type : classification will be used (default) + -> residual function : difference between y and yhat (default) + -> residuals : min = -0.85, mean = 7.05e-05, max = 0.722 + -> model_info : package sklearn + +A new explainer has been created! ++
X_train.tail(1)
+
+ | fixed acidity | +volatile acidity | +citric acid | +residual sugar | +chlorides | +free sulfur dioxide | +total sulfur dioxide | +density | +pH | +sulphates | +alcohol | +
---|---|---|---|---|---|---|---|---|---|---|---|
1402 | +7.6 | +0.3 | +0.42 | +2.0 | +0.052 | +6.0 | +24.0 | +0.9963 | +3.44 | +0.82 | +11.9 | +
print("predykcja = " + str(xgb_model.predict(X_train.tail(1))[0])+", prawdziwa wartość = " + str(y_train.iloc[len(y_test)-1,:][0]))
+
predykcja = 1, prawdziwa wartość = 1 ++
explainer.predict_surrogate(X_train.tail(1), type = "lime").show_in_notebook()
+
Widzimy, że dla wybranej przez nas obserwacji model z bardzo dużym prawdopodobieństwem zaliczył wino do dobrych. Większość zmiennych pozytywnie wpływała na predykcje modelu. Największe znaczenie dla danej obserwacji ma alkohol, który jak wiemy z eskploracji danych jest najlepiej skorelowaną zmienną z naszym targetem. Wartość alkoholu 11.9 jest jak na nasz zbiór wysoka (trzeci kwartyl to 11.1), a wartość kwasowości lotnej (volatile acidity) bardzo niska (pierwszy kwartyl to 0.39). Tłumaczy to duży wpływ tych zmiennych na naszą predykcje.
+ +Przy badaniu kolejnych obserwacji interesować nas będzie, czy prawdopodobieństwo określenia zmiennej przewidywanej jest tak samo wysokie jak przy wcześniej badanej obserwacji. Spojrzymy także na zmienne, które mają największy wpływ na predykcje.
+ +explainer.predict_surrogate(X_train.iloc[1030,:], type = "lime").show_in_notebook()
+
explainer.predict_surrogate(X_train.iloc[198,:], type = "lime").show_in_notebook()
+
explainer.predict_surrogate(X_train.iloc[19,:], type = "lime").show_in_notebook()
+
explainer.predict_surrogate(X_train.iloc[656,:], type = "lime").show_in_notebook()
+
print("Pierwsza obserwacja: predykcja = " + str(xgb_model.predict(X_train.iloc[[1030]])[0])+", prawdziwa wartość = " + str(y_train.iloc[[1030]].iat[0,0]))
+print("Druga obserwacja: predykcja = " + str(xgb_model.predict(X_train.iloc[[198]])[0])+", prawdziwa wartość = " + str(y_train.iloc[[198]].iat[0,0]))
+print("Trzecia obserwacja: predykcja = " + str(xgb_model.predict(X_train.iloc[[19]])[0])+", prawdziwa wartość = " + str(y_train.iloc[[19]].iat[0,0]))
+print("Czwarta obserwacja: predykcja = " + str(xgb_model.predict(X_train.iloc[[656]])[0])+", prawdziwa wartość = " + str(y_train.iloc[[656]].iat[0,0]))
+
Pierwsza obserwacja: predykcja = 1, prawdziwa wartość = 1 +Druga obserwacja: predykcja = 1, prawdziwa wartość = 1 +Trzecia obserwacja: predykcja = 0, prawdziwa wartość = 0 +Czwarta obserwacja: predykcja = 1, prawdziwa wartość = 1 ++
Na początku badamy obserwacje dla których nasz model poprawnie zaklasyfikował wartość targetu. Widzimy, że w wybranych obserwacjach model z dużą pewnością klasyfikował zmienne celu. Prawdopodobieństwo z jakim wskazywał poprawną wartość wynosiło średnio 0.9. We wszystkich obserwacjach alkohol miał największy wpływ na predykcje modelu i tylko w trzeciej obserwacji miał negatywny wpływ. Dodatkowo ważnymi zmiennymi były zawartość dwutlenku siarki (total sulfur dioxide), zawartość siarczynów (sulphates) i kwasowośc lotna (volatile acidity).
+ +explainer.predict_surrogate(X_train.iloc[23,:], type = "lime").show_in_notebook()
+
explainer.predict_surrogate(X_train.iloc[68,:], type = "lime").show_in_notebook()
+
print("Piąta obserwacja: predykcja = " + str(xgb_model.predict(X_train.iloc[[23]])[0])+", prawdziwa wartość = " + str(y_train.iloc[[23]].iat[0,0]))
+print("Szósta obserwacja: predykcja = " + str(xgb_model.predict(X_train.iloc[[68]])[0])+", prawdziwa wartość = " + str(y_train.iloc[[68]].iat[0,0]))
+
Piąta obserwacja: predykcja = 1, prawdziwa wartość = 0 +Szósta obserwacja: predykcja = 1, prawdziwa wartość = 0 ++
Następnie mamy obserwacje, gdzie model źle przewidział wartość zmiennej celu. Prawdopodobieństwo było przy tym prawie jednakowe dla obu możliwych wartości targetu. Świadczy to dobrze o naszym modelu, ponieważ nie przypisuje dużych prawdopodobieństw złym wartościom. Na pierwszą obserwacje pozytywnie wpłyneła bardzo wysoka zawartośc alkoholu i siarczynów, więc pomimo tego, że większośc zmiennych wskayzwała, że wino jest złe, zostało ono uznane za dobre. W drugiej obserwacji wpływy poszczególnych zmiennych były w większości małe oraz było dużo zmiennych zarówno o wpływie negatywnym jak i pozytywnym. Ciężko jest więc stwierdzić co dokładnie wpłyneło na niewłaściwą predykcje naszego modelu.
+ +\n", + " | fixed acidity | \n", + "volatile acidity | \n", + "citric acid | \n", + "residual sugar | \n", + "chlorides | \n", + "free sulfur dioxide | \n", + "total sulfur dioxide | \n", + "density | \n", + "pH | \n", + "sulphates | \n", + "alcohol | \n", + "
---|---|---|---|---|---|---|---|---|---|---|---|
1402 | \n", + "7.6 | \n", + "0.3 | \n", + "0.42 | \n", + "2.0 | \n", + "0.052 | \n", + "6.0 | \n", + "24.0 | \n", + "0.9963 | \n", + "3.44 | \n", + "0.82 | \n", + "11.9 | \n", + "