# 중간 데이터 읽기용 함수 작성
library(plyr)
library(foreach)
readActionHourly <- function(app.name, date.from, date.to) {
date.from <- as.Date(date.from)
date.to <- as.Date(date.to)
ldply(foreach(day = seq.Date(date.from, date.to, by = "day"),
combine = rbind) %do%
{
f <- sprintf("sample-data/section10/action_hourly/%s/%s/action_hourly.tsv", app.name, day)
read.csv(f, header = T, stringsAsFactors = F, sep = "\t")
})
}
# 작성한 함수로 데이터 읽어들이기
action.hourly <- readActionHourly("game-01", "2013-08-01", "2013-08-08")
head(action.hourly)
# 시간대가 열에 오도록 정렬
library(reshape2)
dates <- unique(action.hourly$log_date)
train.list <- lapply(1:(length(dates) - 1), function(i) {
day <- dates[i]
x <- action.hourly[action.hourly$log_date == day, ]
df <- dcast(x, user_id ~ log_hour, value.var = "count",
function(x) {ifelse(sum(x) >= 7, 1, 0)}
)
names(df) <- c("user_id", paste0("p", i, "_", 0:23))
df})
head(train.list[[1]])
# 설명용 데이터 작성
train.data <- train.list[[1]]
for (i in 2:length(train.list)) {
df <- train.list[[i]]
train.data <- merge(train.data, df, by = "user_id", all.x = T)
train.data[is.na(train.data)] <- 0
}
names(train.data)
# 정답 데이터 작성
ans0 <- action.hourly[action.hourly$log_date == dates[length(dates)], ]
# 시간대가 열에 오도록 정렬
ans <- dcast(ans0, user_id ~ log_hour, value.var = "count", function(x) {
ifelse(sum(x) >= 7, 1, 0)
})
names(ans) <- c("user_id", paste0("a_", 0:23))
head(ans)
# 설명용 데이터와 결합하기
train.data <- merge(train.data, ans, by = "user_id", all.x = T)
train.data[is.na(train.data)] <- 0
names(train.data)
# 시간대별로 모델 구축(랜덤포레스트)
library(randomForest)
library(caret)
# 학습 조절
fit.control <- trainControl(method = "LGOCV", p = 0.75, number = 30)
# 랜덤포레스트에 의한 학습실시
rf.fit.list <- lapply(0:23, function(h) {
df <- train.data[, c(paste0("p", 1:7, "_", h), paste0("a_", h))]
df1 <- df[df[, ncol(df)] == 1, ]
df0.orig <- df[df[, ncol(df)] == 0, ]
df0 <- df0.orig[sample(1:nrow(df0.orig), nrow(df1)), ]
df <- rbind(df1, df0)
fit <- train(x=df[, -ncol(df)], y=df[, ncol(df)],
method = "rf", preProcess = c("center", "scale"),
trControl = fit.control)
fit
})
# 작성한 모델의 예측치와 실제값의 비교 결과를 표시
for (i in 0:23) {
result.rf <- predict(rf.fit.list[[(i + 1)]]$finalModel, train.data)
result.rf.pred <- ifelse(result.rf >= 0.5, 1, 0)
print(confusionMatrix(result.rf.pred, train.data[, paste0("a_",
i)]))
}
'R' 카테고리의 다른 글
[R 프로그래밍] 크로스집계, 히스토그램 실습을 통한 데이터 분석 (0) | 2017.02.10 |
---|---|
[R 프로그래밍] SQL 데이터를 통한 R프로그래밍 실습 (0) | 2017.02.09 |
[R 프로그래밍] 결정트리 분석 (0) | 2017.02.09 |
[R 프로그래밍] 클러스터링 (0) | 2017.02.09 |
[R 프로그래밍] 로지스틱 회귀분석 (0) | 2017.02.09 |
댓글