425 KiB
Inżynieria uczenia maszynowego
2. Dane [laboratoria]
Tomasz Ziętkiewicz (2023)
Plan na dzisiaj
- Motywacja
- Podział danych
- Skąd wziąć dane?
- Przygotowanie danych
- Zadanie
Motywacja
- Zasada "Garbage in - garbage out"
- Im lepszej jakości dane - tym lepszy model
- Najlepsza architektura, najpotężniejsze zasoby obliczeniowe i najbardziej wyrafinowane metody nie pomogą, jeśli dane użyte do rozwoju modelu nie odpowiadają tym, z którymi będzie on używany, albo jeśli w danych nie będzie żadnych zależności
- Możemy stracić dużo czasu, energii i zasobów optymalizując nasz model w złym kierunku, jeśli dane są źle dobrane
Źródła danych
- Gotowe zbiory:
- Otwarte wyzwania (challenge)
- Repozytoria otwartych zbiorów danych
- Dane udostępniane przez firmy
- Repozytoria zbiorów komercyjnych
- Dane wewnętrzne (np. firmy)
Źródła danych
- Tworzenie danych:
- Generowanie syntetyczne
- np. generowanie korpusów mowy za pomocą TTS (syntezy mowy)
- Crowdsourcing
- Data scrapping
Otwarte wyzwania (shared task / challenge)
- Kaggle: https://www.kaggle.com/datasets
- Gonito: https://gonito.net/list-challenges - polski (+poznański +z UAM) Kaggle
- Semeval: https://semeval.github.io/ - zadania z semantyki
- Poleval: http://poleval.pl/ - przetwarzanie języka polskiego
- WMT http://www.statmt.org/wmt20/ (tłumaczenie maszynowe)
- IWSLT https://iwslt.org/2021/#shared-tasks (tłumaczenie mowy)
- CNLPS - Challenges for Natural Language Processing - https://fedcsis.org/sessions/aaia/cnlps
Repozytoria/wyszukiwarki otwartych zbiorów danych
- Huggingface Datasets: https://huggingface.co/datasets
- Papers with code: https://paperswithcode.com/datasets
- UCI Machine Learning Repository: https://archive.ics.uci.edu/ml/ (University of California)
- Google dataset search: https://datasetsearch.research.google.com/
- Zbiory google:https://research.google/tools/datasets/
- Otwarte zbiory na Amazon AWS: https://registry.opendata.aws/
Otwarte zbiory
- Rozpoznawanie mowy:
- https://www.openslr.org/ - Libri Speech, TED Lium
- Mozilla Open Voice: https://commonvoice.mozilla.org/
- NLP:
- Clarin: https://clarin-pl.eu/index.php/zasoby/
- NKJP: http://nkjp.pl/
Crowdsourcing
Źródło: https://pl.wikipedia.org/wiki/ReCAPTCHA#/media/Plik:ReCAPTCHA_idea.jpg
- Amazon Mechanical Turk: https://www.mturk.com/
Źródło: https://en.wikipedia.org/wiki/Mechanical_Turk#/media/File:Tuerkischer_schachspieler_windisch4.jpg
Licencje
- Przed podjęciem decyzji o użyciu danego zbioru koniecznie sprawdź jego licencję!
- Wiele dostępnych w internecie zbiorów jest udostępniana na podstawie otwartych licencji
- Zazwyczaj jednak ich użycie wymaga spełnienia pewnych warunków, np. podania źródła
- Wiele ogólnie dostępnych zbiorów nie może być jednak użytych za darmo w celach komercyjnych!
- Niektóre z nich mogą nawet powodować, że praca pochodna, która zostanie stworzona z ich wykorzystaniem, będzie musiała być udostępniona na tej samej licencji (GPL). Jest to "niebezpieczeństwo" w przypadku wykorzystania zasobów przez firmę komercyjną!
- Zasady działania licencji CC: https://creativecommons.pl/
- Najbardziej popularne licencje:
- Przyjazne również w zastosowaniach komercyjnych: MIT, BSD, Appache, CC (bez dopisku NC)
- GPL (GNU Public License) - "zaraźliwa" licencja Open Source
Przykład
Za pomocą standardowych narzędzi bash dokonamy wstępnej inspekcji i podziału danych
Jako przykładu użyjemy klasycznego zbioru IRIS: https://archive.ics.uci.edu/ml/datasets/Iris
Zbiór zawiera dane dotyczące długości i szerokości płatków kwiatowych trzech gatunków irysa:
Iris Setosa
Iris Versicolour
Iris Virginica
Źródło: https://www.kaggle.com/vinayshaw/iris-species-100-accuracy-using-naive-bayes
Licencja: Apache 2.0
Pobranie danych
Pobieranie z Kaggle
#Zainstalujmy potrzebne biblioteki
!pip install --user kaggle #API Kaggle, do pobrania zbioru
!pip install --user pandas
Collecting kaggle Downloading kaggle-1.5.13.tar.gz (63 kB) [K |████████████████████████████████| 63 kB 558 kB/s eta 0:00:01 [?25hRequirement already satisfied: six>=1.10 in /home/tomek/miniconda3/lib/python3.9/site-packages (from kaggle) (1.16.0) Requirement already satisfied: certifi in /home/tomek/miniconda3/lib/python3.9/site-packages (from kaggle) (2022.12.7) Requirement already satisfied: python-dateutil in /home/tomek/miniconda3/lib/python3.9/site-packages (from kaggle) (2.8.2) Requirement already satisfied: requests in /home/tomek/miniconda3/lib/python3.9/site-packages (from kaggle) (2.27.1) Requirement already satisfied: tqdm in /home/tomek/miniconda3/lib/python3.9/site-packages (from kaggle) (4.64.0) Collecting python-slugify Downloading python_slugify-8.0.1-py2.py3-none-any.whl (9.7 kB) Requirement already satisfied: urllib3 in /home/tomek/miniconda3/lib/python3.9/site-packages (from kaggle) (1.26.9) Collecting text-unidecode>=1.3 Using cached text_unidecode-1.3-py2.py3-none-any.whl (78 kB) Requirement already satisfied: idna<4,>=2.5 in /home/tomek/miniconda3/lib/python3.9/site-packages (from requests->kaggle) (3.3) Requirement already satisfied: charset-normalizer~=2.0.0 in /home/tomek/miniconda3/lib/python3.9/site-packages (from requests->kaggle) (2.0.4) Building wheels for collected packages: kaggle Building wheel for kaggle (setup.py) ... [?25ldone [?25h Created wheel for kaggle: filename=kaggle-1.5.13-py3-none-any.whl size=77733 sha256=83eee49596c7c76816c3bb9e8ffc0763b25e336457881b9790b9620548ae7297 Stored in directory: /home/tomek/.cache/pip/wheels/9c/45/15/6d6d116cd2539fb8f450d64b0aee4a480e5366bb11b42ac763 Successfully built kaggle Installing collected packages: text-unidecode, python-slugify, kaggle Successfully installed kaggle-1.5.13 python-slugify-8.0.1 text-unidecode-1.3 Requirement already satisfied: pandas in /home/tomek/miniconda3/lib/python3.9/site-packages (1.5.3) Requirement already satisfied: numpy>=1.20.3 in /home/tomek/miniconda3/lib/python3.9/site-packages (from pandas) (1.24.2) Requirement already satisfied: pytz>=2020.1 in /home/tomek/miniconda3/lib/python3.9/site-packages (from pandas) (2022.7.1) Requirement already satisfied: python-dateutil>=2.8.1 in /home/tomek/miniconda3/lib/python3.9/site-packages (from pandas) (2.8.2) Requirement already satisfied: six>=1.5 in /home/tomek/miniconda3/lib/python3.9/site-packages (from python-dateutil>=2.8.1->pandas) (1.16.0)
- Pobierzemy zbiór Iris z Kaggle: https://www.kaggle.com/uciml/iris
- Licencja to "Public Domain", więc możemy z niego korzystać bez ograniczeń.
# Żeby poniższa komenda zadziałała, musisz posiadać plik ~/.kaggle/kaggle.json, zawierający Kaggle API token.
# Instrukcje: https://www.kaggle.com/docs/api
!kaggle datasets download -d uciml/iris
Downloading iris.zip to /home/tomek/repos/aitech-ium 0%| | 0.00/3.60k [00:00<?, ?B/s] 100%|███████████████████████████████████████| 3.60k/3.60k [00:00<00:00, 438kB/s]
!unzip -o iris.zip
Archive: iris.zip inflating: Iris.csv inflating: database.sqlite
Inspekcja
- Zanim zaczniemy trenować model na danych, powinniśmy poznać ich specyfikę
- Pozwoli nam to:
- usunąć lub naprawić nieprawidłowe przykłady
- dokonać selekcji cech, których użyjemy w naszym modelu
- wybrać odpowiedni algorytm uczenia
- podjąć dezycję dotyczącą podziału zbioru i ewentualnej normalizacji
Podstawowa inspekcja za pomocą narzędzi Bash
!wc -l Iris.csv
151 Iris.csv
!head -n 5 Iris.csv
Id,SepalLengthCm,SepalWidthCm,PetalLengthCm,PetalWidthCm,Species 1,5.1,3.5,1.4,0.2,Iris-setosa 2,4.9,3.0,1.4,0.2,Iris-setosa 3,4.7,3.2,1.3,0.2,Iris-setosa 4,4.6,3.1,1.5,0.2,Iris-setosa
less Iris.csv
Inspekcja
- Do inspekcji danych użyjemy popularnej biblioteki pythonowej Pandas: https://pandas.pydata.org/
- Do wizualizacji użyjemy biblioteki Seaborn: https://seaborn.pydata.org/index.html
- Służy ona do analizy i operowania na danych tabelarycznych jak i szeregach czasowych
!pip install --user pandas
!pip install --user seaborn
Requirement already satisfied: pandas in /home/tomek/miniconda3/lib/python3.9/site-packages (1.5.3) Requirement already satisfied: python-dateutil>=2.8.1 in /home/tomek/miniconda3/lib/python3.9/site-packages (from pandas) (2.8.2) Requirement already satisfied: pytz>=2020.1 in /home/tomek/miniconda3/lib/python3.9/site-packages (from pandas) (2022.7.1) Requirement already satisfied: numpy>=1.20.3 in /home/tomek/miniconda3/lib/python3.9/site-packages (from pandas) (1.24.2) Requirement already satisfied: six>=1.5 in /home/tomek/miniconda3/lib/python3.9/site-packages (from python-dateutil>=2.8.1->pandas) (1.16.0) Collecting seaborn Downloading seaborn-0.12.2-py3-none-any.whl (293 kB) [K |████████████████████████████████| 293 kB 694 kB/s eta 0:00:01 [?25hCollecting matplotlib!=3.6.1,>=3.1 Downloading matplotlib-3.7.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (11.6 MB) [K |████████████████████████████████| 11.6 MB 253 kB/s eta 0:00:01 |██████▊ | 2.4 MB 396 kB/s eta 0:00:24 [?25hRequirement already satisfied: pandas>=0.25 in /home/tomek/miniconda3/lib/python3.9/site-packages (from seaborn) (1.5.3) Requirement already satisfied: numpy!=1.24.0,>=1.17 in /home/tomek/miniconda3/lib/python3.9/site-packages (from seaborn) (1.24.2) Requirement already satisfied: packaging>=20.0 in /home/tomek/miniconda3/lib/python3.9/site-packages (from matplotlib!=3.6.1,>=3.1->seaborn) (23.0) Requirement already satisfied: python-dateutil>=2.7 in /home/tomek/miniconda3/lib/python3.9/site-packages (from matplotlib!=3.6.1,>=3.1->seaborn) (2.8.2) Requirement already satisfied: importlib-resources>=3.2.0 in /home/tomek/miniconda3/lib/python3.9/site-packages (from matplotlib!=3.6.1,>=3.1->seaborn) (5.12.0) Collecting contourpy>=1.0.1 Downloading contourpy-1.0.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (299 kB) [K |████████████████████████████████| 299 kB 613 kB/s eta 0:00:01 [?25hCollecting pyparsing>=2.3.1 Using cached pyparsing-3.0.9-py3-none-any.whl (98 kB) Collecting fonttools>=4.22.0 Downloading fonttools-4.39.0-py3-none-any.whl (1.0 MB) [K |████████████████████████████████| 1.0 MB 556 kB/s eta 0:00:01 [?25hCollecting cycler>=0.10 Downloading cycler-0.11.0-py3-none-any.whl (6.4 kB) Collecting pillow>=6.2.0 Downloading Pillow-9.4.0-cp39-cp39-manylinux_2_28_x86_64.whl (3.4 MB) [K |████████████████████████████████| 3.4 MB 664 kB/s eta 0:00:01 [?25hCollecting kiwisolver>=1.0.1 Downloading kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (1.6 MB) [K |████████████████████████████████| 1.6 MB 1.0 MB/s eta 0:00:01 [?25hRequirement already satisfied: zipp>=3.1.0 in /home/tomek/miniconda3/lib/python3.9/site-packages (from importlib-resources>=3.2.0->matplotlib!=3.6.1,>=3.1->seaborn) (3.15.0) Requirement already satisfied: pytz>=2020.1 in /home/tomek/miniconda3/lib/python3.9/site-packages (from pandas>=0.25->seaborn) (2022.7.1) Requirement already satisfied: six>=1.5 in /home/tomek/miniconda3/lib/python3.9/site-packages (from python-dateutil>=2.7->matplotlib!=3.6.1,>=3.1->seaborn) (1.16.0) Installing collected packages: pyparsing, pillow, kiwisolver, fonttools, cycler, contourpy, matplotlib, seaborn Successfully installed contourpy-1.0.7 cycler-0.11.0 fonttools-4.39.0 kiwisolver-1.4.4 matplotlib-3.7.1 pillow-9.4.0 pyparsing-3.0.9 seaborn-0.12.2
import pandas as pd
iris=pd.read_csv('Iris.csv')
iris
Id | SepalLengthCm | SepalWidthCm | PetalLengthCm | PetalWidthCm | Species | |
---|---|---|---|---|---|---|
0 | 1 | 5.1 | 3.5 | 1.4 | 0.2 | Iris-setosa |
1 | 2 | 4.9 | 3.0 | 1.4 | 0.2 | Iris-setosa |
2 | 3 | 4.7 | 3.2 | 1.3 | 0.2 | Iris-setosa |
3 | 4 | 4.6 | 3.1 | 1.5 | 0.2 | Iris-setosa |
4 | 5 | 5.0 | 3.6 | 1.4 | 0.2 | Iris-setosa |
... | ... | ... | ... | ... | ... | ... |
145 | 146 | 6.7 | 3.0 | 5.2 | 2.3 | Iris-virginica |
146 | 147 | 6.3 | 2.5 | 5.0 | 1.9 | Iris-virginica |
147 | 148 | 6.5 | 3.0 | 5.2 | 2.0 | Iris-virginica |
148 | 149 | 6.2 | 3.4 | 5.4 | 2.3 | Iris-virginica |
149 | 150 | 5.9 | 3.0 | 5.1 | 1.8 | Iris-virginica |
150 rows × 6 columns
iris.describe(include='all')
Id | SepalLengthCm | SepalWidthCm | PetalLengthCm | PetalWidthCm | Species | |
---|---|---|---|---|---|---|
count | 150.000000 | 150.000000 | 150.000000 | 150.000000 | 150.000000 | 150 |
unique | NaN | NaN | NaN | NaN | NaN | 3 |
top | NaN | NaN | NaN | NaN | NaN | Iris-virginica |
freq | NaN | NaN | NaN | NaN | NaN | 50 |
mean | 75.500000 | 5.843333 | 3.054000 | 3.758667 | 1.198667 | NaN |
std | 43.445368 | 0.828066 | 0.433594 | 1.764420 | 0.763161 | NaN |
min | 1.000000 | 4.300000 | 2.000000 | 1.000000 | 0.100000 | NaN |
25% | 38.250000 | 5.100000 | 2.800000 | 1.600000 | 0.300000 | NaN |
50% | 75.500000 | 5.800000 | 3.000000 | 4.350000 | 1.300000 | NaN |
75% | 112.750000 | 6.400000 | 3.300000 | 5.100000 | 1.800000 | NaN |
max | 150.000000 | 7.900000 | 4.400000 | 6.900000 | 2.500000 | NaN |
iris["Species"].value_counts()
Iris-virginica 50 Iris-setosa 50 Iris-versicolor 50 Name: Species, dtype: int64
iris["Species"].value_counts().plot(kind="bar")
<AxesSubplot:>
iris[["Species","PetalLengthCm"]].groupby("Species").mean()
PetalLengthCm | |
---|---|
Species | |
Iris-setosa | 1.464 |
Iris-versicolor | 4.260 |
Iris-virginica | 5.552 |
iris[["Species","PetalLengthCm"]].groupby("Species").mean().plot(kind="bar")
<AxesSubplot:xlabel='Species'>
import seaborn as sns
sns.set_theme()
sns.relplot(data=iris, x="PetalLengthCm", y="PetalWidthCm", hue="Species")
sns.relplot(data=iris, x="SepalLengthCm", y="SepalWidthCm", hue="Species")
<seaborn.axisgrid.FacetGrid at 0x7f97eed545b0>
irisv = iris[iris["Species"] != "Iris-setosa"]
sns.relplot(data=irisv, x="SepalLengthCm", y="SepalWidthCm", hue="Species")
<seaborn.axisgrid.FacetGrid at 0x7f97ef942eb0>
sns.pairplot(data=iris.drop(columns=["Id"]), hue="Species")
<seaborn.axisgrid.PairGrid at 0x7f97f2ad3550>
Pobieranie z HuggingFace 🤗 Datasets
- Szukamy na https://huggingface.co/datasets/
- Klikamy w "</> Use in datasets library" i kopiujemy kod
- Instalujemy bibliotekę datasets
#Instalujemy bibliotekę datasets
!python -m pip install datasets
Collecting datasets Downloading datasets-2.10.1-py3-none-any.whl (469 kB) [K |████████████████████████████████| 469 kB 683 kB/s eta 0:00:01 [?25hCollecting responses<0.19 Downloading responses-0.18.0-py3-none-any.whl (38 kB) Collecting xxhash Downloading xxhash-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (212 kB) [K |████████████████████████████████| 212 kB 866 kB/s eta 0:00:01 [?25hCollecting pyarrow>=6.0.0 Downloading pyarrow-11.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (34.9 MB) [K |████████████████████████████████| 34.9 MB 956 kB/s eta 0:00:01 [?25hRequirement already satisfied: numpy>=1.17 in /home/tomek/miniconda3/lib/python3.9/site-packages (from datasets) (1.24.2) Requirement already satisfied: requests>=2.19.0 in /home/tomek/miniconda3/lib/python3.9/site-packages (from datasets) (2.27.1) Collecting aiohttp Downloading aiohttp-3.8.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.0 MB) [K |████████████████████████████████| 1.0 MB 859 kB/s eta 0:00:01 [?25hCollecting pyyaml>=5.1 Downloading PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (661 kB) [K |████████████████████████████████| 661 kB 857 kB/s eta 0:00:01 [?25hCollecting huggingface-hub<1.0.0,>=0.2.0 Downloading huggingface_hub-0.13.2-py3-none-any.whl (199 kB) [K |████████████████████████████████| 199 kB 866 kB/s eta 0:00:01 [?25hRequirement already satisfied: packaging in /home/tomek/miniconda3/lib/python3.9/site-packages (from datasets) (23.0) Collecting multiprocess Downloading multiprocess-0.70.14-py39-none-any.whl (132 kB) [K |████████████████████████████████| 132 kB 1.0 MB/s eta 0:00:01 [?25hRequirement already satisfied: tqdm>=4.62.1 in /home/tomek/miniconda3/lib/python3.9/site-packages (from datasets) (4.64.0) Requirement already satisfied: pandas in /home/tomek/miniconda3/lib/python3.9/site-packages (from datasets) (1.5.3) Collecting fsspec[http]>=2021.11.1 Downloading fsspec-2023.3.0-py3-none-any.whl (145 kB) [K |████████████████████████████████| 145 kB 1.0 MB/s eta 0:00:01 [?25hCollecting dill<0.3.7,>=0.3.0 Downloading dill-0.3.6-py3-none-any.whl (110 kB) [K |████████████████████████████████| 110 kB 772 kB/s eta 0:00:01 [?25hRequirement already satisfied: attrs>=17.3.0 in /home/tomek/miniconda3/lib/python3.9/site-packages (from aiohttp->datasets) (22.2.0) Collecting async-timeout<5.0,>=4.0.0a3 Using cached async_timeout-4.0.2-py3-none-any.whl (5.8 kB) Collecting aiosignal>=1.1.2 Downloading aiosignal-1.3.1-py3-none-any.whl (7.6 kB) Collecting yarl<2.0,>=1.0 Downloading yarl-1.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (264 kB) [K |████████████████████████████████| 264 kB 1.1 MB/s eta 0:00:01 [?25hCollecting frozenlist>=1.1.1 Downloading frozenlist-1.3.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (158 kB) [K |████████████████████████████████| 158 kB 1.2 MB/s eta 0:00:01 [?25hCollecting multidict<7.0,>=4.5 Downloading multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (114 kB) [K |████████████████████████████████| 114 kB 997 kB/s eta 0:00:01 [?25hRequirement already satisfied: charset-normalizer<4.0,>=2.0 in /home/tomek/miniconda3/lib/python3.9/site-packages (from aiohttp->datasets) (2.0.4) Requirement already satisfied: typing-extensions>=3.7.4.3 in /home/tomek/miniconda3/lib/python3.9/site-packages (from huggingface-hub<1.0.0,>=0.2.0->datasets) (4.5.0) Collecting filelock Downloading filelock-3.9.1-py3-none-any.whl (9.7 kB) Requirement already satisfied: urllib3<1.27,>=1.21.1 in /home/tomek/miniconda3/lib/python3.9/site-packages (from requests>=2.19.0->datasets) (1.26.9) Requirement already satisfied: certifi>=2017.4.17 in /home/tomek/miniconda3/lib/python3.9/site-packages (from requests>=2.19.0->datasets) (2022.12.7) Requirement already satisfied: idna<4,>=2.5 in /home/tomek/miniconda3/lib/python3.9/site-packages (from requests>=2.19.0->datasets) (3.3) Requirement already satisfied: python-dateutil>=2.8.1 in /home/tomek/miniconda3/lib/python3.9/site-packages (from pandas->datasets) (2.8.2) Requirement already satisfied: pytz>=2020.1 in /home/tomek/miniconda3/lib/python3.9/site-packages (from pandas->datasets) (2022.7.1) Requirement already satisfied: six>=1.5 in /home/tomek/miniconda3/lib/python3.9/site-packages (from python-dateutil>=2.8.1->pandas->datasets) (1.16.0) Installing collected packages: multidict, frozenlist, yarl, async-timeout, aiosignal, pyyaml, fsspec, filelock, dill, aiohttp, xxhash, responses, pyarrow, multiprocess, huggingface-hub, datasets Successfully installed aiohttp-3.8.4 aiosignal-1.3.1 async-timeout-4.0.2 datasets-2.10.1 dill-0.3.6 filelock-3.9.1 frozenlist-1.3.3 fsspec-2023.3.0 huggingface-hub-0.13.2 multidict-6.0.4 multiprocess-0.70.14 pyarrow-11.0.0 pyyaml-6.0 responses-0.18.0 xxhash-3.2.0 yarl-1.8.2
from datasets import load_dataset
iris_dataset = load_dataset("scikit-learn/iris")
Found cached dataset csv (/home/tomek/.cache/huggingface/datasets/scikit-learn___csv/scikit-learn--iris-4e13227f45447466/0.0.0/6b34fb8fcf56f7c8ba51dc895bfa2bfbe43546f190a60fcf74bb5e8afdcc2317) 100%|██████████| 1/1 [00:00<00:00, 268.64it/s]
iris_dataset
DatasetDict({ train: Dataset({ features: ['Id', 'SepalLengthCm', 'SepalWidthCm', 'PetalLengthCm', 'PetalWidthCm', 'Species'], num_rows: 150 }) })
iris_dataset["train"]
Dataset({ features: ['Id', 'SepalLengthCm', 'SepalWidthCm', 'PetalLengthCm', 'PetalWidthCm', 'Species'], num_rows: 150 })
iris_dataset["train"][0]
{'Id': 1, 'SepalLengthCm': 5.1, 'SepalWidthCm': 3.5, 'PetalLengthCm': 1.4, 'PetalWidthCm': 0.2, 'Species': 'Iris-setosa'}
pd.DataFrame(iris_dataset["train"])
Id | SepalLengthCm | SepalWidthCm | PetalLengthCm | PetalWidthCm | Species | |
---|---|---|---|---|---|---|
0 | 1 | 5.1 | 3.5 | 1.4 | 0.2 | Iris-setosa |
1 | 2 | 4.9 | 3.0 | 1.4 | 0.2 | Iris-setosa |
2 | 3 | 4.7 | 3.2 | 1.3 | 0.2 | Iris-setosa |
3 | 4 | 4.6 | 3.1 | 1.5 | 0.2 | Iris-setosa |
4 | 5 | 5.0 | 3.6 | 1.4 | 0.2 | Iris-setosa |
... | ... | ... | ... | ... | ... | ... |
145 | 146 | 6.7 | 3.0 | 5.2 | 2.3 | Iris-virginica |
146 | 147 | 6.3 | 2.5 | 5.0 | 1.9 | Iris-virginica |
147 | 148 | 6.5 | 3.0 | 5.2 | 2.0 | Iris-virginica |
148 | 149 | 6.2 | 3.4 | 5.4 | 2.3 | Iris-virginica |
149 | 150 | 5.9 | 3.0 | 5.1 | 1.8 | Iris-virginica |
150 rows × 6 columns
Podział danych
Zbiór trenujący ("training set")
- Służy do dopasowania parametrów modelu (np. wag w sieci neuronowej).
- Podczas trenowania algorytm minimalizuje funkcję kosztu obliczoną na zbiorze treningowym
Zbiór walidujący/walidacyjny ("validation set" aka. "dev set")
- Służy do porównania modeli powstałych przy użyciu różnych hiperparametrów (np. architektura sieci, ilość iteracji trenowania)
- Pomaga uniknąć przetrenowania (overfitting) modelu na zbiorze trenującym poprzez zastosowanie tzw. early stopping
Zbiór testujący ("test set")
- Służy do ewaluacji finalnego modelu wybranego/wytrenowanego za pomocą zbiorów trenującego i walidującego
Podział danych
- Zbiory trenujący, walidacyjny i testowy powinny być niezależne, ale pochodzić z tego samego rozkładu
- W przypadku klasyfikacji, rozkład klas w zbiorach powinien być zbliżony
- Bardzo istotne jest to, żeby zbiory walidujący i testujący dobrze odzwierciedlały nasze cele biznesowe i rzeczywiste dane, na których będzie działał nasz model
Metody podziału:
- Skorzystać z gotowego podziału danych :)
- Jeśli dzielimy zbiór sami:
- "Klasyczne" podejście: proporcja Train:Dev:Test 6:2:2 lub 8:1:1
- Uczenie głębokie:
- metody "głębokie" mają bardzo duże zapotrzebowanie na dane, zbiory rzędu > 1 000 000 przykładów
- Załóżmy, że cały zbiór ma 1 000 000 przykładów
- wielkości zbiorów dev i test ustalamy bezwzględnie, np. na 1000 albo 10 000 przykładów
- 10 000 przykładów to (wystarczająco) dużo, choć stanowi jedynie 1% z całego zbioru
- szkoda "marnować" dodatkowe 180 000 przykładów na zbiory testujące i walidacyjne, lepiej mieć większy zbiór trenujący
Przykładowy podział z pomocą standardowych narzędzi Bash
# Pobierzmy plik ze zbiorem z repozytorium
!cd IUM_02; wget -c https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data
--2021-03-15 11:16:36-- https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data Resolving archive.ics.uci.edu (archive.ics.uci.edu)... 128.195.10.252 Connecting to archive.ics.uci.edu (archive.ics.uci.edu)|128.195.10.252|:443... connected. HTTP request sent, awaiting response... 416 Requested Range Not Satisfiable The file is already fully retrieved; nothing to do.
#Sprawdźmy wielkość zbioru
!wc -l IUM_02/iris.data
151 IUM_02/iris.data
#Sprawdźmy strukturę
!head -n 5 IUM_02/iris.data
5.1,3.5,1.4,0.2,Iris-setosa 4.9,3.0,1.4,0.2,Iris-setosa 4.7,3.2,1.3,0.2,Iris-setosa 4.6,3.1,1.5,0.2,Iris-setosa 5.0,3.6,1.4,0.2,Iris-setosa
#Sprawdźmy jakie są klasy i ile każda ma przykładów:
!cut -f 5 -d "," IUM_02/iris.data | sort | uniq -c
1 50 Iris-setosa 50 Iris-versicolor 50 Iris-virginica
# Znajdźmy pustą linijkę:
! grep -P "^$" -n IUM_02/iris.data
151:
#Usuwamy pustą linijkę i tasujemy plik:
! head -n -1 IUM_02/iris.data | shuf > IUM_02/iris.data.shuf
# Dzielimy zbiór w proporcji 4:1:1
!head -n 25 IUM_02/iris.data.shuf > IUM_02/iris.data.test
!head -n 50 IUM_02/iris.data.shuf | tail -n 25 > IUM_02/iris.data.dev
!tail -n +51 IUM_02/iris.data.shuf > IUM_02/iris.data.train
!rm IUM_02/iris.data.shuf
#Sprawdźmy, czy wielkości się zgadzają:
!wc -l IUM_02/iris.data*
151 IUM_02/iris.data 25 IUM_02/iris.data.dev 25 IUM_02/iris.data.test 100 IUM_02/iris.data.train 301 total
!cut -f 5 -d "," IUM_02/iris.data.train | sort | uniq -c
33 Iris-setosa 36 Iris-versicolor 31 Iris-virginica
!cut -f 5 -d "," IUM_02/iris.data.dev | sort | uniq -c
7 Iris-setosa 9 Iris-versicolor 9 Iris-virginica
!cut -f 5 -d "," IUM_02/iris.data.test | sort | uniq -c
10 Iris-setosa 5 Iris-versicolor 10 Iris-virginica
Podział z pomocą sckikit learn
- Do podziału możemy też użyć biblioteki https://scikit-learn.org/
from sklearn.model_selection import train_test_split
iris_train, iris_test = sklearn.model_selection.train_test_split(iris, test_size=50, random_state=1)
iris_train["Species"].value_counts()
Iris-virginica 36 Iris-setosa 33 Iris-versicolor 31 Name: Species, dtype: int64
iris_test["Species"].value_counts()
Iris-versicolor 19 Iris-setosa 17 Iris-virginica 14 Name: Species, dtype: int64
from sklearn.model_selection import train_test_split
iris_train, iris_test = sklearn.model_selection.train_test_split(iris, test_size=50, random_state=1, stratify=iris["Species"])
iris_train["Species"].value_counts()
Iris-setosa 34 Iris-virginica 33 Iris-versicolor 33 Name: Species, dtype: int64
iris_test["Species"].value_counts()
Iris-virginica 17 Iris-versicolor 17 Iris-setosa 16 Name: Species, dtype: int64
Preprocessing danych
- Czyszczenie
- usuwanie ze zbioru przykładów nieprawidłowych
- korekta nieprawidłowych wartości
- Normalizacja
- Dane numeryczne: skalowanie do zakresu, np. [0.0, 1.0] (https://scikit-learn.org/stable/modules/preprocessing.html)
- Dane tekstowe: lowercase, ujednolicenie wariantów pisowni, normalizacja wyrażeń numerycznych
- Dane obrazowe: normalizacja rozdzielczości, palety kolorów
- Dane dźwiękowe: normalizacja natężenia, rozdzielczości, częstotliwości próbkowania, ilości kanałów
- Poszerzanie (augumentacja) danych
- Generowanie nowych przykładów przez wprowadzanie szumu/przekształceń na originalnych danych
- np. dodanie echa do nagrania dźwiękowego, dodanie szumów do obrazka
- zmiana wartości cech o względnie małe, losowe wartości
- Over/under-sampling
- Algorymty uczące i metryki mogą być wrażliwe na niezbalansowane klasy w zbiorze
- Np. jeśli w zbiorze są 2 klasy w propocji 9:1, to najprostszy "klasyfikator" bez problemy osiągnie accuracy 90%
- Najprostszy sposób: skopiujmy (albo usuńmy) część przykładów zwiększając (lub zmniejszając) dany zbiór
Zadanie [5pkt]
Wybierz jeden z ogólnodostępnych zbiorów danych. Będziesz na nim pracował do końca roku (oczywiście, zbiór można zmienić w trakcie, ale będzie się to wiązało z powtarzeniem pewnych działań, co prawdwa niezbyt kosztownych, ale jednak).
Zbiór powinien być:
nie za duży (max ~200 MB)
nie za mały (np. IRIS jest za mały ;))
unikalny (każda osoba w grupie pracuje na innym zbiorze). W celu synchronizacji, wybrany przez siebie zbiór proszę zapisać tutaj: https://uam.sharepoint.com/❌/r/sites/2023SL06-DIUMUI0LABInynieriauczeniamaszynowego-Grupa11/Shared%20Documents/General/IUM-2023-zapisy.xlsx?d=w49d444e07d864d2997ef7d72c5a47da0&csf=1&web=1&e=4XgO7A
najlepiej, żeby był to zbiór zawierający dane w formie tekstowej, mogący posłużyć do zadania klasyfikacji lub rergesji - na takim zbiorze będzie łatwiej pracować niż np. na zbiorze obrazów albo dźwięków. Dzięki temu będziesz się mogła/mógł skupić na istocie tych zajęć.
Napisz skrypt, który:
- Pobierze wybrany przez Ciebie zbiór
- Jeśli brak w zbiorze gotowego podziału na podzbiory train/dev/test, to dokona takiego podziału
- Zbierze i wydrukuje statystyki dla tego zbioru i jego podzbiorów, takie jak np.:
- wielkość zbioru i podzbiorów
- średnią, minimum, maksimum, odchylenia standardowe, medianę wartości poszczególnych parametrów)
- rozkład częstości przykładów dla poszczególnych klas
- Dokona normalizacji danych w zbiorze (np. normalizacja wartości float do zakresu 0.0 - 1.0)
- Wyczyści zbiór z artefaktów (np. puste linie, przykłady z niepoprawnymi wartościami)
- Skrypt możesz napisać w swoim ulubionym języku. Jedyne ograniczenie: ma działać pod Linuxem
- Wygodnie będzie stworzyć zeszyt Jupyter w tym celu (choć nie jest to konieczne)
- Stwórz na wydziałowym serwerze git (http://git.wmi.amu.edu.pl/) repozytorium "ium_nrindeksu" i umieść w nim stworzony skrypt
- Link do repozytorium wklej do arkusza ze zbiorami: https://uam.sharepoint.com/❌/r/sites/2023SL06-DIUMUI0LABInynieriauczeniamaszynowego-Grupa11/Shared%20Documents/General/IUM-2023-zapisy.xlsx?d=w49d444e07d864d2997ef7d72c5a47da0&csf=1&web=1&e=4XgO7A