728x90

오늘은 R보다는 태양열 프로젝트를 주로 작업했습니다. 곧 있으면 마감인데 원하는 만큼 결과물이 좋지 않아서 조바심이 나네요. 먼저 R 요약 내용입니다.

R(나이브베이즈)

나이브베이즈 알기 전 조건부 확률 개념 먼저 보겠습니다.

축구 경기할 때의 승리/패배할 경우는 위와 같습니다. 이 중 승리를 하는데, 선제골의 여부에 따라 승리할 확률을 구할 수 있습니다. 종종 축구 경기 보면 캐스터가 말하길 "우리가 선제골을 넣으면 주로 승리를 하는데요 ~ " 혹은 '홈에서 경기를 하면 승리를 하는데요~' 이 모든 게 조건부 확률입니다. 식으로 나타내면 1번부터 3번까지 차례로 나타낼 수 있습니다.

베이즈 정리

2 번식을 1번에 대입하면 3번이 됩니다. 중요하게 볼 식은 3번입니다. 3번에 대해 자세히 살펴보겠습니다.

P(Y)가 조건이므로 P(x)는 당연히 아직 실행되지 않았습니다. 즉, 발생하기 전 확률이라 하여 사전 확률입니다. 이때 P(Y)은 

P(Y)는 상수이라고 하는데요 제 나름대로 예를 들자면..

 

동전 앞과 뒤, 둘 중 뭐가 나올지 모르기 때문에 둘 다 확률변수지만 앞이라는 조건이 결정이 되면 이는 확률변수가 아닌 상수로써 조건이 주어진 것이다. 즉 주어진 조건은 확률변수가 아닌 고정된 상수로 본다는 뜻이다.
P(X|Y) =  P(X) * P(Y|X) / P(Y) 에서 P(Y)는 고정된 값이므로 P(X|Y) 는 P(X) * P(Y|X) 값에 비례한다(이게 핵심)

 

*헷갈리지 않게 다시 정리
P(X|Y)의 조건 P(Y)는 상수이고, 그냥 단독적인 P(Y)는 확률변수이다.

 

조건으로 주어졌다는 것은 조건은 실행이 된다는 전제가 깔립니다. 시행이 되었으므로 어느 값을 가진 상수라는 것입니다. 상수는 한번 결정되면 변하지 않습니다. 따라서 분자인 P(X) * P(Y|X)에 따라서 비례를 한다 라는 것입니다.

 

R의 caret 패키지를 통해 구현하는 방법을 보겠습니다.

#데이터 불러오기
library(caret)
rawdata <- read.csv(file='heart.csv', header = TRUE)
str(rawdata)

#타켓 클래스 범주화
rawdata$target <- as.factor(rawdata$target)
unique(rawdata$target)

#연속형 독립변수의 표준화
rawdata$age <- scale(rawdata$age)
rawdata$trestbps <- scale(rawdata$trestbps)
rawdata$chol <- scale(rawdata$chol)
rawdata$thalach <- scale(rawdata$thalach)
rawdata$oldpeak <- scale(rawdata$oldpeak)
rawdata$slope <- scale(rawdata$slope)

#범주형 독립변수 
newdata <- rawdata
factorVar <- c('sex','cp','fbs','restecg','exang','ca','thal')
newdata[,factorVar] = lapply(newdata[,factorVar],factor)

#데이터 분리
set.seed(2020)
datatotal <-  sort(sample(nrow(newdata),size=nrow(newdata)*0.7))
train <- newdata[datatotal,]
test <-  newdata[-datatoal,]

train_x <- train[,1:12]
train_y <- train[,13]

test_x <- test[,1:12]
test_y <- test[,13]

#모델설정
ctrl <- trainControl(method='repeatedcv',repeats = 5)
nbFit <- train(target~.,
                  data=train,
                  method="naive_bayes",
                  trControl=ctrl,
                  #preProcess=c('center','scale'),
                  metric="Accuracy")
plot(nbFit)

#예측
pred_test <- predict(nbFit,newdata=test)
confusionMatrix(pred_test, test$target)

약 82%의 성능을 보였습니다. 스케일링을 하면 성능이 떨어져서 주석처리했습니다.

 

태양열 예측

첫 번째 시도:랜덤 포레스트 log 상태에서 스케일링에 따른 변화
-> 변화 없음

두 번째 시도: log 아닌 상태에서 스케일링에 따른 변화
->year 변수 삭제 후 MinMax or Robust 사용 시 가장 좋은 성능을 보임

세 번째 시도: 변수의 차분 변화에 따른 성능 측정(온도, 습도 등 차분을 통해 증감을 표현하여 패턴을 설명하고자, Cloud의 lag을 통해 1시간 전 Cloud가 끼치는 영향을 보고자)
->변수 2개 이상 동시 사용 시 성능 저하 발생, 가장 좋은 조합은.. 

랜덤포레스트'

'CV Score : '

7.801435294117648

'lgb'

'CV Score : '

8.27872655535256

 

많은 조합을 실험해 본 결과 위와 같은 조합이 7.801로 가장 나은 성능을 보였습니다. 하지만 눈에 띄는 결과물은 아녔기에 변수의 한계를 뚫고자 네 번째 시도를 진행 중입니다.

 

네번째 시도: extracted_features 활용
-> 모든 변수 사용 시 성능 저하 발생하여 VIF 및 RFECV 실행 중

extracted_features 함수를 통해 변수를 생선 한 결과 1600개 변수가 생성되었습니다. 하지만 결측 값으로 채워진 변수들이 대부분이었으며, 0과 1로 만 이루어진 변수들도 있었기에 이 두 가지 경우를 전처리하여 

121개 변수를 모두 사용하여 랜덤 포레스트의 중요도를 살펴봤습니다. 

랜덤포레스트' 'CV Score : ' 21.665118055555556 

중요도의 퍼센트를 보니까 아주 상~당히 낮았습니다. 아무래도 한정된 변수를 121개로 쪼개 놓으니까 설명력이 분산이 된 게 아닌가 싶습니다. 변수 선택을 하기 위해서  VIF, RFECV를 돌리고 있습니다. 결과는 내일 포스팅하겠습니다. 

728x90
728x90

KNN

k가 3이라면 내 주변에 있는 A라는 집단의 포인트가 2개, B집단의 포인트가 1개가 있다면, A집단이 많으므로 해당 포인트는 A집단으로 분류가 됩니다. 만일 k가 10개 인데 B집단 포인트가 A보다 더 많다면 해당포인트는 B집단으로 분류가 됩니다. 이 내용을 R에서 어떻게 구현할지 실습을 했습니다. 실습 때 사용한 패키지는 caret입니다.

#dependencies = TRUE? : 다른 패키지와 연결이 되도록 하는 명령어(의존성이 있다) 
install.packages('caret', dependencies = TRUE)

##데이터 불러오기
library(caret)
rawdata <- read.csv(file='wine.csv', header=TRUE)
rawdata$Class <- as.factor(rawdata$Class) #Class를 숫자로 인식하지 않도록 factor를 이용
str(rawdata)
View(rawdata)

##데이터분할
analdata <- rawdata
set.seed(2020) #분할시 같은 랜덤이 나오게끔 설정
#sample(x,y): x중에 y만큼 뽑겠다
datatoal <- sort(sample(nrow(analdata),nrow(analdata)*0.7))
train <- rawdata[datatoal,]
test <- rawdata[-datatoal,] #-붙여서 0.7에 뽑힌게 아닌! 데이터를 가져온다

train_x <- train[,1:13]
train_y <- train[,14]

test_x <- test[,1:13]
test_y <- test[,14]

#모형학습
ctrl <- trainControl(method='repeatedcv', number=10,repeats = 5) #number: K-fold의 K(데이터를 10개로 나눈다, 반복횟수 5회
customGrid <- expand.grid(k=1:10) #knn은 1~10까지 보겠다(최 근전 1개 부터 10개까지)
knnFit <- train(Class~., #.은 모든 피쳐를 사용
          data=train,
          method='knn',
          trControl=ctrl, #traincontrol
          preProcess=c("center","scale"), #전처리는 표준화로 실행
          tuneGrid=customGrid,
          metric="Accuracy")
knnFit #출력물의 k은 Knn의 K이다

가장 높은 정확도를 보인 k=5라는 결과가 나왔습니다. 이 모델을 가지고 예측을 진행합니다

#예측하기
pred_test <- predict(knnFit, newdata=test)
confusionMatrix(pred_test, test$Class)

Confusion 매트릭스를 보면 틀린 포인트가 총 3개로 정확도 94%로 계산되었습니다. 

 

 

Logitstic

선혀회귀 방식을 분류에 적용한 알고리즘입니다. 간략하게 적어보자면, 선형은 구불거리지 않고 쭉 펼처진 직선 모양을 가집니다. 로지스틱은 직선의 형태가 아니라 시그모이드 형태를 적용합니다. 선형회귀는 만일 집값을 예측할때, A 집값 1억6천만원 과 같은 구체적인 값이 나옵니다. 반면 시그모이드를 취하면 확률이 나옵니다. 보통 0.5 기준으로 0과1로 치환하여 분류를 하게 되기 때문에 분류모형으로 사용될수 있습니다.

#데이터 불러오기
library(caret)
rawdata <- read.csv(file='heart.csv', header = TRUE)
str(rawdata)

#타켓 클래스 범주화
rawdata$target <- as.factor(rawdata$target)
unique(rawdata$target)

#연속형 독립변수의 표준화
rawdata$age <- scale(rawdata$age)
rawdata$trestbps <- scale(rawdata$trestbps)
rawdata$chol <- scale(rawdata$chol)
rawdata$thalach <- scale(rawdata$thalach)
rawdata$oldpeak <- scale(rawdata$oldpeak)
rawdata$slope <- scale(rawdata$slope)

#범주형 독립변수 as.factor : 명복변수를 factor로 만든다
newdata <- rawdata
factorVar <- c('sex','cp','fbs','restecg','exang','ca','thal')
newdata[,factorVar] = lapply(newdata[,factorVar],factor)

#데이터 분리
set.seed(2020)
datatotal <-  sort(sample(nrow(newdata),size=nrow(newdata)*0.7))
train <- newdata[datatotal,]
test <-  newdata[-datatoal,]

train_x <- train[,1:12]
train_y <- train[,13]

test_x <- test[,1:12]
test_y <- test[,13]

#모델설정
ctrl <- trainControl(method='repeatedcv',repeats = 5)
logitFit <- train(target~.,
                  data=train,
                  method="LogitBoost",
                  trControl=ctrl,
                  metric="Accuracy")
logitFit #21번 반복 학습 할때 가장 좋다. 즉 21번

#예측
pred_test <- predict(logitFit,newdata=test)

모델 결과
예측 결과

728x90
728x90

R

이번 part는 R을 직접 다루는 것이 아니라 머신러닝에 대한 전체적인 개요를 훑은 part였습니다.

이는 다른 강의에서 몇번 중첩된 내용이 대부분이였기 때문에 복습의 개념으로 쭉 봤습니다.

덕분에 잊고 있었던 부분과 평소 알고 싶었던 것들을 간략하게 정리 할수 있었던 시간이였습니다.

특히 likelihood는 작년 처음 수학공부했을때, 한창 혼란스러웠던 시기라서 개념조차 어렵다고만 생각했는데 지금 들으니까 한결 이해하기가 편했습니다. 솔~직히 깊은 내용의 강의가 아니라 머신러닝의 개요 수준이라서 제가 아는 범위였기 때문에 집중력이 많이 떨어지긴 했습니다;;  그래도 꾸역꾸역 들으면서 수강완료를 했습니다 

필기부분은 제가 까먹고 있었거나 하는 내용을 위주로 적었습니다. 저만 볼 생각에 대충 적었는데 보기 불편 하시다면 양해 부탁드립니다 ><

*확률변수-> 숫자로 맵핑 시켜주는 것.
ex)우리집에서 천왕역을 가는 방법
사거리->네네치킨->천황역: 1
사거리->초등학교->천황역: 1
사거리->풍성마트->천황역: 1 
세가지 경우가 있을때 각 경우를 숫자로 맵핑 시켜주는 것을 
이산 확률 변수

확률분포->확률변수값을 확률로 대응시키는 함수를 확률 분포라고 한다.
사거리->네네치킨->천황역: 1, 1/3
사거리->초등학교->천황역: 1, 1/3
사거리->풍성마트->천황역: 1, 1/3 

*MLE : 모수를 추정하는 방법 중 하나이다.
likelihood를 최대화 하는 모수를 추정한다.
likelihood? 이미 주어진 표본적 증거를 토대로 모집단에 관해 통계적 추정이
그럴듯한 정도. 
ex) 뽑은 데이터를 토대로 뮤=5로 놓으면 그럴듯 하겠다


회귀분석part
SST= SSE+SSR
SSR이 많아야 제대로된 회귀식이다. 이를 이용하여 결정계수로 나타낼수있다
R^2 = 1-SSE/SST = SSR/SST

결정계수는 유의하지 않는 변수가 추가 되어도 값이 올라가는 문제점이 있다. 
이를 해결하기 위해서 수정 결정계수가 나타남

다중선형회귀 계수 해석시
다른 독립변수가 고정되었을때의 변화량이다. 
예를들어 y =10+10x1+20x2 에서 x1은 광고비, x2 판매원 수이다. 
이때 광고비의 10은 판매원 수의 값이 고정 되었을때의 10이 나온다는 의미

스케일이 작은 데이터의 오차를 상대적으로 추정하기 위해서 MAPE를 사용

 

태양열 예측

저번 시간에 문제였던 예측값과 True 값의 벌이짐을 해결했습니다. 여러가지 실험하다가 스케일러를 Robust로 바꾸니까 겹쳐졌습니다. 하지만 여전히 자기상관, 등분산성,정규성을 만족을 못하고 있기 때문에 정상성을 못만들고 있습니다.

 

 

 

 

 

 

 

 

 

728x90
728x90

R

가설검정 이론 바탕으로한 실습을 진행했습니다. 이번 강의를 통해 다소 헷갈렸던 가설검정을 정리 할수 있었던 좋은 시간이였습니다. 강의 들으면서 필기 했던 부분을 짧게나마 정리하여 간단하게 적어 보겠습니다.

 

* 대립가설은 보통 양측검정 보다는 단측검정을 사용한다(가설 설정하기 전에 데이터를 대략 파악하여 관계를 설정한다)

* 분할표는 주로 연관성을 볼때 사용한다(예를들어 흡연과 폐암의 연관성) -> 카이제곱 검정

* 대응표본 t검정은 A,B 집단에 속한 대상자가 같다 (예를들어 성형하기 전/후 처럼 대상자는 같고 전/후로 나뉜 경우를 말한다)

* 모집단에 대해서 주의할점: 모집단은 관심이 있는 전체 집단이다. 경기도 20대 남성 평균키일 경우, 모집단은 경기도에 살고 있는 모든 20대 남성들의 키 모음이다.

* t검정은 30개 미만일때 사용하는 것이므로 t검정하기전에 정규성 검정을 하고 등분산 검정을 거친 후 t검정을 적용한다

이때, 정규성 데이터가 아니라면 t검정 대신 비모수 검정을 실시 할수 있다.

* t분포는 정규분포보다 꼬리가 더 두껍다. 그리고 t분포의 n이 커질수록 정규분포에 수렴한다.

*p-value란 귀무가설이 참이라고 했을때, 표본데이터가 수집될 확률을 말한다. 즉, p-value가 낮으면 표본 데이터가 수집될 확률도 낮다. 낮을수록 극단치로 향해 간다. 

*anova는 세 집단 이상일때 사용한다. 아노바의 오차는 집단 간 오차 +집단 내 오차 로 구성된다. 

 

집단 내 오차는 왜 구하는걸까?

만일 집단 간 오차 > 집단 내 오차 일 경우에는 집단간의 차이가 크다는 얘기이므로 집단 간 평균 차이가 있다는 걸 알수가 있다. 

 

아래는 가설검정 실습 내용입니다.

rawN3 <- read.csv(file = 'htest01.csv', header = TRUE)
library(dplyr)

groupA <- rawN3[rawN3$group=='A',1:2] 
groupB <- rawN3[rawN3$group=='B',1:2]
mean(groupA[,2])
mean(groupB$height)
#step1: 가설검정 설정
#귀무: 두 집단간의 차이가 없다
#대립: B그룹이 A그룹보다 크다

#step2: 데이터 정규성 검정
#첫번째 방법: 샤피로 검정
shapiro.test(groupA[,2]) #0.05보다 크므로 귀무가설
shapiro.test(groupB[,2])
#qq plot
qqnorm(groupA[,2])
qqline(groupA[,2])

qqnorm(groupB[,2])
qqline(groupB[,2])
#정규성의 직선에 점이 가까울수록 정규성을 따른다

#step3: 분산동질성 검정
#귀무: 두 집단 간 분산은 동일하다
#대립: 분산이 서로 다르다
var.test(groupA[,2],groupB[,2]) #0.05보다 크므로 귀무

#step4: T-test(합동분산 사용)
#alternative: 대립가설 뜻함
#less: A<B(왼쪽집단<오른쪽집단)
t.test(groupA[,2],groupB[,2], alternative = 'less', var.equal = TRUE)

#step5: 0.05보다 크므로 그룹 간 평균키 차이가 없다

#==============================================
#각 집단 샘플 사이즈 = 10(소표본)
rawN10 <-  read.csv(file = 'htest02.csv',header = TRUE)
groupA <- rawN10[rawN10$group=='A',1:2]
groupB <- rawN10[rawN10$group=='B',1:2]
mean(groupA[,2]) #170
mean(groupB[,2]) #181

#step1: 가설설정
#귀무: 평균 키 차이가 없다
#대립: B가 A보다 크다

#step2: 정규성 검정
shapiro.test(groupA[,2]) #정규성따름
shapiro.test(groupB[,2]) #정규성따름

qqnorm(groupA[,2])
qqline(groupA[,2])
qqnorm(groupB[,2])
qqline(groupB[,2])

#step3: 분산 동질성 검정
var.test(groupA[,2],groupB[,2])
#0.02 이므로 대립가설 채택(분산이 다르다)

#step4: T-test 검정
t.test(groupA[,2],groupB[,2], alternative = 'less', var.equal = FALSE)

#step5: 0.019이므로 대립가설 채택(B가A보다 평균키 크다)

#==============================================
#대응표본 t검정(마케팅에 따른 판매액 차이)
raw_d <-  read.csv(file = 'htest02d.csv',header = TRUE)
raw_d
groupAd <- raw_d[,1]
groupBd <- raw_d[,2]
mean(groupAd)
mean(groupBd)

#step1: 가설검정
#귀무: 마케팅을 통한 판매액 변화 없음
#대립: 마케팅을 통한 팬매액이 증가함  전<후

#step2: 데이터 정규성 검정
d= groupAd-groupBd #차이를 가지고 연산
shapiro.test(d) #귀무가설
qqnorm(d)
qqline(d)

#분산동질성 검정이 없는이유
#-> d라는 집단 하나만 있기 때문에

#step3: T-test
t.test(groupAd,groupBd,alternative = 'less',paired=TRUE)

#step4: 0.05보다 작으므로 마케팅을 통해 판매액 증가했다 

#===========================================
#Z검정(데이터 갯수가 30개 이상): 대표본
rawN30 <-  read.csv(file = 'htest03.csv',header = TRUE)
groupA <- rawN30[rawN30$group=='A',1:2]
groupB <- rawN30[rawN30$group=='B',1:2]
mean(groupA[,2])
mean(groupB[,2])

#step1:가설검정
#귀무: 그룹간의 평균 키 차이가 없다
#대립: 그룹B의 평균키가 A 그룹보다 크다

#step2~3: Z-test, 결론
z.test(groupA[,2],groupB[,2]) #대립가설 채택

#=============================================
#여러지단 비교 검정(집단내오차, 집단간오차 필요)
rawN30 <-  read.csv(file = 'htest04.csv',header = TRUE)
groupA <- rawN30[rawN30$group=='A',1:2]
groupB <- rawN30[rawN30$group=='B',1:2]
groupC <- rawN30[rawN30$group=='C',1:2]

#step1: 가설검정
#귀무:세 집단간 평균 차이가 없다
#대립: 세 집단간 평균 차이가 있다(집단이 세개 이상이므로 단측검정할 사용한 방향 설정이 어렵다 따라서 양측검정을 사용)

#step2: 정규성 검정
shapiro.test(groupA[,2]) #귀무
shapiro.test(groupB[,2]) #귀무
shapiro.test(groupC[,2]) #귀무

#step3:분산 동질성 검정
#아노바의 분산 검정은 levene, bartlett test 사용
install.packages('lawstat')
library(lawstat)

levene.test(rawN30$height, rawN30$group)
#세 집단간 분산이 동일하다

bartlett.test(height~group, data=rawN30)

#step3: anova test
rawAnova <- aov(height~group, data=rawN30)
summary(rawAnova)
#p_value가 0.05보다 작으므로 대립가설 채택
#즉, 세 집단간 평균이 다르다
#658.4:그룹 간 오차
#36.2: 그룹 내 오차

#=============================================
#분할표를 이용한 연관성 분석(카이제곱검정)
raw_chisq<-  read.csv(file = 'htest05.csv',header = TRUE)
rawTable <- table(raw_chisq)
rawTable

#step1:가설 설정
#귀무: 흡연여부와 폐암은 관계가 없다
#대립: 관계가 있다

#step2: 카이제곱 검정
#기대도수 >5 인 경우: correct=FALSE
#기대도수<5 인 경우: correct=TRUE
chisq.test(rawTable, correct = FALSE)
#0.05보다 작으므로 대립채택

 

 

 

 

 

 

 

 

728x90
728x90

R

오늘은 R 전처리를 위한 기본 다지기 강의를 들으면서 실습을 진행했습니다 

part3는 기본기 다지기 과정이라서 실습코드는 따로 올리지 않을려고 합니다.

 

간략하게 학습내용을 적어보자면 산점도,막대그래프,박스플롯,결측치 처리,이상치 정제 그리고 마지막엔 한국복지패널 데이터를 가지고 분석해 보는 실습을 진행했습니다. 

 

학습내용중에 조금 버벅거리고 낯선 함수가 있습니다. 바로 mutate 함수 입니다. 함수를 통해 변수를 생성하는 것과 직접 $로 변수를 생성하는 코드 과정이 조금 헷갈리는 것같아요 

이 함수를 좀더 주의깊게 봐야 할것 같습니다. 내일은 part4 가설검정을 학습 합니다. 

 

태양열예측

모든 변수를 넣었을때의 결과 값과 REV로 선별된 변수로 돌린 결과값이 상당히 차이나게 나왔습니다(파라미터는 같게)

게다가 REV에서 선별된 변수로 했을경우에 val 시각화가 이상했습니다. 

True 값과 pred 값이 서로 겹치지 않고 위 아래로 따로 분리가 되었습니다. 패턴은 따라가는 것같은데 

예측값이 True 값과 전혀 달라서 조금도 겹쳐지지 않았습니다. 그러다 보니 성능도 안좋게 나왔구요

거의 점수가 47이 나왔습니다(데이콘의 베이스 코드 점수는 8점대) 데이콘 점수와 크게 차이가 납니다.

 

시간이 오래 걸려서 train 값을 2020년만 따로 짤라서 하고 있는데도 불구하고 걸리다 보니까 진도가 빨리 안나간다는 점이 안타깝습니다 다음주면 pro 기간 만료라서 더 조급합니다

 

 

 

 

 

728x90
728x90

오늘 새롭게 계획을 세웠습니다. 그 첫걸음은 R! 

작년에 R 강의 들으면서 공부하다가 중간에 중단을 하게 되었습니다. 살짝 늦은 감이 있는 것같지만

처음부터 강의 들으면서 공부하려고 합니다. 

 

가장 베스트는 이번달 안에 태양열에너지 프로젝트 + R 온라인 완강이 목표입니다.

그래서 틈틈히 R공부하면서 태양프로젝트까지 같이 하고 있습니다. 

 

오늘 R 배운 내용은 처음부터 하는 거라 가장 기본적인 것들이였습니다. 그래서 실습으로 업로드 하기엔 아닌것 같아서 

이 기록장에 간단하게 열거로 기록하겠습니다.

 

1. R studio 설치 및 사용법

2. 데이터 분석 기본기 (아래 진도 나간 부분)

 작년에 모두 배웠던 내용이였는지라 이해하기 편했습니다. 

 

아 그리고 6월달 목표한 R + 프로젝트가 계획대로 끝난다면 바로 computer vision 중급 과정을 배우려고 합니다. 

이미지와 관련된 학문이므로 딥러닝이 반드시 나올텐데, 이때 제가 배우고 있었던 딥러닝수학을 함께 병행하면서 

이해력을 높히고자 합니다. 

 

요약하자면

6월 : 태양열 에너지 프로젝트 + R 완강&실습

7월 : computer vision 중급 + 딥러닝 수학

8월 : 태블루,SQL,하둡 or ADSP자격증 시험 준비를 계획중입니다.

 

*태양 프로젝트

오늘은 로그 정규화 하기 전후를 비교 해봤습니다.

log 정규화 시킨 validation plot
log 정규화 안한 validation plot

두 그래프의 눈에 띄는 차이점은 에너지값 0에 대한 예측값입니다. log를 취해주면 0을 0이라 인식하고 

log를 하지 않으면 마이너스값을 출력합니다. 사실 그동안 0값을 마이너스값으로 예측하는 점 때문에 고민을 많이 했었습니다. 그래서 저 두 결과값을 합쳐봤습니다. 

합친 결과값

성능값이 그닥 좋지 않습니다. 두 결과값에 각각 비율을 할당해도 성능은 제자리 걸음이였습니다.

현재 val 값이 가장 좋은 모델은 랜덤입니다. 저는 시계열 모델로 어떻게든 성능을 뽑아 내고 싶은데 쉽지 않습니다.

 

내일은 log정규화 상태에서 성능을 어떻게 하면 더 끌어 올릴지 연구 해봐야 할것같습니다 

728x90
728x90

코랩에서 forecast 패키지가 깔리지 않아서 파이썬에서 옮겨 실행했습니다. 그런데 결과 값이 워낙 엉망이라서 

효용가치가 없었습니다 아마도 제가 잘못 했을 가능성이 다분한 것같은데..;; 

 

현재는 FE의 수정을 통해서 어떻게 성능을 향상시킬까 고민중에 있습니다.

rolling, decompose 등 생각 나는대로 시도 중인데 괄목할만한 내용은 없었습니다 ;

 

SARIMAX을 통해서 정상성을 확보 못하는 데이터 일수도 있어서 이런 저런 시도중 입니다.

728x90
728x90

tsfresh를 통한 특징추출을 시도해 봤습니다. 

처음 들어보는 거라서 적용하는데 시간 좀 걸린 것같아요 특히 column_id가 어떤 역할을 하는지 몰라서 이를 어떻게 정할건지도 몰랐어요 그래서 임의로 year를 넣어 봤는데, year 변수의 수(유니크) 만큼 row가 생기고, 열이 6000개 이상 생기더라구요. 이때 직감을 했습니다. 제 계획은 변수를 뽑아서 원본에 붙이고 변수의 수를 rev or 다중공선성으로 줄일려고 했습니다. 그런데 row의 수가 id 수 만큼 생긴 걸로 보아서는 병합 조차 안되겠더라구요. 

 

그 다음으로 시도 한게 auto_arima 입니다. 해봐야지 했던게 미루고 미뤄서 오늘 하게 되었습니다.

이것도 메모리 부족으로 중간에 끊기긴 했는데 이상한점은 그게 아니라,  분명 pdq 시작 값을 분명히 정했는데, 범위를 벗어난 값을 적용한다는 점입니다. 

start_p =2 이므로 0과 1은 없어야 하는데, 아래 결과를 보면 실행이 된걸 확인할수 있습니다 ;

공식 홈페이지를 살펴봐도 그닥 잘못한게 없어 보이던데 .. ;; 어차피 메모리 때문에 이 방법도 접었습니다.

 

그리고 기존에 train을 predict를 하면 초반 값이 아래 이미지처럼 엄~청 크게 튑니다.

랜덤포레스트는 그러지 않는데,, 그래서 스케일링을 robust로 바꿔서 했더니 튀는 값은 사라졌습니다. 그렇지만 ...

첫번째 그림은 train, 두번째는 2021/01 validation, 그리고 마지막은 1월과 2월달 예측 값입니다. 2월달만 예측하고 싶은데 하..; 이것도 말하자면 또 길어질것같아서 패스하겠습니다 ㅠ  2월달 예측값은 복붙마냥 똑같은 패턴이 보입니다. 원인을 모르겠어요 그리고 0 밑으로 마이너스가 계속 나오는데  이것도 고칠 아이디어가 생각 나질 않네요 

 

그래서 R의 forecast 패키지를 사용해 볼려고 교재를 보면서 적용중인데

저 부분에서 더이상 진도가 나가질 않습니다. 이~것도 원인을 모르겠습니다 ㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎ

728x90

+ Recent posts