Professional Documents
Culture Documents
Chương 8 - Học máy ứng dụng với scikit-learn và Tensor Flows - v3
Chương 8 - Học máy ứng dụng với scikit-learn và Tensor Flows - v3
VÀ TENSOR FLOWS
2
Học máy (machine learning – ML) là gì
3
4
Tổng quan về học máy
• Mỗi mô hình ML được mô tả bởi các tham số mô hình (model
parameters)
• Công việc của một thuật toán ML là đi tìm các tham số mô hình phù
hợp với mỗi bài toán
• Việc đi tìm các tham số mô hình có liên quan mật thiết đến các phép
đánh giá
• Mục đích của chúng ta là đi tìm các tham số mô hình sao cho các
phép đánh giá cho kết quả tốt nhất (gọi là huấn luyện mô hình)
o Trong bài toán classification, kết quả tốt có thể được hiểu là ít điểm dữ
liệu bị phân lớp sai nhất
o Trong bài toán regression, kết quả tốt là khi sự sai lệch giữa đầu ra dự
đoán và đầu ra thực sự là ít nhất
5
Tổng quan về học máy (tt)
! Cần quan tâm 2 vấn đề: xây dựng hàm mất mát và thuật toán tối ưu hoá
6
Mô hình chung cho các bài toán học máy
7
Scikit-learn
8
Scikit-learn (tt)
• Quy trình của BT học máy (có giám sát) điển hình thường gồm
2 bước: trích xuất đặc trưng và mô hình/thuật toán để dự đoán
các giá trị đích
• Trong scikit-learn:
• Trích xuất đặc trưng được thực hiện bằng các bộ tiền xử lý
(pre-processors)
• Mô hình/thuật toán được thực hiện bằng các bộ ước lượng
(estimators)
• Chúng được cài đặt bằng các hàm thư viện với API tương tự
nhau
9
Bộ tiền xử lý (pre-processors)
10
Bộ ước lượng: huấn luyện và dự báo
• Mỗi bộ ước lượng có thể được tính toán bộ tham số (hay được
huấn luyện) đối với từng tập dữ liệu
• Ví dụ: huấn luyện bộ phân lớp RandomForestClassifier bằng
một tập dữ liệu đơn giản:
11
Bộ ước lượng: huấn luyện và dự báo (tt)
12
Bộ ước lượng: huấn luyện và dự báo (tt)
13
Pipelines: chaining pre-processors and estimators
14
Pipelines: chaining pre-processors and estimators
• Ví dụ: chia tập dữ liệu Iris thành tập huấn luyện và kiểm thử, huấn luyện một
đường ống và tính độ chính xác của nó trên dữ liệu kiểm thử:
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import Logis6cRegression
from sklearn.pipeline import make_pipeline
from sklearn.datasets import load_iris
from sklearn.model_selec6on import train_test_split
from sklearn.metrics import accuracy_score
# create a pipeline object
pipe = make_pipeline(
StandardScaler(),
Logis6cRegression()
)
# load the iris dataset and split it into train and test sets
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
# fit the whole pipeline
pipe.fit(X_train, y_train)
# we can now use it like any other es6mator
accuracy_score(y_test, pipe.predict(X_test))
15
Đánh giá và lựa chọn mô hình
16
Đánh giá mô hình (Model evaluation)
• Các phương pháp đánh giá
• Các tiêu chí đánh giá
(Xem Slide “Đánh giá và lựa chọn mô hình học máy_TQKhoat”)
17
Đánh giá mô hình bằng cross-validation
(5-fold cross-validation)
18
Đánh giá mô hình bằng cross-validation
• Ví dụ thực hiện quy trình xác thực chéo 5 lần (5-fold cross-
validation procedure), sử dụng hàm cross_validate().
• Có thể lặp lại theo cách thủ công qua các folds, sử dụng các chiến
lược tách dữ liệu khác nhau và sử dụng các chức năng tính điểm
(scoring) tùy chỉnh.
X, y = make_regression(n_samples=1000, random_state=0)
lr = LinearRegression()
19
Lựa chọn tham số mô hình (model selection)
20
Lựa chọn tham số mô hình (model selection)
• Việc tinh chỉnh mô hình cho khớp với một số dữ liệu có sẵn
không dẫn đến việc nó sẽ dự đoán tốt trên dữ liệu mới
• Các trường hợp thường xảy ra đ/v một mô hình đã huấn luyện:
oTốt (Good fit): nếu cả training error và test error đều thấp
oDưới khớp (Underfitting): nếu training error cao và test error
cao
oQuá khớp (Overfitting): nếu training error thấp nhưng test
error cao (khả năng tổng quát hoá của mô hình thấp)
" Overfitting đặc biệt xảy ra khi lượng dữ liệu huấn luyện quá nhỏ hoặc
độ phức tạp của mô hình quá cao
21
Lựa chọn mô hình
22
Lựa chọn mô hình bằng cross-validation
https://scikit-learn.org/stable/modules/cross_validation.html
23
Model selection - Automatic parameter searches
• Tất cả các bộ ước lượng đều có các tham số (thường được gọi là
siêu tham số) có thể được điều chỉnh.
• Hiệu suất tổng quát của một bộ ước lượng thường phụ thuộc rất
nhiều vào một (vài) siêu tham số.
• Ví dụ: RandomForestRegressor có tham số n_estimators
xác định số lượng cây trong rừng và tham số max_depth xác
định độ sâu tối đa của mỗi cây.
• Thông thường, không rõ giá trị chính xác của các tham số này
phải là bao nhiêu vì chúng phụ thuộc vào dữ liệu hiện có.
• Scikit-learning cung cấp các công cụ để tự động tìm các kết hợp tham
số tốt nhất (thông qua xác nhận chéo cross-validation).
24
Model selection - Automatic parameter searches
• Ví dụ: tìm kiếm ngẫu nhiên trên không gian tham số của một rừng ngẫu nhiên với một đối tượng
RandomizedSearchCV. Khi quá trình tìm kiếm kết thúc, RandomizedSearchCV hoạt động như một
RandomForestRegressor đã được trang bị bộ thông số tốt nhất.
from sklearn.datasets import fetch_california_housing
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selec9on import RandomizedSearchCV
from sklearn.model_selec9on import train_test_split
from scipy.stats import randint
X, y = fetch_california_housing(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
# define the parameter space that will be searched over
param_distribu9ons = {'n_es9mators': randint(1, 5),
'max_depth': randint(5, 10)}
# now create a searchCV object and fit it to the data
search = RandomizedSearchCV(es9mator=RandomForestRegressor(random_state=0),
param_distribu9ons=param_distribu9ons,
n_iter=5,
random_state=0)
search.fit(X_train, y_train)
search.best_params_ # Parameter seSng that gave the best results on the hold out data
# the search object now acts like a normal random forest es9mator
# with max_depth=9 and n_es9mators=4
search.score(X_test, y_test)
25
Các phương pháp học máy và ví dụ
• Mã nguồn thực hiện
(https://scikit-learn.org/stable/user_guide.html#user-guide )
• Supervised learning
• Unsupervised learning
• Model selection and evaluation
• Inspection
• Visualizations
• Computing with scikit-learn
• …..
• https://scikit-learn.org/stable/auto_examples/index.html
26
TensorFlow
• TensorFlow là một nền tảng mã nguồn mở end-to-end dành cho học máy.
• Một hệ sinh thái toàn diện, linh hoạt gồm các công cụ, thư viện và
tài nguyên cộng đồng cho phép các nhà nghiên cứu thúc đẩy tính
năng tiên tiến trong ML và các nhà phát triển dễ dàng xây dựng và
triển khai các ứng dụng hỗ trợ ML
• https://www.tensorflow.org/
27
TensorFlow
• Easy model building
• Dễ dàng xây dựng và huấn luyện một cách dễ dàng các mô hình ML
bằng cách sử dụng các API cấp cao trực quan như Keras với khả năng
thực thi nhanh chóng, giúp lặp lại mô hình ngay lập tức và gỡ lỗi dễ dàng
• Robust ML production anywhere
• Dễ dàng huấn luyện và triển khai các mô hình trên đám mây (in the
cloud), tại chỗ, trong trình duyệt hoặc trên thiết bị bất kể sử dụng ngôn
ngữ nào
• Powerful experimentation for research
• Một kiến trúc đơn giản và linh hoạt để đưa các ý tưởng mới từ khái niệm
đến mã code, đến các mô hình hiện đại và công bố nhanh hơn
28
Install TensorFlow with pip
• Install TensorFlow with pip
• TensorFlow 2 packages are available
• tensorflow —Latest stable release with CPU and GPU support
(Ubuntu and Windows)
• tf-nightly —Preview build (unstable) . Ubuntu and Windows
include GPU support .
• Older versions of TensorFlow
• For TensorFlow 1.x, CPU and GPU packages are separate:
• tensorflow==1.15 —Release for CPU-only
• tensorflow-gpu==1.15 —Release with GPU support
(Ubuntu and Windows)
29
Install TensorFlow with pip
• System requirements
• Python 3.6–3.8
• Python 3.8 support requires TensorFlow 2.2 or later.
• pip 19.0 or later (requires manylinux2010 support)
• Ubuntu 16.04 or later (64-bit)
• macOS 10.12.6 (Sierra) or later (64-bit) (no GPU support)
• macOS requires pip 20.3 or later
• Windows 7 or later (64-bit)
• Microsoft Visual C++ Redistributable for Visual Studio 2015, 2017 and
2019
• Raspbian 9.0 or later
• GPU support requires a CUDA®-enabled card (Ubuntu and Windows)
30
Google Colab: An easy way to learn and use TensorFlow
• Không cần cài đặt - chạy hướng dẫn TensorFlow trực tiếp trong trình duyệt
với Colaboratory
31
Setup and basic usage
import os
import tensorflow as tf
import cProfile
x = [[2.]]
m = tf.matmul(x, x)
print("hello, {}".format(m))
hello, [[4.]]
32
Setup and basic usage
a = tf.constant([[1, 2],[3, 4]]) # Use NumPy values
print(a) import numpy as np
tf.Tensor( [[1 2] [3 4]],
c = np.multiply(a, b)
shape=(2, 2), dtype=int32)
print(c)
# Broadcasting support
b = tf.add(a, 1) [[ 2 6]
print(b) [12 20]]
33
Dynamic control flow
def fizzbuzz(max_num):
counter = tf.constant(0)
max_num = tf.convert_to_tensor(max_num) fizzbuzz(15)
for num in range(1, max_num.numpy()+1):
num = tf.constant(num)
if int(num % 3) == 0 and int(num % 5) == 0:
print('FizzBuzz') 1
elif int(num % 3) == 0: 2
print('Fizz')
elif int(num % 5) == 0: Fizz
print('Buzz') 4
else:
print(num.numpy()) Buzz
counter += 1 Fizz
7
8
Fizz Buzz
11
Fizz
13
14
FizzBuz
34
Dynamic models
• tf.GradientTape được sử dụng trong các mô hình động.
• Ví dụ này cho thuật toán tìm kiếm theo đường backtracking trông
giống như mã NumPy bình thường, ngoại trừ có các gradients và
có thể phân biệt được, mặc dù quy trình điều khiển phức tạp:
35
Custom gradients
def log1pexp(x):
return tf.math.log(1 + tf.exp(x))
def grad_log1pexp(x):
with tf.GradientTape() as tape:
tape.watch(x)
value = log1pexp(x)
return tape.gradient(value, x)
0.5
# However, x = 100 fails because of numerical i
nstability.
grad_log1pexp(tf.constant(100.)).numpy()
nan
36
Performance
• Tính toán tự động được tải xuống GPU trong quá trình thực thi nhanh chóng: kiểm soát nơi chạy, có thể đặt
nó trong một khối tf.device ('/ gpu: 0') (hoặc khối CPU tương đương):
import time
def measure(x, steps):
# TensorFlow initializes a GPU the first time it's used, exclude from timing.
tf.matmul(x, x)
start = time.time()
for i in range(steps):
x = tf.matmul(x, x)
# tf.matmul can return before completing the matrix multiplication
# (e.g., can return after enqueing the operation on a CUDA stream).
# The x.numpy() call below will ensure that all enqueued operations
# have completed (and will also copy the result to host memory,
# so we're including a little more than just the matmul operation
# time).
_ = x.numpy()
end = time.time()
return end - start
38
# tf.data: Build TensorFlow input pipelines
• Để tạo một input pipeline, phải bắt đầu với một nguồn dữ liệu.
• Xây dựng Dataset từ dữ liệu trong bộ nhớ, có thể sử dụng
tf.data.Dataset.from_tensors() hoặc tf.data.Dataset.from_tensor_slices ()
• Nếu dữ liệu đầu vào được lưu trữ trong một tệp ở định dạng TFRecord, có thể
sử dụng tf.data.TFRecordDataset ().
• Khi có một đối tượng Dataset, có thể biến đổi nó thành một Dataset mới bằng
cách chuỗi các cuộc gọi phương thức trên đối tượng tf.data.Dataset.
• Có thể áp dụng các phép biến đổi cho mỗi phần tử như Dataset.map () và
các phép biến đổi nhiều phần tử như Dataset.batch ()
• Đối tượng Dataset là có thể lặp lại. Điều này làm cho nó có thể sử dụng các
phần tử của nó bằng cách sử dụng vòng lặp for, hoặc bằng cách tạo một
trình lặp một cách rõ ràng bằng cách sử dụng next
39
# tf.data: Build TensorFlow input pipelines
import tensorflow as tf
import pathlib
import os
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
np.set_printoptions(precision=4)
print(next(it).numpy())
for elem in dataset:
print(elem.numpy())
8
8
3
0
8
2
1
40
Dataset structure
• Tập dữ liệu tạo ra một chuỗi các phần tử, trong đó mỗi phần tử là cấu trúc giống
nhau
• Các thành phần riêng lẻ của cấu trúc có thể thuộc bất kỳ kiểu nào mà
tf.TypeSpec có thể đại diện
• tf.Tensor
• tf.sparse.SparseTensor
• tf.RaggedTensor
• tf.TensorArray
• tf.data.Dataset.
• Thuộc tính Dataset.element_spec cho phép kiểm tra kiểu của từng thành
phần.
• Trả về một cấu trúc lồng nhau (nested structure) của các đối tượng
tf.TypeSpec, khớp với cấu trúc của phần tử, có thể là một thành phần
đơn lẻ, một bộ thành phần hoặc một bộ thành phần lồng nhau.
41
Dataset structure
dataset1 = tf.data.Dataset.from_tensor_slices(tf.random.uniform([4, 10]))
dataset1.element_spec
dataset2.element_spec
dataset3.element_spec
(TensorSpec(shape=(10,), dtype=tf.float32, name=None),
(TensorSpec(shape=(), dtype=tf.float32, name=None),
TensorSpec(shape=(100,), dtype=tf.int32, name=None)))
dataset4.element_spec
42
Using tf.data with tf.keras
• API `tf.keras’ đơn giản hóa nhiều khía cạnh của việc tạo và thực thi các mô
hình học máy.
• Các API `.fit ()’ và `.evaluate ()’ và ‘.predict()’ hỗ trợ các tập dữ liệu làm
đầu vào
43
Using tf.data with tf.keras
train, test = tf.keras.datasets.fashion_mnist.load_data()
images, labels = train
images = images/255.0
labels = labels.astype(np.int32)
model = tf.keras.Sequential([
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(10)
])
model.compile(optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])
model.fit(fmnist_train_ds, epochs=5)
Epoch 1/5
1875/1875 [==============================] - 3s 1ms/step - loss: 0.4137 - accuracy: 0.8564
Epoch 2/5
1875/1875 [==============================] - 3s 1ms/step - loss: 0.4055 - accuracy: 0.8594
Epoch 3/5
1875/1875 [==============================] - 3s 1ms/step - loss: 0.4034 - accuracy: 0.8601
Epoch 4/5
1875/1875 [==============================] - 3s 1ms/step - loss: 0.3971 - accuracy: 0.8619
Epoch 5/5
1875/1875 [==============================] - 3s 1ms/step - loss: 0.3951 - accuracy: 0.8631
<tensorflow.python.keras.callbacks.History at 0x7fd5041c1450>
44
Using tf.data with tf.keras
Epoch 1/5
20/20 [==============================] - 0s 2ms/step - loss: 0.4024 - accuracy: 0.8703
Epoch 2/5
20/20 [==============================] - 0s 2ms/step - loss: 0.3819 - accuracy: 0.8500
Epoch 3/5
20/20 [==============================] - 0s 2ms/step - loss: 0.3997 - accuracy: 0.8781
Epoch 4/5
20/20 [==============================] - 0s 2ms/step - loss: 0.3674 - accuracy: 0.8625
Epoch 5/5
20/20 [==============================] - 0s 2ms/step - loss: 0.4204 - accuracy: 0.8562
<tensorflow.python.keras.callbacks.History at 0x7fd5041be490>
45
Using tf.data with tf.keras
loss, accuracy = model.evaluate(fmnist_train_ds.repeat(), steps=10)
print("Loss :", loss)
print("Accuracy :", accuracy)
predict_ds = tf.data.Dataset.from_tensor_slices(images).batch(32)
result = model.predict(predict_ds, steps = 10)
print(result.shape)
(320, 10)
(320, 10)
46
Bài tập
1. Tính độ chính xác trung bình của pipeline gồm các kỹ thuật xử lý đặc trưng
đã chọn trong BT trước & thuật toán hồi quy logistic dùng kỹ thuật 5-fold cross
validation (dùng hàm cross_validate()).
2. Thử nghiệm quá trình xây dựng và đánh giá mô hình hồi quy logistic theo
các bước sau:
- Chia bộ dữ liệu thành Training set và Test set dùng kỹ thuật Hold-out with
Stratified sampling (chỉ thực hiện 1 lần với tỉ lệ Train:Test = 7:3)
- Lựa chọn mô hình hồi quy logistic có bộ siêu tham số tối ưu (với 2 siêu tham
số sử dụng trong kỹ thuật regularization: penalty=L1/L2/none & C=1/lambda)
dùng kỹ thuật 5-fold cross-validation trên Training set
- Huấn luyện mô hình với bộ siêu tham số tối ưu dùng Training set
- Tính độ chính xác dự đoán của mô hình đã xây dựng trên Test set
47