Triển khai SVM và Kernel SVM với Scikit-Learn của Python

Triển khai SVM và Kernel SVM với Scikit-Learn của Python

Giới thiệu

Hướng dẫn này là phần đầu tiên trong ba hướng dẫn về Máy Vector Hỗ trợ (SVM). Trong loạt bài này, chúng ta sẽ nghiên cứu trường hợp sử dụng tiền giả mạo, tìm hiểu về SVM đơn giản, sau đó về siêu tham số SVM và cuối cùng, tìm hiểu một khái niệm gọi là lừa hạt nhân và khám phá các loại SVM khác.

Nếu bạn muốn đọc tất cả các hướng dẫn hoặc xem hướng dẫn 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ả

2. Tìm hiểu về siêu tham số SVM (Sắp có!)

  • 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 (Sắp có!)

  • Ý tưởng chung về SVM (tóm tắt)
  • Hạt nhân (lừa) SVM
  • Triển khai SVM 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

Trường hợp sử dụng: Giấy bạc ngân hàng giả mạo

Đôi khi người ta tìm cách giả mạo tiền giấy. Nếu có một người nhìn vào những ghi chú đó và xác minh tính hợp lệ của chúng, thì có lẽ khó có thể bị lừa bởi chúng.

Nhưng điều gì sẽ xảy ra khi không có người xem từng ghi chú? Có cách nào để tự động biết liệu tiền giấy là giả hay thật không?

Có nhiều cách để trả lời những câu hỏi đó. Một câu trả lời là chụp ảnh từng tờ tiền nhận được, so sánh hình ảnh của nó với hình ảnh của tờ tiền giả, sau đó phân loại nó là thật hay giả. Một khi việc chờ xác thực ghi chú có thể tẻ nhạt hoặc quan trọng, thì việc so sánh đó nhanh chóng cũng sẽ rất thú vị.

Vì hình ảnh đang được sử dụng nên chúng có thể được nén, giảm thành thang độ xám và trích xuất hoặc lượng tử hóa các phép đo của chúng. Theo cách này, phép so sánh sẽ là giữa các phép đo hình ảnh, thay vì pixel của từng hình ảnh.

Cho đến nay, chúng ta đã tìm ra cách để xử lý và so sánh tiền giấy, nhưng làm cách nào để phân loại chúng thành thật hay giả? Chúng ta có thể sử dụng máy học để thực hiện việc phân loại đó. Có một thuật toán phân loại gọi là Máy hỗ trợ vector, chủ yếu được biết đến dưới dạng viết tắt của nó: SVM.

Bối cảnh của SVM

SVM lần đầu tiên được giới thiệu vào năm 1968 bởi Vladmir Vapnik và Alexey Chervonenkis. Vào thời điểm đó, thuật toán của họ bị giới hạn trong việc phân loại dữ liệu có thể được phân tách chỉ bằng một đường thẳng hoặc dữ liệu được có thể phân tách tuyến tính. Chúng ta có thể thấy sự tách biệt đó sẽ như thế nào:

Triển khai SVM và Kernel SVM với Trí tuệ dữ liệu PlatoBlockchain Scikit-Learn của Python. Tìm kiếm dọc. Ái.

Trong hình trên, chúng ta có một đường thẳng ở giữa, trong đó một số điểm nằm ở bên trái và những điểm khác nằm ở bên phải của đường thẳng đó. Lưu ý rằng cả hai nhóm điểm được phân tách hoàn hảo, không có điểm nào ở giữa hoặc thậm chí gần với đường thẳng. Dường như có một lề giữa các điểm tương tự và đường phân chia chúng, lề đó được gọi là lề tách biệt. Chức năng của lề phân tách là làm cho khoảng cách giữa các điểm giống nhau và đường phân chia chúng lớn hơn. SVM thực hiện điều đó bằng cách sử dụng một số điểm và tính toán các vectơ vuông góc của nó để hỗ trợ quyết định cho lề của đường thẳng. Đó là những vectơ hỗ trợ đó là một phần của tên của thuật toán. Chúng ta sẽ hiểu thêm về chúng sau. Và đường thẳng mà chúng ta nhìn thấy ở giữa được tìm thấy bằng các phương pháp tối đa hóa khoảng cách đó giữa đường thẳng và các điểm hoặc tối đa hóa biên độ phân tách. Những phương pháp đó bắt nguồn từ lĩnh vực Lý thuyết tối ưu hóa.

Trong ví dụ chúng ta vừa thấy, cả hai nhóm điểm có thể dễ dàng tách biệt, vì mỗi điểm riêng lẻ gần nhau với các điểm tương tự của nó và hai nhóm cách xa nhau.

Nhưng điều gì sẽ xảy ra nếu không có cách nào để phân tách dữ liệu bằng một đường thẳng? Nếu có những điểm lộn xộn, hoặc nếu cần một đường cong?

Để giải quyết vấn đề đó, SVM sau đó đã được cải tiến vào những năm 1990 để có thể phân loại dữ liệu có các điểm nằm ngoài xu hướng trung tâm của nó, chẳng hạn như các giá trị ngoại lai hoặc các vấn đề phức tạp hơn có nhiều hơn hai chiều và không thể phân tách tuyến tính .

Điều gây tò mò là chỉ trong những năm gần đây, SVM mới được áp dụng rộng rãi, chủ yếu là do khả năng đạt được hơn 90% câu trả lời đúng hoặc chính xác, đối với những bài toán khó.

Các SVM được triển khai theo một cách độc đáo khi so sánh với các thuật toán học máy khác, một khi chúng dựa trên các giải thích thống kê về việc học là gì hoặc trên Lý thuyết học thống kê.

Trong bài viết này, chúng ta sẽ xem thuật toán Máy vectơ hỗ trợ là gì, lý thuyết ngắn gọn đằng sau máy vectơ hỗ trợ và cách triển khai chúng trong thư viện Scikit-Learn của Python. Sau đó, chúng tôi sẽ chuyển sang một khái niệm SVM khác, được gọi là Hạt nhân SVM, hoặc là thủ thuật hạt nhânvà cũng sẽ triển khai nó với sự trợ giúp của Scikit-Learn.

Mô hình SVM đơn giản (tuyến tính)

Giới thiệu về Dataset

Theo ví dụ được đưa ra trong phần giới thiệu, chúng tôi sẽ sử dụng tập dữ liệu có phép đo hình ảnh tiền thật và tiền giả.

Khi nhìn vào hai ghi chú, mắt chúng ta thường quét chúng từ trái sang phải và kiểm tra xem có thể có điểm giống hoặc khác nhau ở đâu. Chúng tôi tìm kiếm một chấm đen xuất hiện trước một chấm xanh lá cây hoặc một dấu sáng bóng phía trên hình minh họa. Điều này có nghĩa là chúng ta xem các ghi chú theo thứ tự. Nếu chúng ta biết có các chấm màu xanh lá cây và màu đen, nhưng không biết nếu chấm màu xanh lá cây xuất hiện trước màu đen hoặc nếu màu đen xuất hiện trước màu xanh lá cây, thì sẽ khó phân biệt giữa các nốt hơn.

Có một phương pháp tương tự như những gì chúng tôi vừa mô tả có thể được áp dụng cho các hình ảnh ghi chú ngân hàng. Nói chung, phương pháp này bao gồm việc dịch các pixel của hình ảnh thành tín hiệu, sau đó xem xét thứ tự mà mỗi tín hiệu khác nhau xuất hiện trong hình ảnh bằng cách chuyển đổi nó thành các sóng nhỏ hoặc sóng con. Sau khi thu được các wavelet, có một cách để biết thứ tự mà một số tín hiệu xảy ra trước một tín hiệu khác, hoặc thời gian, nhưng không chính xác là tín hiệu gì. Để biết điều đó, cần phải thu được tần số của hình ảnh. Chúng thu được bằng một phương pháp phân tách từng tín hiệu, được gọi là phương pháp Fourier.

Sau khi thu được chiều thời gian thông qua các bước sóng và chiều tần số thông qua phương pháp Fourier, sự chồng chất của thời gian và tần số được thực hiện để xem khi nào cả hai khớp nhau, đây là tích chập Phân tích. Phép tích chập thu được sự phù hợp khớp với các wavelet với tần số của hình ảnh và tìm ra tần số nào nổi bật hơn.

Phương pháp này liên quan đến việc tìm các wavelet, tần số của chúng và sau đó khớp cả hai, được gọi là biến đổi wavelet. Biến đổi wavelet có các hệ số và các hệ số đó được sử dụng để thu được các phép đo mà chúng tôi có trong tập dữ liệu.

Nhập tập dữ liệu

Bộ dữ liệu tiền giấy ngân hàng mà chúng ta sẽ sử dụng trong phần này giống với bộ dữ liệu đã được sử dụng trong phần phân loại của hướng dẫn cây quyết định.

Lưu ý: Bạn có thể tải xuống bộ dữ liệu tại đây.

Hãy nhập dữ liệu vào pandas dataframe cấu trúc và hãy xem năm hàng đầu tiên của nó với head() phương pháp.

Lưu ý rằng dữ liệu được lưu trong một txt định dạng tệp (văn bản), được phân tách bằng dấu phẩy và không có tiêu đề. Chúng ta có thể xây dựng lại nó dưới dạng bảng bằng cách đọc nó dưới dạng csv, xác định separator dưới dạng dấu phẩy và thêm tên cột bằng names tranh luận.

Hãy làm theo ba bước đó cùng một lúc, rồi xem năm hàng đầu tiên của dữ liệu:

import pandas as pd 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()

Kết quả này trong:

	variance skewness curtosis entropy class
0 3.62160 8.6661 -2.8073 -0.44699 0
1 4.54590 8.1674 -2.4586 -1.46210 0
2 3.86600 -2.6383 1.9242 0.10645 0
3 3.45660 9.5228 -4.0112 -3.59440 0
4 0.32924 -4.4552 4.5718 -0.98880 0

Lưu ý: Bạn cũng có thể lưu dữ liệu cục bộ và thay thế data_link cho data_pathvà chuyển đường dẫn đến tệp cục bộ của bạn.

Chúng tôi có thể thấy rằng có năm cột trong tập dữ liệu của chúng tôi, cụ thể là, variance, skewness, curtosis, entropyclass. Trong năm hàng, bốn cột đầu tiên được điền bằng các số như 3.62160, 8.6661, -2.8073 hoặc liên tục các giá trị và giá trị cuối cùng class cột có năm hàng đầu tiên chứa đầy số 0 hoặc một rời rạc giá trị.

Vì mục tiêu của chúng tôi là dự đoán xem một tờ tiền tệ ngân hàng có xác thực hay không, chúng tôi có thể làm điều đó dựa trên bốn thuộc tính của tờ tiền:

  • variance của hình ảnh biến đổi Wavelet. Nói chung, phương sai là một giá trị liên tục đo lường mức độ gần hoặc xa của các điểm dữ liệu với giá trị trung bình của dữ liệu. Nếu các điểm gần với giá trị trung bình của dữ liệu hơn, thì phân phối gần với phân phối chuẩn hơn, điều này thường có nghĩa là các giá trị của nó được phân phối tốt hơn và dễ dự đoán hơn một chút. Trong bối cảnh hình ảnh hiện tại, đây là phương sai của các hệ số do biến đổi wavelet. Phương sai càng ít, các hệ số càng gần với việc dịch hình ảnh thực tế.

  • skewness của hình ảnh biến đổi Wavelet. Độ lệch là một giá trị liên tục biểu thị tính bất đối xứng của phân phối. Nếu có nhiều giá trị hơn ở bên trái của giá trị trung bình, thì phân phối là lệch tiêu cực, nếu có nhiều giá trị hơn ở bên phải của giá trị trung bình, thì phân phối là sai lệch tích cựcvà nếu giá trị trung bình, chế độ và trung vị giống nhau, thì phân phối là đối xứng. Phân phối càng đối xứng thì càng gần với phân phối chuẩn và các giá trị của nó cũng được phân phối tốt hơn. Trong bối cảnh hiện tại, đây là độ lệch của các hệ số do phép biến đổi wavelet. Các hệ số càng đối xứng, chúng ta càng gầnvariance, skewness, curtosis, entropylại để dịch hình ảnh thực tế.

Triển khai SVM và Kernel SVM với Trí tuệ dữ liệu PlatoBlockchain Scikit-Learn của Python. Tìm kiếm dọc. Ái.

  • curtosis (hoặc kurtosis) của hình ảnh Wavelet Transformed. Độ nhọn là một giá trị liên tục, giống như độ lệch, cũng mô tả hình dạng của một phân bố. Tùy thuộc vào hệ số nhọn (k), một phân phối – khi so sánh với phân phối bình thường có thể phẳng hơn hoặc ít hơn – hoặc có nhiều hoặc ít dữ liệu ở các cực hoặc đuôi của nó. Khi phân phối trải rộng hơn và phẳng hơn, nó được gọi là thú mỏ vịt; khi nó ít lan ra và tập trung nhiều hơn ở giữa, trung du; và khi sự phân phối gần như hoàn toàn tập trung ở giữa, nó được gọi là leptokurtic. Đây là trường hợp tương tự như các trường hợp trước về phương sai và độ lệch, phân phối mesokurtic càng nhiều thì các hệ số càng gần với việc dịch hình ảnh thực tế.

Triển khai SVM và Kernel SVM với Trí tuệ dữ liệu PlatoBlockchain Scikit-Learn của Python. Tìm kiếm dọc. Ái.

  • entropy của hình ảnh. Entropy cũng là một giá trị liên tục, nó thường đo lường tính ngẫu nhiên hoặc mất trật tự trong một hệ thống. Trong ngữ cảnh của một hình ảnh, entropy đo lường sự khác biệt giữa một pixel và các pixel lân cận của nó. Đối với bối cảnh của chúng tôi, các hệ số có entropy càng nhiều thì càng có nhiều tổn thất khi biến đổi hình ảnh – và entropy càng nhỏ thì tổn thất thông tin càng nhỏ.

Triển khai SVM và Kernel SVM với Trí tuệ dữ liệu PlatoBlockchain Scikit-Learn của Python. Tìm kiếm dọc. Ái.

Biến thứ năm là class biến, có thể có các giá trị 0 và 1, cho biết tờ tiền là thật hay giả mạo.

Chúng tôi có thể kiểm tra xem cột thứ năm có chứa số XNUMX và số XNUMX với Pandas' unique() phương pháp:

bankdata['class'].unique()

Phương thức trên trả về:

array([0, 1]) 

Phương thức trên trả về một mảng có giá trị 0 và 1. Điều này có nghĩa là các giá trị duy nhất có trong các hàng lớp của chúng tôi là số không và số không. Nó đã sẵn sàng để được sử dụng như là mục tiêu trong học tập có giám sát của chúng tôi.

  • class của hình ảnh. Đây là một giá trị số nguyên, nó là 0 khi hình ảnh giả mạo và 1 khi hình ảnh thật.

Vì chúng tôi có một cột có chú thích về hình ảnh thực và quên, điều này có nghĩa là kiểu học của chúng tôi là giám sát.

Khuyên bảo: để biết thêm về lý do đằng sau Biến đổi Wavelet trên hình ảnh tiền giấy và việc sử dụng SVM, hãy đọc bài báo đã xuất bản của các tác giả.

Chúng tôi cũng có thể xem chúng tôi có bao nhiêu bản ghi hoặc hình ảnh bằng cách xem số lượng hàng trong dữ liệu thông qua shape bất động sản:

bankdata.shape

Kết quả này cho ra:

(1372, 5)

Dòng trên có nghĩa là có 1,372 hàng hình ảnh ghi chú ngân hàng được chuyển đổi và 5 cột. Đây là dữ liệu chúng tôi sẽ phân tích.

Chúng tôi đã nhập tập dữ liệu của mình và thực hiện một số kiểm tra. Bây giờ chúng ta có thể khám phá dữ liệu của mình để hiểu nó tốt hơn.

Khám phá bộ dữ liệu

Chúng ta vừa thấy rằng chỉ có số XNUMX và XNUMX trong cột lớp, nhưng chúng ta cũng có thể biết tỷ lệ của chúng – nói cách khác – nếu có nhiều số XNUMX hơn XNUMX, nhiều số XNUMX hơn XNUMX, hoặc nếu các số số không giống như số lượng một, nghĩa là chúng là cân bằng.

Để biết tỷ lệ, chúng ta có thể đếm từng giá trị XNUMX và XNUMX trong dữ liệu với value_counts() phương pháp:

bankdata['class'].value_counts()

Kết quả này cho ra:

0 762
1 610
Name: class, dtype: int64

Trong kết quả trên, chúng ta có thể thấy rằng có 762 số 610 và 152 số 5500, hoặc 610 số XNUMX nhiều hơn số XNUMX. Điều này có nghĩa là chúng tôi đã giả mạo hình ảnh thực đó nhiều hơn một chút và nếu sự khác biệt đó lớn hơn, chẳng hạn như XNUMX số không và XNUMX, nó có thể tác động tiêu cực đến kết quả của chúng tôi. Một khi chúng ta đang cố gắng sử dụng các ví dụ đó trong mô hình của mình – càng có nhiều ví dụ, thường có nghĩa là mô hình sẽ có càng nhiều thông tin để quyết định giữa ghi chú giả hoặc ghi chú thật – nếu có ít ví dụ về ghi chú thực, mô hình có xu hướng bị lỗi. nhầm lẫn khi cố gắng nhận ra chúng.

Chúng tôi đã biết rằng có thêm 152 nốt nhạc giả, nhưng liệu chúng tôi có thể chắc chắn rằng đó là những ví dụ đủ để mô hình học hỏi không? Biết có bao nhiêu ví dụ cần thiết cho việc học là một câu hỏi rất khó trả lời, thay vào đó, chúng ta có thể cố gắng hiểu, theo tỷ lệ phần trăm, sự khác biệt đó giữa các lớp là bao nhiêu.

Bước đầu tiên là sử dụng gấu trúc value_counts() phương thức một lần nữa, nhưng bây giờ hãy xem tỷ lệ phần trăm bằng cách đưa vào đối số normalize=True:

bankdata['class'].value_counts(normalize=True)

Sản phẩm normalize=True tính tỷ lệ phần trăm của dữ liệu cho mỗi lớp. Cho đến nay, phần trăm dữ liệu giả (0) và dữ liệu thực (1) là:

0 0.555394
1 0.444606
Name: class, dtype: float64

Điều này có nghĩa là khoảng (~) 56% tập dữ liệu của chúng tôi là giả mạo và 44% trong số đó là thật. Điều này mang lại cho chúng tôi tỷ lệ 56%-44%, tương đương với mức chênh lệch 12%. Đây được coi là một sự khác biệt nhỏ về mặt thống kê, bởi vì nó chỉ trên 10% một chút, vì vậy dữ liệu được coi là cân bằng. Nếu thay vì tỷ lệ 56:44, có tỷ lệ 80:20 hoặc 70:30, thì dữ liệu của chúng tôi sẽ bị coi là mất cân bằng và chúng tôi sẽ cần thực hiện một số xử lý mất cân bằng, nhưng may mắn thay, đây không phải là trường hợp.

Chúng ta cũng có thể thấy sự khác biệt này một cách trực quan, bằng cách xem phân phối của lớp hoặc mục tiêu với biểu đồ thấm nhuần Pandas, bằng cách sử dụng:

bankdata['class'].plot.hist();

Điều này vẽ biểu đồ biểu đồ bằng cách sử dụng trực tiếp cấu trúc khung dữ liệu, kết hợp với matplotlib thư viện đằng sau hậu trường.

Triển khai SVM và Kernel SVM với Trí tuệ dữ liệu PlatoBlockchain Scikit-Learn của Python. Tìm kiếm dọc. Ái.

Bằng cách nhìn vào biểu đồ, chúng tôi có thể chắc chắn rằng các giá trị mục tiêu của chúng tôi là 0 hoặc 1 và dữ liệu được cân bằng.

Đây là phân tích cột mà chúng tôi đang cố gắng dự đoán, nhưng còn việc phân tích các cột khác trong dữ liệu của chúng tôi thì sao?

Chúng ta có thể xem xét các phép đo thống kê với describe() phương pháp khung dữ liệu. Chúng ta cũng có thể sử dụng .T of transpose – để đảo ngược các cột và hàng, giúp việc so sánh giữa các giá trị trực tiếp hơn:

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ó!

bankdata.describe().T

Kết quả này trong:

 count mean std min 25% 50% 75% max
variance 1372.0 0.433735 2.842763 -7.0421 -1.773000 0.49618 2.821475 6.8248
skewness 1372.0 1.922353 5.869047 -13.7731 -1.708200 2.31965 6.814625 12.9516
curtosis 1372.0 1.397627 4.310030 -5.2861 -1.574975 0.61663 3.179250 17.9274
entropy 1372.0 -1.191657 2.101013 -8.5482 -2.413450 -0.58665 0.394810 2.4495
class 1372.0 0.444606 0.497103 0.0000 0.000000 0.00000 1.000000 1.0000

Lưu ý rằng các cột độ lệch và độ cong có giá trị trung bình khác xa so với giá trị độ lệch chuẩn, điều này cho thấy rằng những giá trị đó nằm ngoài xu hướng trung tâm của dữ liệu hoặc có độ biến thiên lớn hơn.

Chúng ta cũng có thể xem qua phân phối của từng tính năng một cách trực quan bằng cách vẽ biểu đồ của từng tính năng bên trong vòng lặp for. Bên cạnh việc xem xét phân phối, sẽ rất thú vị nếu xem xét cách các điểm của mỗi lớp được phân tách theo từng tính năng. Để làm điều đó, chúng ta có thể vẽ một biểu đồ phân tán tạo ra sự kết hợp các tính năng giữa chúng và gán các màu khác nhau cho từng điểm liên quan đến lớp của nó.

Hãy bắt đầu với phân phối của từng tính năng và vẽ biểu đồ tần suất của từng cột dữ liệu ngoại trừ cột class cột. Các class cột sẽ không được xem xét bởi vị trí của nó trong mảng cột bankdata. Tất cả các cột sẽ được chọn ngoại trừ cột cuối cùng có columns[:-1]:

import matplotlib.pyplot as plt for col in bankdata.columns[:-1]: plt.title(col) bankdata[col].plot.hist() plt.show();

Sau khi chạy đoạn mã trên, chúng ta có thể thấy rằng cả hai skewnessentropy phân phối dữ liệu bị sai lệch tiêu cực và curtosis bị lệch dương. Tất cả các phân phối là đối xứng, và variance là phân phối duy nhất gần với bình thường.

Bây giờ chúng ta có thể chuyển sang phần thứ hai và vẽ biểu đồ phân tán của từng biến. Để làm điều này, chúng ta cũng có thể chọn tất cả các cột ngoại trừ lớp, với columns[:-1], sử dụng của Seaborn scatterplot() và hai vòng lặp for để có được các biến thể trong việc ghép nối cho từng tính năng. Chúng tôi cũng có thể loại trừ việc ghép nối một tính năng với chính nó, bằng cách kiểm tra xem tính năng đầu tiên có bằng tính năng thứ hai với một if statement.

import seaborn as sns for feature_1 in bankdata.columns[:-1]: for feature_2 in bankdata.columns[:-1]: if feature_1 != feature_2: print(feature_1, feature_2) sns.scatterplot(x=feature_1, y=feature_2, data=bankdata, hue='class') plt.show();

Lưu ý rằng tất cả các biểu đồ có cả điểm dữ liệu thực và giả mạo không được tách biệt rõ ràng với nhau, điều này có nghĩa là có một số loại chồng chất của các lớp. Vì mô hình SVM sử dụng một dòng để phân tách giữa các lớp, nên có thể tách bất kỳ nhóm nào trong biểu đồ chỉ bằng một dòng không? Có vẻ như không thể. Đây là những gì hầu hết các dữ liệu thực trông giống như. Gần nhất chúng ta có thể đạt được sự tách biệt là trong sự kết hợp của skewnessvariance, hoặc là entropyvariance âm mưu. Điều này có lẽ là do variance dữ liệu có hình dạng phân phối gần với bình thường hơn.

Nhưng nhìn vào tất cả các biểu đồ đó theo trình tự có thể hơi khó. Chúng ta có một cách khác là cùng nhau xem xét tất cả các đồ thị biểu đồ phân bố và biểu đồ phân tán bằng cách sử dụng Seaborn's pairplot().

Cả hai vòng lặp for trước đó chúng ta đã thực hiện đều có thể được thay thế bằng dòng này:

sns.pairplot(bankdata, hue='class');

Nhìn vào biểu đồ cặp, có vẻ như, trên thực tế, curtosisvariance sẽ là sự kết hợp dễ dàng nhất của các tính năng, vì vậy các lớp khác nhau có thể được phân tách bằng một dòng hoặc có thể phân tách tuyến tính.

Nếu hầu hết dữ liệu không thể phân tách tuyến tính, chúng ta có thể thử xử lý trước dữ liệu đó bằng cách giảm kích thước của dữ liệu và cũng chuẩn hóa các giá trị của dữ liệu để cố gắng làm cho phân phối gần với giá trị bình thường hơn.

Trong trường hợp này, hãy sử dụng dữ liệu như hiện tại, không cần tiền xử lý thêm và sau đó, chúng ta có thể quay lại một bước, thêm vào tiền xử lý dữ liệu và so sánh kết quả.

Khuyên bảo: Khi làm việc với dữ liệu, thông tin thường bị mất khi biến đổi dữ liệu, bởi vì chúng tôi đang thực hiện các phép tính gần đúng thay vì thu thập thêm dữ liệu. Làm việc với dữ liệu ban đầu trước vì nếu có thể, nó cung cấp đường cơ sở trước khi thử các kỹ thuật tiền xử lý khác. Khi đi theo đường dẫn này, kết quả ban đầu sử dụng dữ liệu thô có thể được so sánh với một kết quả khác sử dụng các kỹ thuật tiền xử lý trên dữ liệu.

Lưu ý: Thông thường trong Thống kê, khi xây dựng các mô hình, người ta thường tuân theo một quy trình tùy thuộc vào loại dữ liệu (rời rạc, liên tục, phân loại, số), phân phối của nó và các giả định của mô hình. Trong khi ở Khoa học Máy tính (CS), có nhiều không gian hơn cho phép thử, lỗi và các lần lặp lại mới. Trong CS, thông thường có một đường cơ sở để so sánh. Trong Scikit-learning, có triển khai các mô hình giả (hoặc công cụ ước tính giả), một số không tốt hơn việc tung đồng xu và chỉ cần trả lời Vâng (hoặc 1) 50% thời gian. Thật thú vị khi sử dụng các mô hình giả làm cơ sở cho mô hình thực tế khi so sánh kết quả. Người ta hy vọng rằng kết quả mô hình thực tế sẽ tốt hơn so với phỏng đoán ngẫu nhiên, nếu không, việc sử dụng mô hình máy học sẽ không cần thiết.

Triển khai SVM với Scikit-Learn

Trước khi tìm hiểu thêm về lý thuyết về cách thức hoạt động của SVM, chúng ta có thể xây dựng mô hình cơ sở đầu tiên của mình với dữ liệu và Scikit-Learn's Hỗ trợ phân loại Vector or SVC lớp học.

Mô hình của chúng tôi sẽ nhận các hệ số wavelet và cố gắng phân loại chúng dựa trên lớp. Bước đầu tiên trong quy trình này là tách các hệ số hoặc Tính năng, đặc điểm từ lớp học hoặc mục tiêu. Sau bước đó, bước thứ hai là tiếp tục chia dữ liệu thành một tập hợp sẽ được sử dụng cho việc học của mô hình hoặc đoàn tàu và một số khác sẽ được sử dụng để đánh giá mô hình hoặc Tập kiểm tra.

Lưu ý: Danh pháp kiểm tra và đánh giá có thể hơi khó hiểu vì bạn cũng có thể phân chia dữ liệu của mình giữa các tập huấn luyện, đánh giá và kiểm tra. Bằng cách này, thay vì có hai bộ, bạn sẽ có một bộ trung gian chỉ để sử dụng và xem liệu hiệu suất mô hình của bạn có được cải thiện hay không. Điều này có nghĩa là mô hình sẽ được đào tạo với tập huấn luyện, được nâng cao với tập đánh giá và thu được số liệu cuối cùng với tập kiểm tra.

Một số người nói rằng đánh giá là tập trung gian đó, những người khác sẽ nói rằng tập kiểm tra là tập trung gian và tập đánh giá là tập cuối cùng. Đây là một cách khác để cố gắng đảm bảo rằng mô hình không nhìn thấy cùng một ví dụ theo bất kỳ cách nào hoặc một số loại rò rỉ dữ liệu không xảy ra và có một sự tổng quát hóa mô hình bằng cách cải thiện các chỉ số đã đặt cuối cùng. Nếu bạn muốn làm theo cách tiếp cận đó, bạn có thể chia thêm dữ liệu một lần nữa như được mô tả trong phần này Scikit-Learn's train_test_split() – Bộ đào tạo, kiểm tra và xác thực hướng dẫn.

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

Trong phiên trước, chúng tôi đã hiểu và khám phá dữ liệu. Bây giờ, chúng ta có thể chia dữ liệu của mình thành hai mảng – một mảng cho bốn tính năng và mảng còn lại dành cho tính năng thứ năm hoặc mục tiêu. Vì chúng tôi muốn dự đoán lớp phụ thuộc vào các hệ số wavelet, nên chúng tôi y sẽ là class cột và của chúng tôi X sẽ variance, skewness, curtosisentropy cột.

Để tách mục tiêu và các tính năng, chúng ta chỉ có thể gán cho class cột đến y, sau đó loại bỏ nó khỏi khung dữ liệu để gán các cột còn lại cho X với .drop() phương pháp:

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

Sau khi dữ liệu được chia thành các thuộc tính và nhãn, chúng ta có thể chia thêm dữ liệu đó thành các tập huấn luyện và kiểm tra. Điều này có thể được thực hiện bằng tay, nhưng model_selection thư viện của Scikit-Learn chứa các train_test_split() phương pháp cho phép chúng tôi phân chia ngẫu nhiên dữ liệu thành các tập huấn luyện và kiểm tra.

Để sử dụng, chúng ta có thể nhập thư viện, gọi hàm train_test_split() phương pháp, chuyển vào Xy dữ liệu và xác định một test_size để vượt qua như một đối số. Trong trường hợp này, chúng tôi sẽ định nghĩa nó là 0.20– điều này có nghĩa là 20% dữ liệu sẽ được sử dụng để thử nghiệm và 80% còn lại để đào tạo.

Phương pháp này lấy ngẫu nhiên các mẫu tương ứng với tỷ lệ phần trăm mà chúng tôi đã xác định, nhưng tôn trọng các cặp Xy, vì sợ rằng việc lấy mẫu sẽ làm xáo trộn hoàn toàn mối quan hệ.

Vì quá trình lấy mẫu vốn dĩ là ngẫu nhiên nên chúng ta sẽ luôn có các kết quả khác nhau khi chạy phương thức. Để có thể có cùng kết quả hoặc kết quả có thể lặp lại, chúng ta có thể xác định một hằng số có tên là SEED với giá trị là 42.

Bạn có thể thực thi đoạn script sau để làm như vậy:

from sklearn.model_selection import train_test_split SEED = 42 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20, random_state = SEED)

Chú ý rằng train_test_split() phương thức đã trả về X_train, X_test, y_train, y_test đặt theo thứ tự này. Chúng ta có thể in số lượng mẫu được phân tách để huấn luyện và kiểm tra bằng cách lấy phần tử (0) đầu tiên của shape thuộc tính trả về tuple:

xtrain_samples = X_train.shape[0]
xtest_samples = X_test.shape[0] print(f'There are {xtrain_samples} samples for training and {xtest_samples} samples for testing.')

Điều này cho thấy có 1097 mẫu để huấn luyện và 275 mẫu để kiểm tra.

Đào tạo người mẫu

Chúng tôi đã chia dữ liệu thành các tập huấn luyện và kiểm tra. Bây giờ là lúc tạo và đào tạo một mô hình SVM trên dữ liệu đào tạo. Để làm điều đó, chúng ta có thể nhập Scikit-Learn's svm thư viện cùng với Hỗ trợ phân loại Vector lớp học, hoặc SVC lớp học.

Sau khi nhập lớp, chúng tôi có thể tạo một phiên bản của nó – vì chúng tôi đang tạo một mô hình SVM đơn giản, chúng tôi đang cố gắng phân tách dữ liệu của mình một cách tuyến tính, vì vậy chúng tôi có thể vẽ một đường để phân chia dữ liệu của mình – điều này giống như sử dụng một hàm tuyến tính - bằng cách xác định kernel='linear' làm đối số cho trình phân loại:

from sklearn.svm import SVC
svc = SVC(kernel='linear')

Bằng cách này, trình phân loại sẽ cố gắng tìm một hàm tuyến tính phân tách dữ liệu của chúng tôi. Sau khi tạo mô hình, hãy huấn luyện nó, hoặc phù hợp với nó, với dữ liệu tàu, sử dụng fit() phương pháp và đưa ra X_train tính năng và y_train các mục tiêu làm đối số.

Chúng ta có thể thực thi đoạn mã sau để huấn luyện mô hình:

svc.fit(X_train, y_train)

Cứ như vậy, người mẫu được đào tạo. Cho đến nay, chúng tôi đã hiểu dữ liệu, phân chia nó, tạo một mô hình SVM đơn giản và gắn mô hình vào dữ liệu đào tạo.

Bước tiếp theo là hiểu mức độ phù hợp được quản lý để mô tả dữ liệu của chúng tôi. Nói cách khác, để trả lời liệu một SVM tuyến tính có phải là một lựa chọn thích hợp hay không.

Dự đoán

Một cách để trả lời nếu mô hình quản lý để mô tả dữ liệu là tính toán và xem xét một số phân loại số liệu.

Xét rằng việc học được giám sát, chúng ta có thể đưa ra dự đoán với X_test và so sánh những kết quả dự đoán đó – mà chúng ta có thể gọi là y_pred - với thực tế y_test, hoặc là thực địa.

Để dự đoán một số dữ liệu, mô hình predict() phương pháp có thể được sử dụng. Phương pháp này nhận được các tính năng thử nghiệm, X_test, làm đối số và trả về một dự đoán, 0 hoặc 1, cho mỗi một trong số X_testcác hàng.

Sau khi dự đoán X_test dữ liệu, kết quả được lưu trữ trong một y_pred Biến đổi. Vì vậy, mỗi lớp được dự đoán bằng mô hình SVM tuyến tính đơn giản hiện đang ở trong y_pred biến.

Đây là mã dự đoán:

y_pred = svc.predict(X_test)

Xem xét chúng tôi có các dự đoán, bây giờ chúng tôi có thể so sánh chúng với kết quả thực tế.

Đánh giá mô hình

Có một số cách so sánh dự đoán với kết quả thực tế và chúng đo lường các khía cạnh khác nhau của phân loại. Một số chỉ số phân loại được sử dụng nhiều nhất là:

  1. Ma trận hỗn loạn: khi chúng tôi cần biết chúng tôi lấy đúng hay sai bao nhiêu mẫu mỗi lớp. Các giá trị đúng và được dự đoán chính xác được gọi là mặt tích cực thực sự, những cái được dự đoán là dương nhưng không phải là dương được gọi là dương tính giả. Cùng một danh pháp của phủ định thực sựphủ định sai được sử dụng cho các giá trị âm;

  2. Độ chính xác: khi mục đích của chúng tôi là hiểu giá trị dự đoán chính xác nào được bộ phân loại của chúng tôi coi là chính xác. Độ chính xác sẽ chia các giá trị dương thực đó cho các mẫu được dự đoán là dương;

$$
precision = frac{text{true positives}}{text{true positives} + text{false positive}}
$$

  1. Nhớ lại: thường được tính toán cùng với độ chính xác để hiểu có bao nhiêu kết quả dương tính thực sự đã được bộ phân loại của chúng tôi xác định. Việc thu hồi được tính bằng cách chia các kết quả tích cực thực sự cho bất kỳ điều gì đáng lẽ phải được dự đoán là tích cực.

$$
thu hồi = frac{text{true positives}}{text{true positives} + text{false negatives}}
$$

  1. Điểm F1: là cân bằng hoặc trung bình hài hòa độ chính xác và thu hồi. Giá trị thấp nhất là 0 và cao nhất là 1. Khi f1-score bằng 1, điều đó có nghĩa là tất cả các lớp đã được dự đoán chính xác - đây là một số điểm rất khó có được với dữ liệu thực (hầu như luôn tồn tại các trường hợp ngoại lệ).

$$
text {f1-score} = 2 * frac {text {precision} * text {summon}} {text {precision} + text {summon}}
$$

Chúng ta đã làm quen với các phép đo ma trận nhầm lẫn, độ chính xác, thu hồi và điểm F1. Để tính toán chúng, chúng ta có thể nhập Scikit-Learn's metrics thư viện. Thư viện này chứa các classification_reportconfusion_matrix phương pháp báo cáo phân loại trả về độ chính xác, thu hồi và điểm f1. Cả hai classification_reportconfusion_matrix có thể dễ dàng được sử dụng để tìm ra các giá trị cho tất cả các số liệu quan trọng đó.

Để tính toán các số liệu, chúng tôi nhập các phương thức, gọi chúng và chuyển các phân loại được dự đoán làm đối số, y_testvà các nhãn phân loại, hoặc y_true.

Để hình dung rõ hơn về ma trận nhầm lẫn, chúng ta có thể vẽ nó trong Seaborn's heatmap cùng với các chú thích về số lượng và đối với báo cáo phân loại, tốt nhất là in kết quả của nó, vì vậy kết quả của nó được định dạng. Đây là đoạn mã sau:

from sklearn.metrics import classification_report, confusion_matrix cm = confusion_matrix(y_test,y_pred)
sns.heatmap(cm, annot=True, fmt='d').set_title('Confusion matrix of linear SVM') print(classification_report(y_test,y_pred))

Điều này hiển thị:

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

Triển khai SVM và Kernel SVM với Trí tuệ dữ liệu PlatoBlockchain Scikit-Learn của Python. Tìm kiếm dọc. Ái.

Trong báo cáo phân loại, chúng tôi biết có độ chính xác là 0.99, độ thu hồi là 0.99 và điểm f1 là 0.99 đối với các tờ tiền giả mạo hoặc loại 0. Các phép đo đó thu được bằng cách sử dụng 148 mẫu như được hiển thị trong cột hỗ trợ. Trong khi đó, đối với loại 1, hoặc ghi chú thực, kết quả thấp hơn một đơn vị, độ chính xác 0.98, độ thu hồi 0.98 và cùng điểm f1. Lần này, 127 phép đo hình ảnh đã được sử dụng để thu được những kết quả đó.

Nếu nhìn vào ma trận nhầm lẫn, chúng ta cũng có thể thấy rằng từ 148 mẫu loại 0, 146 mẫu được phân loại chính xác và có 2 mẫu dương tính giả, trong khi đối với 127 mẫu loại 1, có 2 âm tính giả và 125 mẫu dương tính thật.

Chúng ta có thể đọc báo cáo phân loại và ma trận nhầm lẫn, nhưng ý nghĩa của chúng là gì?

Diễn giải kết quả

Để tìm hiểu ý nghĩa, hãy xem xét tất cả các số liệu được kết hợp.

Hầu hết các mẫu của lớp 1 đều được phân loại chính xác, mẫu của chúng tôi có 2 sai sót khi xác định tờ tiền thật. Điều này giống như 0.98, hoặc 98%, thu hồi. Điều tương tự cũng có thể xảy ra với loại 0, chỉ có 2 mẫu được phân loại không chính xác, trong khi 148 mẫu là âm tính thực, tổng độ chính xác là 99%.

Bên cạnh những kết quả đó, tất cả những kết quả khác đều được chấm 0.99, gần bằng 1, một số liệu rất cao. Hầu hết thời gian, khi số liệu cao như vậy xảy ra với dữ liệu thực tế, điều này có thể cho thấy một mô hình được điều chỉnh quá mức đối với dữ liệu hoặc trang bị quá nhiều.

Khi có sự phù hợp quá mức, mô hình có thể hoạt động tốt khi dự đoán dữ liệu đã biết, nhưng nó sẽ mất khả năng khái quát hóa thành dữ liệu mới, điều này rất quan trọng trong các tình huống trong thế giới thực.

Một thử nghiệm nhanh để tìm hiểu xem liệu tình trạng overfit có đang xảy ra hay không cũng được thực hiện với dữ liệu đào tạo. Nếu mô hình đã phần nào ghi nhớ dữ liệu tàu, thì số liệu sẽ rất gần với 1 hoặc 100%. Hãy nhớ rằng dữ liệu đào tạo lớn hơn dữ liệu thử nghiệm – vì lý do này – hãy cố gắng xem xét nó theo tỷ lệ, nhiều mẫu hơn, nhiều khả năng mắc lỗi hơn, trừ khi có một số trường hợp quá khớp.

Để dự đoán với dữ liệu huấn luyện, chúng ta có thể lặp lại những gì chúng ta đã làm đối với dữ liệu thử nghiệm, nhưng bây giờ với X_train:

y_pred_train = svc.predict(X_train) cm_train = confusion_matrix(y_train,y_pred_train)
sns.heatmap(cm_train, annot=True, fmt='d').set_title('Confusion matrix of linear SVM with train data') print(classification_report(y_train,y_pred_train))

Kết quả này cho ra:

 precision recall f1-score support 0 0.99 0.99 0.99 614 1 0.98 0.99 0.99 483 accuracy 0.99 1097 macro avg 0.99 0.99 0.99 1097
weighted avg 0.99 0.99 0.99 1097

Triển khai SVM và Kernel SVM với Trí tuệ dữ liệu PlatoBlockchain Scikit-Learn của Python. Tìm kiếm dọc. Ái.

Có thể dễ dàng nhận thấy dường như có sự phù hợp quá mức, một khi số liệu đào tạo là 99% khi có dữ liệu gấp 4 lần. Những gì có thể được thực hiện trong kịch bản này?

Để hoàn nguyên trạng thái quá khớp, chúng ta có thể thêm nhiều quan sát huấn luyện hơn, sử dụng phương pháp huấn luyện với các phần khác nhau của tập dữ liệu, chẳng hạn như xác nhận chéovà cũng thay đổi các tham số mặc định đã tồn tại trước khi đào tạo, khi tạo mô hình của chúng tôi hoặc siêu tham số. Hầu hết thời gian, Scikit-learning đặt một số tham số làm mặc định và điều này có thể diễn ra âm thầm nếu không có nhiều thời gian dành riêng cho việc đọc tài liệu.

Bạn có thể kiểm tra phần thứ hai của hướng dẫn này (đến sớm) để xem cách triển khai xác thực chéo và thực hiện điều chỉnh siêu tham số.

Kết luận

Trong bài viết này, chúng tôi đã nghiên cứu SVM nhân tuyến tính đơn giản. Chúng tôi có trực giác đằng sau thuật toán SVM, sử dụng tập dữ liệu thực, khám phá dữ liệu và xem cách dữ liệu này có thể được sử dụng cùng với SVM bằng cách triển khai nó với thư viện Scikit-Learn của Python.

Để tiếp tục thực hành, bạn có thể thử các bộ dữ liệu trong thế giới thực khác có sẵn ở những nơi như Kaggle, UCI, Bộ dữ liệu công khai Big Query, các trường đại học và các trang web của chính phủ.

Tôi cũng khuyên bạn nên khám phá toán học thực tế đằng sau mô hình SVM. Mặc dù bạn không nhất thiết phải cần nó để sử dụng thuật toán SVM, nhưng vẫn rất hữu ích để biết điều gì đang thực sự diễn ra đằng sau hậu trường trong khi thuật toán của bạn đang tìm các ranh giới quyết định.

Dấu thời gian:

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