# 1.1 Struktura zbioru danych

Najpopularniejszym obecnie źródłem zbiorów danych jest repozytorium [UCI ML](https://archive.ics.uci.edu/ml/index.php). 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.

![](https://1302653387-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LAPTvpSUHjvdTxR-I8E%2F-LAPU4JemSqnxK3qhBvW%2F-LAPU7RWIwLLh90jQauM%2FZrzut%20ekranu%202018-03-20%20o%2008.46.52.png?generation=1524084028126740\&alt=media)

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.

![](https://1302653387-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LAPTvpSUHjvdTxR-I8E%2F-LAPU4JemSqnxK3qhBvW%2F-LAPU7RoB2Vy7mbQWNRM%2Firis.png?generation=1524084028191354\&alt=media)

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.

![](https://1302653387-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LAPTvpSUHjvdTxR-I8E%2F-LAPU4JemSqnxK3qhBvW%2F-LAPU7SUyMWWvjGWlHt_%2FZrzut%20ekranu%202018-03-20%20o%2008.52.17.png?generation=1524084028120679\&alt=media)

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`.

```python
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.

```python
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**.

```python
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`).

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

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

```python
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]]
```

```python
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.

```python
print(X.shape)
```

```
(150, 4)
```

```python
print y.shape
```

```
(150,)
```
