작성
·
299
·
수정됨
1
안녕하세요 선생님, 상세한 강의 잘 듣고 있습니다. 감사합니다.
수강 중, 위의 [섹션4. 2유형] 강의 내용 중 문의사항이 있어 질문을 남깁니다.
[동일 내용 문의 링크]
맨 마지막 p3에서 2,482명이 나와야 되는거 아닌가요??? - 인프런 | 질문 & 답변 (inflearn.com)
문의 커뮤니티 내 동일한 질문이 있어 일부 연장선 문의를 드립니다.
(체험) 제2유형 - 체험하기 (goorm.io) - 해당문제
model1, model2 을 평균을 내서 최종 모델 p3을 만들고 이를 적용했을 때
최근 답변 기준으로 2482개에서 1611개를 제외한 871개의 행이 출력되는 부분은 이해하였습니다.
연습 중 제출 형식을 보니, 규정에는 총 2482개의 온전한 데이터 예측 결과를 제출해야 한다고 명시되어 있고
이를 강의 상의 871개짜리 데이터로 최종 제출해도 채점 기준에 부합하는지 궁금합니다.
저는 TEST 파일은 열 생략이나 결측지 보정 들의 수정이 가해지면 안되는 원본 데이터의 상태로
예측 모델을 적용하는 것으로 인지하고 있는데, 해당 부분에 대한 보충 회신을 주시면 감사드리겠습니다.
(채점을 위한 기관측의 추가 별도 데이터를 대입하여 예측결과가 실제로 산출되는지 확인하는 부분이 있다하여, 모든 독립변수 행에 대해서도 대응할 수 있는 모델에 대해서 추가 설명이 있으면 도움이 될 것 같습니다.)
제가 강의 내용 중 못 따라간 부분이 있을 수도 있어, 코드 작성 내 놓친 부분이 있는지 계속 수강내용과 확인해 보겠습니다.
감사합니다.
답변 2
1
안녕하세요.
아래 주신 답글에 계층으로 답글을 달 수 없어서 원래 글에 답글을 답니다.
말씀드린바대로 강의자료에 메모장대로 하면 정상적으로 출력됩니다.
아마 녹화된 부분에는 그 부분이 생략되었거나 누락된 것 같은데요. 메모장대로 실행을 부탁드립니다.
결국, 답안으로 제출해야하는 부분은 예측 확률값이기 때문에, 반드시 문제에서 준 관측치는 유지되어야 합니다. 따라서 결측치의 유무나 다른 어떤 이상점의 유무와 관계없이 그 부분을 처리한 뒤 (주로 결측치에 평균, 0, 중앙값 등을 채워넣습니다.) 예측을 진행합니다. 결측치가 포함된 행도 포함해야 합니다.
다만, 예측을 할 때 특정 칼럼을 제외하는 것은 아무 문제가 되지 않습니다. 또한 특정 칼럼을 만드는 것 역시 문제가 되지 않습니다. 주로 성능을 높이기 위해서 파생변수를 만드는 데요. 저희 강의에서는 시험을 편하게 보기 위해서 오히려 특정 칼럼을 제외하는 방법을 사용합니다. (성능에 큰 차이가 없다고 가정합니다.) 그리고 Test데이터에도 동일한 로직을 적용해야 합니다. 모델에 들어간 칼럼숫자 만큼 반드시 예측을 위한 데이터의 칼럼 숫자가 필요합니다. 만들거나 삭제하거나 무관하게 동일하게 처리해서 동일한 숫자의 칼럼이 모델로 투입되지 않으면 동작하지 않습니다.
한번 읽어보시고 혹시 또 추가 문의사항 생기시면 편하게 문의주세요!
0
안녕하세요.
올려주신 저의 지난번 답변이 계층도 깨지고 시간이 오래되서 명확하게 기억이 나질 않네요.
제가 강의자료로 올린 '출제예상.txt'의 '# 4. 모델구축' 부분에 대한 질문인 것 같습니다.
그 내용을 그대로 복사 붙여넣기 해서 돌리고 아래 스크립트인 최종 제출직전의 p3를 확인해보았습니다.
[최종제출코드]
result <- data.frame(Y_N = p3[,2])
write.csv(result, 'result.csv')
위의 스크립트 직전의 p3값을 확인하면 아래와 같습니다.
> str(p3)
'data.frame': 2482 obs. of 2 variables:
$ 0: num 0.645 0.769 0.796 0.6 0.517 ...
$ 1: num 0.355 0.231 0.204 0.4 0.483 ...
말씀하신대로 최종제출해야되는 관측치의 갯수는 문제와 동일해야 합니다.
예측해서 제출하는 답안지의 관측치의 갯수가 문제보다 늘어서도 줄어서도 안됩니다.
위의 내용을 한 번 확인해보시고 혹시 이상한 부분이 있으면 또 질문 부탁드립니다.
감사합니다.
안녕하세요 선생님, 답변 감사드립니다.
회신주신 내용을 참조하여 강의 내용과 동일하게 필사 코딩을 해보았습니다.
강의자료 파일을 그대로 사용하였으며, 실제 Test 파일에 모델을 적용 시 역시 최종값은
2482개 중 1611개의 결측부분이 제외 된 871행으로 출력이 됩니다.
원인을 계속 생각해 보았는데, Test Data의 결측치는 예측값 산출에서 제외되는 것 같습니다.
환불금액 열을 아예 빼버리고 모델 적용 시 올바른 2482개가 나오지만....
TEST Data는 수정을 가하면 안 되는 데이터로 알고 있습니다.
강의 부분 내 선생님께서 언급하여 주신 아래의 내용중 결과 수량이 상이한 부분에 대하여
추가 분석해보려 하였는데 강의 내에 숫자 산출 부분이 없어 다시 한번 확인 문의를 드립니다.
[회신주신 내역]
result <- data.frame(Y_N = p3[,2])
write.csv(result, 'result.csv')
위의 스크립트 직전의 p3값을 확인하면 아래와 같습니다.
> str(p3) → 2482개로 산출
[추가 문의내역 요약]
1) 처음 회신 주신 최종 2482개의 데이터가 X_Test 데이터 내 결측치(NA)가 포함된 '환불금액' 행을 포함하여 예측을 진행하였을 경우에도 동일하게 2482개로 산출되는 것인지 문의 드립니다.
2) Train Data 예측시 select(-c(1,5,6)으로 factor 파라메타가 많은 열을 제외하셨는데,
이 것을 TEST 데이터 적용시에도 동일하게 수정을 가해도 되는 부분인지 문의 드립니다.(+결측값 수정 포함)
(TEST 환불금액 NA결측치를 평균으로 강제변경시 2482개 정상 산출을 확인하였습니다)
[추가확인내역]
강의내역 확인 시 15:02 쯤 첨부 내의 해당 코드가 없는 것 같습니다.
제가 아직 강의 진도를 절반 밖에 안 나가서 아직 학습이 안 된 부분일 수 있어 이 부분은 계속 수강하면서 학습하겠습니다.
X_test 가 메모장 내역과 같이 수정이 되면 2482개는 정상 산출 됩니다만, 2)번 질문과 같이 검증데이터에 수정을 가해도
채점 간 문제가 없는 부분인지 문의드립니다. (가능하다면 오히려 저는 시험 볼 때 편할 것 같습니다)
해당 부분만 확인되면 질문이 해결 될 것 같습니다.
[강의에 없는 코드부분]
X_test$총구매액 <- ifelse(X_test$총구매액 < 0 , mean(X_test$총구매액), X_test$총구매액)
X_test$최대구매액 <- ifelse(X_test$최대구매액 < 0 , mean(X_test$최대구매액), X_test$최대구매액)
X_test$환불금액 <- ifelse(is.na(X_test$환불금액), mean(X_test$환불금액, na.rm = T), X_test$환불금액)
[강의내용화면 비교 시 행 뽑는 코드내용만 확인되는 것 같습니다.]
[참조] - 강의와 코드가 다른 부분을 찾아서 안보셔도 되실 것 같습니다. 혹시나 해서 남겨놓습니다.
=======필사 코드를 첨부 드리오니 문제가 있는 부분 확인주시면 감사 드리겠습니다==
library(caret)
library(pROC)
library(dplyr)
library(ModelMetrics)
X_train <- read.csv("C:\\Users\\arong\\Desktop\\r_1900_MSJ\\inflearn2\\X_train.csv", header = T, fileEncoding = "EUC-KR")
Y_train <- read.csv("C:\\Users\\arong\\Desktop\\r_1900_MSJ\\inflearn2\\Y_train.csv", header = T, fileEncoding = "EUC-KR")
X_test <- read.csv("C:\\Users\\arong\\Desktop\\r_1900_MSJ\\inflearn2\\X_test.csv", header = T, fileEncoding = "EUC-KR")
str(X_train)
str(X_test)
str(Y_train)
df <- merge(X_train, Y_train, by = 'cust_id')
str(df)
summary(df)
df <- df %>% select(-c(1,5,6))
str(df)
df$gender <- as.factor(df$gender)
summary(df)
#=============preprocessing=================
df$총구매액 <- ifelse(df$총구매액 < 0, mean(df$총구매액), df$총구매액)
df$최대구매액 <- ifelse(df$최대구매액 < 0, mean(df$최대구매액), df$최대구매액)
df$환불금액 <- ifelse(is.na(df$환불금액), mean(df$환불금액, na.rm=T), df$환불금액)
summary(df)
inx <- createDataPartition(df$gender, p=0.7, list=F)
train <- df[inx,]
test <- df[-inx,]
str(test)
#====================modeling=============
model1 <- train(gender ~ ., data=train, method="glm")
model2 <- train(gender ~ ., data=train, method="rpart")
p1 <- predict(model1, test, type='prob')
p2 <- predict(model2, test, type='prob')
p3 <- (p1+p2)/2
auc(test$gender, p3[,2])
#=======모델선정 및 applying(여기서 충돌이 나는 것 같습니다)==========
model1 <- train(gender ~ ., data=df, method="glm")
model2 <- train(gender ~ ., data=df, method="rpart")
X_test <- X_test %>% select(-c(1,5,6))
(여기서 '환불금액' 열을 모델링에서 제외할 경우(-c(1,4,5,6)) 올바른 예측결과 수가 나옵니다.
p1 <- predict(model1, X_test, type='prob')
p2 <- predict(model2, X_test, type='prob')
p3 <- (p1+p2)/2
head(p3)
#============result input===================
result <- data.frame(Y_N = p3[,2])
#write.csv(result, 'data/123456.csv', row.names=F)
#======== why 871? ==========
summary(X_test)
#=========[번외] X_test 환불금액 결측치를 강제 조정한 경우=========
X_test1 <- X_test
X_test1$환불금액 <- ifelse (is.na(X_test$환불금액), mean(X_test$환불금액, na.rm = T), X_test$환불금액)
model1 <- train(gender ~ ., data=df, method="glm")
model2 <- train(gender ~ ., data=df, method="rpart")
X_test <- X_test %>% select(-c(1,5,6))
p4 <- predict(model1, X_test1, type='prob')
p5 <- predict(model2, X_test1, type='prob')
p6 <- (p4+p5)/2
dim(p6) #2482개 정상적으로 나옴.
선생님 강의를 열심히 듣다가 해결하고 싶은 마음에 글이 길어 진 점 너그러이 양해 부탁드립니다.
감사합니다.
친절하고 상세한 답변에 감사 드립니다.
TEST 데이터 또한 TRAIN 모형에 따라 조절이 가능하다면,
응시 간 부담이 덜어지는 느낌이라 다행입니다.
덕분에 많은 이해가 되었습니다. 수강 하면서 좋은 결과 드릴 수 있도록 노력하겠습니다.
감사합니다.