월간 데이콘 생체 광학 데이터 분석 AI 경진대회

알고리즘 | 정형 | 회귀 | 바이오 | MAE

  • moneyIcon 상금 : 총 360만원
  • 961명 마감

 

EDA : LB Score - 1.09

2020.06.01 11:48 8,015 조회 language

EDA 진행하고, 대충 정한 하이퍼파라미터로 예측해보았습니다. 도움이 되셨다면 따봉 한번씩 부탁드립니다 (_ _)

코드
로그인이 필요합니다
0 / 1000
성민석
2020.06.01 16:12

감사합니다

Jamm
2020.06.01 17:56

화이팅입니다~~~

당쇠
2020.06.01 16:21

오 도움 많이 되겠습니다. 감사합니다.

Jamm
2020.06.01 17:56

다행이네요! 화이팅입니다~~

지엔장
2020.06.01 23:16

배우고갑니다. 굳

Jamm
2020.06.02 14:11

도움이 되셨다니 다행이네요~ 화이팅~~~

처음해봐요
2020.06.02 01:31

감사합니다!

Jamm
2020.06.02 14:11

화이팅입니다~~

신혜연
2020.06.02 04:40

혹시 인터넷으로는 안 보이는 건가요? 처음이라 그런지 미숙해서 여쭤봅니다.

Jamm
2020.06.02 14:11

인터넷으로는 안보인다는게 어떤 의미이신가요..???

Machinelearning
2020.06.02 16:55

삭제된 댓글입니다

시로
2020.06.02 17:00

공유 감사합니다

Jamm
2020.06.03 00:47

화이팅입니다!!!

JunHoLim
2020.06.02 22:41

좋은 정보 공유 감사합니다. 혹시 푸리에 변환시 NaN 값이 굉장히 많이나오는건 왜 그런건지 궁금합니다~!

Jamm
2020.06.03 00:53

NaN 값이 나오셨나요..?? 저는 다시 실행해보니까 NaN 은 하나도 안나왔었습니다. 
몇가지 생각이 드는 이유로는 1. 결측치 채우지 않고 진행.  / 2. FE과정중 무언가 0으로 나누는 경우가 발생했지만 인지하지 못함 / 3. 부동소수점 문제 가 아닐까 생각이 듭니다만.... 잘 모르겠습니다 죄송해여 ㅠㅠ

JunHoLim
2020.06.03 22:38

아 저는 원래 데이터에서 어떤 데이터가 나오나 궁금해서 결측치를 채우기 전에 진행했습니다! 근데 제가 생각한거보다 NaN 값이 훨씬 많이 나오길래 궁금해서 여쭤봤습니다 ㅎㅎ

Jamm
2020.06.04 08:48

음 아마 nan 값때문에 연산이 안되는 값들이 생기지 않았을까 합니다... 영상을 보고 제가 알아들은 바에 따르면 푸리에변환이 복소수지수함수의 적분(+ 극한)이 들어있는데 이중 어떤건지는 모르겠지만 nan이 있어서는 안되는부분이 있는것같습니다..하하..

장영달
2020.06.07 15:29

주어진 데이터가 시계열 데이터가 아닌데 퓨리에 변환을 사용한 이유가 무엇인지 궁금합니다. 저도 퓨리에변환에 대해서 잘 모르는데, 링크 걸어주신 영상을 보면 시계열 데이터( ex)파동)를 추상화할 때 사용하는 것 같아서요.

Jamm
2020.06.07 20:18

시계열 데이터를 '추상화' 한다는 말을 제가 잘 이해하지 못하겠습니다만... 이산 시간 푸리에변환이라고 찾아보시면 좋을 듯 합니다. 제가 알아본 바에 따르면, 제한된 시간길이의 특정 파장이 주어졌을때, 이 주어진 파장이 한 주기로 계속 반복된다고 가정하고 푸리에 변환을 하는것이 이산 푸리에 변환입니다. (혹시 잘못알고있다면 고쳐주시면 감사하겠습니다.)
데이터가 꼭 시간에 따른 파장이 아니더라도, 주기를 가지고 반복된다고 가정한다면, 푸리에 변환을 이용해서 합성파를 몇개의 성분파로 분해해내는데 어떤 논리적인 문제가 있을까요..?

SunToTemp
2020.06.09 00:54

저도 그 부분이 궁금하긴 했어요. 저는 푸리에 변환이 분해 시계열이고 시간에 따른 추세-계절-순환-불규칙 요인으로 나누는 기법으로 알고 있습니다. 근데 파장 데이터는 시계열 데이터가 아니라 한 순간을 측정한 데이터라 요인 별 분해가 가능한지 의문이네요. 설령 어떠한 형태로 분해가 된다 하더라도 데이터에는 시간이라는 차원이 존재하지 않기 때문에 데이터 내에 추세-계절-순환 이라는 요인이 존재한다고 볼 수 없는 것 같아서요. 

Jamm
2020.06.09 11:54

댓글 감사합니다. 사실 제가 푸리에변환을 써볼까 했던 생각은 여기서부터 출발했었습니다. 폼으로 괜히 써봐야지 했던게 아닙니다 ㅠㅠ
1. 이 실험은 적외선 흡수 분광분석법 실험이다. 
2. 실제 적외선 분광분석 실험에서는 FTIR(Fourier-transform infrared spectroscopy, FT-IR) 이 잘 쓰이고, 수많은 FTIR 분석장비들이 널리 사용된다. 

Jamm
2020.06.09 11:54

3. 푸리에 변환은 몇개의 원래 파로 이루어진 합성파를 원래의 파들로 분리해낼 수 있다. 
데이터가 시계열일때만 적용할 수 있다, 보다는 이게 메인아이디어 아닌가요?

4. 그래서 주어진 파장 데이터는 일정 구간으로 정해져있기 때문에, 이 데이터를 한 주기로 하는 연속적인 파장을 가정하고 푸리에 변환을 진행한다. (이산 푸리에변환)

Jamm
2020.06.09 11:54

5. 실제로 푸리에변환은 시계열 데이터에만 적용할 수 있지 않습니다. 대부분 '파동', 하면 '음성' 이 가장 쉽고, 제일 먼저 떠오르며, 연속적인 파장으로 잘 나타낼 수 있기 때문에 많은 예시가 음성 혹은 시계열 데이터로 설명을 하는것 같기는 하지만, 푸리에변환은 어떤 이미지를 스펙트럼화해서 필터를 적용할 수도 있습니다. jpeg 사진 파일 한장이 시계열 데이터일리는 없지요?

제가 잘못 알고있는 부분이 있으면 고쳐주시면 감사하겠습니다. 

SunToTemp
2020.06.09 20:25

저도 제 제한된 지식 안에서 이해한걸 이야기 해본건데 답변 감사합니다! 정리하신 글을 보니, 빛의 세기가 증가했다가 감소하는 경향을 보시고 주기가 있다고 보신 것 같아요. 그런데 저는 입력 또는 출력된 빛의 세기의 분포를 볼 때 하나의 주기라기 보다는, 정규 분포에 가깝다는 생각이 들어서요. 주기가 있다면 반복되어야 하는데 데이터 내에서는 규칙적으로 반복되는 형태를 찾기가 어렵고, 설령 상승했다가 감소하는 데이터 내에 주기가 들어있다 하더라도 그것이 무엇인지 해석하기가 어렵다고 생각이 되요. 

SunToTemp
2020.06.09 20:25

무엇인지도 모르는 것을 데이터 예측에 활용하면 아무래도 해석에 있어서 문제가 생길 수 있지 않을까 싶어서 글을 올렸던 거였어요~~~

Jamm
2020.06.10 01:03

음 제가 설명을 잘 못드렸나보네요.. dst 파장 안에 있는 35개의 값 안에 주기가 있다고 말씀드린게 아니라 이산푸리에변환(dft)을 적용하기위해서 그  35개의 값이 '한 주기' 로 반복된다고 가정하고 dft 를 했다는 뜻이었습니다.. ㅠㅠ
이 dst 35개의 값은 어떠한 합성파의 한 주기일 것이고, 이 합성파 안에 있는 어떤 특정한 파동 x 가 그 합성파의 특정 부분을 감소시킨다면 -> 이 특정한 파동 x 를 찾아내는 과정이 이산 푸리에 변환으로 가능할거라고 생각했습니다. 

SunToTemp
2020.06.10 20:15

네 제가 볼 때도 35개의 값을 '한 주기'로 보신 것 같았어요~ 특히 35개의 값을 650~990순으로 나열했을 때 증가하고 감소하는 경향성을 보시고 한 주기로 파악하신 것 같다는 이야기였습니다~ 그런데 제 생각은 약간 다른게, 그러한 경향성을 '주기'로 해석할 것이냐에 대한 것이었어요. 제가 생각하기엔 시간의 차원이 더해져야 주기라는 개념을 쓸 수 있을 것 같았습니다. 데이터가 순간을 담고 있기 때문에 일정한 형태가 반복되는 주기가 존재하지 않아 오히려 정규분포 형태에 가깝다고 본 것이죠.

SunToTemp
2020.06.10 20:21

쓰신 글을 쭉 읽어봤을 때 ~ 모든 데이터안의 35개 값이 상승, 하강하는 경향성이 있고, 이러한 경향성을 주기로 보신 것 같기도 해요. 그런데 각 사건은 독립적인 사건이기 때문에 각 데이터가 가지는 상승, 하강의 경향성을 주기로 파악하는 건 무리가 있지 않은가 짧은 생각을 남겨봅니다~

Jamm
2020.06.10 22:44

음... 제가 댓글창에서는 안적어놨지만, 코드를 읽어보셨다면 아실거라고 생각했습니다. 죄송합니다. dft 진행하는 코드를 보면, 데이터가 총 1만개 열이 있어서, 행 인덱스를 반복문으로 돌려서 총 1만번 dft를 진행했습니다. 
'그런데 각 사건은 독립적인 사건이기 때문에 각 데이터가 가지는 상승, 하강의 경향성을 주기로 파악하는 건 무리가 있지 않은가 짧은 생각을 남겨봅니다~' 일단 이 부분은 아예 처음부터 잘못 이해하고 계셨던게 맞고요~

Jamm
2020.06.10 20:42

각 행별로 있는 dst열 35개 를 한 주기로 하는 연속적인 파장  1만개에 대해서, 행별로 총 1만번 이산 푸리에변환을 연산해서 그 결과물을 변수로 추가했다. 
였는데, 각 데이터는 독립적이라서 주기가 있지 않다~ 하시면...뭐라고 더 설명을 드려야할지 모르겠네요~

Jamm
2020.06.10 20:45

[0, 1, 2, 3]을 한 주기로 갖는파장은 [0, 1, 2, 3, 0, 1, 2, 3, ... , 0, 1, 2, 3] 이고, 
[2, 4, 6, 8]을 한 주기로 갖는파장은 [2, 4, 6, 8, 2, 4, 6, 8, ... , 2, 4, 6, 8] 이고, 
[1, 3, 5, 7]을 한 주기로 갖는파장은 [1, 3, 5, 7, 1, 3, 5, 7, ... , 1, 3, 5, 7] 이라고 계속 말씀을 드렸는데, 
 0, 2, 1을 가지고 여기서 주기를 보기는 무리가 있다. 정규분포 아니냐, 하시면 더 설명 드릴 방법이 없네요~

SunToTemp
2020.06.15 11:45

삭제된 댓글입니다

Yion
2020.06.08 15:46

좋은글 감사합니다. 토론게시판에서도 데이터에 대해서 글 올리셨던데 그 글도 아주 유익하게 봤습니다.
한가지 질문이 있는데 혹시 퓨리에 변환 전,후로 점수차이가 있었나요?

Jamm
2020.06.08 22:35

게시물 중간중간에 1.2..., 1.18...., 1.09... 이런식으로 아웃풋 점수가 있는데 이게 10fold 교차검증 한 점수입니다. 이거 말씀하신거 맞으신지요??

Yion
2020.06.09 15:30

앗 네 맞아요. 이걸 제가 못봤네요. 답변 감사합니다.

Yion
2020.06.09 15:31

질문 하나만 더 드려도 될까요?
데이터는 650nm ~ 990nm에 해당하는 35가지 종류의 빛을 어떤 물체에 쏘아서(이게 src) 물체를 투과한 후의 세기를 측정(이게 dst)한 것으로 이해하고 있는데 데이터에서 퓨리에변환이 어떻게 적용되고 잇는건지 이해가 잘 안되요.

Jamm
2020.06.10 00:34

우선 적외선은 에너지가 낮기 때문에 실험에 사용된 근적외선이 뇌를 투과할수있을것같지는 않고요, 아마 흡수가 될거라고 생각했습니다. 일부는 반사가 되겠지요. 흡수되는 파장은 물질의 분자구조(작용기) 에 따라 달라지기때문에 이를 통해 물질의 성분을 알 수 있습니다. 
제가 이해한 실험의 내용은 이렇습니다. 잘못 이해한거라면 고쳐주시면 감사하겠습니다. 

Jamm
2020.06.10 00:54

그래서 측정된 dst 값 35개를 한 주기로 보는 파동을 가정합니다. 이 dst row 의 값은 어떠한 합성파일 것이고, 이 합성파 안에 있는 어떤 특정한 파동 x 가 그 합성파의 특정 부분을 감소시킨다면 -> 이 특정한 파동 x 를 찾아내는 과정이 이산 푸리에 변환으로 가능할거라고 생각했습니다. 

Yion
2020.06.09 15:33

삭제된 댓글입니다

Yion
2020.06.09 15:34

댓글이 이어서 안달아지네요. 여기에 올릴게요.
퓨리에 변환이라는데 어떤 주기를 가지는 파동을 여러개의 sin, cos파로 decompostion하는 건데 지금 이 대회의 데이터에서 "어떤 주기를 가지는 파동"이라는게 데이터의 어떤부분에서 표현되고 있는건지 잘 이해가 안되서요. 

Jamm
2020.06.10 00:51

'이산 푸리에 변환'을 진행하기 위해 dst 열 35개가 한 주기로 반복된다고 생각하였습니다. 

nevret
2020.06.10 15:23

좋은 커널 공유 감사합니다! 많이 도움 됐습니다 :)
전체 흐름을 model_scoring_cv 함수로 feature engineering의 결과를 kfold를 통해 성능을 체크하고
마지막 submission은 kfold 없이 단일로 제출하는 과정으로 제가 이해를 했는데 혹시 맞을까요?

Jamm
2020.06.10 15:34

네 잘 보셨습니다~ 제출해본 결과로는 cv 점수랑 lb 점수가 크게 차이가 나지 않아서, 10fold 교차검증정도면 어느정도 신뢰할수 있는..? 검증이 될 수 있겠다 판단했습니다

nevret
2020.06.10 17:27

삭제된 댓글입니다

Jamm
2020.06.10 17:28

음 sklearn 문서를 읽어보시면 multi output regressor 를 사용해서 fit 을 하면, 한개의 모델로 데이터를 여러번 학습해서 결과를 만들어줍니다. 여기서는 타겟변수의 종류가 4개이니 4번이겠지요? baseline 코드처럼 같은 모델로 4번 코드를 써서 해도 똑같은 결과가 나올거라고 생각합니다. 근데 전 귀찮아서... 
근데 어차피 똑같습니다~

nevret
2020.06.15 12:03

죄송하지만 하나만 더 여쭙겠습니다..!
사용하신 model_scoring_cv 함수가 submission 제출을 하지 않아도 성능을 체크해볼 수 있는 방법인거죠? 일종의 노하우같은..?
그리고 cross_val_score()에서 마이너스 부호를 붙인 이유도 궁금합니다ㅠ

Jamm
2020.06.16 12:57

A. 그렇습니다. 제출 횟수가 무제한이라면, 그냥 매번 제출해보면 되지만, 제출 횟수가 제한되어있으면, 제출하지 않고도 지금 이 결과물이 몇점정도 할지를 파악하는것이 다른 추가적인 데이터 실험을 하는데 정말 중요한 역할을 합니다. 저같은 경우는 10fold cv 점수와 lb 점수가 크게 차이가 나지 않는다는걸 발견해서, 이 cv점수를 보고 '아 이대로 제출하면, lb에서 몇점정도겠구나' 를 파악한 거라고 할 수 있겠습니다.

Jamm
2020.06.16 12:57

A. 마이너스를 붙인 이유는 자세히 보면 코드 안에 숨어있는데요, 'scoring = neg_mean_absolute_error' 이라고 되어있습니다. sklearn 에서는 기본적으로 '점수는 높을수록 좋은거다!' 라는식으로 여러 metric 들을 일관성있게 통합하기 위해, 낮을수록 좋은 점수들(mae, mse, logloss) 등등을 저와 같은식으로 사용할때 음수로 만들어 버렸습니다......

Jamm
2020.06.16 12:57

 (neg_logloss, neg_mean_squared_error) 이렇게 되면 값이 높을 수록 좋은 점수가 되니까요... 제가 sklearn 운영진이 아니라 자세한거는 말씀을 못드리겠지만... 듣기로 이렇게 들었습니다~~

SIM0
2020.06.12 11:24

안녕하세요. 코드를 참고하여 많은 도움이 되었습니다.
푸리에 변환을 이번에 처음 알게 되면서 공부를 하고 있는데, 제가 이해한 바로는 합성파를 원래의 파장으로 분리해낸다고 이해를 했는데,
푸리에 변환을 통해 얻어진 각 행에 650~990에 대한 값들이 분리가 되었다면 여러 개의 값이 나온다고 생각이 드는데, 실수부 허수부만 나뉘어 져있는데 이는 어떻게 해석하는게 맞나요?

처음 들어보고 직관적으로만 이해하니 제대로 이해하고 있는 게 맞나 싶네요 ㅠ 

Jamm
2020.06.12 14:32

사실 어떤 파동a 에 푸리에 변환을 해준다고, 결과물이 2sin(b) + 3cos(c) + ... -sin(d) 이런식으로 파장이 나오는게 아니라, https://blog.mbedded.ninja/programming/signal-processing/fourier-transforms/1d-fourier-transform.png
와 같은 'magnitude' 값을 얻을 수 있습니다. 

Jamm
2020.06.12 14:39

제가 올려드린 영상 안에서는 파동을 원에다 감고, '원을 감은 파동 그래프의 무게중심의 x좌표' 를 구할 수 있다. 라고 설명이 나오는데요, 이때 이 그래프를 원에 감는 환경이 복소평면(x축은 실수축, y축은 허수축)이기 때문에, 실수부는 '원을 감은 파동 그래프의 무게중심(극한값) 의 x좌표, 허수부는 y좌표'라고 할 수 있습니다. 

Jamm
2020.06.12 14:41

저도 저 영상을 보고 직관적으로 이해만 하고있는거라 수식으로 자세한 설명은 못드릴것같아요..ㅠㅠ '여러개의 값이 나와야 하는것' 이 어떤 의미인지 제가 이해는 잘 못했는데, 제가 푸리에 변환으로 추가한 변수가 실수부 35개, 허수부 35개 해서, 전 후 dataframe 의 shape 를 비교해보시면 열이 70개가 증가했습니다. 이 의미가 맞으신지 모르겠네요..ㅠㅠ

parking9
2020.06.16 10:57

안녕하세요:D 올려주신 자료 잘 봤습니다.
질문이 있어서 댓글 달아요.
결측치를 왜 -1로 설정하셨나요?

Jamm
2020.06.16 12:48

처음에 마땅한 결측치 처리 방법이 생각이 나지 않을때 제가 주로 쓰는 방법입니다~ (전체 데이터의 최솟값보다 더 작은 값으로 채우기) 하지만 적절한 결측치 처리 방법을 도입하면서 더 점수향상을 만들었기 때문에, 이걸 보여드리려고 일부러 -1로 채운 코드도 같이 파일에 실었습니다. 

parking9
2020.06.16 17:09

답변 감사합니다!!
분석에 서툴러서 추가 질문이 있는데, y_train에 있는 0에 대해서는 결측치 처리를 하지 않은 이유가 있나요?
시료의 특정 성분이 0이 될 수 없다고 생각해서요.

Jamm
2020.06.17 01:30

음 딱히 이유는 없습니다만, 이렇게 생각해보시면 어떨까 합니다. 
만약 Ytrain의 0이 결측치라고 한다면, 이 결측치를 채울만한 다른 합리적인 방법이 있을까?
만약 머신러닝을 이용해서 Ytrain의 결측치를 예측해서 채운다고 하면, 어떤식으로 모델을 구성해야하고, 검증은 다시 어떻게 하며, 모델링은 어떻게 해야 이 채운 값을 신뢰하고 나머지 데이터들을 이걸로 학습시킬 수 있을까? 

Jamm
2020.06.17 01:33

저도 캐글 하면서 의심스러운 타겟값들을 몇번 보긴 했지만, 위와 같은 문제때문에 별다른 뭘 하지는 않았었습니다. 아무래도 빠르게 정확도를 올리는데는, 소수의 의심스러운 타겟값에 집중하기보다는 다수의 정상적으로 생각되는 타겟값을 맞추는데 집중하는게 더 낫다고 생각합니다.

Jamm
2020.06.17 01:33

제가 생각했던 위 두개의 질문 보다도 더 많은 문제점이 있을 수 있습니다. 만약 이러한 문제 +@ 를 해결하신다면 아무래도 채우고 하는게 더 나을 '수도' 있다고 생각합니다. 제 지식 영역 속에서는 이상한 값일 수도 있지만, 데이터를 만든 전문가 입장에서는 정상적일 수도 있으니까요~

parking9
2020.06.17 09:26

친절한 답변 감사합니다. 덕분에 많은 도움이 됐습니다!

Jamm
2020.06.17 16:08

아닙니다~ 마지막까지 화이팅입니다~

스누디킹
2020.06.23 17:49

너무 좋은 코드와 지식, 정보들 감사합니다!!!

Jamm
2020.06.24 14:20

도움이 되셨다니 저 역시 기쁠 따름입니다~~

23fdf51d
2020.06.25 03:00

처음 접근하는데 많은 도움 되었습니다~