Hiểu về siêu tham số SVM

Hiểu về siêu tham số SVM

Giới thiệu

Hướng dẫn này là phần thứ hai 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, hiểu những thông số SVM nào đã được đặt bởi Scikit-learning, siêu tham số C và Gamma là gì và cách điều chỉnh chúng bằng cách sử dụng xác thực chéo và tìm kiếm lưới.

Trong loạt hướng dẫn đầy đủ về SVM, bên cạnh các siêu tham số SVM, bạn cũng sẽ tìm hiểu về SVM đơn giản, một khái niệm được gọi là lừa hạt nhânvà 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, hãy xem hướng dẫn đầu tiên hoặc xem hướng dẫn nào bạn quan tâm nhất, bên dưới là bảng các chủ đề có 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

  • 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

Hãy tìm hiểu cách triển khai xác thực chéo và thực hiện điều chỉnh siêu tham số.

Siêu tham số SVM

Để xem tất cả các tham số mô hình đã được đặt bởi Scikit-learning và các giá trị mặc định của nó, chúng ta có thể sử dụng get_params() phương pháp:

svc.get_params()

Phương pháp này hiển thị:

{'C': 1.0, 'break_ties': False, 'cache_size': 200, 'class_weight': None, 'coef0': 0.0, 'decision_function_shape': 'ovr', 'degree': 3, 'gamma': 'scale', 'kernel': 'linear', 'max_iter': -1, 'probability': False, 'random_state': None, 'shrinking': True, 'tol': 0.001, 'verbose': False}

Lưu ý rằng có tổng cộng 15 siêu tham số đã được đặt, điều này xảy ra do thuật toán SVM có nhiều biến thể. Chúng tôi đã sử dụng hạt nhân tuyến tính để thu được một hàm tuyến tính, nhưng cũng có những hạt nhân mô tả các loại hàm khác và những hạt nhân đó được tham số hóa theo những cách khác nhau.

Những biến thể này xảy ra để làm cho mô hình linh hoạt hơn và phù hợp hơn để tìm sự tách biệt giữa các dạng dữ liệu khác nhau. Nếu chúng ta có thể vẽ một đường để phân chia các lớp của chúng ta, thì một nhân tuyến tính sẽ là một lựa chọn tốt, nếu chúng ta cần một đường cong, thì một đa thức kernel có thể là lựa chọn tốt nhất, nếu dữ liệu của chúng ta có hình dạng tròn, thì một Hàm cơ sở xuyên tâm or RBF kernel sẽ phù hợp với dữ liệu hơn, nếu có các giá trị trên và dưới ngưỡng, một sigmoid kernel có thể tách các lớp tốt hơn. Từ những gì chúng tôi đã khám phá trong dữ liệu của mình, có vẻ như RBF hoặc nhân đa thức sẽ phù hợp hơn nhân tuyến tính.

Bây giờ chúng ta có một ý tưởng rằng có 4 loại hàm kernel khác nhau, chúng ta có thể quay lại các tham số. Khi thuật toán SVM cố gắng tìm sự tách biệt giữa các lớp, chúng ta đã hiểu rằng nó rút ra một phân loại tỷ suất lợi nhuận giữa các vectơ hỗ trợ và đường phân cách (hoặc đường cong).

Theo một nghĩa nào đó, lề này giống như một vùng đệm giữa đường phân cách và các điểm. Kích thước lề có thể thay đổi, khi lề là nhỏ hơn, sẽ có ít không gian hơn cho các điểm nằm ngoài lề, làm cho sự phân tách giữa các lớp rõ ràng hơn, do đó, nhiều mẫu hơn được lấy phân loại chính xác, ngược lại, khi biên là lớn hơn, sự tách biệt giữa các lớp kém rõ ràng hơn và có thể có nhiều mẫu hơn phân loại sai. Nói cách khác, lề nhỏ hơn có nghĩa là các mẫu được phân loại chính xác hơn và cũng nhiều hơn cứng nhắc bộ phân loại, trong khi biên độ lớn hơn, biểu thị nhiều mẫu bị phân loại sai hơn, nhưng nhiều hơn linh hoạt bộ phân loại.

Khi các lề đó được chọn, tham số xác định chúng là C tham số.

Siêu tham số C

Sản phẩm C tham số tỷ lệ nghịch với kích thước lề, điều này có nghĩa là lớn hơn giá trị của C, Các nhỏ hơn lề, và ngược lại, nhỏ hơn giá trị của C, Các lớn hơn lề. Các C tham số có thể được sử dụng cùng với bất kỳ hạt nhân nào, nó cho thuật toán biết mức độ cần thiết để tránh phân loại sai từng mẫu đào tạo, do đó, nó còn được gọi là chính quy. Nhân tuyến tính SVM của chúng tôi đã sử dụng một C của 1.0, đó là một lớn giá trị và cung cấp cho một lề nhỏ hơn.

Tìm hiểu về siêu tham số SVM PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Chúng ta có thể thử nghiệm với một nhỏ hơn giá trị của 'C' và hiểu trong thực tế điều gì xảy ra với một lề lớn hơn. Để làm điều đó, chúng ta sẽ tạo một bộ phân loại mới, svc_c, và chỉ thay đổi giá trị của C đến 0.0001. Hãy cũng nhắc lại fitpredict các bước:

svc_c = SVC(kernel='linear', C=0.0001)
svc_c.fit(X_train, y_train)
y_pred_c = svc_c.predict(X_test)

Bây giờ chúng ta có thể xem kết quả cho dữ liệu thử nghiệm:

print(classification_report(y_test, y_pred_c)) cm_c = confusion_matrix(y_test, y_pred_c)
sns.heatmap(cm_c, annot=True, fmt='d').set_title('Confusion matrix of linear SVM with C=0.0001')

Kết quả này cho ra:

 precision recall f1-score support 0 0.82 0.96 0.88 148 1 0.94 0.76 0.84 127 accuracy 0.87 275 macro avg 0.88 0.86 0.86 275
weighted avg 0.88 0.87 0.86 275

Tìm hiểu về siêu tham số SVM PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Bằng cách sử dụng một nhỏ hơn C và thu được biên độ lớn hơn, bộ phân loại đã trở nên linh hoạt hơn và có nhiều lỗi phân loại hơn. Trong báo cáo phân loại, chúng ta có thể thấy rằng f1-score, trước đây là 0.99 cho cả hai loại, đã giảm xuống 0.88 cho loại 0 và 0.84 cho loại 1. Trong ma trận nhầm lẫn, mô hình đã tăng từ 2 đến 6 kết quả dương tính giả và từ 2 đến 31 kết quả âm tính giả.

Chúng ta cũng có thể lặp lại predict step và xem kết quả để kiểm tra xem có còn overfit hay không khi sử dụng dữ liệu tàu:

y_pred_ct = svc_c.predict(X_train) cm_ct = confusion_matrix(y_train, y_pred_ct)
sns.heatmap(cm_ct, annot=True, fmt='d').set_title('Confusion matrix of linear SVM with C=0.0001 and train data') print(classification_report(y_train, y_pred_ct))

Kết quả này trong:

 precision recall f1-score support 0 0.88 0.96 0.92 614 1 0.94 0.84 0.88 483 accuracy 0.90 1097 macro avg 0.91 0.90 0.90 1097
weighted avg 0.91 0.90 0.90 1097

Tìm hiểu về siêu tham số SVM PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Bằng cách nhìn vào kết quả với một nhỏ hơn C và đào tạo dữ liệu, chúng ta có thể thấy đã có sự cải thiện trong tình trạng quá khớp, nhưng một khi hầu hết các chỉ số vẫn cao hơn đối với dữ liệu đào tạo, thì có vẻ như tình trạng quá khớp vẫn chưa được giải quyết. Vì vậy, chỉ cần thay đổi C tham số không đủ để làm cho mô hình linh hoạt hơn và cải thiện khả năng khái quát hóa của nó.

Chú thích: Cố gắng tìm sự cân bằng giữa một chức năng quá xa dữ liệu, quá cố định hoặc có thiên vị cao hoặc ngược lại, một chức năng phù hợp với dữ liệu, quá linh hoạt hoặc có phương sai cao thường được gọi là đánh đổi phương sai sai lệch. Việc tìm kiếm sự cân bằng đó không phải là chuyện nhỏ, nhưng khi đạt được nó, sẽ không có hiện tượng khớp sai hoặc thừa của mô hình đối với dữ liệu. Là một cách để giảm phương sai và ngăn chặn quá mức, dữ liệu có thể được thu nhỏ đồng đều để trở nên đều đặn hơn và đơn giản hơn khi có được một hàm mô tả nó. Đó là thông số C thực hiện khi nó được sử dụng trong SVM, vì lý do đó, nó còn được gọi là Chính quy hóa L2 or Hồi quy Ridge.

Cho đến thời điểm này, chúng ta đã hiểu về lề trong SVM và cách chúng tác động đến kết quả tổng thể của thuật toán, nhưng còn đường (hoặc đường cong) phân cách các lớp thì sao? dòng này là ranh giới quyết định. Vì vậy, chúng ta đã biết rằng biên có ảnh hưởng đến tính linh hoạt của ranh giới quyết định đối với các sai lầm, bây giờ chúng ta có thể xem xét một tham số khác cũng tác động đến ranh giới quyết định.

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

Chú thích: Ranh giới quyết định cũng có thể được gọi là một siêu phẳng. Siêu phẳng là một khái niệm hình học để chỉ số chiều của một không gian trừ đi một (dims-1). Nếu không gian là 2 chiều, chẳng hạn như một mặt phẳng có tọa độ x và y, thì các đường (hoặc đường cong) 1 chiều là các siêu phẳng. Trong bối cảnh học máy, vì số lượng cột được sử dụng trong mô hình là kích thước mặt phẳng của nó, nên khi chúng tôi làm việc với 4 cột và bộ phân loại SVM, chúng tôi đang tìm một siêu phẳng 3 chiều phân tách giữa các lớp.

Siêu tham số Gamma

Ranh giới quyết định vô hạn có thể được chọn, một số ranh giới đó sẽ phân tách các lớp và những ranh giới khác thì không. Khi chọn một ranh giới quyết định hiệu quả có nên xem xét 10 điểm gần nhất đầu tiên của mỗi lớp không? Hay nên xét nhiều điểm hơn, kể cả những điểm ở xa? Trong SVM, sự lựa chọn phạm vi đó được xác định bởi một siêu tham số khác, gamma.

Như C, gamma phần nào tỷ lệ nghịch với khoảng cách của nó. Các cao hơn giá trị của nó, các gần nhất là những điểm được xem xét cho ranh giới quyết định, và thấp nhất các gamma, Các xa hơn điểm cũng được xem xét để chọn ranh giới quyết định.

Tìm hiểu về siêu tham số SVM PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Một tác động khác của gamma là giá trị của nó càng cao thì phạm vi của ranh giới quyết định càng gần với các điểm xung quanh nó, khiến nó trở nên lởm chởm hơn và dễ bị khớp quá mức – và giá trị của nó càng thấp thì ranh giới quyết định càng mượt mà và đều đặn. bề mặt cũng ít bị overfit hơn. Điều này đúng với bất kỳ siêu phẳng nào, nhưng có thể quan sát dễ dàng hơn khi tách dữ liệu ở các chiều cao hơn. Trong một số tài liệu, gamma cũng có thể được gọi là sigma.

Tìm hiểu về siêu tham số SVM PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Trong trường hợp mô hình của chúng tôi, giá trị mặc định của gammascale. Như có thể thấy trong Scikit-tìm hiểu tài liệu SVC, điều đó có nghĩa là giá trị của nó là:

$$
gamma = (1/ văn bản{n_features} * X.var())
$$

or

$$
gamma = (1/ văn bản{number_of_features} * văn bản{features_variance})
$$

Trong trường hợp của chúng ta, chúng ta cần tính phương sai của X_train, nhân nó với 4 và chia kết quả cho 1. Chúng ta có thể làm điều này với đoạn mã sau:

number_of_features = X_train.shape[1] features_variance = X_train.values.var()
gamma = 1/(number_of_features * features_variance)
print('gamma:', gamma)

Kết quả này cho ra:

gamma: 0.013924748072859962

Ngoài ra còn có một cách khác để xem xét giá trị của gamma, bằng cách truy cập đối tượng của trình phân loại gamma tham số với ._gamma:

svc._gamma 

Chúng ta có thể thấy rằng gamma được sử dụng trong bộ phân loại của chúng tôi là thấp, vì vậy nó cũng được coi là các điểm xa hơn.

Chú thích: Như chúng ta đã thấy, Cgamma quan trọng đối với một số định nghĩa của mô hình. Một siêu tham số khác, random_state, thường được sử dụng trong Scikit Learn để đảm bảo xáo trộn dữ liệu hoặc khởi tạo ngẫu nhiên cho các mô hình, vì vậy chúng tôi luôn có kết quả giống nhau, nhưng điều này hơi khác đối với SVM. Đặc biệt, các random_state chỉ có ý nghĩa nếu một siêu tham số khác, probability, được đặt thành đúng. Điều này là do nó sẽ xáo trộn dữ liệu để có được các ước tính xác suất. Nếu chúng tôi không muốn ước tính xác suất cho các lớp của chúng tôi và xác suất được đặt thành sai, SVM's random_state tham số không có ý nghĩa đối với kết quả mô hình.

Không có quy tắc nào về cách chọn giá trị cho siêu tham số, chẳng hạn như C và gamma – nó sẽ phụ thuộc vào thời gian và nguồn tài nguyên nào có sẵn để thử nghiệm với các giá trị siêu tham số khác nhau, những biến đổi nào có thể được thực hiện đối với dữ liệu và kết quả mong đợi . Cách thông thường để tìm kiếm các giá trị siêu tham số là kết hợp từng giá trị được đề xuất thông qua một lưới tìm kiếm cùng với một quy trình áp dụng các giá trị siêu tham số đó và thu được số liệu cho các phần khác nhau của dữ liệu được gọi là xác nhận chéo. Trong Scikit-learning, điều này đã được triển khai dưới dạng GridSearchCV (CV từ xác nhận chéo).

Để chạy tìm kiếm dạng lưới có xác thực chéo, chúng ta cần nhập GridSearchCV, xác định một từ điển với các giá trị của siêu đường kính sẽ được thử nghiệm, chẳng hạn như loại kernel, phạm vi cho C, Và cho gamma, tạo một thể hiện của SVC, xác định score hoặc số liệu sẽ được sử dụng để đánh giá (ở đây chúng tôi sẽ chọn tối ưu hóa cho cả độ chính xác và khả năng thu hồi, vì vậy chúng tôi sẽ sử dụng f1-score), số lượng phân chia sẽ được thực hiện trong dữ liệu để chạy tìm kiếm trong cv – mặc định là 5, nhưng nên sử dụng ít nhất 10 – ở đây, chúng tôi sẽ sử dụng 5 nếp gấp dữ liệu để làm rõ hơn khi so sánh kết quả.

Sản phẩm GridSearchCV có một fit phương thức nhận dữ liệu đào tạo của chúng tôi và phân tách thêm dữ liệu đó trong các tập huấn luyện và kiểm tra để xác thực chéo. chúng ta có thể thiết lập return_train_score thành true để so sánh kết quả và đảm bảo không có sự phù hợp quá mức.

Đây là mã cho tìm kiếm dạng lưới có xác thực chéo:

from sklearn.model_selection import GridSearchCV parameters_dictionary = {'kernel':['linear', 'rbf'], 'C':[0.0001, 1, 10], 'gamma':[1, 10, 100]}
svc = SVC() grid_search = GridSearchCV(svc, parameters_dictionary, scoring = 'f1', return_train_score=True, cv = 5, verbose = 1) grid_search.fit(X_train, y_train)

Mã này xuất ra:

Fitting 5 folds for each of 18 candidates, totalling 90 fits
# and a clickable GridSeachCV object schema

Sau khi thực hiện tìm kiếm siêu tham số, chúng ta có thể sử dụng best_estimator_, best_params_best_score_ để có được mô hình tốt nhất, giá trị tham số và điểm f1 cao nhất:

best_model = grid_search.best_estimator_
best_parameters = grid_search.best_params_
best_f1 = grid_search.best_score_ print('The best model was:', best_model)
print('The best parameter values were:', best_parameters)
print('The best f1-score was:', best_f1)

Kết quả này trong:

The best model was: SVC(C=1, gamma=1)
The best parameter values were: {'C': 1, 'gamma': 1, 'kernel': 'rbf'}
The best f1-score was: 0.9979166666666666

Xác nhận phỏng đoán ban đầu của chúng tôi khi xem dữ liệu, mô hình tốt nhất không có nhân tuyến tính, mà là nhân phi tuyến, RBF.

Khuyên bảo: khi điều tra thêm, điều thú vị là bạn bao gồm nhiều hạt nhân phi tuyến tính hơn trong tìm kiếm lưới.

Cả hai Cgamma có giá trị là 1 và f1-score rất cao, 0.99. Vì giá trị cao, hãy xem liệu có sự phù hợp quá mức hay không bằng cách xem qua điểm trung bình của bài kiểm tra và đào tạo mà chúng tôi đã trả về, bên trong cv_results_ vật:

gs_mean_test_scores = grid_search.cv_results_['mean_test_score']
gs_mean_train_scores = grid_search.cv_results_['mean_train_score'] print("The mean test f1-scores were:", gs_mean_test_scores)
print("The mean train f1-scores were:", gs_mean_train_scores)

Điểm trung bình là:

The mean test f1-scores were: [0.78017291 0. 0.78017291 0. 0.78017291 0. 0.98865407 0.99791667 0.98865407 0.76553515 0.98865407 0.040291 0.98656 0.99791667 0.98656 0.79182565 0.98656 0.09443985] The mean train f1-scores were: [0.78443424 0. 0.78443424 0. 0.78443424 0. 0.98762683 1. 0.98762683 1. 0.98762683 1. 0.98942923 1. 0.98942923 1. 0.98942923 1. ]

Bằng cách xem xét điểm trung bình, chúng ta có thể thấy rằng điểm cao nhất, 0.99791667 xuất hiện hai lần và trong cả hai trường hợp, điểm trong dữ liệu đào tạo là 1. Điều này cho thấy tình trạng quá khớp vẫn tồn tại. Từ đây, sẽ rất thú vị nếu quay lại quá trình chuẩn bị dữ liệu và hiểu liệu việc chuẩn hóa dữ liệu, thực hiện một số loại chuyển đổi dữ liệu khác và tạo các tính năng mới bằng kỹ thuật tính năng có hợp lý hay không.

Chúng ta vừa thấy một kỹ thuật để tìm siêu tham số mô hình và chúng ta đã đề cập đến điều gì đó về khả năng phân tách tuyến tính, vectơ hỗ trợ, ranh giới quyết định, cực đại hóa lề và thủ thuật nhân. SVM là một thuật toán phức tạp, thường có rất nhiều khái niệm toán học liên quan và các phần nhỏ có thể điều chỉnh cần được điều chỉnh để kết hợp với nhau thành một tổng thể.

Hãy kết hợp những gì chúng ta đã thấy cho đến nay, tạo một bản tóm tắt về cách thức hoạt động của tất cả các phần của SVM, sau đó xem xét một số triển khai hạt nhân khác cùng với kết quả của chúng.

Kết luận

Trong bài viết này, chúng ta đã hiểu về các tham số mặc định đằng sau việc triển khai SVM của Scikit-Learn. Chúng tôi đã hiểu tham số C và Gamma là gì và việc thay đổi từng tham số có thể ảnh hưởng như thế nào đến mô hình SVM.

Chúng tôi cũng đã tìm hiểu về tìm kiếm dạng lưới để tìm các giá trị C và Gamma tốt nhất, đồng thời sử dụng xác thực chéo để khái quát hóa tốt hơn các kết quả của chúng tôi và đảm bảo rằng không có một số dạng rò rỉ dữ liệu.

Thực hiện điều chỉnh siêu tham số với tìm kiếm lưới và xác thực chéo là một phương pháp phổ biến trong khoa học dữ liệu, vì vậy tôi thực sự khuyên bạn nên triển khai các kỹ thuật, chạy mã và xem các liên kết giữa các giá trị siêu tham số và những thay đổi trong dự đoán SVM.

Dấu thời gian:

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