Feature normalize và Gradient Descent cho multivariate problem

Machine Learning cơ bản với NumPy

5.0 (1 đánh giá)
Tạo bởi Huy Trịnh Cập nhật lần cuối 21:44 31-08-2020 3.243 lượt xem 5 bình luận
Học nhanh

Danh sách bài học

Feature normalize và Gradient Descent cho multivariate problem

Dẫn nhập

Trong bài trước, chúng ta đã tìm hiểu về THUẬT TOÁN GRADIENT DESCENT CHO LINEAR REGRESSION.

Ở bài này Kteam sẽ giới thiệu đến các bạn Feature Normalize và Gradient Descent cho multivariate problem.


Nội dung

Để theo dõi bài này tốt nhất bạn cần có kiến thức về:

Trong bài này chúng ta sẽ cùng tìm hiểu về:

  • Vì sao phải Feature Normalize?
  • Công thức Feature Normalize.
  • Ứng dụng Feature Normalize vào multivariate problem.

Vì sao phải Feature Normalize ?

Thuật toán Gradient Descent sẽ chạy nhanh hơn với những vùng dữ liệu nhỏ.

Ví dụ:

Với việc dự đoán chất lượng gạo từ độ dài hạt, ta chỉ cần xử lí với những số từ 0-3 cm, thuật toán Gradient Descent sẽ chạy khá nhanh.

Nhưng với dự đoán giá đất, ta phải xử lí diện tích rất rộng, và giá tiền lên đến vài chục nghìn $ hay vài tỷ đồng, hầu hết thuật toán training sẽ overload và nếu có thể xử lí hết thì tốc độ cũng rất chậm.

Vì thế chúng ta cần phải quy chuẩn các input về một khoảng nhất định để việc training được tối ưu nhất. Các khoảng dữ liệu có thể như sau:

-1 < x <= 1

Hoặc:

-0.5 < x <= 0.5

Không có một quy chuẩn cụ thể x sẽ nằm trong khoảng nào, nhưng để tối ưu nhất, vùng dữ liệu (x lớn nhất – x nhỏ nhất) nên <= 1 và trung bình của toàn bộ x gần bằng 0.

Để thực hiện 2 yêu cầu này, chúng ta tách Feature Normalize thành 2 phần: Feature Scaling (đưa vùng dữ liệu về -0.5 < x <= 0.5) và Mean Normalization (đưa trung bình của x về gần 0).


Công thức Feature Normalize

Feature Scaling

Standard Deviation là gì?

Standard Deviation (độ lệch chuẩn) có thể hiểu là độ biến động của dữ liệu. Dữ liệu càng ổn định (ít chênh lệch), độ lệch chuẩn càng thấp. Kteam sẽ không đi sâu phần toán học của Standard Deviation, các bạn có thể tìm hiểu thêm tại Wikipedia.

Trong numpy, ta có thể tính độ lệch chuẩn bằng hàm std():

np.std(<mảng dữ liệu>,<index>,dtype = <kiểu dữ liệu>)

Trong đó:

  • Mảng dữ liệu là ma trận hoặc vector cần tìm độ lệch chuẩn, trong Feature Normalize chính là ma trận X input của chúng ta.
  • Index: Nếu bằng 0 sẽ tính độ lệch chuẩn theo từng cột (trả về độ lệch chuẩn của từng cột), bằng 1 sẽ tính theo hàng.
  • Kiểu dữ liệu: Kiểu dữ liệu càng phức tạp, độ chính xác càng cao, trong bài này Kteam sử dụng kiểu np.float64.

Lưu ý: 

Vì Standard Deviation là độ biến động của dữ liệu, nếu tất cả dữ liệu giống nhau, std = 0.

Công thức Feature Scaling

Để thực hiện Feature Scaling, ta chỉ cần lấy X chia cho độ lệch chuẩn:

X_{scaled}= \frac{X}{s}  với  s = std(X)

Tuy nhiên, ta sẽ không thực hiện Feature Normalize với bias feature (x0 = 1), vì thế sau khi Feature Normalize xong, ta sẽ gán giá trị x0 = 1 lại.

Thực hiện std cho x0 sẽ trả về kết quả là 0, nếu tiếp tục lấy x/0 sẽ bị lỗi chia cho 0, nên ta phải cho x0 một độ biến động giả bằng cách gán x0 đầu tiên bằng 100 (để x0 không còn “luôn bằng 1”)

Ta thực hiện Feature Scaling với numpy như sau:

import numpy as np  
def Normalize(X):
    #tạo copy của X (tham chiếu X) để không ảnh hưởng trực tiếp đến X (tham trị).
    n = np.copy(X)
    #x0 đầu tiên giả = 100
    n[0,0] = 100
    #tính std cho từng feature x
    s = np.std(n,0,dtype = np.float64)
    n = n/s
    #gán lại x0 = 1
    n[:,0] = 1

Mean Normalize

Để thực hiện Mean Normalize, ta sẽ tính trung bình từng feature rồi lấy feature cũ trừ trung bình.

Hàm tính trung bình – mean() với numpy:

np.std(<mảng dữ liệu>,<index>)

Trong đó:

  • Mảng dữ liệu là ma trận hoặc vector cần tìm trung bình, trong Feature Normalize chính là ma trận X input của chúng ta.
  • Index: Nếu bằng 0 sẽ tính trung bình theo từng cột (trả về trung bình của từng cột), bằng 1 sẽ tính theo hàng.

Công thức Feature Normalize khi có Mean Normalize:

X_{norm}=\frac{X-u}{s} với \mu = mean(X)

Trong đó:

  • \mu  đọc là mu

Áp dụng vào hàm Normalize:

import numpy as np  
def Normalize(X):
    #tạo copy của X (tham chiếu X) để không ảnh hưởng trực tiếp đến X (tham trị).
    n = np.copy(X)
    #x0 đầu tiên giả = 100
    n[0,0] = 100
    #tính std cho từng feature x
    s = np.std(n,0,dtype = np.float64)
    #tính mean cho từng feature x
    mu = np.mean(n,0)
    n = (n-mu)/s
    #gán lại x0 = 1
    n[:,0] = 1

Trả kết quả

Hàm normalize sẽ trả về 3 kết quả: norm, \mu và s. \mu và s được trả về để thuận tiện cho việc predict (trước khi predict phải Normalize input).

import numpy as np  
def Normalize(X):
    #...
    yield n
    yield mu
    yield s

Áp dụng Feature Normalize vào multivariate problem

Load data

Bài 6 -  Resources

Ta sẽ define một hàm riêng để load data, tiết kiệm thời gian hơn:

import numpy as np  
def Loadtxt(path):
    try:
        raw = np.loadtxt(path,delimiter = ‘,’)
        X = np.zeros((np.size(raw,0),np.size(raw,1)))
        X[:,0] = 1
        X[:,1:] = raw[:,:-1]
        y = raw[:,-1]
        yield X
        yield y
    except:
        return 0

Normalize data

import numpy as np  
from functions import *
[X, y] = Loadtxt(‘data.txt’)
[X, mu, s] = Normalize(X)

Train data

Để train data, ta gọi hàm Gradient Descent đã viết sẵn với alpha = 0.1iter = 400

import numpy as np  
from functions import *
[X, y] = Loadtxt(‘data.txt’)
[X, mu, s] = Normalize(X)
[Theta, J_hist] = GradientDescent(X,y,0.1,400)

Predict kết quả

Đầu tiên, ta phải normalize input với mu và s, sau đó mới dùng hàm predict

import numpy as np  
from functions import *
[X, y] = Loadtxt(‘data.txt’)
[X, mu, s] = Normalize(X)
[Theta, J_hist] = GradientDescent(X,y,0.1,400)
input = np.array([1,1650,3])
input = (input-mu)/s
#Lưu ý sửa lại x0 = 1
input[0] = 1
predict = predict(input,Theta)
print(‘%.2f$’%(predict))

Resources

Các bạn có thể download các file text được sử dụng trong bài viết tại:

Bài 6 -  Resources


Kết luận

Qua bài này chúng ta đã cùng nhau tìm hiểu về hàm Feature Normalize và áp dụng vào multivariate problem.

Ở bài sau, Kteam sẽ giới thiệu về PHƯƠNG PHÁP NORMAL EQUATION CHO LINEAR REGRESSION.

Cảm ơn bạn đã theo dõi bài viết. Hãy để lại bình luận hoặc góp ý của mình để phát triển bài viết tốt hơn. Đừng quên “Luyện tập – Thử thách – Không ngại khó”.


Thảo luận

Nếu bạn có bất kỳ khó khăn hay thắc mắc gì về khóa học, đừng ngần ngại đặt câu hỏi trong phần BÌNH LUẬN bên dưới hoặc trong mục HỎI & ĐÁP trên thư viện Howkteam.com để nhận được sự hỗ trợ từ cộng đồng.

Nội dung bài viết

Tác giả/Dịch giả

Chào các bạn!! Mình là Huy - một cậu bé đam mê lập trình :D Trong một mùa hè rảnh rỗi trước năm cuối cấp đầy cam go, sau khi đã cày hết 7749 bộ anime thì mình muốn làm một việc gì đó "có ích cho đời" hơn. Từ đó mình đã thành 1 Kter :)))

Liên hệ: huytrinhm@gmail.com

Khóa học

Machine Learning cơ bản với NumPy

Với mục đích giới thiệu đến mọi người về Machine Learning cũng như tạo điểm khởi đầu cho các bạn mới, muốn tham gia và tìm hiểu ban đầu về lĩnh vực khá hot này. Cùng Kteam tìm hiểu về Machine Learning cơ bản với ngôn ngữ Python.

Thông qua khóa học MACHINE LEARNING VỚI NUMPY, Kteam sẽ hướng dẫn các kiến thức cơ bản của thuật toán Machine Learning để các bạn có thể tạo ra những sản phẩm Machine Learning của riêng mình.

Đánh giá

Trongnguyen đã đánh giá 11:26 26-03-2020

Bình luận

Để bình luận, bạn cần đăng nhập bằng tài khoản Howkteam.

Đăng nhập
tranpt93 đã bình luận 20:52 16-10-2020

Sao sau cùng lại tạo một array input mới vậy.

Và sao lại dùng (input - mu)/s trong khi mu và s là 2 giá trị tính độ lệch chuẩn cho X chứ ko phải cho Input :D

thanhlong1997 đã bình luận 11:16 04-03-2020

hi vọng tác giả giải đáp câu nói : " khi các feature có giá trị lớn thì việc thực hiện gradient descent sẽ lâu hơn " . Theo mình hiểu thì việc quá chênh lệch độ lớn giữa các feature sẽ gây ra hiện tượng chênh lệch vai trò giữa các feature , khi trọng số w được cập nhật thì với những feature có giá trị lớn sẽ làm cho biến động của các feature này lớn hơn hẳn các feature khác . Còn việc thực hiện gradient descent thì thuật toán dừng khi nó đã hội tụ và tốc độ hội tụ phụ thuộc vào learning rate , điểm khởi tạo , momentum ,v,v,v chứ nhỉ đâu có phụ thuộc vào độ lớn feature ?

Không có video.