Zobacz na TensorFlow.org | Uruchom w Google Colab | Wyświetl źródło na GitHub | Pobierz notatnik |
Przegląd
Ten tutorial pokazuje jak utworzyć tf.data.Dataset
z serwera bazy danych PostgreSQL, dzięki czemu tworzone Dataset
może być przekazany do tf.keras
do celów szkoleniowych lub wnioskowania.
Baza danych SQL jest ważnym źródłem danych dla naukowców zajmujących się danymi. Jako jeden z najbardziej popularnej bazy danych SQL open source, PostgreSQL jest szeroko stosowany w przedsiębiorstwach do przechowywania danych critial i transakcyjnych całej planszy. Tworzenie Dataset
z serwera bazy danych PostgreSQL i przejść bezpośrednio do Dataset
do tf.keras
na szkolenie lub wnioskowania, może znacznie uprościć danych naukowca rurociągu danych i pomagają skupić się na budowaniu modeli uczenia maszynowego.
Konfiguracja i użytkowanie
Zainstaluj wymagane pakiety tensorflow-io i uruchom ponownie środowisko wykonawcze
try:
%tensorflow_version 2.x
except Exception:
pass
!pip install -q tensorflow-io
Zainstaluj i skonfiguruj PostgreSQL (opcjonalnie)
Aby zademonstrować użycie w Google Colab, zainstalujesz serwer PostgreSQL. Potrzebne jest również hasło i pusta baza danych.
Jeśli nie korzystasz z tego notatnika w Google Colab lub wolisz korzystać z istniejącej bazy danych, pomiń poniższą konfigurację i przejdź do następnej sekcji.
# Install postgresql server
sudo apt-get -y -qq update
sudo apt-get -y -qq install postgresql
sudo service postgresql start
# Setup a password `postgres` for username `postgres`
sudo -u postgres psql -U postgres -c "ALTER USER postgres PASSWORD 'postgres';"
# Setup a database with name `tfio_demo` to be used
sudo -u postgres psql -U postgres -c 'DROP DATABASE IF EXISTS tfio_demo;'
sudo -u postgres psql -U postgres -c 'CREATE DATABASE tfio_demo;'
Preconfiguring packages ... Selecting previously unselected package libpq5:amd64. (Reading database ... 254633 files and directories currently installed.) Preparing to unpack .../0-libpq5_10.15-0ubuntu0.18.04.1_amd64.deb ... Unpacking libpq5:amd64 (10.15-0ubuntu0.18.04.1) ... Selecting previously unselected package postgresql-client-common. Preparing to unpack .../1-postgresql-client-common_190ubuntu0.1_all.deb ... Unpacking postgresql-client-common (190ubuntu0.1) ... Selecting previously unselected package postgresql-client-10. Preparing to unpack .../2-postgresql-client-10_10.15-0ubuntu0.18.04.1_amd64.deb ... Unpacking postgresql-client-10 (10.15-0ubuntu0.18.04.1) ... Selecting previously unselected package ssl-cert. Preparing to unpack .../3-ssl-cert_1.0.39_all.deb ... Unpacking ssl-cert (1.0.39) ... Selecting previously unselected package postgresql-common. Preparing to unpack .../4-postgresql-common_190ubuntu0.1_all.deb ... Adding 'diversion of /usr/bin/pg_config to /usr/bin/pg_config.libpq-dev by postgresql-common' Unpacking postgresql-common (190ubuntu0.1) ... Selecting previously unselected package postgresql-10. Preparing to unpack .../5-postgresql-10_10.15-0ubuntu0.18.04.1_amd64.deb ... Unpacking postgresql-10 (10.15-0ubuntu0.18.04.1) ... Selecting previously unselected package postgresql. Preparing to unpack .../6-postgresql_10+190ubuntu0.1_all.deb ... Unpacking postgresql (10+190ubuntu0.1) ... Selecting previously unselected package sysstat. Preparing to unpack .../7-sysstat_11.6.1-1ubuntu0.1_amd64.deb ... Unpacking sysstat (11.6.1-1ubuntu0.1) ... Setting up sysstat (11.6.1-1ubuntu0.1) ... Creating config file /etc/default/sysstat with new version update-alternatives: using /usr/bin/sar.sysstat to provide /usr/bin/sar (sar) in auto mode Created symlink /etc/systemd/system/multi-user.target.wants/sysstat.service → /lib/systemd/system/sysstat.service. Setting up ssl-cert (1.0.39) ... Setting up libpq5:amd64 (10.15-0ubuntu0.18.04.1) ... Setting up postgresql-client-common (190ubuntu0.1) ... Setting up postgresql-common (190ubuntu0.1) ... Adding user postgres to group ssl-cert Creating config file /etc/postgresql-common/createcluster.conf with new version Building PostgreSQL dictionaries from installed myspell/hunspell packages... Removing obsolete dictionary files: Created symlink /etc/systemd/system/multi-user.target.wants/postgresql.service → /lib/systemd/system/postgresql.service. Setting up postgresql-client-10 (10.15-0ubuntu0.18.04.1) ... update-alternatives: using /usr/share/postgresql/10/man/man1/psql.1.gz to provide /usr/share/man/man1/psql.1.gz (psql.1.gz) in auto mode Setting up postgresql-10 (10.15-0ubuntu0.18.04.1) ... Creating new PostgreSQL cluster 10/main ... /usr/lib/postgresql/10/bin/initdb -D /var/lib/postgresql/10/main --auth-local peer --auth-host md5 The files belonging to this database system will be owned by user "postgres". This user must also own the server process. The database cluster will be initialized with locale "C.UTF-8". The default database encoding has accordingly been set to "UTF8". The default text search configuration will be set to "english". Data page checksums are disabled. fixing permissions on existing directory /var/lib/postgresql/10/main ... ok creating subdirectories ... ok selecting default max_connections ... 100 selecting default shared_buffers ... 128MB selecting default timezone ... Etc/UTC selecting dynamic shared memory implementation ... posix creating configuration files ... ok running bootstrap script ... ok performing post-bootstrap initialization ... ok syncing data to disk ... ok Success. You can now start the database server using: /usr/lib/postgresql/10/bin/pg_ctl -D /var/lib/postgresql/10/main -l logfile start Ver Cluster Port Status Owner Data directory Log file 10 main 5432 down postgres /var/lib/postgresql/10/main /var/log/postgresql/postgresql-10-main.log update-alternatives: using /usr/share/postgresql/10/man/man1/postmaster.1.gz to provide /usr/share/man/man1/postmaster.1.gz (postmaster.1.gz) in auto mode Setting up postgresql (10+190ubuntu0.1) ... Processing triggers for man-db (2.8.3-2ubuntu0.1) ... Processing triggers for ureadahead (0.100.0-21) ... Processing triggers for libc-bin (2.27-3ubuntu1.2) ... Processing triggers for systemd (237-3ubuntu10.38) ... ALTER ROLE NOTICE: database "tfio_demo" does not exist, skipping DROP DATABASE CREATE DATABASE
Ustaw niezbędne zmienne środowiskowe
Poniższe zmienne środowiskowe są oparte na konfiguracji PostgreSQL w ostatniej sekcji. Jeśli masz inną konfigurację lub korzystasz z istniejącej bazy danych, należy je odpowiednio zmienić:
%env TFIO_DEMO_DATABASE_NAME=tfio_demo
%env TFIO_DEMO_DATABASE_HOST=localhost
%env TFIO_DEMO_DATABASE_PORT=5432
%env TFIO_DEMO_DATABASE_USER=postgres
%env TFIO_DEMO_DATABASE_PASS=postgres
env: TFIO_DEMO_DATABASE_NAME=tfio_demo env: TFIO_DEMO_DATABASE_HOST=localhost env: TFIO_DEMO_DATABASE_PORT=5432 env: TFIO_DEMO_DATABASE_USER=postgres env: TFIO_DEMO_DATABASE_PASS=postgres
Przygotuj dane na serwerze PostgreSQL
W celach demonstracyjnych ten samouczek utworzy bazę danych i wypełni ją niektórymi danymi. Dane wykorzystane w tym tutorialu pochodzi z Air jakości zestaw danych , dostępny z UCI Machine Learning Repository .
Poniżej znajduje się podgląd podzbioru zbioru danych o jakości powietrza:
Data|Godzina|CO(GT)|PT08.S1(CO)|NMHC(GT)|C6H6(GT)|PT08.S2(NMHC)|NOx(GT)|PT08.S3(NOx)|NO2(GT)| PT08.S4(NO2)|PT08.S5(O3)|T|RH|AH| ----|----|------|-----------|--------|--------|--- ----------|----|----------|-------|------------|-- ---------|-|--|--| 10.03.2004|18.00.00|2,6|1360|150|11,9|1046|166|1056|113|1692|1268|13,6|48,9|0,7578| 10.03.2004|19.00.00|2|1292|112|9,4|955|103|1174|92|1559|972|13,3|47,7|0,7255| 10.03.2004|20.00.00|2,2|1402|88|9,0|939|131|1140|114|1555|1074|11,9|54,0|0,7502| 10.03.2004|21.00.00|2,2|1376|80|9,2|948|172|1092|122|1584|1203|11,0|60,0|0,7867| 10.03.2004|22.00.00|1,6|1272|51|6,5|836|131|1205|116|1490|1110|11,2|59,6|0,7888|
Więcej informacji na temat jakości powietrza zbioru danych i UCI Machine Learning Repository są availabel w Referencje sekcji.
Aby uprościć przygotowanie danych, wersja SQL jakości powietrza zbioru danych została przygotowana i jest dostępna jako AirQualityUCI.sql .
Oświadczenie do stworzenia tabeli to:
CREATE TABLE AirQualityUCI (
Date DATE,
Time TIME,
CO REAL,
PT08S1 INT,
NMHC REAL,
C6H6 REAL,
PT08S2 INT,
NOx REAL,
PT08S3 INT,
NO2 REAL,
PT08S4 INT,
PT08S5 INT,
T REAL,
RH REAL,
AH REAL
);
Kompletne polecenia tworzenia tabeli w bazie danych i wypełniania danych to:
curl -s -OL https://github.com/tensorflow/io/raw/master/docs/tutorials/postgresql/AirQualityUCI.sql
PGPASSWORD=$TFIO_DEMO_DATABASE_PASS psql -q -h $TFIO_DEMO_DATABASE_HOST -p $TFIO_DEMO_DATABASE_PORT -U $TFIO_DEMO_DATABASE_USER -d $TFIO_DEMO_DATABASE_NAME -f AirQualityUCI.sql
Utwórz zestaw danych z serwera PostgreSQL i użyj go w TensorFlow
Tworzenie zestawu danych z serwera PostgreSQL jest tak proste jak wywołanie tfio.experimental.IODataset.from_sql
z query
i endpoint
argumentów. query
jest zapytanie SQL dla wybranych kolumn w tabelach, a endpoint
argumentem jest nazwa i adres bazy danych:
import os
import tensorflow_io as tfio
endpoint="postgresql://{}:{}@{}?port={}&dbname={}".format(
os.environ['TFIO_DEMO_DATABASE_USER'],
os.environ['TFIO_DEMO_DATABASE_PASS'],
os.environ['TFIO_DEMO_DATABASE_HOST'],
os.environ['TFIO_DEMO_DATABASE_PORT'],
os.environ['TFIO_DEMO_DATABASE_NAME'],
)
dataset = tfio.experimental.IODataset.from_sql(
query="SELECT co, pt08s1 FROM AirQualityUCI;",
endpoint=endpoint)
print(dataset.element_spec)
{'co': TensorSpec(shape=(), dtype=tf.float32, name=None), 'pt08s1': TensorSpec(shape=(), dtype=tf.int32, name=None)}
Jak można zobaczyć z wyjścia dataset.element_spec
powyżej, element tworzonego Dataset
jest pyton DICT obiekt z nazwami kolumn w tabeli bazy danych jako kluczy. Stosowanie dalszych operacji jest dość wygodne. Na przykład, można wybrać zarówno nox
i no2
pole w Dataset
i obliczyć różnicę:
dataset = tfio.experimental.IODataset.from_sql(
query="SELECT nox, no2 FROM AirQualityUCI;",
endpoint=endpoint)
dataset = dataset.map(lambda e: (e['nox'] - e['no2']))
# check only the first 20 record
dataset = dataset.take(20)
print("NOx - NO2:")
for difference in dataset:
print(difference.numpy())
NOx - NO2: 53.0 11.0 17.0 50.0 15.0 -7.0 -15.0 -14.0 -15.0 0.0 -13.0 -12.0 -14.0 16.0 62.0 28.0 14.0 3.0 9.0 34.0
Utworzona Dataset
jest gotowy, aby być przekazywane do tf.keras
bezpośrednio zarówno dla celów szkoleniowych lub wnioskowania teraz.
Bibliografia
- Dua, D. i Graff, C. (2019). UCI Machine Learning Repository [ http://archive.ics.uci.edu/ml ]. Irvine, Kalifornia: Uniwersytet Kalifornijski, Szkoła Informacji i Informatyki.
- S. De Vito, E. Massera, M. Piga, L. Martinotto, G. Di Francia, O kalibracji w terenie elektronicznego nosa do szacowania benzenu w scenariuszu monitorowania zanieczyszczenia miejskiego, Sensors and Actuators B: Chemical, tom 129, wydanie 2, 22 lutego 2008, strony 750-757, ISSN 0925-4005