Xây dựng tối ưu tính năng ngày trong mạng lưới thần kinh


18

Làm việc với vấn đề hồi quy tôi bắt đầu nghĩ về việc thể hiện tính năng "ngày trong tuần". Tôi tự hỏi cách tiếp cận nào sẽ thực hiện tốt hơn:

  • một tính năng; giá trị 1/7 cho thứ Hai; 2/7 cho thứ ba ...
  • 7 tính năng: (1, 0, 0, 0, 0, 0, 0) cho thứ Hai; (0, 1, 0, 0, 0, 0, 0) cho thứ ba ...

Thật khó để đo lường nó do sự khác biệt về cấu hình mạng. (Tôi tin rằng sáu tính năng bổ sung sẽ được phản ánh theo số lượng nút ẩn mà tôi tin.)

Số lượng tất cả các tính năng là khoảng 20. Tôi sử dụng backprop đơn giản để tìm hiểu mạng thần kinh chuyển tiếp thức ăn thông thường.


Còn việc sử dụng mã hóa nhị phân cho ngày trong tuần thì sao? 3 tính năng, trong đó (0, 0, 0) là Chủ nhật. (0, 0, 1) cho thứ Hai và cứ thế?
Shamoon

Điều này có thêm lợi ích của việc giảm các tính năng thành thứ gì đó có ý nghĩa hơn để giảm thời gian tính toán
Shamoon 3/03/2015

Câu trả lời:


22

Đại diện thứ hai của bạn là truyền thống hơn cho các biến phân loại như ngày trong tuần.

Điều này còn được gọi là tạo các biến giả và là một phương pháp được sử dụng rộng rãi để mã hóa các biến phân loại. Nếu bạn đã sử dụng mã hóa 1-7, bạn đang nói với mô hình rằng ngày 4 và 5 rất giống nhau, trong khi ngày 1 và 7 rất khác nhau. Trong thực tế, ngày 1 và 7 cũng tương tự như ngày 4 và 5. Logic tương tự giữ mã hóa 0-30 cho các ngày trong tháng.

Ngày trong tháng khó hơn một chút, bởi vì trong khi mỗi tuần có 7 ngày giống nhau, không phải tháng nào cũng có 30 ngày giống nhau: một số tháng có 31 ngày và một số tháng có 28 ngày. Vì cả tuần và tháng đều theo chu kỳ, bạn có thể sử dụng các phép biến đổi phạm vi để chuyển đổi chúng thành các biến tuyến tính trơn tru.

Ví dụ: ( sử dụng R, ngôn ngữ lập trình tôi chọn ):

day_of_month = c(1:31, 1:28, 1:30)
day_of_year <- 1:length(day_of_month)
s = sin((2*pi)/30*day_of_month)
c = cos((2*pi)/30*day_of_month)
plot(day_of_month ~ day_of_year)
lines(15*s+15 ~ day_of_year, col='blue')
lines(15*c+15 ~ day_of_year, col='red')
legend(10, 30, c('raw', 'sin', 'cos'), c('black', 'blue', 'red'))

nguyên vs sin vs cos

(Tôi đã chia tỷ lệ các biến sin / cosine thành 0/30, thay vì -1/1 để biểu đồ trông tốt hơn)

Như bạn có thể thấy, trong khi "biến số của tháng" thô trở về 0 vào cuối mỗi tháng, các phép biến đổi sin và cos tạo ra sự chuyển đổi suôn sẻ cho phép mô hình biết các ngày vào cuối một tháng tương tự như ngày vào đầu tháng tiếp theo.

Bạn có thể thêm phần còn lại của các điều khoản phạm lỗi như sau:

for(i in 1:3){
  s = sin((2*pi)/30*day_of_month + 30 * i/4)
  c = cos((2*pi)/30*day_of_month + 30 * i/4)
  lines(15*s+15 ~ day_of_year, col='blue')
  lines(15*c+15 ~ day_of_year, col='red')
}
legend(10, 30, c('raw', 'sin', 'cos'), c('black', 'blue', 'red'))

Biến đổi hoàn toàn

Mỗi cặp sóng sin / cos tạo thành một vòng tròn:

m <- lapply(1:4, function(i){
  as.matrix(
    data.frame(
    s = sin((2*pi)/30*day_of_month + 30 * i/4),
    c = cos((2*pi)/30*day_of_month + 30 * i/4)
    )
  )
})
m <- do.call(cbind, m)
pairs(m)

vòng tròn Trang này có một lời giải thích thực sự tiện dụng về cách điều khiển sóng sin và cos.


Có bất kỳ lý do cụ thể để làm như vậy? Tôi tự hỏi làm thế nào nó có thể ảnh hưởng đến sự hội tụ. Nghi ngờ thứ hai của tôi là khi một biến vẫn còn phân loại - còn ngày trong tháng thì sao? (0 - 30)
Oepas Dost

Điều tương tự; sử dụng các biến chỉ báo. Mã hóa đầu tiên tạo ra một biện pháp tương tự có thể không phù hợp; ví dụ, chủ nhật có thực sự là ngày không giống nhau nhất từ ​​thứ hai không? Đó là những gì mã hóa ngụ ý ...
Emre

@OepasDost Nếu bài đăng của tôi trả lời câu hỏi của bạn, vui lòng bỏ phiếu và / hoặc chấp nhận nó bằng cách nhấp vào dấu chọn.
Zach

@Zach tại sao bạn lại coi ngày trong tuần (có thể được mã hóa từ 0 đến 6) là phân loại và ngày trong tháng theo chu kỳ thông thường (và do đó sử dụng biến đổi Fourier). Và không phải cả hai đều theo chu kỳ thông thường và do đó cũng thực hiện chuyển đổi Fourier cho ngày trong tuần?
zipp

1
@zipp Bạn cũng có thể sử dụng Fourier cho ngày trong tuần. Theo kinh nghiệm của tôi, giá trị chính của ngày trong tuần là sự khác biệt giữa các ngày trong tuần và cuối tuần, rất đơn giản để chụp với các biến giả (hoặc một biến chỉ báo).
Zach
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.