3. 목차
• 회귀분석
– 단순선형회귀분석
– 다중선형회귀분석
• 분류
– 로지스틱 회귀분석
– 나이브베이즈 분류기
– K-최근접 이웃
• 군집화
– K-means 군집화
• 기타
– 주성분분석
– 추천시스템
4. 선형회귀분석
• 단순선형회귀 (Simple Linear Regression) :
– 연속형 변수 대상
– 독립변수와 종속변수 간의 상관관계에 따른 수학적 모델인 선형적 관계식 도출
– 독립변수가 주어졌을 때 이에 따른 종속변수를 예측
• 종류
– 단순회귀분석 : 1개의 종속변수와 1개의 독립변수 사이의 관계를 분석
– 다중회귀분석 : 1개의 종속변수와 여러 개의 독립변수 사이의 관계를 규명
• 회귀식 추정
– 단순선형회귀모델 :
– 표본회귀식 : y = a + bx
– 최소제곱법 : 𝑒𝑖
2
=𝑛
𝑖=1 (𝑦𝑖 − 𝑦𝑖)2
=𝑛
𝑖=1 (𝑦𝑖 − 𝑎 − 𝑏𝑥𝑖)2𝑛
𝑖=1 를 최소화하는 a, b
• 회귀모형 적합도 판단
– 회귀모형이 적합한지 확인하기 위해 결정계수 𝑅2
을 사용
– 회귀모형의 독립변수가 종속변수 변동의 몇%를 설명하는지를 나타내는 지표
– 결정계수 𝑅2
값은 상관계수 r을 제곱한 값과 같다.
y = α + βx + ε, ε ~ iid N(0, σ²)
5. 선형회귀분석
• 상관분석 (Correlation Analysis)
– 두 변수간에 어떤 선형적 관계를 갖고 있는 지를 분석하는 방법
– 상관계수(Correlation coefficient)로 상관관계의 정도를 파악
– 두 변수간의 연관된 정도를 나타낼 뿐 인과관계를 설명하는 것은 아니다
• 피어슨 상관계수 (Pearson correlation coefficient)
–
X와 Y가 함께 변하는 정도
X와 Y가 따로 변하는 정도
= 두 변수 X,Y의 표준편차의 곱에 대한 공분산의 비율
– 모상관계수 =
– 표본상관계수 =
– 상관성을 -1과 1 사이 값으로 측정
• 방향 : 변수들이 어떻게 변하는지를 나타낸다
• 크기 : 절대값이 크면 상관관계가 더 강하다
6. 선형회귀분석
• 단순선형회귀분석 실습
women
ggplot(women, aes(x=height, y=weight)) +
geom_point() +
geom_smooth(method = 'lm', se = FALSE)
model = lm(weight ~ height, women)
summary(model)
Call:
lm(formula = weight ~ height, data = women)
Residuals:
Min 1Q Median 3Q Max
-1.7333 -1.1333 -0.3833 0.7417 3.1167
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -87.51667 5.93694 -14.74 1.71e-09 ***
height 3.45000 0.09114 37.85 1.09e-14 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 1.525 on 13 degrees of freedom
Multiple R-squared: 0.991, Adjusted R-squared: 0.9903
F-statistic: 1433 on 1 and 13 DF, p-value: 1.091e-14
8. 선형회귀분석
• 다중선형회귀 (Multiple Linear Regression) :
– 일반적인 자연 현상은 여러 독립 변수들에 의해 설명된다.
– 2개 이상의 독립 변수와 종속 변수간의 관계 도출
– 다중회귀모형 : 𝑦 = 𝛽0 + 𝛽1 𝑥1 + 𝛽2 𝑥2 + … + 𝛽 𝑛 𝑥 𝑛 + 𝜀
• 다중공선성
– 현실에서 설명변수들이 완벽하게 독립인 경우는 드물다.
– 변수간 상관정도가 높으면 회귀분석 결과에 나쁜 영향을 미친다.
• 변수선택
– 전진 선택법
– 변수 소거법
– 단계적 방법
9. 선형회귀분석
• 다중선형회귀분석 실습
library(car)
mtcars_num <- mtcars[,c(1,3:7)]
# 산점도 행렬과 상관계수만으로 다중공선성 1차 진단
pairs(mtcars_num, panel=panel.smooth)
cor(mtcars_num[,-1])
# 모델 생성 후 값 추정
model <- lm(mpg~., data=mtcars_num)
summary(model)
predict(model, data.frame(disp=170, hp=120, drat=4.0, wt=2.7, qsec=17.0))
# stepwise selection 방법으로 변수 선택
out <- step(model, direction="both")
summary(out)
formula(out)
# 선택 변수만으로 모델 재생성 후 값 추정
model <- lm(formula(out), data=mtcars_num)
summary(model)
predict(model, data.frame(disp=170, hp=120, drat=4.0, wt=2.7, qsec=17.0))
10. 로지스틱 회귀분석
• 종속변수가 연속형이 아닌 범주형 자료인 이항 변수로 구성됨
• 일반화된 선형 모델 (generalized linear model)을 이용
– 𝑦 = ln(
𝑝
1−𝑝
) = 𝛽0 + 𝛽1 𝑥1 + 𝛽2 𝑥2 + … + 𝛽 𝑝 𝑥 𝑝 + 𝜀, 𝜀 ~ 𝑁(0, 𝜎2
)
• 모델 설명
– 𝑝 : X인 경우 Y가 발생할 확률 (0 ~ 1)
– Odds : Y가 0일 확률에 대한 1일 확률의 비율 =
𝑝
1−𝑝
(0 ~ ∞)
– Logit : odds에 자연로그 취한 상태 = ln(
𝑝
1−𝑝
) (−∞ ~ ∞)
• 위 모델로부터
– 𝑝 = Pr(Y=1 | X) =
𝑒 𝑧
1+𝑒 𝑧 =
1
1+𝑒−𝑧
( 𝑧 = 𝛽0 + 𝛽1 𝑥1 + 𝛽2 𝑥2 + … + 𝛽 𝑝 𝑥 𝑝)
1
(1 + 𝑒−𝑥)
11. 로지스틱 회귀분석
• 로지스틱회귀분석 실습
# 임의의 데이터 생성
x <- c(rnorm(50, mean=0), rnorm(50, mean=2))
y <- c(rnorm(50, mean=2), rnorm(50, mean=0))
z <- c(rep("a", 50), rep("b", 50))
data <- data.frame(x, y, z)
# 데이터 스플릿
training_set <- sample(100,67)
train <- data[training_set,]
test <- data[-training_set,]
# 트레이닝 데이터 관찰
plot(train$x, train$y, col=train$z, xlab="x", ylab="y")
# 로지스틱회귀모형
model <- glm(z~x+y, binomial(link="logit"), train)
summary(model)
출처 : http://www.cleveralgorithms.com/machinelearning/regression/logistic_regression.html
12. 로지스틱 회귀분석
• 로지스틱회귀분석 실습
# 테스트 데이터로 검증
probabilities <- predict.glm(model, test[,1:2], type="response")
predictions <- cut(probabilities, c(-Inf,0.5,Inf), labels=c("a","b"))
table(predictions, test$z)
# 모델이 테스트 데이터를 분류하는 모습 관찰
plot(test$x, test$y, col=test$z, xlab="x", ylab="y")
abline(intercept, slope, lty=5)
predictions a b
a 16 2
b 1 14
출처 : http://www.cleveralgorithms.com/machinelearning/regression/logistic_regression.html
13. 나이브베이즈 분류기
• 베이즈 정리를 기반으로 하는 단순한 확률 분류기
– 어떤 feature 변수들 Fi가 주어졌을 때 이것이 Class C에서 나왔을 확률인 사후확
률을 측정하여 가장 확률이 높은 클래스로 분류한다.
–
• 보유한 데이터에서 해당 카테고리의 확률인 사전확률을 알 수 있고
해당 카테고리에서 각 아이템이 어떤 확률로 발생하는지(우도,
likelyhood)를 알 수 있으니 계산을 통해 사후확률을 구할 수 있다.
–
–
–
14. 나이브베이즈 분류기
• 나이브베이즈 분류기 실습
install.packages('ElemStatLearn') # spam 이메일 데이터셋
install.packages('e1071')
library(e1071)
# 이메일 데이터 로드
data(spam, package="ElemStatLearn")
spam[1,]
# 데이터 스플릿
cv = sample(nrow(spam), floor(nrow(spam) * 0.9), replace=FALSE)
train = spam[cv,]
test = spam[-cv,]
# 분류기 테스트
num_feature <- ncol(spam) # label class feature 위치
modle <- naiveBayes(train[,-num_feature], train[,num_feature], laplace=1)
predict(modle, test[,-num_feature])
table(predict(m, test[,-num_feature]), test$spam)
15. K-최근접 이웃
• 직관적으로 이해하기 쉽고 매우 효과적인 분류기
• 분류 항목 표시가 주어지지 않은 테스트 데이터가 새로 주어졌을 때
트레이닝 데이터와 비교하여 가장 유사한 k개의 데이터를 골라내고
그 중 가장 많은 label을 테스트 데이터의 클래스로 예측한다.
• 선형적으로 분류하기 힘든 데이터에서도 간단하고 직관적인 방법으
로 분류를 수행
16. K-최근접 이웃
• K-최근접 이웃 실습 : OCR 예제
– 머신러닝 인 액션 2장의 소스코드 참조
– 데이터셋 : http://www.manning-source.com/books/pharrington/MLiA_SourceCode.zip
# 이미지를 벡터로 변환
img2vector <- function(filename) {
vec <- rep(0, 1024)
f <- file(filename, "rt")
lines <- readLines(f)
vec <- as.integer(unlist(strsplit(paste(lines, collapse=''), NULL)))
close(f)
return(vec)
}
# img2vector 테스트
test_vec <- img2vector('./data/digits/trainingDigits/0_0.txt') # 0
image(matrix(test_vec, ncol=32))
test_vec <- img2vector('./data/digits/trainingDigits/3_0.txt') # 3
image(matrix(test_vec, ncol=32))
소스코드 발췌 : 머신러닝 인 액션 2장
17. K-최근접 이웃
• K-최근접 이웃 실습 : OCR 예제
# training data 생성
hwLabels <- vector('integer')
training_file_list <- list.files('./data/digits/trainingDigits')
m <- length(training_file_list)
training_mat <- matrix(nrow=m, ncol=1024)
for(i in 1:m) {
file_name <- training_file_list[i]
print(file_name)
file_str <- unlist(strsplit(file_name, split="."))[1] # 0_0, txt
class_num <- as.integer(unlist(strsplit(file_str, split="_"))[1]) # 0, 0
hwLabels <- append(hwLabels, class_num)
training_mat[i,] <- img2vector(paste('./data/digits/trainingDigits/', file_name,
sep=""))
}
소스코드 발췌 : 머신러닝 인 액션 2장
18. K-최근접 이웃
• K-최근접 이웃 실습 : OCR 예제
# test data 분류
test_file_list <- list.files('./data/digits/testDigits')
error_cnt <- as.integer(0)
m_test <- length(test_file_list)
for(i in 1:m_test) {
file_name <- test_file_list[i]
print(file_name)
file_str <- unlist(strsplit(file_name, split="."))[1] # 0_0, txt
class_num <- as.integer(unlist(strsplit(file_str, split="_"))[1]) # 0, 0
test_vec <- img2vector(paste('./data/digits/testDigits/', file_name, sep=""))
cl_result <- knn(training_mat, test_vec, hwLabels, k=3)
print(sprintf("knn() result : %s, the real answer : %d", cl_result, class_num))
print("---------------")
if(cl_result != class_num) error_cnt <- error_cnt + 1
}
print(sprintf("the total error rate is : %f %%", error_cnt/m_test*100))
소스코드 발췌 : 머신러닝 인 액션 2장
19. K-means 군집화
• Cluster
– Object들의 집합
– 비슷한 Object끼리 같은 cluster에 묶음
• Clustering Algorithm
– Object 집합을 여러 개의 group으로 묶는 알고리즘
• 좋은 Clustering Algorithm
– Vector distance는 최대한 가깝게
– Cluster distance는 최대한 멀게
20. K-means 군집화
• K-means Clustering
– 주어진 데이터를 k개의 클러스터로 묶는 알고리즘
– 각 클러스터 센터와의 거리 차이의 분산을 최소화하는 방식으로 동작
–
– 알고리즘 동작 방식
21. K-means 군집화
• K-means 군집화 실습
# 데이터셋 준비
newiris <- iris
newiris$Species <- NULL
# k-means 알고리즘 수행
(kc <- kmeans(newiris, 3))
table(iris$Species, kc$cluster)
# 결과 확인
plot(newiris[c("Sepal.Length", "Sepal.Width")], col=kc$cluster)
points(kc$centers[,c("Sepal.Length", "Sepal.Width")], col=1:3, pch=8, cex=2)
22. PCA
• 주성분 분석 : PCA (Principal component analysis)
– 분포의 주 성분을 분석하는 방법
– 즉, 다차원의 데이터에서 정보 유실을 최소화하면서 더 적은 차원의 데이터로 설
명할 수 있게 하는 방법
– 주성분 벡터 -> 해당 벡터 방향으로 데이터들의 분산이 가장 큰 방향 벡터
– 데이터를 한 개의 축으로 사상시켰을 때 그 분산이 가장 커지는 축이 첫 번째 좌
표축으로 오고, 두 번째로 커지는 축이 두 번째… 와 같은 방법으로 차례로 놓이
도록 새로운 좌표계로 데이터를 선형 변환한다.
23. PCA
• PCA 실습
# 데이터셋 생성 및 관찰
data <- matrix(c(1,1,5,4,4,6,5,5,6,5,9,9),byrow=T,ncol=2)
(mu <- apply(data, 2, mean))
plot(data, xlim=c(0,10), ylim=c(0,10), asp=1)
(pc <- prcomp(data))
(r <- pc$rotation)
(result <- predict(pc, newdata=data))
plot(result, asp=1) # result를 그려보면 각 eigenvector의 관점에서 오리지널 데이터가 그려진다.
# 하지만 위에서는 모든 PC를 유지했기 때문에 차원 리덕션 효과는 없었다.
# PC1만을 남겨두어 차원 축소를 수행해보면
(pc <- prcomp(data, tol=0.3)) # tol 값은 0.7745967/3.6055513 보다 큰 값을 주면 된다.
(result <- predict(pc, newdata=data)) # 원본 데이터에서 차원 축소된 1차원 결과 데이터를 얻는다.
# 결과 데이터를 원본 데이터의 영역에서 비교해보자
result <- cbind(result, matrix(rep(0,6),byrow=F)) # 더미 차원을 추가해주고
plot(result, asp=1, col=2)
# eigenvector를 통한 transformation을 역으로 적용함
# t(t(r))의 의미는 solve(t(r)), 연산을 위해 rotation의 eigenvector를 col->row로 변환한 놈의 역행렬
(b <- t(t(t(r)) %*% t(result) + mu))
plot(data, xlim=c(0,10), ylim=c(0,10), asp=1)
par(new=T)
plot(b, xlim=c(0,10), ylim=c(0,10), asp=1, col=2, pch=4)
lines(c(0,10), c(0,10), lty="dotted")
24. 추천시스템
• 등장 배경
• User-Item Matrix
Off-line On-line
물리적 공간의 제약 물리적 공간 제약 없음
제한된 고객 수 고객 수의 제한 없음
Pareto(80/20) 법칙 Long tail 법칙
개인화 불가능 개인화 가능
25. 추천시스템
• 추천시스템 분류
– Content-based RS
– Collaborative Filtering
• Memory-based
– User-based CF
– Item-based CF
• Model-based
• 일반적인 성능 및 결과 비교
Content-based < User-based CF <= Item-based CF < Model-based
26. 추천시스템
• 추천 시스템 실습
library(recommenderlab)
data(MovieLense)
MovieLense
image(sample(MovieLense, 500))
r <- Recommender(MovieLense, method="UBCF")
recom <- predict(r, MovieLense[1:2], n=3)
as(recom, "list")
[[1]]
[1] "Glory (1989)" "Schindler's List (1993)" "Casablanca (1942)"
[[2]]
[1] "Boot, Das (1981)" "Dead Man Walking (1995)" "Lone Star (1996)"