+ - 0:00:00
Notes for current slide
Notes for next slide

Metody przetwarzania
i analizy danych

Dane

© Łukasz Wawrowski

1 / 26

Zbiór danych

German credit data

  1. Age (numeric)
  2. Sex (text: male, female)
  3. Job (numeric: 0 - unskilled and non-resident, 1 - unskilled and resident, 2 - skilled, 3 - highly skilled)
  4. Housing (text: own, rent, or free)
  5. Saving accounts (text - little, moderate, quite rich, rich)
  6. Checking account (text, little, moderate, rich)
  7. Credit amount (numeric, in DM)
  8. Duration (numeric, in month)
  9. Purpose (text: car, furniture/equipment, radio/TV, domestic appliances.. and so on...)
  10. Risk (text: good/bad): it's our Target Variable, describes if client paid or didn't pay loan
2 / 26

Zmienna objaśniana vs. zmienne objaśniające

Zmienna objaśniana/zależna/decyzyjna (ang. dependent variable, target, ground truth, y) np. czy klient spłaci kredyt, jaka jest cena mieszkania.

  • To wynik, który chcemy przewidzieć lub wyjaśnić.

  • Zależy od innych zmiennych.

Zmienne objaśniające/niezależne/warunkowe (ang. independent variables, features, X) np. wiek, dochód, liczba dzieci.

  • To czynniki, które wpływają na zmienną objaśnianą.

  • Cechy wejściowe modelu.

3 / 26

Zmienna objaśniana vs. zmienne objaśniające

Zmienna objaśniana/zależna/decyzyjna (ang. dependent variable, target, ground truth, y) np. czy klient spłaci kredyt, jaka jest cena mieszkania.

  • To wynik, który chcemy przewidzieć lub wyjaśnić.

  • Zależy od innych zmiennych.

Zmienne objaśniające/niezależne/warunkowe (ang. independent variables, features, X) np. wiek, dochód, liczba dzieci.

  • To czynniki, które wpływają na zmienną objaśnianą.

  • Cechy wejściowe modelu.

y=f(X)

3 / 26

Dane

Dane surowe (raw data) bez odpowiedniego przygotowania nie będą się nadawać do zastosowania w uczeniu maszynowym.

4 / 26

Czyszczenie danych

  • czyszczenie nazw kolumn

  • usuwanie lub uzupełnianie braków danych

  • usuwanie wartości odstających

  • usuwanie duplikatów

  • ujednolicanie lub grupowanie kategorii

5 / 26

Przetwarzanie danych

  • konwersja typów danych

  • kodowanie danych kategorycznych (one-hot-encoding)

  • normalizacja wartości numerycznych

  • tworzenie nowych cech (feature engineering)

  • podział zbioru

6 / 26

Czyszczenie nazw kolumn

Natywny python

df.columns = (
df.columns
.str.strip() # usuń spacje
.str.lower() # małe litery
.str.replace(' ', '_') # spacje na podkreślniki
.str.replace(r'[^\w]', '', regex=True) # usuwanie znaków specjalnych
)

Pakiet pyjanitor

from janitor import clean_names
df = df.clean_names()
7 / 26

Braki danych

Możliwe rozwiązania

  • usunięcie obserwacji z brakami danych

  • imputacja statystyczna:

    • metody deterministyczne - zawsze te same wartości imputacyjne:

      • zastępowanie wartością przeciętną, imputacja regresyjna,
      • nie wprowadzają dodatkowego źródła błędu losowego,
      • zniekształcają rozkłady zmiennych
    • metody stochastyczne - można uzyskać różne wartości imputacyjne:

      • metoda hot-deck, stochastyczna imputacja regresyjna,
      • generują dodatkowy błąd,
      • lepiej zachowują rozkłady zmiennych

Tomasz Piasecki - Imputacja dochodów w badaniach statystyki publicznej dotyczących gospodarstw domowych

8 / 26
02:00

Pytanie do słuchaczy

Jaka statystyka najlepiej uzupełni braki w przypadku cechy numerycznej?

https://pollev.com/lukaszw470

9 / 26

Zastępowanie wybraną wartością

Funkcja fillna() zastępuje braki danych wskazaną wartością.

df['num_var'] = df['num_var'].fillna(df['num_var'].median()[0])
df['cat_var'] = df['cat_var'].fillna(df['cat_var'].mode()[0])
10 / 26

scikit-learn - biblioteka do ML

Jeden z najważniejszych pakietów w Pythonie dla analizy i modelowania danych

  • preprocessing danych (skalowanie, kodowanie, imputacja)

  • podział na zbiór treningowy/testowy

  • modele klasyfikacji, regresji, klasteryzacji

  • walidacja krzyżowa i metryki oceny modelu

Dokumentacja: https://scikit-learn.org/

11 / 26

Moduł sklearn.impute

  • SimpleImputer: proste strategie: średnia, mediana, najczęstsza wartość

  • KNNImputer: imputacja na podstawie najbliższych sąsiadów

  • IterativeImputer: zaawansowana iteracyjna imputacja (np. z regresją)

  • MissingIndicator: dodaje kolumny informujące o brakach

Wybrane algorytmy ML radzą się z obecnością braków danych.

Dokumentacja: https://scikit-learn.org/stable/modules/impute.html

12 / 26

Fit i transform

Kluczowe metody w preprocessingu z wykorzystaniem pakietu scikit-learn

  • fit() - analizuje dane wejściowe i zapamiętuje parametry przekształcenia

  • transform() - wykorzystuje zapamiętane parametry z fit() i przekształca dane

  • fit_transform() - wygodne połączenie fit() + transform() często stosowane na zbiorze treningowym

Nigdy nie używamy fit() na danych testowych, wyłącznie transform().

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test) # tylko transform!
13 / 26

SimpleImputer

Prosta imputacja medianą

from sklearn.impute import SimpleImputer
imputer = SimpleImputer(strategy='median')
df[['num_var']] = imputer.fit_transform(df[['num_var']])
14 / 26

KNNImputer

Uzupełnia brakujące dane na podstawie podobieństwa do innych rekordów. Dla każdej brakującej obserwacji: znajduje K najbliższych sąsiadów i wstawia średnią (ważoną) z tych wartości.

from sklearn.impute import KNNImputer
knn_imputer = KNNImputer(n_neighbors=5)
df[['num_var']] = knn_imputer.fit_transform(df[['num_var']])
15 / 26
05:00

Zadanie dla słuchaczy

Porównaj rozkład cechy checking_account z wykorzystaniem obu przedstawionych metod.

16 / 26

Wartości odstające

Wykres pudełkowy i metoda IQR (interquartile range)

Q1 = df['num_var'].quantile(0.25)
Q3 = df['num_var'].quantile(0.75)
IQR = Q3 - Q1
# Granice
dolna = Q1 - 1.5 * IQR
górna = Q3 + 1.5 * IQR
# Usunięcie outlierów
df_clean = df[(df['num_var'] >= dolna) & (df['num_var'] <= górna)]

Usunięcie 1% lub 5% największych i najmniejszych wartości.

17 / 26

Usuwanie duplikatów

Funkcja drop_duplicates() usuwa duplikaty ze zbioru danych.

W argumencie subset można podać kolumny, które mają być brane pod uwagę w analizie duplikatów. Domyślnie uwzględniane są wszystkie kolumny.

18 / 26

Feature Engineering

Proces modyfikowania, przekształcania lub tworzenia nowych zmiennych (cech), które lepiej opisują dane i ułatwiają modelowi naukę.

Przykłady:

  • Ekstrakcja informacji np. z dat: rok, miesiąc, dzień tygodnia

  • Grupowanie wartości np. przedziały wiekowe (18–25, 26–40, itd.)

  • Tworzenie nowych cech np. BMI = waga / wzrost$^2$

  • Agregacje np. średni dochód na klienta

  • Transformacje np. logarytmy, standaryzacja

19 / 26
05:00

Pytanie do słuchaczy

Jakie nowe cechy można zaproponować dla zbioru credit?

https://pollev.com/lukaszw470

20 / 26

Kodowanie zmiennych kategorycznych

One-Hot Encoding: zamiana wartości kategorycznych na kolumny binarne.

  • tworzy nową kolumnę dla każdej unikalnej wartości w zmiennej kategorycznej

  • wartość 1 oznacza obecność danej kategorii, 0 – jej brak

df = pd.DataFrame({'płeć': ['kobieta', 'mężczyzna', 'kobieta']})
df_encoded = pd.get_dummies(df, columns=['płeć'])
płeć_kobieta płeć_mężczyzna
0 1 0
1 0 1
2 1 0

W module sklearn.preprocessing jest OneHotEncoder.

21 / 26

Normalizacja cech

Modele oparte na odległościach (np. KNN, SVM) są wrażliwe na skalę cech. Zastosowanie normalizacji sprawia, że wszystkie cechy mają porównywalną skalę oraz przyspiesza i poprawia jakość uczenia modeli.

  • StandardScaler: przekształca cechy do rozkładu o średniej = 0 i odchyleniu standardowym = 1

  • MinMaxScaler: skaluje wartości do zakresu [0, 1]

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
22 / 26

Kodowanie etykiet

Interfejs modeli pakietu scikit-learn wymaga zakodowania zmiennej decyzyjnej jako wartości liczbowych.

LabelEncoder przekształca napisy/kategorie w liczby całkowite i każdej unikalnej wartości przypisuje unikalny numer.

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
y = ['dobry', 'zły', 'dobry', 'dobry', 'zły']
y_encoded = le.fit_transform(y)
23 / 26

Podział danych

  • dane uczące (treningowe) - zbiór przykładów używanych do dopasowania parametrów algorytmu

  • dane testowe - niezależny od danych uczących zbiór przykładów o takim samym rozkładzie jak dane uczące

  • dane walidacyjne - zbiór przykładów używanych do dopasowania hiperparametrów

Często nazewnictwo danych testowych i walidacyjnych jest mylone.

Wikipedia

24 / 26

Podział zbioru na treningowy i testowy

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)
25 / 26

Pytania?

26 / 26

Zbiór danych

German credit data

  1. Age (numeric)
  2. Sex (text: male, female)
  3. Job (numeric: 0 - unskilled and non-resident, 1 - unskilled and resident, 2 - skilled, 3 - highly skilled)
  4. Housing (text: own, rent, or free)
  5. Saving accounts (text - little, moderate, quite rich, rich)
  6. Checking account (text, little, moderate, rich)
  7. Credit amount (numeric, in DM)
  8. Duration (numeric, in month)
  9. Purpose (text: car, furniture/equipment, radio/TV, domestic appliances.. and so on...)
  10. Risk (text: good/bad): it's our Target Variable, describes if client paid or didn't pay loan
2 / 26
Paused

Help

Keyboard shortcuts

, , Pg Up, k Go to previous slide
, , Pg Dn, Space, j Go to next slide
Home Go to first slide
End Go to last slide
Number + Return Go to specific slide
b / m / f Toggle blackout / mirrored / fullscreen mode
c Clone slideshow
p Toggle presenter mode
t Restart the presentation timer
?, h Toggle this help
Esc Back to slideshow