ium/IUM_02.Dane.ipynb
2024-04-09 09:46:32 +02:00

425 KiB
Raw Blame History

Inżynieria uczenia maszynowego

13 marca 2024

2. Dane

Plan na dzisiaj

  1. Motywacja
  2. Podział danych
  3. Skąd wziąć dane?
  4. Przygotowanie danych
  5. 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)

Repozytoria/wyszukiwarki otwartych zbiorów danych

Otwarte zbiory

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)
     |████████████████████████████████| 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)
# Ż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

!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)
     |████████████████████████████████| 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)
     |████████████████████████████████| 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)
     |████████████████████████████████| 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)
     |████████████████████████████████| 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)
     |████████████████████████████████| 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)
     |████████████████████████████████| 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

#Instalujemy bibliotekę datasets
!python -m pip install datasets
Collecting datasets
  Downloading datasets-2.10.1-py3-none-any.whl (469 kB)
     |████████████████████████████████| 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)
     |████████████████████████████████| 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)
     |████████████████████████████████| 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)
     |████████████████████████████████| 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)
     |████████████████████████████████| 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)
     |████████████████████████████████| 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)
     |████████████████████████████████| 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)
     |████████████████████████████████| 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)
     |████████████████████████████████| 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)
     |████████████████████████████████| 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)
     |████████████████████████████████| 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)
     |████████████████████████████████| 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

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/2024SL06-S4IN01-F01005LABInynieriauczeniamaszynowego-Grupa11/Materiay%20z%20zaj/IUM-2024.xlsx?d=w23a1cad8c73a4fe183404d1b0671af36&csf=1&web=1&e=zUvrxN
  • 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:
  1. Pobierze wybrany przez Ciebie zbiór
  2. Jeśli brak w zbiorze gotowego podziału na podzbiory train/dev/test, to dokona takiego podziału
  3. 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
  1. Dokona normalizacji danych w zbiorze (np. normalizacja wartości float do zakresu 0.0 - 1.0)
  2. Wyczyści zbiór z artefaktów (np. puste linie, przykłady z niepoprawnymi wartościami)