Làm thế nào để thực hiện lựa chọn biến thuật toán di truyền trong R cho các biến đầu vào SVM?


9

Tôi đang sử dụng gói kernlab trong R để xây dựng một SVM để phân loại một số dữ liệu.

SVM đang hoạt động tốt ở chỗ nó cung cấp 'dự đoán' về độ chính xác khá, tuy nhiên danh sách các biến đầu vào của tôi lớn hơn tôi muốn và tôi không chắc về tầm quan trọng tương đối của các biến khác nhau.

Tôi muốn triển khai một thuật toán di truyền để chọn tập hợp con của các biến đầu vào tạo ra SVM được đào tạo tốt nhất / tốt nhất.

Tôi muốn một số trợ giúp với việc chọn gói R nào sẽ sử dụng khi thử triển khai GA này (và có thể là một ví dụ psuedo ngắn).

Tôi đã xem hầu hết các gói R GA / P ngoài đó ( RGP , genache , subselect , GALGO ), nhưng tôi đang vật lộn để xem làm thế nào tôi sẽ vượt qua chức năng ksvm của mình như là một phần của chức năng tập thể dục và nhập vào mảng biến như nhóm dân số ...?

Bất kỳ trợ giúp, suy nghĩ, hoặc khỏa thân theo đúng hướng biết ơn nhận được.

Cảm ơn

mã giải quyết được thêm vào bên dưới trong EDIT sau này

# Prediction function to be used for backtesting
pred1pd = function(t) {
print(t)
##add section to select the best variable set from those available using GA
  # evaluation function - selects the best indicators based on miminsied training error
mi.evaluate <- function(string=c()) {
    tmp <- data[(t-lookback):t,-1]
    x <- string
    tmp <- tmp[,x==1]
    tmp <- cbind(data[(t-lookback):t,1],tmp)
    colnames(tmp)[1] <- "targets"
    trainedmodel = ksvm(targets ~ ., data = tmp, type = ktype, kernel="rbfdot", kpar=list(sigma=0.1), C = C, prob.model = FALSE, cross = crossvalid)
    result <- error(trainedmodel)
    print(result)
    }

## monitor tge GA process
monitor <- function(obj) {
minEval = min(obj$evaluations);
plot(obj, type="hist");
}

## pass out the GA results; size is set to be the number of potential indicators
gaResults <- rbga.bin(size=39, mutationChance=0.10, zeroToOneRatio=10, evalFunc=mi.evaluate, verbose=TRUE, monitorFunc=monitor, popSize=50, iters=3, elitism=10)

## now need to pull out the best chromosome and rebuild the data frame based on these results so that we can train the model

bestChro <- gaResults$population[1,]
newData <- data[,-1]
newData <- newData[,bestChro==1]
newData <- cbind(data[,1],newData)
colnames(newData)[1] <- "targets"
print(colnames(newData))

# Train model using new data set
model = trainSVM(newData[(t-lookback):t, ], ktype, C, crossvalid)
# Prediction
pred = as.numeric(as.vector(predict(model, newData[t+1, -1], type="response")))
# Print for user inspection
print(pred)
}

Câu trả lời:


7

Lời khuyên của tôi sẽ là không làm điều này. Những lợi thế về mặt lý thuyết của SVM tránh sự phù hợp quá mức chỉ áp dụng cho việc xác định các số nhân độ trễ (các tham số của mô hình). Ngay khi bạn bắt đầu thực hiện lựa chọn tính năng, những lợi thế đó về cơ bản đã bị mất, vì có rất ít lý thuyết bao gồm lựa chọn mô hình hoặc lựa chọn tính năng và bạn rất có thể phù hợp với tiêu chí lựa chọn tính năng, đặc biệt là nếu bạn tìm kiếm rất khó sử dụng GA. Nếu lựa chọn tính năng là quan trọng, tôi sẽ sử dụng một cái gì đó như LASSO, LARS hoặc Mạng đàn hồi, trong đó lựa chọn tính năng phát sinh thông qua việc tính toán lại, trong đó lựa chọn tính năng bị hạn chế hơn, do đó có ít mức độ tự do hiệu quả hơn và ít phù hợp hơn.

Lưu ý một ưu điểm chính của SVM là đó là việc triển khai gần đúng giới hạn tổng quát, không phụ thuộc vào chiều của không gian tính năng, điều này cho thấy rằng lựa chọn tính năng có lẽ không nhất thiết phải cải thiện hiệu suất và nếu có sự hiệu quả trong quá trình lựa chọn (ví dụ như quá phù hợp với tiêu chí lựa chọn) nó cũng có thể làm cho mọi thứ tồi tệ hơn!


5
+1 Một con chó con ngọt ngào chết mỗi khi bạn thực hiện lựa chọn tính năng với các thuật toán di truyền.

@mbq LOL! (rõ ràng tôi cần nhập ít nhất sáu ký tự nhiều hơn tôi thực sự muốn.)
Dikran Marsupial

1
@mbq cún con và mèo con sẽ xuất hiện, nếu kết quả của tôi là bất cứ điều gì xảy ra ...
tfb

@mbq Tôi đang lên kế hoạch thực hiện một số lựa chọn tính năng với GA cho một bài báo tôi đang viết vào lúc này (không hy vọng nó hoạt động, nhưng một số bộ dữ liệu có quá nhiều tính năng để tìm kiếm toàn diện). Xin lỗi Fido!
Dikran Marsupial

@DikranMarsupial Vâng, tôi chỉ có thể mời bạn thử lọc trước chúng bằng một số công cụ gỗ của tôi (;

2

Cuối cùng, tôi đã kết thúc bằng cách sử dụng gói 'genache' trên R. Nó có nghĩa là chuyển đổi nhiễm sắc thể chiến thắng từ định dạng nhị phân để thể hiện các biến trong dữ liệu của tôi, nhưng điều này tương đối tầm thường khi GA chạy. Hãy cho tôi biết nếu bạn muốn biết thêm chi tiết.


Bạn có phiền đăng mã?
B_Miner

@B_Miner xin lỗi vì sự chậm trễ, đã lâu rồi tôi mới vào SO. Cũng đã được một thời gian kể từ khi tôi phải vật lộn với vấn đề này trong R. Tôi đã xem qua các tập tin cũ của tôi và tôi nghĩ rằng bên dưới là mã đã giải quyết nó - hy vọng nó sẽ giúp:added above
tfb

2
(Tuyên bố miễn trừ trách nhiệm: Các thuật toán di truyền của IMHO là một trong những tối ưu hóa xấu hơn cho các mô hình thống kê. Chúng đang khai thác phương sai trong ước tính hiệu suất theo cách rất xấu). Vì vậy: ít nhất hãy kiểm tra mô hình cuối cùng của bạn với dữ liệu thử nghiệm thực sự độc lập!
cbeleites không hài lòng với SX
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.