1.1 Struktura zbioru danych

Najpopularniejszym obecnie źródłem zbiorów danych jest repozytorium UCI ML. Założyli je, początkowo jako serwer FTP, jeszcze pod koniec lat 80. absolwenci Uniwersytetu Kalifornijskiego w Irvine.

Skorzystamy więc z niego, aby zdobyć zbiór Iris. Znajdziemy go na stronie głównej jako pierwszą na liście najczęściej odwiedzanych zbiorów danych.

Po odwiedzeniu strony zbioru zobaczymy jego opis, zadania w których jest przydatny, liczbę cech, instancji, opis parametrów i (zaznaczone na czerwono) łącze do pobrania.

Sam zbiór, w postaci pliku CSV, znajdziemy pod łączem do pliku iris.data. Nie ściągajmy go na dysk, a tylko skopiujmy hiperłącze do niego.

Tak przygotowani możemy wczytać zbiór w skrypcie w języku Python.

W pierwszej linijce importujemy moduł pandas, ułatwiający operacje na zbiorach danych, następnie odkładamy do zmiennej url znalezioną na UCI ML ścieżkę do pliku csv i wreszcie wczytujemy ramkę danych do zmiennej pd.

import pandas as pd

url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data'
df = pd.read_csv(url, header=None)

Tak wczytany zbiór możemy wyświetlić na ekranie.

print(df)
       0    1    2    3               4
0    5.1  3.5  1.4  0.2     Iris-setosa
1    4.9  3.0  1.4  0.2     Iris-setosa
2    4.7  3.2  1.3  0.2     Iris-setosa
..   ...  ...  ...  ...             ...
147  6.5  3.0  5.2  2.0  Iris-virginica
148  6.2  3.4  5.4  2.3  Iris-virginica
149  5.9  3.0  5.1  1.8  Iris-virginica

[150 rows x 5 columns]

Jak widać, we wczytanym zbiorze znajduje się sto pięćdziesiąt wierszy (wzorców, obiektów), każdy po pięć kolumn. Wyświetlmy pojedynczy wzorzec.

print(df.loc[0])
0 5.1
1 3.5
2 1.4
3 0.2
4 Iris-setosa
Name: 0, dtype: object

Zgodnie z opisem zbioru na stronie UCI, Pierwsze cztery elementy naszego obiektu są wektorem cech wzorca, a ostatni jego etykietą, którą będziemy mogli posłużyć się później w procesie uczenia naszego algorytmu rozpoznawania wzorców.

Cały zbiór danych możemy zatem podzielić na:

  • przestrzeń cech — zbiór wszystkich wektorów cech obiektów znajdujących się w zbiorze (zwyczajowo oznaczamy go przez X),

  • zbiór etykiet — zawierający etykiety dla obiektów znajdujących się w zbiorze (zwyczajowo oznaczamy go przez y).

Zwróć uwagę, że X jest wielkie, a y małe.

Dokonajmy więc podziału wczytanego zbioru danych na X i y. Zapiszemy je już nie jako ramki danych (tak nazywamy struktury obsługiwane przez pandas), a jako tablice numpy.

Do zmiennej data odkładamy za pośrednictwem atrybutu values tablicę numpy ze wszystkimi wartościami z ramki df. Tablice tego typu adresujemy podobnie jak robiliśmy to w języku Matlab. Adres podajemy w nawiasie kwadratowym, a po przecinkach wymieniamy pozycje w kolejnych wymiarach tablicy. Do zmiennej X przypisujemy więc wszystkie wiersze (:) i wszystkie kolumny poza ostatnią (:-1). Z kolei do zmiennej y przypisujemy wszystkie wiersze (:) ale tylko ostatnią kolumnę (-1).

data = df.values
X = data[:,:-1]
y = data[:,-1]

Wyświetlmy jeszcze naszą przestrzeń cech X i zbiór etykiet y.

print(X)
[[5.1 3.5 1.4 0.2]
 [4.9 3.0 1.4 0.2]
 [4.7 3.2 1.3 0.2]
 ...
 [6.5 3.0 5.2 2.0]
 [6.2 3.4 5.4 2.3]
 [5.9 3.0 5.1 1.8]]
print(y)
['Iris-setosa' 'Iris-setosa' 'Iris-setosa' ... 'Iris-virginica'
'Iris-virginica' 'Iris-virginica']

Warto zapamiętać, że każda tablica numpy zawiera parametr shape, który pozwala nam poznać jej wymiary przestrzenne. Widzimy dzięki temu, że nasza przestrzeń cech ma 150 wierszy po 4 kolumny, a zbiór etykiet, po prostu 150 elementów.

print(X.shape)
(150, 4)
print y.shape
(150,)

Last updated