sk-learn과 비슷하나 홈페이지가 구리다...
library(caret) # sklearn과 비슷하나 sklearn이 더 좋다.
library(tidyverse)
df <- read_csv("automobile.csv") # RStudio에서 tibble은 화면크기에 맞게 데이터가 출력된다. jupyter 에서 전체 출력.
head(df)
model <- lm(symboling ~ width, data=df)
summary(model)
options(repr.plot.height=3)
ggplot(df, aes(width, symboling)) + geom_point() + geom_smooth(method='lm')
symboling.p <- predict(model,df)
head(symboling.p)
index <- createDataPartition(y = df$symboling, p=0.6, times = 1, list = F)
train <- df[index,]
test <- df[-index,]
dim(train)
dim(test)
mean((train$symboling-predict(model,train))^2)
mean((test$symboling-predict(model,test))^2)
colnames(df)
features = c("symboling", "fuel", "aspiration", "doors", "body", "wheels", "wheel_base",
"length", "width", "height", "curb_weight", "engine_size",
"bore", "stroke", "compression_ratio", "horsepower", "peak_rpm",
"city_mpg", "highway_mpg", "price")
train = df[index, features]
test = df[-index, features]
# Training Control
controlObject <- trainControl(
method = 'repeatedcv',
repeats = 1, #나누는 걸 몇번
number = 5) # 5등분
# 모든 경우의 수를 만든다.
elst.Grid <- expand.grid(
.alpha = seq(0, 1, 0.2),
.lambda = c(0.001, 0.01, 0.1))
t(elst.Grid)
library(glmnet)
elst.Model <- train(
symboling ~ .,
data = train,
method = 'glmnet',
tuneGrid = elst.Grid, # 만든 파라미터.
preProc = c('center', 'scale'), # 무조건 넣는다고 생각하면된다.
metric = 'RMSE', #예측문제라 RMSE를 최적화
trControl = controlObject) #CrossValidation을 어떻게 할 것인가.
#RMSE가 작은걸 고르면 된다.
elst.Model
best = as.numeric(rownames(elst.Model$bestTune))
best
elst.Model$finalModel$beta[,best] # 베스트의 회귀계수
y = predict(elst.Model, test, na.action = na.pass)
mean((test$symboling - y)^2, na.rm = T)
knn.Model <- train(
symboling ~ .,
data = train,
method = 'knn',
preProc = c('center', 'scale'),
metric = 'RMSE',
tuneGrid = data.frame(.k = 2:5), # 2~5개 k 개
trControl = controlObject)
knn.Model
test.c = test[complete.cases(test),]
y = predict(knn.Model, test.c) # 주변의 값의 평균으로 한다. k=3 이면 3개의 평균.
mean((test.c$symboling - y)^2, na.rm = T)
library(kernlab)
sigmaRange <- sigest(as.matrix(train[8:20])) # sigma range를 추천해준다. 연속인 값에 넣어준다.
svm.Grid <- expand.grid(
.sigma = sigmaRange[1],
.C = 2^(seq(-5,5,2)))
svm.Model <- train(
symboling ~ .,
data = train,
method = 'svmRadial', # svm with rbf
tuneGrid = svm.Grid,
preProc = c('center', 'scale'),
metric = 'RMSE',
trControl = controlObject)
y = predict(svm.Model, test)
mean((test.c$symboling - y)^2)
nnet.Grid <- expand.grid(
.decay = c(0.001, 0.01, 0.1), # LM의 ridge와 동일하다. 람다를 키우를거랑 비슷하다. 정규화를 얼마나 할 것이냐.
.size = seq(3,11, by = 2), # hidden Layer 크기 노드의 수
.bag = FALSE) # bagging 모델을 여러개 만들어서 각각 다른 데이터를 줘서 평균 내는 방식.
nnet.Model <- train(
symboling ~ .,
data = train,
method = 'avNNet',
tuneGrid = nnet.Grid,
preProc = c('center', 'scale'),
maxit = 200, # 밑바닥에 들어가서 error가 주는것인지 아닌지 알수가 없다. 한참걸린다. local minimun 최대 200 Step을 내려가고 Stop
trControl = controlObject
,trace = F)
y = predict(nnet.Model, test)
mean((test.c$symboling - y)^2)
rpart.Model <- train(
symboling ~ .,
data = train,
method = 'rpart',
tuneLength = 10,
trControl = controlObject)
rpart.Model
y = predict(rpart.Model, test)
mean((test.c$symboling - y)^2)
rf.Grid <- expand.grid(.mtry = c(4,6,8,10)) # 컬럼수를 결정 총 length 만큼 반복하는데 각 순서대로 컬럼수를 가지고 한다.
rf.Model <- train(
symboling ~.,
data = train,
method = 'rf',
tuneGrid = rf.Grid,
ntrees = 10, # 트리 수
importance = T,
trControl = controlObject)
y = predict(rf.Model, test)
mean((test.c$symboling - y)^2)
allResamples <- resamples(
list('Elastic Net' = elst.Model,
'K-NN' = knn.Model,
'svm' = svm.Model,
'Neural network' = nnet.Model,
'tree' = rpart.Model,
'Random Forest' = rf.Model))
summary(allResamples)
save(rf.Model, file="rfModel.RData")
load('rfModel.RData')
library(e1071)
df$doors <- factor(df$doors)
levels(df$doors)
lda.Model <- train(
doors ~ .,
data = train,
method = 'lda2',
metric = 'Kappa',
tuneLength = 2,
trControl = controlObject)
lda.Model
y = predict(lda.Model, test.c)
confusionMatrix(y, test.c$doors)