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

![](/files/-LAPU7RWIwLLh90jQauM)

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.

![](/files/-LAPU7RoB2Vy7mbQWNRM)

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.

![](/files/-LAPU7SUyMWWvjGWlHt_)

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,)
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://kssk.gitbook.io/msi/1.-klasyfikacja-jako-przyklad-rozpoznawania-wzorcow/1.1-struktura-zbioru-danych.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
