728x90

오랜만에 업로드 하는 것같습니다 ㅎㅎ

간만에 진도를 나간터라 그 전까지 뭘 했는지 복습을 좀 했어요

최근에 막혔던 부분이 R값이 1 이 나온 부분이였어요 과적합 인것같은데,,

여러가지 문제를 생각해 보는데 시간을 많이 할애했던 것같아요 시계열 프로젝트를 처음 하다보니까 

계속 헷갈리더라구요 

 

Y 값을 가지고 tren,seasonal, rolling 등 FE를 진행했는데 이 값들이 validation dataset에 영향을 주었을 수도 있고,

스케일링,다중공선성을 아직 하지 않아서 그런 것일수도 있구요 

 

2021-01을 Y값을 모른다는 전제 하에 검증을 진행해 보고 있어요

실제로 제출할 6~7월달 값은 Y값이 없기때문에 미리 선행해보자는 뜻으로 진행 중입니다

그래서 1월달 값은 가장 최근인 2020년1월 값을 중복해서 사용했어요 계절성은 비슷하니까 큰~무리는 없지 않을까 생각합니다. 

 

그래서 1. 중복데이터 적용 후 성능 확인 ->  2. 스케일링 적용 후 성능 확인 -> 3. 다중공선성 제거 후 성능확인 

이 순으로 진행할 계획이고, 현재 2단계 스케일링은 마쳤습니다. 

 

스케일링 하기전 1월달 예측값과 실제값 비교 시각화
스케일링 적용 후 1월달 예측값과 실제값 비교 시각화

스케일링 적용 후 과적합 현상이 줄어서 그런지 R값도 조금 감소했어요 나름 현실성을 찾아 가는 것 같아요

1월달 값은 적용 후 값이 더 손실을 보고 있어요 아직 다중공선성이 남았는데 조금 혼란 스럽네요

파란색이 실제 값,  주황색이 예측값인데 예측값을 보면 새벽시간에 태양열 에너지가 있다고 말하고 심지어 마이너스도 있네요, ㅎㅎ;; 아직 시작단계니까 차근차근 해보도록 하겠습니다

 

 

 

728x90
728x90

아버지의 신장이 좋지 않아서 제가 신장 공여를 할 생각이였습니다

다음주 월요일에 신장내과 정밀 검사 결과가 나오므로 그때 가서 다시 얘기 해보기로 했는데 

 

그날이 오늘이였어요

만성신부전4기이신데 .. 병원에서는 약물치료와 식이요법으로 경과를 지켜보자고 하시더라구요

 

일주일간 마음고생 많았는데 결과가 석연치 않아서 마음이 놓이진 않습니다 ..

공부하면서 힘들고 지쳤었는데 

 

건강하다라는 사실 하나 만으로 이렇게 큰 힘이 될줄 새삼 깨달았습니다

오전에 할머니가 전화하시고는 아버지 상태를 듣더니 서럽게 우셨어요.. 후..

여간 요즘 좀 힘이 살짝 드네요

 

내일은 아버지 퇴원 수속 밟으러 갑니다 

업로드는 빠른 시일내로 좋은 공부내용 돌아오겠습니다

감사합니다

728x90
728x90

FE & data 분리를 끝마친 후 2021년 1월 데이터를 검증 데이터로 사용하여 lgb와 회귀분석 각각

돌려봤습니다. lgb 코드는 데이콘에서 공유한 코드를 사용해 봤어요 

회귀분석 결과 R^2이 1 이 나왔어요. 뭔가 잘못된 것아요; 설명력이 100%일리가 없을텐데...

target 데이터로 차분,lag,seasonal 등 적용했는데, 12월 Y데이터가 1월에 들어 갔기 때문에 그런게 아닌가 싶습니다. 

 

그런데 고민되는 점은, 단지 검증하는 목적인데 굳이 Y데이터를 변경할 필요가 있을까 였어요 

뭔가 뜬구름 잡는 것같아서 고민하다가 일단 lgb 상태는 어떤지 쭉 확인해 봤습니다.

 

lgb의 y_val값과 y_val의 pred를 시각화한 그래프 입니다. 데이콘이 제시한 평가 방식으로 점수를 계산해 봤는데 약 0.40이 나왔어요 데이콘의 베이스 코드의 점수는 8점대 였어요 

 

 

 

왼쪽은 정상성 테스트, 오른쪽은 자기상관 테스트 해본 결과입니다.

평균이 0에 집중적으로 모이고, 분산은 일정하니 당연히 정상성 데이터로 보입니다.

자기상관그래프도 다른 lag 시점과 corr값을 비교해봐도 눈에 띄게 튀는 값이 없었습니다. 

자기상관 그래프는 유의수준 범위? 갑자기 기억이 안나는데 파란색으로 범위가 그러져 있어요

그 안에 점들이 위치해 있다면 corr값은 0이라고 판단하는데 위 그래프에는 파란색 범위가 보이질 않습니다 

값이 워낙 작아서 안보이는 것일수도 있습니다. 그래서 저 시각화 그래프만으로는 자기상관이 있다 없다 판단하기엔 이릅니다. 정확한 통계치로 확인해 보겠습니다.

p-value가 0.05보다 작아서 자기상관은 있다고 나왔습니다. 

데이터는 정상성 이지만 자기상관은 있다는 것은 무슨 의미일까요 아직 여기까지는 잘 모르겠습니다;;

 

이 방향이 맞는지 고민좀 더 해봐야 할것 같아요 회귀분석 설명력이 1이라니.. 분명 뭔가 잘못된것같네요

데이터 자체가 정오가 될수록 값이 커지고 밤이 될수록 0에 가까워지는 단순한 시계열 패턴이라서 손쉽게 패턴이 뽑힌 걸까 생각도 드는데.. 

좀더 고민해 봐야 할것같습니다

728x90
728x90

요 근래 업로드를 못했습니다

 

개인적인 집안 사정 때문에 공부 진도를 제대로 나가지 못했습니다

 

음..;; 사실 아버지가 좀 편찮아지셔서 병원에 입원을 하셨습니다 

 

최대한 집중해서 해볼려고 노력은 하는데

 

업로드를 할만큼 양질의 공부 내용은 없었어요.. 

 

곧 있으면 검사 결과 나오시는데.. 걱정이 많이 되네요

 

그래도 오늘 꾸역꾸역 태양열 에너지 예측 프로젝트 진도를 조금 나갔어요

 

feature engineering과 data split 코드를 진행 중인데 군데군데 알 수 없는 에러가 떠서

 

아직 완성은 못했습니다

728x90
728x90

오늘은 전에 예고했던 EDA 중 시간 별 시각화 진행과 feature engineering 중 Trend, seasonal 분리까지 진도를 나갔습니다. 

 

지금 하고 있는 프로젝트가 실제로 대회 진행 중이라서 자세한 내용을 말하면 안될것 같아서 좀 답답한데

EDA결과 좀 의외의 사실을 알게 되었어요 

태양열이 가장 쎈 여름에 에너지 수급이 가장 높을 줄 알았는데 그거 아니였더라구요 

구글링을 통해 예상되는 원인을 발견했는데 꽤나 EDA 결과와 일맥상통한 걸 확인했어요 물론 다른 원인이 있을수도 있고 혹은 EDA를 잘못했을 수도 있습니다 

 

그리고 바로 데이터 전처리 중 FE를 진행 중에 있습니다. 시계열 분해를 해서 결측치를 채웠는데..

이게 문제가 새벽대의 값은 0 인데 시계열 분해 특성상 결측값으로 비어 버렸어요 

이 부분을 생각치 못해서 고민좀 했어요 

새벽 시간대에는 아무 것도 없어야 할 것같은데 ffill, bfill로 채우면 정보 왜곡이 되지 않을까 하는 ..

그래서 심플하게 다 해보려고 합니다 시계열분해 적용 전/후 모델 성능을 비교하기로 결정하고 진행 중에 있습니다. 

아직까지는 아주 큰~~ 어려움은 없이 진행 중입니다

728x90
728x90

저번 포스팅 체인 룰에 이어서 이번 시간부터는 Linear Regression을 시작으로 포스팅하겠습니다.

 

 

1. Linear Regression?

데이터 공부하면서 참 자주 들었으면서도 잘 몰랐던 부분이지 않을까 합니다.

오늘은 딥러닝에서 Linear가 어떤 역할을 맡고 있는지 알아 보도록 하겠습니다.

 

딥러닝의 한 노드는 가중치*입력+bias를 계산한 뒤 활성화 함수로 넘겨줍니다. 

이때 가중치*입력+bias가 바로 linear 인것이죠

logistic Regression

linear에서 활성함수를 적용것이 위와 같으며 이를 logistic Regression.

활성함수를 제거한 것이 Linear 입니다.

Linear Regression

 

2. Regression?

Regression을 간략하게 정의하면 독립변수와 종속변수간의 관계를 파악하여 미래를 예측하는 방법입니다.

우리가 머신러닝 작업을 할때 최대한 많은 변수들을 수집한 후에 영향을 주는 X들을 가려내기 위한 전처리 작업을 합니다. 즉 Regression은 dominant한 변수들을 가지고 예측을 하게 됩니다.

 

수학성적 = f(수면시간,공부시간,통학시간) 이라는 식이 있을때, 저 3개의 변수가 수학성적에게 중요한 변수라고 가정합니다. 하지만 저 3개 이외에도 수학성적에 미미하지만 영향을 주는 변수는 수도 없이 많습니다. 

이 모~든걸 다 수집하여 적용한다는 건 거의 불가능에 가깝습니다. 연산량도 많아질 뿐더러 데이터를 수집하기도 힘들죠

위에 3개 변수로 예측기를 만들어도 나머지 자잘한 영향을 주는 변수가 포함했을때와 성능이 비슷할겁니다. 

3개의 변수가 수학성적에 얼만큼 영향을 주는지에 대한 값을 알아내야 합니다.

이 값을 weight라고 합니다.

다시 Linear Regression의 식을 보겠습니다.

Linear Regression

식을 간단하게 해석하면 n개 변수의 W(가중치)를 찾아내는 것입니다.

번외로 머신러닝 VS 딥러닝의 차이점은 뭘까요?

머신러닝은 dominant한 변수로 모델을 만듭니다. 이건 익숙합니다.  딥러닝은 쓸데없는, 영양가가 없는 X변수들도 다

집어 넣어서 학습을 시킨다는 것입니다. 예를들어 28*28의 강아지 이미지가 있다고 생각해 봅니다.

강아지 이외의 배경은 사실 쓸모없는 input입니다. 강아지를 인식하는데 전혀 영향을 주지 못합니다.

딥러닝은 이러한 쓸모없는 input까지 모두 고려하는 점이 머신러닝과 큰 차이점이라 할수 있습니다.

 

linear를 아래처럼 벡터로 표현이 가능합니다.

3.Loss and Cost Function 

개인적으로 Loss와 cost가 굉장히 헷갈렸는데 이 둘의 차이점을 보겠습니다.

Loss는 실측치와 예측치를 하나씩 뺀 값의 제곱을 취한 값입니다. 

Cost는 모든 Loss값을 더한 값후 datapoint값 만큼 나눈 평균값입니다. 

평균을 냄으로써 각 loss값의 중간값을 표현합니다.

y ̂ = θx 일때, 대입 후 식을 전개해 보겠습니다.

y와 x는 정해진 값이기 때문에 constant로 볼수 있습니다. 여기서 변할수 있는 값은 θ뿐입니다. 

최적의 θ값을 찾기 위해서는 gradient dscent를 해야하는데, 먼저 위 식이 어떤 그래프를 나타낼수 있는지 보겠습니다

θ가 2차이므로 밥그릇 모양의 그래프가 나오게되며 이는 마찬가지로 Loss값도 동일하게 밥그릇 그래프가 나옵니다. 

이둘의 차이점은 평균을 하느냐 마느냐의 차이이기 때문입니다.

 

만일 bias까지 포함되면 어떻게 변할지 보겠습니다.

왼쪽(loss), 오른쪽(Cost)

y ̂ = θ1x + θ0을 Loss 및 Cost로 대입했을때의 전개식입니다. 

대입하고 벡터로 표현했습니다. 각 식을 전개를 하게되면 양쪽 모두 θ1**2, θ0**2 값을 얻게 됩니다.

Loss에 대한 θ1,θ0 그래프는 아래와 같습니다. 

사실 위 그림은 y= X**2 + Y**2 그래프 입니다. 이해를 돕기위해서 사용되었습니다.

그러면 y = X**2+Y**2 +x1x2는 어떤 그래프 일까요

한 축을 기준으로 누운 그래프를 볼수 있습니다. X1X2의 계수에 따라 어떻게 변하는지 보겠습니다.

 

계수가 높을수록 그래프가 점점 평평해 집니다. 최적점을 구할려면 U 모양의 그래프가 필요한데 위 그래프는 U와는

거리가 멀어 보입니다. 뭔가 잘못되었음을 직감할수 있습니다. X의 값이 커지게되면 계수값이 증가해서 위 그래프처럼 

되는 것입니다. 

만일 X1이 연봉이라면 단위가 상당히 커지게 되고 그래프가 어떻게 변할지는 굳이 시각화 안해봐도 예측 할수 있게됩니다. 적절한 스케일링이 필요한 이유를 여기서 알수가 있게 되는 것이죠

 

 

3.Gradient descent

argminy를 찾아가는 과정을 gradient descent 라고한다. 어떻게 최저점으로 이동하는 것일까를 생각해 보자.

초록색처럼 x로 미분했을때 음수가 나오면 x값을 증가 하여 오른쪽으로 이동해야 한다. 얼만큼 이동해야 할까?

x-dy/dx 만큼 이동한다. 이동 한 수치가 빨간색 수치이다. 최종적으로 dy/dx=0이 가장 이상적인 수치이기 때문에 x값을 감소 시킨다. 얼만큼? x-dy/dx 만큼 이동한다. 이렇게 왔다갔다 하는 과정에서 오히려 발산하는 경우가 있다. 

x=1일때 민분값이 -2.5이니까 이를 x와 더하면 3.5가 나오고 3.5위치의 미분값을 구하면 5가 나오고 이를 더하면 x가 그 전보다 더 커지는 현상이 발생되면서 위 그림처럼 나오게 된다. 따라서 미분값을 그대로 쓰면 안된다. 어느정도 패널티를 줌으로써 야금야금 기어 갈수 있도록 해야 하는데 이때 등장하는 것이 learning late이다. 위 사진 알파에 해당된다.

 

이상적인 gradient descent

y와 y^이 일치 할때가 최소가 된다. 위 이미지처럼 x=2가 되면 y=0이 되고 미분값도 0이 되는 지점으로 가야한다.

x를 쎄타라고 했을때 아래 그림을 보면

 

하나의 loss에 대한 gradient descent(왼쪽), 전체 loss 평균에 대한 gradient descent(오른쪽)

현재의 세타 = 이전의 세타 - 움직여야 하는 거리 로 구성되어있다. loss와의 미분값이 0이 되는 지점으로 움직이는 것이다. 그래서 가장 최소가 되는 세타 지점을 찾는 것이다. (모든 세타는 0으로 수렴 하기가 거의 불가능)

gradient descent를 사용하는 이유는 최적의 세타를 구하기 위함이다. 이 세타값을 구하기 위해서 각각 Loss, Cost  최적화 함수를 사용한다. 이 두개의 함수를 이용해서 세타를 찾는다.

 

상단을 보면 x,y 값이 있고 그에 따라 그래프가 좁게 변화한다. 

Loss 함수에서 x가 1일때, (y-세타*1)**2 -> 쎄타**2 의 값이 나오고

x=2 일때, (y-세타*2)**2 -> 4세타**2 값이 나와서 x의 증가에 따라 값이 커지므로 그래프가 

좁게 변화한다. 따라서 각 loss에 따라 learning late를 조절해줘야 하는 문제점이 있다.

(완만한 정도가 각각 다르니까 학습률도 달라야 한다)

728x90
728x90

오늘은 태양광 프로젝트를 진행했습니다.

데이터 전처리 예시 중 선형보건법이 있었습니다. 처음 본 방법이라서 신기했어요

이게 없었더라면 결측치를 삭제하거나 아마 ffill / bfill로 채웠을텐데 말이죠 

결측치가 연쇄적으로 따닥 따닥 붙어 있다면 fillna 보다는 선형보건법이 유용할것같네요 

아무튼 오늘 진도 나간 부분은 일기예보 시간 정하기 와 데이터 concat 정도입니다. 

 

주어진 데이터 중에서 일기예보가 있었어요 11시,14시,17시,20시 이렇게 하루에 4번씩 일기예보를 한다고 합니다.

데이콘 예시를 보니까 임의로 11시 일기예보를 사용했더라구요

저는 각 예보의 오차를 알아내서 시간을 정하고 싶었어요 

 

그래서 실제 관측치 데이터를 가지고 직접 MSE 방법으로 오차를 구했습니다. (온도로 비교했습니다)

20시가 가장 오차가 적었는데 사실 4개 모두 대동소이 했어요 

 

시행착오

비교할때 시각화를 그렸는데 온도가 한줄로 쭉 그어져 있더라구요 

띠용했죠 이게 문제가 싶어서 고치고 또 고치고 삽질 좀 하다가

설마해서 Xlim을 제거하니까 제대로 나오더라구요 Xlim에 날짜를 적어 놨는데

데이터에는 index가 그냥 숫자로 되어 있는데 이게 불일치 해서 그런가 싶어요 

 

내일모레는 EDA 목록을 만들고 마무리했습니다 이 전에 택시 프로젝트를 했었던 터라 한결 수월하게 진행 할수 있을것같은 예감이 듭니다 :) 

얼른 EDA끝내고 다음단계로 들어가고 싶네용  

내일은 딥러닝 수학을 진행할 예정입니다 

내일 수업 내용 포스팅을 가지고 다시 돌아오겠습니다

728x90
728x90

Chain  Rule

위 두 함수가 있을때 이를 결합한 Z함수가 아래처럼 있습니다. 

이때, Z함수를 s로 미분한 값을 알아 낼수 있을까요? S는 X,Y에 포함된 element입니다. 

그리고 X,Y는 Z함수안에 포함되어 있습니다. 흐름을 보면 Z함수-X,Y함수-s,t elements 이렇게 관계가 맺어져 있습니다.

이게 무슨 뜻일까요? 이 관계를 한번 들여다 보겠습니다. 

 

Z라는 함수가 바닷물이고 그 바닷물 안에는 X,Y함수라는 물고기가 있고 s,t는 물고기가 잡아 먹은 먹이 같은 구조입니다.

음.. 딥러닝이 가능한 이유는 Back propagation이 있기 때문입니다. 다시말해서 오차를 쪼개서 파라미터를 업데이트해줄때 사용되는게 이 체인 룰입니다.

 

이 바닷물의 수질을 아주 깨끗하게 만들고 싶습니다. 오염도가 2정도 나오면 좋겠는데, 결과는 10이 나와서 

오차가 8이라는 결과를 얻었습니다. 이 8을 쪼갭니다. 각 파라미터들에게 나눠줘서 오차를 줄이는 방향으로 만듭니다.

초록색은 X,Y -> Z로 올라가는 과정(forward propagation)

빨간색은 Z -> X,Y로 내려가는 과정(Back propagation)

 

이때 S라는 먹이감의 변화에 따라서 바닷물의 수질에 얼만큼 영향을 주는지 궁금할수 있습니다. 

S 먹이감이 만일 독극물이라면 그걸먹은 물고기가 바닷물 수질에 악영향을 줄수도 있을것입니다.

반대로 정상적인 먹이라면 깨끗한 수질을 만드는데 최소한 악영향은 주지 않을 것입니다.

 

그래서 우리는 S라는 먹이감 변화에 따른 바닷물 수질 변화량을 알아야 합니다. 이를 구하기 위해서 체인룰이 사용됩니다. 빨간색 미분값을 보면 그 정답을 알수 있습니다. 

파란색 미분값은 파란색 화살표가 그려진 미분값입니다. 보라색은 보라색 화살표 미분값입니다.

forward propagation 할때 이미 미분값을 구해 놨으므로 back propagation할때는 저장해놓은 미분값을 곱하기만 하면 됩니다. 그래서 연산이 빨라지고 딥러닝이 가능해 지는것입니다. 

위 식은 S 먹이감 변화에 따른 수질의 영향을 알기 위한값입니다. 따라서 X 물고기가 먹은 S먹이감 + Y물고기가 먹은 S먹이감 이 둘을 더해서 구할 수 있었습니다.

 

Vector Chain Rule은 위 예시의 스칼라값 대신 벡터 or 매트릭스가 들어가는 형태입니다. 예시를 들자면

위 처럼 각 함수 값이 스칼라가 아닌 백터 형식으로 되어있고 마지막 Z함수는 X+Y를 한 후 1/n으로 나눈 평균값 스칼라가 되겠습니다. 먼저 forward propagation이 실행되므로 각 element로 미분한 값은 아래와 같습니다.

 

 

 

그리고 스칼라 체인룰와 같은 방법으로 back Propagation을 해주면 됩니다.

 

 

위 예시로 계산하면 마지막 결과 shape는 1*n 벡터입니다. 계산을 꼭 해봐야 shape를 알수 있는 것은 아닙니다.

m개의 f함수와 n개의 element가 있을때의 자코비안 shape은 m*n입니다. 이것을 이용하면  

계산하기 전에 shape를 추정해 볼수 있게 됩니다. 결국 최종적으로 가장 아래에 있는 i(먹이) element와 바닷가 수질을 나타내는 f함수의 미분을 구했을때의 shape를 추정해 볼수 있게 됩니다. 

좀 더 구체적으로 보면

위 식을 보면 chain처럼 연결고리가 있다는 걸 직관적으로 알수가 있습니다. 

따라서, 딥러닝의 back propagation은 위 식의 순서대로 오차를 뿌려준다고 생각하면 될것같습니다.

 

 

 

 

728x90

+ Recent posts