Triển khai các hương vị SVM khác với Scikit-Learn của Python

Triển khai các hương vị SVM khác với Scikit-Learn của Python

Giới thiệu

Hướng dẫn này là phần thứ ba và cũng là phần cuối cùng trong ba hướng dẫn về Máy Vector Hỗ trợ (SVM). Trong hướng dẫn này, chúng tôi sẽ tiếp tục làm việc với trường hợp sử dụng tiền giấy giả mạo, tóm tắt nhanh về ý tưởng chung đằng sau SVM, hiểu thủ thuật nhân là gì và triển khai các loại nhân phi tuyến tính khác nhau với Scikit-Learn.

Trong loạt hướng dẫn đầy đủ về SVM, bên cạnh việc tìm hiểu về các loại SVM khác, bạn cũng sẽ tìm hiểu về SVM đơn giản, các tham số được xác định trước của SVM, siêu tham số C và Gamma cũng như cách điều chỉnh chúng bằng tìm kiếm lưới và xác thực chéo.

Nếu bạn muốn đọc các hướng dẫn trước đó, bạn có thể xem qua hai hướng dẫn đầu tiên hoặc xem chủ đề nào bạn quan tâm nhất. Dưới đây là bảng các chủ đề được đề cập trong mỗi hướng dẫn:

  1. Triển khai SVM và Kernel SVM với Scikit-Learn của Python
  • Trường hợp sử dụng: quên tiền giấy
  • Bối cảnh của SVM
  • Mô hình SVM đơn giản (tuyến tính)
    • Giới thiệu về Dataset
    • Nhập tập dữ liệu
    • Khám phá bộ dữ liệu
  • Triển khai SVM với Scikit-Learn
    • Chia dữ liệu thành các tập huấn luyện/kiểm tra
    • Đào tạo người mẫu
    • Dự đoán
    • Đánh giá mô hình
    • Diễn giải kết quả
  1. Hiểu về siêu tham số SVM
  • Siêu tham số C
  • Siêu tham số Gamma

3. Triển khai các hương vị SVM khác với Scikit-Learn của Python

  • Ý tưởng chung về SVM (tóm tắt)
  • Hạt nhân (Thủ thuật) SVM
  • Triển khai SVM hạt nhân phi tuyến tính với Scikit-Learn
  • Nhập thư viện
    • Nhập tập dữ liệu
    • Chia dữ liệu thành các tính năng (X) và mục tiêu (y)
    • Chia dữ liệu thành các tập huấn luyện/kiểm tra
    • Huấn luyện thuật toán
  • nhân đa thức
    • Dự đoán
    • Đánh giá thuật toán
  • Hạt nhân Gaussian
    • Dự đoán và Đánh giá
  • hạt sigmoid
    • Dự đoán và Đánh giá
  • So sánh hiệu suất hạt nhân phi tuyến tính

Hãy nhớ lại SVM là gì trước khi xem một số biến thể nhân SVM thú vị.

Ý tưởng chung về SVM

Trong trường hợp dữ liệu có thể phân tách tuyến tính theo hai chiều (như trong Hình 1), phương pháp tiếp cận thuật toán học máy điển hình sẽ là cố gắng tìm một ranh giới phân chia dữ liệu theo cách sao cho giảm thiểu lỗi phân loại sai. Nếu bạn nhìn kỹ vào hình 1, hãy chú ý rằng có thể có một số ranh giới (vô hạn) phân chia các điểm dữ liệu một cách chính xác. Hai đường đứt nét cũng như đường liền nét đều là các phân loại hợp lệ của dữ liệu.

Nhiều ranh giới quyết định

Hình 1: Nhiều ranh giới quyết định

Khi SVM chọn ranh giới quyết định, nó chọn một ranh giới tối đa hóa khoảng cách giữa nó và các điểm dữ liệu gần nhất của các lớp. Chúng tôi đã biết rằng các điểm dữ liệu gần nhất là các vectơ hỗ trợ và khoảng cách có thể được tham số hóa bởi cả hai Cgamma siêu tham số.

Khi tính toán ranh giới quyết định đó, thuật toán chọn số lượng điểm cần xem xét và mức lợi nhuận có thể đi bao xa – điều này cấu hình một vấn đề tối đa hóa lợi nhuận. Để giải quyết vấn đề tối đa hóa lề đó, SVM sử dụng các vectơ hỗ trợ (như trong Hình 2) và cố gắng tìm ra đâu là giá trị tối ưu giúp giữ khoảng cách lề lớn hơn, đồng thời phân loại chính xác nhiều điểm hơn theo chức năng đang được sử dụng để tách dữ liệu.

Ranh giới quyết định với các vectơ hỗ trợ

Hình 2: Ranh giới quyết định với các vectơ hỗ trợ

Đây là lý do tại sao SVM khác với các thuật toán phân loại khác, một khi nó không chỉ đơn thuần tìm ra ranh giới quyết định, mà còn tìm ra ranh giới quyết định tối ưu.

Có toán học phức tạp bắt nguồn từ các phương pháp thống kê và tính toán liên quan đến việc tìm kiếm các vectơ hỗ trợ, tính toán biên độ giữa ranh giới quyết định và các vectơ hỗ trợ và tối đa hóa biên độ đó. Lần này, chúng ta sẽ không đi sâu vào chi tiết toán học diễn ra như thế nào.

Điều quan trọng là luôn tìm hiểu sâu hơn và đảm bảo các thuật toán học máy không phải là một loại câu thần chú bí ẩn nào đó, mặc dù việc không biết mọi chi tiết toán học vào thời điểm này không và sẽ không ngăn cản bạn thực hiện thuật toán và thu được kết quả.

Khuyên bảo: Bây giờ chúng ta đã tóm tắt quy trình thuật toán, rõ ràng là khoảng cách giữa các điểm dữ liệu sẽ ảnh hưởng đến ranh giới quyết định mà SVM chọn, do đó, nhân rộng dữ liệu thường là cần thiết khi sử dụng bộ phân loại SVM. Hãy thử sử dụng Phương pháp Scaler tiêu chuẩn của Scikit-learn để chuẩn bị dữ liệu, sau đó chạy lại mã để xem liệu có sự khác biệt trong kết quả hay không.

Hạt nhân (Thủ thuật) SVM

Trong phần trước, chúng ta đã ghi nhớ và sắp xếp ý tưởng chung về SVM – xem cách nó có thể được sử dụng để tìm ranh giới quyết định tối ưu cho dữ liệu có thể phân tách tuyến tính. Tuy nhiên, trong trường hợp dữ liệu có thể phân tách phi tuyến tính, chẳng hạn như dữ liệu được hiển thị trong Hình 3, chúng ta đã biết rằng không thể sử dụng một đường thẳng làm ranh giới quyết định.

Dữ liệu có thể phân tách phi tuyến tính

Hình 3: Dữ liệu có thể phân tách phi tuyến tính

Thay vào đó, chúng ta có thể sử dụng phiên bản sửa đổi của SVM mà chúng ta đã thảo luận ở phần đầu, được gọi là Kernel SVM.

Về cơ bản, những gì kernel SVM sẽ làm là chiếu dữ liệu có thể phân tách phi tuyến tính của các kích thước thấp hơn sang dạng tương ứng của nó ở các kích thước cao hơn. Đây là một thủ thuật, bởi vì khi chiếu dữ liệu có thể phân tách phi tuyến tính ở các chiều cao hơn, hình dạng dữ liệu sẽ thay đổi theo cách mà nó có thể phân tách được. Chẳng hạn, khi nghĩ về 3 chiều, các điểm dữ liệu từ mỗi lớp có thể được phân bổ ở một chiều khác, làm cho nó có thể tách rời. Một cách để tăng kích thước dữ liệu có thể là thông qua lũy thừa nó. Một lần nữa, có toán học phức tạp liên quan đến điều này, nhưng bạn không phải lo lắng về nó để sử dụng SVM. Thay vào đó, chúng ta có thể sử dụng thư viện Scikit-Learn của Python để triển khai và sử dụng các hạt nhân phi tuyến tính giống như cách chúng ta đã sử dụng hạt nhân tuyến tính.

Triển khai SVM hạt nhân phi tuyến tính với Scikit-Learn

Trong phần này, chúng ta sẽ sử dụng cùng một bộ dữ liệu để dự đoán xem một tờ tiền thật hay giả mạo theo bốn đặc điểm mà chúng ta đã biết.

Bạn sẽ thấy rằng các bước còn lại là các bước máy học điển hình và cần rất ít lời giải thích cho đến khi chúng ta đến phần đào tạo các SVM hạt nhân phi tuyến tính của mình.

Nhập thư viện

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
from sklearn.model_selection import train_test_split

Nhập tập dữ liệu

data_link = "https://archive.ics.uci.edu/ml/machine-learning-databases/00267/data_banknote_authentication.txt"
col_names = ["variance", "skewness", "curtosis", "entropy", "class"] bankdata = pd.read_csv(data_link, names=col_names, sep=",", header=None)
bankdata.head()mes)

Chia dữ liệu thành các tính năng (X) và mục tiêu (y)

X = bankdata.drop('class', axis=1)
y = bankdata['class']

Chia dữ liệu thành các tập huấn luyện/kiểm tra

SEED = 42 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20, random_state = SEED)

Huấn luyện thuật toán

Để huấn luyện kernel SVM, chúng ta sẽ sử dụng cùng một SVC lớp của Scikit-Learn's svm thư viện. Sự khác biệt nằm ở giá trị cho tham số hạt nhân của SVC lớp học.

Trong trường hợp của SVM đơn giản, chúng tôi đã sử dụng “tuyến tính” làm giá trị cho tham số kernel. Tuy nhiên, như chúng tôi đã đề cập trước đó, đối với SVM nhân, chúng ta có thể sử dụng nhân Gaussian, đa thức, sigmoid hoặc tính toán được. Chúng tôi sẽ triển khai các nhân đa thức, Gaussian và sigmoid và xem xét các số liệu cuối cùng của nó để xem cái nào có vẻ phù hợp với các lớp của chúng tôi với số liệu cao hơn.

1. Nhân đa thức

Trong đại số, đa thức là một biểu thức có dạng:

$$
2a*b^3 + 4a – 9
$$

Điều này có các biến, chẳng hạn như ab, hằng số, trong ví dụ của chúng tôi, 9 và các hệ số (hằng số kèm theo biến), chẳng hạn như 24. Các 3 được coi là bậc của đa thức.

Có những loại dữ liệu có thể được mô tả tốt nhất khi sử dụng hàm đa thức, ở đây, điều mà hạt nhân sẽ làm là ánh xạ dữ liệu của chúng ta thành một đa thức mà chúng ta sẽ chọn bậc. Mức độ càng cao, chức năng sẽ cố gắng tiến gần hơn đến dữ liệu, do đó, ranh giới quyết định càng linh hoạt (và dễ bị quá khớp) – mức độ càng thấp, càng kém linh hoạt.

Xem hướng dẫn thực hành, thực tế của chúng tôi để học Git, với các phương pháp hay nhất, các tiêu chuẩn được ngành công nghiệp chấp nhận và bảng lừa đảo đi kèm. Dừng lệnh Googling Git và thực sự học nó!

Vì vậy, để thực hiện các nhân đa thức, bên cạnh việc chọn poly kernel, chúng tôi cũng sẽ chuyển một giá trị cho degree tham số của SVC lớp học. Dưới đây là mã:

from sklearn.svm import SVC
svc_poly = SVC(kernel='poly', degree=8)
svc_poly.fit(X_train, y_train)

Dự đoán

Bây giờ, khi chúng tôi đã đào tạo thuật toán, bước tiếp theo là đưa ra dự đoán về dữ liệu thử nghiệm.

Như chúng ta đã làm trước đây, chúng ta có thể thực thi đoạn script sau để làm như vậy:

y_pred_poly = svclassifier.predict(X_test)

Đánh giá thuật toán

Như thường lệ, bước cuối cùng là đánh giá nhân đa thức. Vì chúng tôi đã lặp lại mã cho báo cáo phân loại và ma trận nhầm lẫn một vài lần, hãy chuyển đổi nó thành một chức năng display_results sau khi nhận được tương ứng y_test, y_pred và đặt tiêu đề cho ma trận nhầm lẫn của Seaborn với cm_title:

def display_results(y_test, y_pred, cm_title): cm = confusion_matrix(y_test,y_pred) sns.heatmap(cm, annot=True, fmt='d').set_title(cm_title) print(classification_report(y_test,y_pred))

Bây giờ, chúng ta có thể gọi hàm và xem kết quả thu được với nhân đa thức:

cm_title_poly = "Confusion matrix with polynomial kernel"
display_results(y_test, y_pred_poly, cm_title_poly)

Đầu ra trông như thế này:

 precision recall f1-score support 0 0.69 1.00 0.81 148 1 1.00 0.46 0.63 127 accuracy 0.75 275 macro avg 0.84 0.73 0.72 275
weighted avg 0.83 0.75 0.73 275

Triển khai các hương vị SVM khác với Trí thông minh dữ liệu PlatoBlockchain Scikit-Learn của Python. Tìm kiếm dọc. Ái.

Bây giờ chúng ta có thể lặp lại các bước tương tự cho hạt nhân Gaussian và sigmoid.

2. Hạt nhân Gaussian

Để sử dụng nhân gaussian, chúng ta chỉ cần chỉ định 'rbf' làm giá trị cho kernel tham số của lớp SVC:

svc_gaussian = SVC(kernel='rbf', degree=8)
svc_gaussian.fit(X_train, y_train)

Khi khám phá thêm hạt nhân này, bạn cũng có thể sử dụng tìm kiếm dạng lưới để kết hợp nó với các Cgamma các giá trị.

Dự đoán và Đánh giá

y_pred_gaussian = svc_gaussian.predict(X_test)
cm_title_gaussian = "Confusion matrix with Gaussian kernel"
display_results(y_test, y_pred_gaussian, cm_title_gaussian)

Đầu ra của nhân Gaussian SVM trông như thế này:

 precision recall f1-score support 0 1.00 1.00 1.00 148 1 1.00 1.00 1.00 127 accuracy 1.00 275 macro avg 1.00 1.00 1.00 275
weighted avg 1.00 1.00 1.00 275

Triển khai các hương vị SVM khác với Trí thông minh dữ liệu PlatoBlockchain Scikit-Learn của Python. Tìm kiếm dọc. Ái.

3. Hạt nhân Sigmoid

Cuối cùng, hãy sử dụng hạt nhân sigmoid để triển khai Kernel SVM. Hãy xem đoạn script sau:

svc_sigmoid = SVC(kernel='sigmoid')
svc_sigmoid.fit(X_train, y_train)

Để sử dụng nhân sigmoid, bạn phải chỉ định 'sigmoid' làm giá trị cho kernel tham số của SVC lớp học.

Dự đoán và Đánh giá

y_pred_sigmoid = svc_sigmoid.predict(X_test)
cm_title_sigmoid = "Confusion matrix with Sigmoid kernel"
display_results(y_test, y_pred_sigmoid, cm_title_sigmoid)

Đầu ra của Kernel SVM với nhân Sigmoid trông như thế này:

 precision recall f1-score support 0 0.67 0.71 0.69 148 1 0.64 0.59 0.61 127 accuracy 0.65 275 macro avg 0.65 0.65 0.65 275
weighted avg 0.65 0.65 0.65 275

Triển khai các hương vị SVM khác với Trí thông minh dữ liệu PlatoBlockchain Scikit-Learn của Python. Tìm kiếm dọc. Ái.

So sánh hiệu suất hạt nhân phi tuyến tính

Nếu chúng ta so sánh ngắn gọn hiệu suất của các loại nhân phi tuyến tính khác nhau, thì có vẻ như nhân sigmoid có số liệu thấp nhất, do đó, hiệu suất kém nhất.

Trong số các hạt nhân Gaussian và đa thức, chúng ta có thể thấy rằng hạt nhân Gaussian đạt được tỷ lệ dự đoán hoàn hảo 100% – điều này thường đáng ngờ và có thể chỉ ra sự phù hợp quá mức, trong khi hạt nhân đa thức đã phân loại sai 68 trường hợp của lớp 1.

Do đó, không có quy tắc cứng và nhanh nào về việc hạt nhân nào hoạt động tốt nhất trong mọi kịch bản hoặc trong kịch bản hiện tại của chúng tôi mà không cần tìm kiếm thêm siêu tham số, hiểu về từng hình dạng hàm, khám phá dữ liệu và so sánh kết quả huấn luyện và kiểm tra để xem thuật toán có phù hợp hay không. là khái quát hóa.

Tất cả chỉ là kiểm tra tất cả các hạt nhân và chọn một hạt nhân có sự kết hợp của các tham số và chuẩn bị dữ liệu để mang lại kết quả như mong đợi tùy theo ngữ cảnh của dự án của bạn.

Tiến xa hơn – Cầm tay chỉ việc từ đầu đến cuối

Bản tính ham học hỏi của bạn khiến bạn muốn tiến xa hơn? Chúng tôi khuyên bạn nên kiểm tra Dự án có hướng dẫn: “Dự đoán giá nội bộ thực hành - Máy học bằng Python”.

Triển khai các hương vị SVM khác với Trí thông minh dữ liệu PlatoBlockchain Scikit-Learn của Python. Tìm kiếm dọc. Ái.

Trong dự án có hướng dẫn này - bạn sẽ học cách xây dựng các mô hình máy học truyền thống mạnh mẽ cũng như các mô hình học sâu, sử dụng Ensemble Learning và đào tạo những người siêu học để dự đoán giá nhà từ một loạt các mô hình Scikit-Learn và Keras.

Sử dụng Keras, API học sâu được xây dựng trên Tensorflow, chúng tôi sẽ thử nghiệm với các kiến ​​trúc, xây dựng một nhóm các mô hình xếp chồng lên nhau và đào tạo người học meta mạng nơ-ron (mô hình cấp 1) để tìm ra giá của một ngôi nhà.

Học sâu thật tuyệt vời - nhưng trước khi sử dụng nó, bạn cũng nên thử giải quyết vấn đề bằng các kỹ thuật đơn giản hơn, chẳng hạn như với học tập nông cạn các thuật toán. Hiệu suất cơ bản của chúng tôi sẽ dựa trên Hồi quy rừng ngẫu nhiên thuật toán. Ngoài ra - chúng ta sẽ khám phá việc tạo các cụm mô hình thông qua Scikit-Learn thông qua các kỹ thuật như đóng baobiểu quyết.

Đây là một dự án end-to-end và giống như tất cả các dự án Machine Learning, chúng ta sẽ bắt đầu - với Phân tích dữ liệu thăm dò, theo dõi bởi Xử lý dữ liệu và cuối cùng Xây dựng nôngMô hình học sâu để phù hợp với dữ liệu chúng tôi đã khám phá và làm sạch trước đây.

Kết luận

Trong bài viết này, chúng tôi đã tóm tắt nhanh về SVM, nghiên cứu về thủ thuật kernel và triển khai các phiên bản khác nhau của SVM phi tuyến tính.

Tôi đề nghị bạn triển khai từng hạt nhân và tiếp tục tiến xa hơn. Bạn có thể khám phá toán học được sử dụng để tạo ra từng hạt nhân khác nhau, tại sao chúng được tạo ra và sự khác biệt liên quan đến siêu tham số của chúng. Theo cách đó, bạn sẽ tìm hiểu về các kỹ thuật và loại hạt nhân nào là tốt nhất để áp dụng tùy thuộc vào ngữ cảnh và dữ liệu có sẵn.

Hiểu rõ về cách thức hoạt động của từng hạt nhân và thời điểm sử dụng chúng chắc chắn sẽ giúp ích cho bạn trong hành trình của mình. Hãy cho chúng tôi biết tiến trình đang diễn ra như thế nào và chúc bạn viết mã vui vẻ!

Dấu thời gian:

Thêm từ xếp chồng lên nhau