신경망에서 최적의 주간 기능 구성


19

회귀 문제를 다루면서 "요일"기능의 표현에 대해 생각하기 시작했습니다. 어떤 접근 방식이 더 나은지 궁금합니다.

  • 하나의 특징; 월요일의 1/7 값; 화요일 2/7 ...
  • 7 가지 특징 : 월요일의 (1, 0, 0, 0, 0, 0, 0); 화요일의 경우 (0, 1, 0, 0, 0, 0, 0) ...

네트워크 구성 차이로 인해 측정하기가 어렵습니다. (추가 6 기능은 내가 생각하는 숨겨진 노드 수에 반영되어야합니다.)

모든 기능의 수는 약 20입니다. 나는 단순한 역 전파를 사용하여 일반적인 피드 포워드 신경망을 학습합니다.


요일에 이진 인코딩을 사용하는 것은 어떻습니까? (0, 0, 0)이 일요일 인 3 가지 기능 월요일 등 (0, 0, 1)?
— Shamoon

이것은 계산 시간을 줄이는 데 더 의미있는 기능으로 기능을 줄이는 이점이 있습니다
— Shamoon

답변:


23

두 번째 표현은 요일과 같은 범주 형 변수에 대해 더 전통적입니다.

이는 더미 변수 생성이라고도하며 범주 형 변수를 인코딩하는 데 널리 사용되는 방법입니다. 1-7 인코딩을 사용했다면 4 일과 5 일은 매우 유사하지만 1 일과 7 일은 매우 유사하지 않다는 모델을 말합니다. 실제로 1 일과 7 일은 4 일과 5 일과 비슷합니다. 동일한 논리가 해당 월의 0-30 인코딩을 유지합니다.

매주 같은 7 일 동안 매월 같은 30 일이있는 것은 아니기 때문에 달의 날은 조금 까다 롭습니다. 어떤 달에는 31 일이 있고 어떤 달에는 28 일이 있기 때문입니다. 몇 주와 몇 달은 주기적이므로 푸리에 변환 을 사용 하여 부드러운 선형 변수로 변환 할 수 있습니다 .

예를 들어 ( 내 프로그래밍 언어 인 R 사용 ) :

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'))

원시 대 죄 대 코사인

(사인 / 코사인 변수의 스케일을 -1/1이 아닌 0/30으로 조정하여 그래프가 더 좋아 보입니다)

보시다시피, 매월 말에 원시 "월요일 변수"가 0으로 되돌아가는 동안 사인 및 코사인 변환은 매월 끝날이 일과 비슷하다는 것을 모델에 알릴 수 있도록 부드럽게 전환합니다. 다음 달 초에 일.

푸리에 항의 나머지를 다음과 같이 추가 할 수 있습니다.

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'))

완전한 변형

사인 / 코사인의 각 쌍은 원을 만듭니다.

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)

원 이 페이지에는 사인파와 코사인 파를 조작하는 방법에 대한 편리한 설명 이 있습니다.


그렇게 할 특별한 이유가 있습니까? 그것이 어떻게 수렴에 영향을 줄 수 있는지 궁금합니다. 두 번째 의심은 변수가 여전히 범주 형 인 경우입니다. 매일은 어떻습니까? (
— 0-30

같은 것; 지표 변수를 사용하십시오. 첫 번째 인코딩은 적합하지 않은 유사성 측정을 유도합니다. 예를 들어, 일요일이 월요일과는 가장 다른 날입니까? 그것이 인코딩이 의미하는 바입니다.
— Emre

@OepasDost 내 게시물이 귀하의 질문에 대한 답변 인 경우, 확인 표시를 클릭하여 자유롭게 투표하거나 수락하십시오.
— Zach

@Zach 왜 당신이 요일 (0에서 6까지 인코딩 될 수 있는가)을 범주 형으로, 월을 서 수적 순환 (따라서 푸리에 변환을 사용)으로 고려하겠습니까? 둘 다 서수 순환 형이 아니므로 요일에 푸리에 변환을 수행합니까?
— zipp

1
@zipp 요일에도 푸리에를 사용할 수 있습니다. 내 경험에 따르면 요일의 기본 값은 주중과 주말의 차이이며 더미 변수 (또는 지표 변수)로 캡처하는 것이 매우 간단합니다.
— Zach
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.