Hướng dẫn sử dụng LIBSVM

Từ VLOS
Bước tới: chuyển hướng, tìm kiếm

Đây là một thư viện đơn giản, dễ sử dụng và hiệu quả đối với phân lớp SVM và hồi qui. Nó có thể giải quyết phân lớp C-SVM, nu-SVM, hồi qui epsilon-SVM và hồi qui nu-SVM. Nó cũng cung cấp một công cụ lựa chọn mô hình tự động đối với phân lớp C-SVM. Tài liệu này giải thích cách sử dụng thư viện LIBSVM.

Đối với các HĐH khác (không phải Linux), tham khảo ‘Makefile’ để xây dựng chúng hoặc sử dụng pre-build binaries (trong thư mục Windows).

Định dạng của file dữ liệu huấn luyện và file test là: <label> <index1>:<value1> <index2>:<value2> ... trong đó:

<label> là giá trị đích của tập huấn luyện. Đối với việc phân lớp, nó là một số nguyên xác định một lớp. Đối với hồi qui, nó là một số thực bất kỳ.
<index> là một số nguyên bắt đầu từ 1.
<value> là một số thực. Các nhãn trong file dữ liệu test chỉ được sử dụng để tính toán độ chính xác hoặc lỗi.

Có một tập huấn luyện đơn giản đối với việc phân lớp trong gói này: heart_scale.

Gõ ‘svm-train heart_scale’ thì chương trình sẽ đọc dữ liệu huấn luyện và xuất ra file mô hình heart_sacle.model. sau đó ta có thể gõ ‘svm-predict heart_scale heart_sacle.model output’ để xem tỉ lệ phân lớp trên tập huấn luyện. File output chứa giá trị dự đoán của mô hình.

Có một số chương trình hữu dụng trong gói này:

svm-scale: Đây là một công cụ đối với việc xác định file dữ liệu vào.
svm-toy: Đây là một giao diện đồ họa đơn giản thể hiện dữ liệu phân tách SVM trong mặt phẳng. Ta có thể kích vào cửa sổ để vẽ các điểm dữ liệu. Sử dụng nút “change” để chọn lớp 1 hoặc 2, nút “load” để đọc dữ liệu từ một file, nút “save” để lưu dữ liệu vào file, nút “run” để thu được một mô hình SVM và nút “clear” để xóa cửa sổ. Chú ý rằng, nút “load” và “save” chỉ áp dụng cho truờng hợp phân lớp, không áp dụng cho trường hợp hồi qui.

1. Sử dụng svm-train Usage: svm-train [options] training_set_file [model_file] options: -s svm_type : kiểu của SVM (default 0) 0 -- C-SVC 1 -- nu-SVC 2 -- one-class SVM 3 -- epsilon-SVR 4 -- nu-SVR -t kernel_type : kiểu của hàm kernel(default 2) 0 -- linear: u'*v 1 -- polynomial: (gamma*u'*v + coef0)^degree 2 -- radial basis function: exp(-gamma*|u-v|^2) 3 -- sigmoid: tanh(gamma*u'*v + coef0) -d degree : bậc của hàm kernel (default 3) -g gamma : giá trị gamma trong kernel function (default 1/k) -r coef0 : giá trị coef0 trong kernel function (default 0) -c cost : tham số C của C-SVC, epsilon-SVR, and nu-SVR (default 1) -n nu : tham số nu của nu-SVC, one-class SVM, and nu-SVR (default 0.5) -p epsilon : giá trị epsilon trong hàm loss của epsilon-SVR (default 0.1) -m cachesize : kích thước cache bộ nhớ tính theo MB (default 40) -e epsilon : dung sai (tolerance) của tiêu chuẩn thoát (termination criterion) (default 0.001) -h shrinking: có sử dụng shrinking(co lại) heuristics hay không, 0 or 1 (default 1) -b probability_estimates: whether to train an SVC or SVR model for probability estimates, 0 or 1 (default 0) -wi weight: tham số C của lớp i tới trọng số weight*C in C-SVC (default 1) -v n: n-fold cross validation mode

Giá trị k trong tùy chọn -g nghĩa là số thuộc tính trong dữ liệu đầu vào.

Tùy chọn -v phân chia ngẫu nhiên dữ liệu thành n phần và tính thông qua validation accuracy/mean squared error on them.

2. Sử dụng svm-predict Usage: svm-predict [options] test_file model_file output_file options: -b probability_estimates: whether to predict probability estimates, 0 or 1 (default 0); one-class SVM not supported yet

model_file là file mô hình được sinh bởi svm-train. test_file là file dữ liệu test mà ta muốn đánh giá. svm-predict sẽ đưa ra trong file output_file.

Mẹo sử dụng trong thực hành:

  • Scale your data. For example, scale each attribute to [0,1] or [-1,+1].
  • For C-SVC, consider using the model selection tool in the python directory.
  • nu trong nu-SVC/one-class-SVM/nu-SVR xấp xỉ tỉ lệ lỗi huấn luyện và các và các support vectors.
  • Nếu dữ liệu phân lớp không cân bằng(e.g. many positive and few negative), thử trực tiếp các tham số C khác nhau bởi –wi (xem ví dụ sau).

Ví dụ:

> svm-scale -l -1 -u 1 -s range train > train.scale > svm-scale -r range test > test.scale

Scale mỗi đặc trưng của dữ liệu huấn luyện là [-1,1]. Scaling factors are stored in the file range and then used for scaling the test data.

> svm-train -s 0 -c 1000 -t 2 -g 0.5 -e 0.00001 data_file

Train a classifier with RBF kernel exp(-0.5|u-v|^2) and stopping tolerance 0.00001

> svm-train -s 3 -p 0.1 -t 0 -c 10 data_file

Solve SVM regression with linear kernel u'v and C=10, and epsilon = 0.1 in the loss function.

> svm-train -s 0 -c 10 -w1 1 -w-1 5 data_file

Train a classifier with penalty 10 for class 1 and penalty 50 for class -1.

> svm-train -s 0 -c 500 -g 0.1 -v 5 data_file

Do five-fold cross validation for the classifier using the parameters C = 500 and gamma = 0.1

> svm-train -s 0 -b 1 data_file > svm-predict -b 1 test_file data_file.model output_file

Thu được một mô hình với thông tin xác suất và dự đoán dữ liệu test với đánh giá xác suất.

3. Sử dụng thư viện Các cấu trúc và các hàm này được khai báo trong file ‘svm.h’. Ta cần #include "svm.h" trong C/C++ source files và kết nối với `svm.cpp'. Trước khi ta phân lớp dữ liệu test, ta cần xây dựng một mô hình SVM (‘svm_model') sử dụng dữ liệu huấn luyện. Một mô hình cũng có thể được lưu trong một file cho việc sử dụng sau này. Mỗi một mô hình SVM phải sẵn sàng, ta có thể dùng nó để phân lớp dữ liệu mới.

- Function: struct svm_model *svm_train(const struct svm_problem *prob,const struct svm_parameter *param);

hàm này trả về một mô hình SVM theo dữ liệu huấn luyện đã cho với các tham số.

Cấu trúc svm_problem mô tả bài toán:

struct svm_problem { int l; double *y; struct svm_node **x; };

trong đó ‘l’ là số mẫu huấn luyện, ‘y’ là một mảng chứa các giá trị đích của nó (các số nguyên trong phân lớp, các số thực trong hồi qui) và `x' là một mảng các con trỏ, mỗi con trỏ trỏ đến một đại diện (array of svm_node) của một vector huấn luyện.
Ví dụ, nếu ta có dữ liệu huấn luyện sau:
   LABEL           ATTR1   ATTR2   ATTR3   ATTR4   ATTR5
   -----                -----   -----   -----   -----   -----
     1                  0       0.1      0.2    0       0
     2                  0       0.1      0.3    -1.2    0
     1                  0.4     0        0      0       0
     2                  0       0.1      0      1.4     0.5
     3                  -0.1    -0.2     0.1    1.1     0.1

thì các thành phần của bài toán SVM là:

   l = 5
   y -> 1 2 1 2 3
   x -> [ ] -> (2,0.1) (3,0.2) (-1,?)

[ ] -> (2,0.1) (3,0.3) (4,-1.2) (-1,?) [ ] -> (1,0.4) (-1,?) [ ] -> (2,0.1) (4,1.4) (5,0.5) (-1,?) [ ] -> (1,-0.1) (2,-0.2) (3,0.1) (4,1.1) (5,0.1) (-1,?)

trong đó (index,value) được lưu trữ trong cấu trúc `svm_node':

struct svm_node { int index; double value; };

index = -1 cho biết kết thúc của một vector.

cấu trúc svm_parameter mô tả các tham số của một mô hình SVM:

struct svm_parameter { int svm_type; int kernel_type; double degree; /* for poly */ double gamma; /* for poly/rbf/sigmoid */ double coef0; /* for poly/sigmoid */

/* these are for training only */ double cache_size; /* in MB */ double eps; /* stopping criteria */ double C; /* for C_SVC, EPSILON_SVR, and NU_SVR */ int nr_weight; /* for C_SVC */ int *weight_label; /* for C_SVC */ double* weight; /* for C_SVC */ double nu; /* for NU_SVC, ONE_CLASS, and NU_SVR */ double p; /* for EPSILON_SVR */ int shrinking; /* use the shrinking heuristics */ int probability; /* do probability estimates */ };

svm_type có thể là một trong số C_SVC, NU_SVC, ONE_CLASS, EPSILON_SVR, NU_SVR.

   C_SVC:          C-SVM classification
   NU_SVC:              nu-SVM classification
   ONE_CLASS:           one-class-SVM
   EPSILON_SVR: epsilon-SVM regression
   NU_SVR:              nu-SVM regression

kernel_type có thể là một trong số LINEAR, POLY, RBF, SIGMOID.

   LINEAR: u'*v
   POLY:        (gamma*u'*v + coef0)^degree
   RBF: exp(-gamma*|u-v|^2)
   SIGMOID:     tanh(gamma*u'*v + coef0)

cache_size là kích thước của kernel cache (MB). C là giới hạn lỗi ràng buộc. (we usually use 1 to 1000) eps là tiêu chuẩn dừng. (we usually use 0.00001 in nu-SVC, 0.001 in others). nu là tham số trong nu-SVM, nu-SVR, và one-class-SVM. p là epsilon trong hàm epsilon-insensitive loss của hồi qui epsilon-SVM. shrinking = 1 nghĩa là shrinking đã được kiểm soát;

         = 0 otherwise. 

probability = 1 nghĩa là mô hình với thông tin xác suất đã nhận được;

           = 0 otherwise.

nr_weight, weight_label, và weight được sử dụng để thay đổi trực tiếp đối với một số lớp (Nếu trọng số đối với một lớp này không thay đổi, nó dược đặt bằng 1). Điều này hữu ích đối với huấn luyện phân lớp sử dụng dữ liệu vào không cân bằng hoặc với chi phí lỗi phân lớp đối xứng.

nr_weight là số phần tử trong mảng weight_label và weight. Mỗi weight[i] tương ứng với weight_label[i], nghĩa là sự bất tiện của lớp weight_label[i] được tỷ lệ bởi một hệ số của weight[i]. Nếu ta không muốn thay đổi trực tiếp đối với bất kỳ lớp nào, chỉ cần đặt nr_weight = 0.

Chú ý: Vì svm_model chứa các điểm của svm_problem, ta có thể không giải phóng bộ nhớ được sử dụng bởi svm_problem nếu ta vẫn sử dụng svm_model thực hiện bởi svm_train().

- Function: double svm_predict(const struct svm_model *model,

                              const struct svm_node *x);

Hàm này thực hiện phân lớp hoặc hồi qui trên một test vector x cho bởi một mô hình. Đối với một mô hình phân lớp, lớp được dự đoán đối với x được trả về (x thuộc lớp nào). Đối với mô hình hồi qui, giá trị trả về là giá trị hàm của x được tính sử dụng mô hình. Đối với mô hình one-class model, trả về giá trị +1 or -1.

- Function: void svm_cross_validation(const struct svm_problem *prob, const struct svm_parameter *param, int nr_fold, double *target);

Hàm này kiểm soát thông qua sự xác nhận tính hợp lệ. Dữ liệu được phân chia thành nr_fold phần. Dưới các tham số đã cho, mỗi phần được xác nhận sử dụng mô hình từ việc huấn luyện. Các nhãn dự đoán trong việc xử lý xác nhận được lưu trữ trong mảng gọi là ‘đích’(target).

- Function: int svm_get_svm_type(const struct svm_model *model);

Hàm này trả về kiểu của mô hình.

- Function: int svm_get_nr_class(const svm_model *model);

Đối với mô hình phân lớp, hàm này cho số lớp. Đối với mô hình một lớp hoặc hồi qui, 2 được trả về.

- Function: void svm_get_labels(const svm_model *model, int* label)

Đối với mô hình phân lớp, hàm này xuất ra tên của các nhãn vào trong mảng. Đối với mô hình một lớp hoặc hồi qui, nhãn không thay đổi.

- Function: double svm_get_svr_probability(const struct svm_model *model);

Đối với một mô hình hồi qui với thông tin xác suất, hàm này xuất ra một giá trị sigma > 0. Đối với dữ liệu test, ta xét mô hình xác suất: giá trị đích = giá trị được dự đoán + z, z: phân bố Laplace e^(-|z|/sigma)/(2sigma). Ngược lại, hàm trả về giá trị 0.

- Function: void svm_predict_values(const svm_model *model, const svm_node *x, double* dec_values)

Hàm này cho giá trị quyết định trên một test vector x với mô hình đã cho. Đối với một mô hình phân lớp với các lớp nr_class, hàm này cho nr_class*(nr_class-1)/2 giá trị quyết định trong mảng dec_values, trong đó nr_class có thể nhận được từ hàm svm_get_nr_class. Thứ tự là label[0] vs. label[1], ..., label[0] vs. label[nr_class-1], label[1] vs. label[2], ..., label[nr_class-2] vs. label[nr_class-1], trong đó label có thể nhận được từ hàm svm_get_labels. Đối với mô hình hồi qui, label[0] là giá trị hàm của x được tính theo mô hình sử dụng. Đối với mô hình one-class, label[0] là +1 or -1.

- Function: double svm_predict_probability(const struct svm_model *model,const struct svm_node *x, double* prob_estimates);

Hàm này thực hiện phân lớp hoặc hồi qui trên một test vector x cho bởi một mô hình với thông tin xác suất.

Đối với một mô hình phân lớp có thông tin xác suất, hàm này cho nr_class ước lượng xác suất trong mảng prob_estimates. nr_class có thể nhận được từ hàm svm_get_nr_class. Lớp này trả về xác suất cao nhất. Đối với tất cả các tình huốn khác, mảng prob_estimates không thay đổi và giá trị được trả về giống như svm_predict.

- Function: const char *svm_check_parameter(const struct svm_problem *prob, const struct svm_parameter *param);

Hàm này kiểm tra các tham số có thuộc vùng khả thi của bài toán hay không. Hàm này sẽ được gọi trước khi gọi hàm svm_train(). Nó trả về NULL nếu các tham số là khả thi, ngược lại trả về một thông điệp lỗi.

  • Function: int svm_check_probability_model(const struct svm_model *model);

Hàm này kiểm tra mô hình có chứa thông tin cần thiết để thực hiện ước lượng xác suất. Nếu vậy, nó trả về +1. Ngược lại, trả về 0. Hàm này sẽ được gọi trước khi gọi hàm svm_get_svr_probability và svm_predict_probability.

  • Function: int svm_save_model(const char *model_file_name,

const struct svm_model *model); Hàm này lưu mô hình vào file; returns 0 nếu thành công, or -1 nếu có lỗi.

  • Function: struct svm_model *svm_load_model(const char *model_file_name);

Hàm này trả về một con trỏ tới mô hình đọc từ file, hoặc con trỏ null nếu mô hình không được đọc.

  • Function: void svm_destroy_model(struct svm_model *model);

Hàm này giải phóng bộ nhớ sử dụng bởi các mô hình.

  • Function: void svm_destroy_param(struct svm_parameter *param);

Hàm này giải phóng bộ nhớ sử dụng bởi tập các tham số.

Liên kết đến đây