Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 13 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
13
Dung lượng
1,09 MB
Nội dung
Machine Learning of 13 https://machinelearningcoban.com/2017/01/08/knn/ « Bài 5: K-means Clustering: Simple Applications (/2017/01/04/kmeans2/) Bài 7: Gradient Descent (phần 1/2) » (/2017/01/12/gradientdescent/) Bài 6: K-nearest neighbors KNN (/tags#KNN) Regression (/tags#Regression) Supervised-learning (/tags#Supervised-learning) Classification (/tags#Classification) MNIST (/tags#MNIST) Iris (/tags#Iris) Jan 8, 2017 Nếu người có kiểu học “nước đến chân nhảy”, Machine Learning có thuật tốn Trong trang này: • Giới thiệu ◦ Một câu chuyện vui ◦ K-nearest neighbor ◦ Khoảng cách khơng gian vector • Phân tích tốn học • Ví dụ Python ◦ Bộ sở liệu Iris (Iris flower dataset) ◦ Thí nghiệm ▪ Tách training test sets ▪ Phương pháp đánh giá (evaluation method) ▪ Đánh trọng số cho điểm lân cận • Thảo luận ◦ KNN cho Regression ◦ Chuẩn hóa liệu ◦ Sử dụng phép đo khoảng cách khác ◦ Ưu điểm KNN ◦ Nhược điểm KNN ◦ Tăng tốc cho KNN ◦ Try this yourself ◦ Source code • Tài liệu tham khảo Giới thiệu Một câu chuyện vui 03/11/2021, 16:30 Machine Learning of 13 https://machinelearningcoban.com/2017/01/08/knn/ Có anh bạn chuẩn bị đến ngày thi cuối kỳ Vì mơn mở tài liệu thi nên không chịu ôn tập để hiểu ý nghĩa học mối liên hệ Thay vào đó, anh thu thập tất tài liệu lớp, bao gồm ghi chép giảng (lecture notes), slides tập nhà + lời giải Để cho chắc, thư viện quán Photocopy quanh trường mua hết tất loại tài liệu liên quan (khá khen cho cậu chịu khó tìm kiếm tài liệu) Cuối cùng, anh bạn thu thập chồng cao tài liệu để mang vào phòng thi Vào ngày thi, anh tự tin mang chồng tài liệu vào phịng thi Aha, đề phải điểm Câu giống hệt giảng lớp Câu giống hệt đề thi năm ngoái mà lời giải có tập tài liệu mua quán Photocopy Câu gần giống với tập nhà Câu trắc nghiệm chí cậu nhớ xác ba tài liệu có ghi đáp án Câu cuối cùng, câu khó anh nhìn thấy, không nhớ đâu Kết cuối cùng, cậu ta điểm, vừa đủ điểm qua mơn Cậu làm xác câu tìm tập ghi giảng Câu tìm đáp án lời giải quán Photocopy sai! Câu ba thấy gần giống nhà, khác số thôi, cậu cho kết giống luôn, mà không điểm Câu tìm tài liệu có hai cho đáp án A, cịn lại cho B Cậu chọn A điểm Câu khơng làm dù cịn tới 20 phút, tìm chẳng thấy đáp án đâu - nhiều tài liệu mệt!! Không phải ngẫu nhiên mà dành ba đoạn văn để kể chuyện học hành anh chàng Hơm tơi xin trình bày phương pháp Machine Learning, gọi K-nearest neighbor (hay KNN), thuật toán xếp vào loại lazy (machine) learning (máy lười học) Thuật toán giống với cách học/thi anh bạn may mắn K-nearest neighbor K-nearest neighbor thuật toán supervised-learning đơn giản (mà hiệu vài trường hợp) Machine Learning Khi training, thuật tốn khơng học điều từ liệu training (đây lý thuật toán xếp vào loại lazy learning (https://en.wikipedia.org/wiki/Lazy_learning)), tính tốn thực cần dự đốn kết liệu K-nearest neighbor áp dụng vào hai loại toán Supervised learning Classification (/2016/12/27/categories/#classification-phan-loai) Regression (/2016/12/27/categories/#regression-hoi-quy) KNN gọi thuật tốn Instance-based hay Memory-based learning (https://en.wikipedia.org/wiki/Instancebased_learning) Có vài khái niệm tương ứng người-máy sau: Ngôn ngữ người Ngôn ngữ Máy Học in Machine Learning Câu hỏi Điểm liệu Data point Đáp án Đầu ra, nhãn Output, Label 03/11/2021, 16:30 Machine Learning of 13 https://machinelearningcoban.com/2017/01/08/knn/ Ngơn ngữ người Ơn thi Ngơn ngữ Máy Học Huấn luyện in Machine Learning Training Tập tài liệu mang vào phòng thi Tập liệu tập huấn Training set Đề thi Tập liểu kiểm thử Test set Câu hỏi dề thi Dữ liệu kiểm thử Test data point Câu hỏi có đáp án sai Nhiễu Noise, Outlier Câu hỏi gần giống Điểm liệu gần Nearest Neighbor Với KNN, toán Classification, label điểm liệu (hay kết câu hỏi thi) suy trực tiếp từ K điểm liệu gần training set Label test data định major voting (bầu chọn theo số phiếu) điểm gần nhất, suy cách đánh trọng số khác cho điểm gần suy label Chi tiết nêu phần Trong toán Regresssion, đầu điểm liệu đầu điểm liệu biết gần (trong trường hợp K=1), trung bình có trọng số đầu điểm gần nhất, mối quan hệ dựa khoảng cách tới điểm gần Một cách ngắn gọn, KNN thuật tốn tìm đầu điểm liệu cách dựa thông tin K điểm liệu training set gần (K-lân cận), khơng quan tâm đến việc có vài điểm liệu điểm gần nhiễu Hình ví dụ KNN classification với K = Bản đồ 1NN (Nguồn: Wikipedia (https://en.wikipedia.org/wiki/K-nearest_neighbors_algorithm)) 03/11/2021, 16:30 Machine Learning of 13 https://machinelearningcoban.com/2017/01/08/knn/ Ví dụ toán Classification với classes: Đỏ, Lam, Lục Mỗi điểm liệu (test data point) gán label theo màu điểm mà thuộc Trong hình này, có vài vùng nhỏ xem lẫn vào vùng lớn khác màu Ví dụ có điểm màu Lục gần góc 11 nằm hai vùng lớn với nhiều liệu màu Đỏ Lam Điểm nhiễu Dẫn đến liệu test rơi vào vùng có nhiều khả cho kết khơng xác Khoảng cách không gian vector Trong không gian chiều, khoảng cách hai điểm trị tuyệt đối hiệu giá trị hai điểm Trong khơng gian nhiều chiều, khoảng cách hai điểm định nghĩa nhiều hàm số khác nhau, độ dài đường thằng hai điểm trường hợp đặc biệt Nhiều thơng tin bổ ích (cho Machine Learning) tìm thấy Norms (chuẩn) vector (/math/#-norms-chuan) tab Math (/math/) Phân tích tốn học Thuật tốn KNN dễ hiểu nên phần “Phân tích tốn học” có câu Tơi trực tiếp vào ví dụ Có điều đáng lưu ý KNN phải nhớ tất điểm liệu training, việc không lợi nhớ thời gian tính tốn - giống cậu bạn khơng tìm câu trả lời cho câu hỏi cuối Ví dụ Python Bộ sở liệu Iris (Iris flower dataset) Iris flower dataset (https://en.wikipedia.org/wiki/Iris_flower_data_set) liệu nhỏ (nhỏ nhiều so với MNIST (/2017/01/04/kmeans2/#bo-co-so-du-lieu-mnist) Bộ liệu bao gồm thơng tin ba loại hoa Iris (một lồi hoa lan) khác nhau: Iris setosa, Iris virginica Iris versicolor Mỗi loại có 50 bơng hoa đo với liệu thông tin: chiều dài, chiều rộng đài hoa (sepal), chiều dài, chiều rộng cánh hoa (petal) Dưới ví dụ hình ảnh ba loại hoa (Chú ý, sở liệu ảnh MNIST, điểm liệu tập vector chiều) 03/11/2021, 16:30 Machine Learning of 13 https://machinelearningcoban.com/2017/01/08/knn/ Ví dụ Iris flower dataset (Nguồn: Wikipedia (https://en.wikipedia.org/wiki/Iris_flower_data_set)) Bộ liệu nhỏ thường sử dụng nhiều thuật tốn Machine Learning lớp học Tơi giải thích lý khơng chọn MNIST vào phần sau Thí nghiệm Trong phần này, tách 150 liệu Iris flower dataset thành phần, gọi training set test set Thuật toán KNN dựa vào trông tin training set để dự đoán xem liệu test set tương ứng với loại hoa Dữ liệu dự đoán đối chiếu với loại hoa thật liệu test set để đánh giá hiệu KNN Trước tiên, cần khai báo vài thư viện Iris flower dataset có sẵn thư viện scikit-learn (http://scikit-learn.org/) import numpy as np import matplotlib.pyplot as plt from sklearn import neighbors, datasets Tiếp theo, load liệu thị vài liệu mẫu Các class gán nhãn 0, 1, 03/11/2021, 16:30 Machine Learning of 13 https://machinelearningcoban.com/2017/01/08/knn/ iris = datasets.load_iris() iris_X = iris.data iris_y = iris.target print 'Number of classes: %d' %len(np.unique(iris_y)) print 'Number of data points: %d' %len(iris_y) X0 = iris_X[iris_y == 0,:] print '\nSamples from class 0:\n', X0[:5,:] X1 = iris_X[iris_y == 1,:] print '\nSamples from class 1:\n', X1[:5,:] X2 = iris_X[iris_y == 2,:] print '\nSamples from class 2:\n', X2[:5,:] Number of classes: Number of data points: 150 Samples [[ 5.1 [ 4.9 [ 4.7 [ 4.6 [ from 3.5 3.2 3.1 3.6 class 0: 1.4 0.2] 1.4 0.2] 1.3 0.2] 1.5 0.2] 1.4 0.2]] Samples [[ [ 6.4 [ 6.9 [ 5.5 [ 6.5 from 3.2 3.2 3.1 2.3 2.8 class 1: 4.7 1.4] 4.5 1.5] 4.9 1.5] 1.3] 4.6 1.5]] Samples [[ 6.3 [ 5.8 [ 7.1 [ 6.3 [ 6.5 from 3.3 2.7 2.9 class 2: 2.5] 5.1 1.9] 5.9 2.1] 5.6 1.8] 5.8 2.2]] Nếu nhìn vào vài liệu mẫu, thấy hai cột cuối mang nhiều thông tin giúp phân biệt chúng Chúng ta dự đoán kết classification cho sở liệu tương đối cao Tách training test sets Giả sử muốn dùng 50 điểm liệu cho test set, 100 điểm lại cho training set 03/11/2021, 16:30 Machine Learning of 13 https://machinelearningcoban.com/2017/01/08/knn/ Scikit-learn có hàm số cho phép ngẫu nhiên lựa chọn điểm này, sau: from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split( iris_X, iris_y, test_size=50) print "Training size: %d" %len(y_train) print "Test size : %d" %len(y_test) Training size: 100 Test size : 50 Sau đây, trước hết xét trường hợp đơn giản K = 1, tức với điểm test data, ta xét điểm training data gần lấy label điểm để dự đốn cho điểm test clf = neighbors.KNeighborsClassifier(n_neighbors = 1, p = 2) clf.fit(X_train, y_train) y_pred = clf.predict(X_test) print "Print results for 20 test data points:" print "Predicted labels: ", y_pred[20:40] print "Ground truth : ", y_test[20:40] Print results for first 20 test data points: Predicted labels: [2 2 2 2 0 2 0] Ground truth : [2 2 2 1 0 2 0] Kết cho thấy label dự đoán gần giống với label thật test data, có điểm số 20 điểm hiển thị có kết sai lệch Ở làm quen với khái niệm mới: ground truth Một cách đơn giản, ground truth nhãn/label/đầu thực điểm test data Khái niệm dùng nhiều Machine Learning, hy vọng lần tới bạn gặp nhớ Phương pháp đánh giá (evaluation method) Để đánh giá độ xác thuật tốn KNN classifier này, xem xem có điểm test data dự đoán Lấy số lượng chia cho tổng số lượng tập test data độ xác Scikit-learn cung cấp hàm số accuracy_score (http://scikit-learn.org /stable/modules/generated/sklearn.metrics.accuracy_score.html) để thực công việc from sklearn.metrics import accuracy_score print "Accuracy of 1NN: %.2f %%" %(100*accuracy_score(y_test, y_pred)) 03/11/2021, 16:30 Machine Learning of 13 https://machinelearningcoban.com/2017/01/08/knn/ Accuracy of 1NN: 94.00 % 1NN cho kết 94%, không tệ! Chú ý sở liệu dễ với liệu hai cột cuối cùng, suy quy luật Trong ví dụ này, tơi sử dụng p = nghĩa khoảng cách tính khoảng cách theo norm (/math/#norm2) Các bạn thử cách thay p = cho norm (/math/#norm0), gía trị p khác cho norm khác (Xem thêm sklearn.neighbors.KNeighborsClassifier (http://scikit-learn.org/stable /modules/generated/sklearn.neighbors.KNeighborsClassifier.html)) Nhận thấy xét điểm gần dẫn đến kết sai điểm nhiễu Một cách làm tăng độ xác tăng số lượng điểm lân cận lên, ví dụ 10 điểm, xem xem 10 điểm gần nhất, class chiếm đa số dự đốn kết class Kỹ thuật dựa vào đa số gọi major voting clf = neighbors.KNeighborsClassifier(n_neighbors = 10, p = 2) clf.fit(X_train, y_train) y_pred = clf.predict(X_test) print "Accuracy of 10NN with major voting: %.2f %%" %(100*accuracy_score(y_test, y_pred Accuracy of 10NN with major voting: 98.00 % Kết tăng lên 98%, tốt! Đánh trọng số cho điểm lân cận Là kẻ tham lam, chưa muốn dừng kết thấy cải thiện Trong kỹ thuật major voting bên trên, 10 điểm gần coi có vai trị giá trị phiếu điểm Tôi cho khơng cơng bằng, rõ ràng điểm gần nên có trọng số cao (càng thân cận tin tưởng) Vậy nên đánh trọng số khác cho 10 điểm gần Cách đánh trọng số phải thoải mãn điều kiện điểm gần điểm test data phải đánh trọng số cao (tin tưởng hơn) Cách đơn giản lấy nghịch đảo khoảng cách (Trong trường hợp test data trùng với điểm liệu training data, tức khoảng cách 0, ta lấy label điểm training data) Scikit-learn giúp đơn giản hóa việc cách gán gía trị weights = 'distance' (Giá trị mặc định weights 'uniform', tương ứng với việc coi tất điểm lân cận có giá trị như trên) 03/11/2021, 16:30 Machine Learning of 13 https://machinelearningcoban.com/2017/01/08/knn/ clf = neighbors.KNeighborsClassifier(n_neighbors = 10, p = 2, weights = 'distance') clf.fit(X_train, y_train) y_pred = clf.predict(X_test) print "Accuracy of 10NN (1/distance weights): %.2f %%" %(100*accuracy_score(y_test, y_pred Accuracy of 10NN (1/distance weights): 100.00 % Aha, 100% Chú ý: Ngoài phương pháp đánh trọng số weights = 'uniform' weights = 'distance' trên, scikit-learn cung cấp cho cách để đánh trọng số cách tùy chọn Ví dụ, cách đánh trọng số phổ biến khác Machine Learning là: wi = exp( −||x − xi ||22 σ2 ) x test data, xi điểm K-lân cận x, wi trọng số điểm (ứng với điểm liệu xét x), σ số dương Nhận thấy hàm số thỏa mãn điều kiện: điểm gần x trọng số cao (cao 1) Với hàm số này, lập trình sau: def myweight(distances): sigma2 = # we can change this number return np.exp(-distances**2/sigma2) clf = neighbors.KNeighborsClassifier(n_neighbors = 10, p = 2, weights = myweight) clf.fit(X_train, y_train) y_pred = clf.predict(X_test) print "Accuracy of 10NN (customized weights): %.2f %%" %(100*accuracy_score(y_test, y_pred Accuracy of 10NN (customized weights): 98.00 % Trong trường hợp này, kết tương đương với kỹ thuật major voting Để đánh giá xác kết KNN với K khác nhau, cách định nghĩa khoảng cách khác cách đánh trọng số khác nhau, cần thực trình với nhiều cách chia liệu training test khác lấy kết trung bình, liệu phân chia trường hợp cụ thể tốt xấu (bias) Đây cách thường dùng đánh giá hiệu thuật toán cụ thể Thảo luận 03/11/2021, 16:30 Machine Learning 10 of 13 https://machinelearningcoban.com/2017/01/08/knn/ KNN cho Regression Với tốn Regression, hồn tồn sử dụng phương pháp tương tự: ước lượng đầu dựa đầu khoảng cách điểm K-lân cận Việc ước lượng bạn tự định nghĩa tùy vào toán KNN cho toán Regression (Nguồn: Nearest Neighbors regression (http://scikit-learn.org/stable /auto_examples/neighbors/plot_regression.html#sphx-glr-auto-examples-neighbors-plot-regression-py)) Chuẩn hóa liệu Khi có thuộc tính liệu (hay phần tử vector) lớn thuộc tính khác nhiều (ví dụ thay đo cm kết lại tính mm), khoảng cách điểm phụ thuộc vào thuộc tính nhiều Để có kết xác hơn, kỹ thuật thường dùng Data Normalization (chuẩn hóa liệu) để đưa thuộc tính có đơn vị đo khác khoảng giá trị, thường từ đến 1, trước thực KNN Có nhiều kỹ thuật chuẩn hóa khác nhau, bạn thấy tiếp tục theo dõi Blog Các kỹ thuật chuẩn hóa áp dụng với khơng KNN mà cịn với hầu hết thuật toán khác Sử dụng phép đo khoảng cách khác Ngoài norm norm tơi giới thiệu này, cịn nhiều khoảng cách khác có 03/11/2021, 16:30 Machine Learning 11 of 13 https://machinelearningcoban.com/2017/01/08/knn/ thể dùng Một ví dụ đơn giản đếm số lượng thuộc tính khác hai điểm liệu Số nhỏ hai điểm gần Đây giả chuẩn (/math/#norm0) mà giới thiệu Tab Math (/math/) Ưu điểm KNN Độ phức tạp tính tốn q trình training Việc dự đoán kết liệu đơn giản Khơng cần giả sử phân phối class Nhược điểm KNN KNN nhạy cảm với nhiễu K nhỏ Như nói, KNN thuật tốn mà tính tốn nằm khâu test Trong việc tính khoảng cách tới điểm liệu training set tốn nhiều thời gian, đặc biệt với sở liệu có số chiều lớn có nhiều điểm liệu Với K lớn độ phức tạp tăng lên Ngồi ra, việc lưu toàn liệu nhớ ảnh hưởng tới hiệu KNN Tăng tốc cho KNN Ngồi việc tính tốn khoảng cách từ điểm test data đến tất điểm traing set (Brute Force), có số thuật tốn khác giúp tăng tốc việc tìm kiếm Bạn đọc có thẻ tìm kiếm thêm với hai từ khóa: K-D Tree (http://pointclouds.org/documentation/tutorials /kdtree_search.php) Ball Tree (https://en.wikipedia.org/wiki/Ball_tree) Tôi xin dành phần cho độc giả tự tìm hiểu, quay lại có dịp Chúng ta cịn thuật tốn quan trọng khác cần nhiều quan tâm Try this yourself Tơi có viết đoạn code ngắn để thực việc Classification cho sở liệu MNIST (/2017 /01/04/kmeans2/#bo-co-so-du-lieu-mnist) Các bạn download toàn bộ liệu sau cịn dùng nhiều, chạy thử, comment kết nhận xét bạn vào phần comment bên Để trả lời cho câu hỏi tơi khơng chọn sở liệu làm ví dụ, bạn đọc tự tìm đáp án chạy xong đoạn code Enjoy! 03/11/2021, 16:30 Machine Learning 12 of 13 https://machinelearningcoban.com/2017/01/08/knn/ # %reset import numpy as np from mnist import MNIST # require `pip install python-mnist` # https://pypi.python.org/pypi/python-mnist/ import matplotlib.pyplot as plt from sklearn import neighbors from sklearn.metrics import accuracy_score import time # you need to download the MNIST dataset first # at: http://yann.lecun.com/exdb/mnist/ mndata = MNIST(' /MNIST/') # path to your MNIST folder mndata.load_testing() mndata.load_training() X_test = mndata.test_images X_train = mndata.train_images y_test = np.asarray(mndata.test_labels) y_train = np.asarray(mndata.train_labels) start_time = time.time() clf = neighbors.KNeighborsClassifier(n_neighbors = 1, p = 2) clf.fit(X_train, y_train) y_pred = clf.predict(X_test) end_time = time.time() print "Accuracy of 1NN for MNIST: %.2f %%" %(100*accuracy_score(y_test, y_pred)) print "Running time: %.2f (s)" % (end_time - start_time) Source code iPython Notebook cho download (https://github.com/tiepvupsu /tiepvupsu.github.io/tree/master/assets/knn/KNN.ipynb) Tài liệu tham khảo sklearn.neighbors.NearestNeighbors (http://scikit-learn.org/stable/modules/generated /sklearn.neighbors.NearestNeighbors.html#sklearn.neighbors.NearestNeighbors) sklearn.model_selection.train_test_split (http://scikit-learn.org/stable/modules/generated /sklearn.model_selection.train_test_split.html) Tutorial To Implement k-Nearest Neighbors in Python From Scratch (http://machinelearningmastery.com/tutorial-to-implement-k-nearest-neighbors-in-pythonfrom-scratch/) 03/11/2021, 16:30 Machine Learning 13 of 13 https://machinelearningcoban.com/2017/01/08/knn/ Nếu có câu hỏi, Bạn để lại comment bên Forum (https://www.facebook.com/groups/257768141347267/) để nhận câu trả lời sớm Bạn đọc ủng hộ blog qua 'Buy me a cofee' (/buymeacoffee/) góc bên trái blog Tơi vừa hoàn thành ebook 'Machine Learning bản', bạn đặt sách (/ebook/) Cảm ơn bạn « Bài 5: K-means Clustering: Simple Applications (/2017/01/04/kmeans2/) Bài 7: Gradient Descent (phần 1/2) » (/2017/01/12/gradientdescent/) Total visits: 03/11/2021, 16:30