Feature normalize và Gradient Descent cho multivariate problem

Machine Learning cơ bản với NumPy

5.0 (3 đánh giá)
Tạo bởi Huy Trịnh Cập nhật lần cuối 5 năm trước 12.505 lượt xem 9 bình luận
Tác giả/Dịch giả: Huy Trịnh
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:

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:

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).


Á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:

Normalize data

Train data

Để train data, ta gọi hàm Gradient Descent đã viết sẵn với alpha = 0.1iter = 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


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ó”.


Tải xuống

Tài liệu

Nhằm phục vụ mục đích học tập Offline của cộng đồng, Kteam hỗ trợ tính năng lưu trữ nội dung bài học Feature normalize và Gradient Descent cho multivariate problem dưới dạng file PDF trong link bên dưới.

Ngoài ra, bạn cũng có thể tìm thấy các tài liệu được đóng góp từ cộng đồng ở mục TÀI LIỆU trên thư viện Howkteam.com

Đừng quên likeshare để ủng hộ Kteam và tác giả nhé!


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ê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.

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á

5.0
3 đánh giá
Đánh giá
5
3
4
3
2
1
Dongstar2001 đã đánh giá 3 năm trước

:)) Qúa tuyệt zời Qúa Nice !

zenolk đã đánh giá 3 năm trước

Trongnguyen đã đánh giá 5 năm trước

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
peacecun2208 đã bình luận 4 năm trước

ai giải thích giúp mình làm thế nào để chọn alpha với iter cho chuẩn được không. Như coi trong clip thấy bảo là dựa vào bộ data. Nhưng dựa như thế nào, và đánh giá ra sao. Mong mọi người giải thích giúp. Xin cảm ơn.

vuphuongnam đã bình luận 4 năm trước

Em đã kiểm tra code giống anh, nhưng kết quả thì lại báo lỗi như sau:

RuntimeWarning: overflow encountered in multiply
  return bound(*args, **kwds)

Và giá trị đạt tối ưu số rất lớn:

Dat duoc toi uu tai I = 25 ; J = 232357601251212426499071501417501549453565987891232423445476554888062374409818437862864249792132937502186024781976541263938880019081861767687708104327777415261319786638227173530035783911342118742010940293895017444063004656462459212359153564182343182308246280546178795627927030974179353355522504191142526976.000000.

Em có cảm giác chương trình tính toán phần thập phân rất lớn. Ví dụ khi print J_hist như sau:

[[0.00000000e+000 1.34932124e+022]
 [1.00000000e+000 2.88109127e+033]
 [2.00000000e+000 6.15175001e+044]

.....

Cám ơn ae giúp đỡ. 

tranpt93 đã bình luận 4 năm trước

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 5 năm trước

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.