동서발전 태양광 발전량 예측 AI 경진대회

알고리즘 | 정형 | 회귀 | 에너지 | NMAE

  • moneyIcon 상금 : 1,600만원
  • 1,543명 마감

 

[R-tidymodels] R XGBoost Baseline - 9.34983

2021.05.05 12:19 2,646 조회 language

R 사용자분들을 위한 베이스라인 코드입니다.
tidymodels 패키지를 활용했지만 전처리부분은 좀더 자유롭게 만지기 위해 recipe, bake, juice등 없이 직접 작성했습니다.
DACON.Dobby님이 올려주신 베이스라인 코드의 예보데이터 활용방식과 전처리방식을 동일하게 처리한 코드입니다.
모델은 XGBoost로 변수는 튜닝없이 적적히 임의의값을 집어넣었습니다.
개선의 여지가 많은 코드입니다.
참고바랍니다.

코드
로그인이 필요합니다
0 / 1000
함께하는우리
2021.05.07 11:28

요즘 R 코드가 많이 올라오네요 ㅎㅎ 
혹시   
capacities <- c("dangjin"=1000,
                  "dangjin_floating"=1000,
                  "dangjin_warehouse"=700,
                  "ulsan"=500) 
이부분은 어떤 의미인가요 ??

아무개씨
2021.05.07 16:39

안녕하세요
코드 가독성과 의미 이해를 돕기 위해,  각 발전소 별 최대 발전량을 명시적으로 표시한 부분입니다.
코드 동작시에는 큰 의미가 없습니다.
그냥 vector element에 이름을 안주셔도 되고, 단순히 3200으로 나누어도 됩니다 ㅎㅎ

촉촉한초코칩
2021.05.07 12:13

좋은 코드 공유 감사합니다 ~^

아무개씨
2021.05.07 16:39

도움이 되었다니 기쁘네요 ^^

pyoh.amen
2021.05.07 12:34

파이썬만 다뤄서 R 베이스라인이 있으면 좋겠다 싶었는데,, 감사합니다 ~!

아무개씨
2021.05.07 16:39

R사용자 화이팅입니다!

쪼캉
2021.05.12 10:24

안녕하세요? 
파이썬으로 시작해서 기회가 생기어 R을 공부하던 중 찾아보다 아무개씨님의 코드를 필사하고 있습니다. 공유 정말 감사드립니다.
다만 코드 중에 학습 & 밸리데이션 데이터 생성 코드 중 rename(target=!!target) 에서 "=!!"이 의미하는 것이 무엇인지 여쭈어 봐도 될지요? 
각각의 발전소명을 target이라는 변수명으로 변경하는것으로는 이해되지만, =!! 이라는 구문 자체가 이해가 안되어서요.. 
구문 문법에 대한 질문을 드리기에 정말 죄송하지만, 검색을 해보아도 보이질 않아 답답한 마음에 송구하게도 질문을 드립니다..

아무개씨
2021.05.12 12:24

안녕하세요, 사실 없어도 정상작동 하는 부분이지만  혹시 모를 에러를 방지하기 위해 습관적으로 작성한 부분입니다.
 
!!는 tidy-way로 짜여진 함수 내에서 사용되는 일종의 표현식 평가 함수입니다. 주로 enquo와 함께 사용합니다만 여기서는 사용하지 않았습니다.
아래 문서의  8.1 Patterns for single arguments 부분을 참조하시면 자세한 설명을 보실 수 있습니다.
https://tidyeval.tidyverse.org/dplyr.html 

tidyverse 계열 패키지에 익숙치 않으시면 당장 와닿지 않을테니 질문하신 부분만 이해할 수 있게 답변을 드리자면
dplyr 패키지 내의 함수(select, mutate, rename 등)는 데이터 프레임 내에 있는 컬럼을 지칭할 때 따옴표(")로 감싸지 않습니다.  컬럼명을 character로 (Python의 str) 입력해주지 않아도 데이터프레임 내에 있는 컬럼이라면 알아서 들고 함수를 동작합니다.
!!는 dplyr 패키지 내의 함수들이 !!뒤에 붙은 명령어를 변수로 인식하게 하는 역할을 합니다.

예를 들어 
df %>% mutate(a=b/200)
이라는 코드를 입력했을 때,

1. 데이터프레임 (df) 내에 a,b라는 이름을 가진 컬럼이 있는경우
 - 알아서 a, b를 컬럼으로 취급하여 연산합니다 ( df$a, df$b 와 같이 동작하는 것입니다. )

2. 데이터프레임 (df) 내에 a,b라는 이름을 가진 컬럼이 없는 경우
 - a, b라는 이름을 가진 변수를 가져다 연산을 시도합니다.
 - a, b라는 이름을 가진 변수가 검색 가능한 scope내에 없다면 "객체를 찾을 수 없습니다" 에러가 발생합니다. 

3. 데이터프레임 (df)내에 a,b라는 이름을 가진 컬럼이 있고, a, b라는 이름을 변수도 존재할 때
 - pipe( %>%)로 연결된 데이터프레임 내에 있는 컬럼명이 우선순위가 높기 때문에 1번 과 같이 작동합니다.


아무개씨
2021.05.12 17:38

위의 경우는 3번을 회피하기 위해 !!를 쓴 경우인데요.
3번과는 다르게 저는 df의 ("dangjin", "ulsan" 등) 발전소명으로 된 컬럼의 이름을 rename을 이용해서 일괄적으로 target으로 변경하고 싶습니다. 이럴경우,

target <- "dangjin"  (target이라는 변수에 변경을 원하는 컬럼명인 "dangjin"을 저장)

1.  df %>% rename(target=target)
  -->  target이라는 컬럼이 존재하면 이름을 target으로 바꾸고,  없으면 target이라는 변수에 저장된 값을 (dangjin)이름으로 가진 컬럼의 이름을 target으로 바꾸어라 (dangjin -> target 변경)
2.  df %>% rename(target=!!target)
  --> target이라는 변수에 저장된 값을 이름으로 가진 컬럼의 이름을 target으로 바꾸어라. (dangjin -> target 변경)

인풋 데이터에 target컬럼이 존재하지 않으니 결과적으로 제가 작성한 함수에서 1,2의 동작은 같지만 1의 경우 target이라는 컬럼이 존재하면 의도와 다르게 작동합니다.
같은 함수를 동일한 데이터 프레임에 중복으로 사용할 경우 생길 수 있는 문제를 방어하기 위한 회피성 코드라고 보시면 되겠습니다. 

tidyverse계열 함수를 많이 쓰실 거라면 알아두시는 것도 좋습니다.

쉽게 설명하고 싶었는데 적고 보니 구구절절하네요
도움이 되셨는지 모르겠습니다.

쪼캉
2021.05.30 15:25

감사합니다. 지난번 감사의 인사드리려 댓글 작성 중에 전화가 온 이후로 잊어버렸네요ㅠㅠ..
늦었지만 성의있는 답변 정말 감사드립니다.
python도 굉장히 고수준 라이브러리가 많은데도 R이 더욱 추상화된 편리기능이 많은 느낌이네요.
많이 배웠습니다..! 감사합니다.