■ 어제까지 배운 내용 R 내용 복습
- R 기본 문법 수업 : 1주일
- R 기계 학습 :
-2장 : 기계학습 책에 나오는 내용을 이해하기휘한 기본 문법과 함수 소개하는 내용
-3장 : knn
-소개팅
-과일
-유방암
-폐암
-4장 : 나이브 베이즈
-5장 : 결정트리
■ 3장. knn (최근접 이웃을 사용한 분류의 이해)
- 머신러닝의 종류
- 1.지도학습
- 2.비지도학습
- 3.강화학습
▦ 3장 목차
- knn(k-Nearest Neighbors) 란 무엇인가?
- knn(k-Nearest Neighbors)이 필요한 이유?
- knn(k-Nearest Neighbors)의 분류의 이해
- knn(k-Nearest Neighbors)의 분류 실습1( 소개팅 데이터 )
- knn(k-Nearest Neighbors)의 분류 실습2( 과일 데이터 )
- 적당한 k 값 선택
- knn(k-Nearest Neighbors)의 분류 실습3(유방암 데이터)
- knn(k-Nearest Neighbors)의 분류 실습4(붓꽃 데이터)
- knn(k-Nearest Neighbors)의 분류 실습5(폭력과 멜로 분류)
- knn(k-Nearest Neighbors)의 분류 실습6(폐암 데이터)
▦ 1. knn(k-Nearest Neighbors) 란 무엇인가?
- 사회적인 관계 관찰해보면?
대략적으로 비슷한 사람끼리 모이는 성질이 있다.
비슷한 취향의 사람들끼리 모여서 동호회를 만들고
비슷한 부류의 계층의 사람들끼리 친분을 맺기도 한다.
- 공간적인 관계를 관찰해보면?
가구점이 모이는 상가지역이 따로 형성이 되어 있거나
한약방이 밀집되어 있는 지역이 따로 모여있는 경우가 많다.(제기동)
이런 특성을 가진 데이터를 겨냥해서 만들어진 알고리즘이 knn이다.
▦ 2. knn(k-Nearest Neighbors)이 필요한 이유?
- knn 이 왜 필요한지?
"유방암 종양의 크기에 대한 데이터( 반지름 , 둘레, 면적등 ) 만
가지고 이 종양이 악성인지 양성인지를 미리 예측할 수 있다면
환자에 대한 치료 스케쥴에 큰 영향을 미칠 수 있다."
- 암 발견과 치료과정 :
- 건강검진 -----> 2.초음파, 내시경 ----> 3.의심되는 종양
----> 4. 큰 병원에 가서 조직검사를 하라고 권고 받는다.
----> 5. 3~4달 후의 예약을 잡아준다.
▦ knn(k-Nearest Neighbors)의 분류의 이해
그림
물음표가 무슨 색일까?
"어떤 라벨(사진속 물음표)을 정의할 때 그 데이터의 주변 반경안의
데이터들을 조사하여 다수결로 k 개 이상이면 가장 많은 라벨로 정의하는 것이다."
그림을 보면 정체를 알 수 없는 ? 모양의 라벨이 있는데
이것이 빨간색인지 파란색인지
k = 3으로 놓고 본다면
A의 경우는 Red
B의 경우는 Blue
▦ 4.knn(k-Nearest Neighbors)의 분류실습1(소개팅 데이터)
A라는 여학생이 소개팅을 수천번하지는 않기 때문에 14번정도 했다고 가정하고
그 동안 만난 남학생들에 대한 라벨을 호감라벨로 만들어서 데이터를 정리함
이 데이터를 기주능로 새로 만나게 될 남학생에 대한 데이터로만 호감레벨을 예측해본다.
- 기계학습을 기동할대는 input 데이터를 알고리즘에 맞게 잘 정제하는 작업이 필요하다 .
- 표준화 : R 에서는 scale()이라는 함수를 통해서
-1 ~ 1 사이의 데이터로 변경한다.
( 키는 cm 이고 몸무게는 kg니까 서로 데이터의 범위가 달라서
결과가 잘 날올리가 없지 ~ 그래서 scale함수로 키와 몸무게를
-1 ~ 1 사이의 데이터로 변경을 해주어요 ~ )
====> 표준화
- 정규화 : 정규분포에 속하는 데이터로 정규화를 해줘야 한다.
평균 및 표준편차를 기반으로 데이터 조정:
데이터와 평균의 차이를 표준편차로 나눈다.
값 - 평균값
정규화 : -------------
표준편차
- 훈련 데이터 like 데이터를 준비
like <- read.csv('like.csv',stringAsFactor=T, header=T)
> like <- read.csv('like.csv',stringsAsFactors=T, header=T)
> colnames(like) <- c('talk','book','travel','school','tall','skin','muscle','label')
- 테스트 데이터를 만든다 ( 앞으로 ㅅㄱㅁ만나게 될 남학생의 데이터)
test <- data.frame(talk=70, book=50, travel=30 , school=70, tall=70, skin=40, muscle=50)
test
test 데이터의 남학생이 1타입,2타입,3타입 인지를 알아내고자 한다.
- knn을 돌리기 위한 패키지 설치
install.packages("class")
library(class)
train <- like[,-8]
group <- like[,8]
> knnpred1 <- knn(train, test,group, k=3,prob=TRUE)
> knnpred1
[1] 3타입
attr(,"prob")
[1] 0.6666667
Levels: 1타입 2타입 3타입
문제187. k 값을 4로 하면 결과가 달라지는지 확인하시오 ~!
안달라져
문제 188. (점심시간 문제) 나이, 월수입, 상품구매여부 3개읠 데이터를
갖는 데이터가 있다. (buy.csv) 이 데이터를 이용해서 나이가 44이고 월급이 400 만원인
사람이 상품을 구매할지 비구매할지를 knn 분류 알고리즘으로 분석하시오 !
나이와 월수입으로 상품 구매여부를 예측하는 데이터
buy <- read.csv("buy.csv", stringsAsFactors =F, header=T)
buy
1. 나이와 월수입 데이터를 표준화 한다.
buy$age <- scale(buy$나이)
buy$pay <- scale(buy$월수입)
2. 나이와 월수입 데이터를 정규화 한다.
값 - 평균값
정규화 = --------------------------
표준편차
test<- data.frame(age=44, pay=400)
train <- buy[,c(4,5)]
lebels <- buy[,3]
test$age <- (test$age - mean(buy$나이) ) / sd(buy$나이)
test$pay <- ( test$pay - mean(buy$월수입) ) / sd(buy$월수입)
- test (나이:44, 월급:400) 인 데이터를 KNN으로 돌려서 상품을 구매할지 안할지 출력하시오
a<-knn(buy[,c(4,5)], test,buy[,3], k=3,prob=TRUE)
buy <- read.csv("buy.csv" , stringsAsFactors = F , header = T)
buy
buy$age <- scale(buy$나이)
buy$pay <- scale(buy$월수입)
buy
test <- data.frame(age=44 , pay=400)
train <- buy[,c(4,5)]
labels <- buy[,3]
train
test$age <- scale(test$age)
test$pay <- scale(test$pay)
library(class)
knnpred1 <- knn(train , test , labels , k=5 , prob=TRUE)
knnpred2 <- knn(train , test , labels , k=6 , prob=TRUE)
knnpred1;knnpred2
문제189. buy 데이터 프레임에 라벨이 없는 44세의 월급 400만원 데이터를 넣고 다시 scale함수를 돌려서 나이와 월급을 정규화 하고 훈련 데이터와 테스트 데이터를 나눠서 knn 함수로 테스트 데이터의 라벨을 알아내시오 .
strip.white=T(공백을 제거해라 )
buy <- read.csv("buy.csv" , stringsAsFactors = F , header = T,strip.white=T )
buy<-rbind(buy,c(44,400,"")
buy$age <- scale(buy$나이)
buy$pay <- scale(buy$월수입)
train <- buy[c(1:20),c(4,5)]
labels <- na.omit(buy[c(1:20) ,3])
knn1 <- knn(train , buy[21,c(1:2)] , labels , k=5 , prob=TRUE)
knn1
buy <- read.csv("buy.csv" , stringsAsFactors = F , header = T,
strip.white=T)
buy2 <- rbind( buy, c(44,400,""))
buy2$나이 <- as.integer(buy2$나이)
buy2$월수입 <- as.integer(buy2$월수입)
buy2$나이 <- scale(buy2$나이)
buy2$월수입 <- scale(buy2$월수입)
train <- buy2[1:20,c("나이","월수입")]
train_label <- buy2[1:20,"상품구매여부"]
test <- buy2[21,c("나이","월수입")]
library(class)
knnpred3 <- knn(train, test, train_label, k=5, prob=T)
knnpred3
▩ 5. knn(k-Nearest Neighbors)의 분류 실습2(과일 데이터)
knn(k-Nearest Neighbors)은 한국어서 k 근접 이웃이라고 한다.
머신러닝의 분류에 쓰이는 대표적이면서 간단한 알고리즘이다.
사용되는곳: 얼굴인식, 개인영화 추천, 단백질 및 질병 추출을 위한 유전자 데이터 패턴 식별등에 활용이된다.
문제190. 책 104쪽에 나오는 x축 단맛, y축 아삭거림에 대한 과일, 야채 단백질을 분류하는 그래프를 그리시오
■ 책 103쪽에 나온 그래프를 그릴려면 ?
#1. food 데이터 프레임을 만든다.
food <- data.frame(ingredient = c("apple", "bacon", "banana", "carrot",
"celery", "cheese", "cucumber", "fish",
"grape", "green bean", "lettuce",
"nuts", "orange", "pear","shrimp"
),
sweetness = c(10,1,10,7,3,1,2,3,8,3,1,3,7,10,2),
crunchiness = c(9,4,1,10,10,1,8,1,5,7,9,6,3,7,3),
class = c("Fruits","Proteins","Fruits","Vegetables",
"Vegetables","Proteins","Vegetables",
"Proteins","Fruits","Vegetables",
"Vegetables","Proteins","Fruits",
"Fruits","Proteins"))
food
#2. 토마토 데이터 만들기
tomato <- data.frame(ingredient = "tomato",
sweetness = 6,
crunchiness = 4)
tomato
#3. ggplot2 그래프로 plot 그래프를 그린다.
install.packages("ggplot2")
library(ggplot2)
# par : 파라미터 지정 / pty : plot모형을 "square" 정사각형
par(pty="s")
# 그래프 그리기(version : ggplot)
#par:파라미터/xpd:모형옮기기/mar:여백설정(아래,왼쪽,위,오른쪽)
par(xpd=T, mar=par()$mar+c(0,0,0,15))
plot(food$sweetness,food$crunchiness,
pch=as.integer(food$class),
#pch=food$class, # pch는 모형 지정
xlab = "sweetness", ylab = "crunchiness",
main = "What is tomato class?")
legend(10.5,10, # legend 위치 지정
c("Fruits", "Proteins", "Vegetables", "X"),
pch=as.integer(food$class))
text(food$sweetness, food$crunchiness,
labels=food$ingredient,
pos = 3, # 글자위치position(1:below/2:left/3:above/4:right)
offset = 0.3, # 좌표와 얼마나 띄어쓰기 할것인지
cex = 0.7 ) # 문자크기
# 그래프 그리기(version : ggplot2)
ggplot(data=food,aes(x=sweetness,y=crunchiness))+
labs(title="What is tomato class?")+ # 타이틀 명
geom_point(aes(color=class, shape=class),size=6)+
geom_text(aes(label=ingredient), # 라벨링 표시
vjust=-1, # 수직으로 움직일 거리 (위는 -, 아래는 +)
size = 5) # 문자크기

문제191. 토마토가 야채, 과일, 단백질 중에 어느 분류에 속하는지 knn알고리즘으로 알아내시오
답 :
install.packages("dplyr")
library(class)
library(dplyr)
tmt <- knn(select(food,sweetness,crunchiness), select(tomato,sweetness,crunchiness),food$class,k=2)
tmt
토마토의 최근접 이웃을 구하기 위해서는 거리함수나 두 인스턴스 사이의 유사도를 측정하는 공식이 필요하다
거리를 계산하는데는 다양한 방법이 있는데 knn 은 유클리드 거리를 사용한다.
예 : 토마토와 green bean과의 거리
dist("pear","green bean") = sqrt( (6-3)^2 + (4-7)^2 ) = 4.2
문제192. 토마도와 orange와의 유클리드 거리를 구하시오
sqrt( (7-6)^2 + (3-4)^2) ) = 1.414214
▩ 6. 적당한 k 값 선택
적당한 k 값을 선택해야 하는데 k 값이 너무 낮으면 오버피팅 하게된다
즉 훈련데이터로 인해 만든 모델이 훈련 데이터에만 맞고 다른 데이터를
분류를 잘 못한다.
k 값이 너무 높으면 언더피팅을 하게 된다.
훈련 데이터 조차도 분류를 잘 못한다 .
예: k 값에 따른 분류 시각화 작업
■ 구현 코드
install.packages("readr")
install.packages("ElemStatLearn")
install.packages("class")
library(readr)
#1.과적합에 대하여.
library(ElemStatLearn)
library(class)
x <- mixture.example$x
x
g <- mixture.example$y
g
xnew <- mixture.example$xnew
xnew
#k=1, 10 , 30 , 50 , 100, 1000
#k값이 지나치게 작을 때: 분류 경계선이 너무 디테일 하다. : 과적합
#k값이 지나치게 클 때 분류 경계선이 너무 크다 : 부적합
#knn(train, test, cl, k =1, l = 0, prob = FALSE, use.all = TRUE)
mod1 <- knn(x, xnew, g, k=1, prob=TRUE)
mod1
prob1 <- attr(mod1, "prob")
prob1
prob1 <- ifelse(mod1=="1", prob1, 1-prob1)
prob1
px1 <- mixture.example$px1
px2 <- mixture.example$px2
prob1 <- matrix(prob1, length(px1), length(px2))
par(mar=rep(2,4))
#윤곽선
contour(px1, px2, prob1, levels=0.5,
labels="", xlab="", ylab="", main= "k-nearest neighbour", axes=FALSE)
points(x, col=ifelse(g==1, "coral", "cornflowerblue"))
gd <- expand.grid(x=px1, y=px2)
#배경
points(gd, pch=".", cex=1.2, col=ifelse(prob1>0.5, "coral", "cornflowerblue"))
▩ 7. knn (k-nearest neighbors)
▩ 7. knn (k-nearest neighbors) 의 분류 실습1(유방암 데이터)
##### 3장 : 최근접 이웃(Nearest Neighbors)을 사용한 분류(Classification) --------------------
## 예제 : 암 샘플 분류 ----
## 단계 2 : 데이터 준비와 살펴보기 ----
# CSV 파일 임포트
wbcd <- read.csv("wisc_bc_data.csv", stringsAsFactors = FALSE)
# wbcd 데이터 프레임의 구조
str(wbcd)
head(wbcd)
# id 속성 제거
wbcd <- wbcd[-1]
# 진단 테이블
table(wbcd$diagnosis)
# 팩터로서 진단 변수 변환
wbcd$diagnosis <- factor(wbcd$diagnosis, levels = c("B", "M"),
labels = c("Benign", "Malignant"))
head(wbcd)
# 진단 변수의 비율
round(prop.table(table(wbcd$diagnosis)) * 100, digits = 1)
# 세 속성에 대한 요약
summary(wbcd[c("radius_mean", "area_mean", "smoothness_mean")])
# 정규화 함수
normalize <- function(x) {
return ((x - min(x)) / (max(x) - min(x)))
}
# 정규화 함수 테스트 - 결과는 일치함
normalize(c(1, 2, 3, 4, 5))
normalize(c(10, 20, 30, 40, 50))
# wbcd 데이터 정규화
wbcd_n <- as.data.frame(lapply(wbcd[2:31], normalize))
head(wbcd)
head(wbcd_n)
# 정규화가 잘 되었는지 확인 # 모든 컬럼의 값을 0~1 사이의 값으로 변경해줌
summary(wbcd_n$area_mean)
summary(wbcd_n$concavity_worst)
# 훈련 데이터와 테스트 데이터 생성 # 둘다 라벨이 없는 데이터 이다.
wbcd_train <- wbcd_n[1:469, ]
wbcd_test <- wbcd_n[470:569, ]
str(wbcd)
str(wbcd_train)
# 훈련 데이터와 테스트 데이터에 대한 라벨 생성
wbcd_train_labels <- wbcd[1:469, 1]
wbcd_test_labels <- wbcd[470:569, 1]
## 3단계 : 데이터로 모델 훈련 ----
# "class" 라이브러리 로드
library(class)
wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=21)
## 4 단계 : 모델 성능 평가 ----
# "gmodels" 라이브러리 로드
library(gmodels)
# 예측값과 실제값의 교차표 생성
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)
실제/모델 B(양성) M(악성)
B(양성) 61(TN) 0(FP)
M(악성) 2(FN) 37(TP)
#
#
TRUE NEGATIVE
FALSE POSITIVE
FALSE NEGATIVE
TRUE POSITIVE
## 5 단계 : 모델 성능 향상 ----
# 데이터 프레임를 z-score 표준화하기 위해 scale() 함수 사용
wbcd_z <- as.data.frame(scale(wbcd[-1]))
# 변환이 정확하게 적용되었는지 확인
summary(wbcd_z$area_mean)
# 훈련과 테스트 데이터셋 생성
wbcd_train <- wbcd_z[1:469, ]
wbcd_test <- wbcd_z[470:569, ]
# 변경한 데이터로 분류
wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test,
cl = wbcd_train_labels, k=21)
# 예측값과 실제값의 교차표 생성
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred,
prop.chisq=FALSE)
# 다른 k 값으로 분류
wbcd_train <- wbcd_n[1:469, ]
wbcd_test <- wbcd_n[470:569, ]
wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=1)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)
wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=5)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)
wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=11)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)
wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=15)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)
wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=21)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)
wbcd <- read.csv("wisc_bc_data.csv", stringsAsFactors = FALSE)
> nrow(wbcd)
[1] 569
569 건의 유방암 환자 데이터를 둘로 나눈다.
2/3 훈련 데이터 + 악성인지 양성인지를 구분하는 라벨
1/3 테스트 데이터 + 악성인지 양성인지를 구분하는 라벨을 빼고
훈련 데이터로 그 라벨을 알아내는 작업을 수행
knn (훈련 데이터 , 테스트 데이터 , 훈련 데이터 라벨, k=1)
설명 : B (양성) : 357명 , M(악성) : 212명
wbcd$diagnosis <- factor(wbcd$diagnosis, levels = c("B", "M"), labels = c("Benign", "Malignant"))
설명 : B와 M 을 Benign, Malignant 철자로 변환해서 저장함
정규화 하는 방법에는 2가지가 잇는데
1.표준정규분포 : scale() 함수를 사용한 변환
2.최대최소변환 : 책 115페이지 (아래 코드) 의 normalize 함수
(신경망에서 많이 사용됨)
# wbcd 데이터 정규화
wbcd_n <- as.data.frame(lapply(wbcd[2:31], normalize))
head(wbcd)
head(wbcd_n)
문제193. 실제 테스트 데이터의 라벨 (wbcd_test_labels )와
knn으로 예측한 라벨인(wbcd_test_pred) 를 비교해서 얼마나 일치했는지 확인하시오 !
data.table(wbcd_test_labels,wbcd_test_pred,mean(as.numeric(wbcd_test_labels ==wbcd_test_pred )),as.numeric(wbcd_test_labels ==wbcd_test_pred ) )
wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=7)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)
wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=13)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)
wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=21)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)
wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=23)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)
wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=31)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)
wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=29)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)
wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=6)
CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)
거짓부정은 예측값은 양성이지만 종양이 실제로는 악성이다
거짓긍정은 예측값은 악성이지만 종양이 실제로는 양성이다.
k값 거짓부정 거짓긍정
1 1 3
5 2 0
11 3 0
15 3 0
21 2 0
27 4 0
▦ 8. knn(k-Nearest Neighbors)의 분류실습4 ( 붓꽃데이터)
data(iris)
head(iris)
문제194. 붓꽃의 종류가 몇가지가 있는지 출력하시오
unique(iris$Species)
> unique(iris$Species)
[1] setosa versicolor virginica
Levels: setosa versicolor virginica
nrow(iris)
150
▩ 9.knn(k-Nearest Neighbors)의 분류 실습5(폭력과 멜로 분류)
문제195. 붓꽃의 데이터를 훈련데이터와 테스트 데이터로 나눠서
knn 을 돌려서 테스트 데이터의 라벨을 예측하는 실습을
유방암 실습 코드를 가지고 구현하시오 !
(오늘의 마지막 문제)
install.packages('class')
library(class)
install.packages('gmodels')
library(gmodels)
install.packages("scales")
library(scales)
######[KNN] using algorithm######################################################
####movie data load
movie<-read.csv('movie.csv',header=F, stringsAsFactors=F)
colnames(movie)<-c("title","kick","kiss","genre")
movie$genre<-factor(movie$genre, levels= c('Romance','Action')) # covert genre column into a factor
summary(movie[c("kick",'kiss')]) # do not need to normalize
######data partition
movie_train<- movie[1:6,2:3]
movie_test<-movie[7,2:3]
movie_train_label <- movie[1:6,4]
######classification
movie_test_matrix <-rbind( movie_test, movie_test, movie_test,movie_test,movie_test,movie_test)
movie_test_matrix
distances <- sqrt(apply((movie_test_matrix-movie_train)**2,1,sum))
sortedDistIndicies <- order(distances) #rearrange disctances into ascending order ( index)
#distances[order(distances)] #sort by distances
#k <- readline(prompt('enter k value'))
classCount <- movie_train_label[sortedDistIndicies[c(1:3)]]
classCount
sortedClassCount <-table(classCount)
sortedClassCount
movie_test_pred<-names(sortedClassCount[sortedClassCount==max(sortedClassCount)])
movie_test_pred
########plot graph
plot(movie[1:6,]$kick~movie[1:6,]$kiss, data=movie[1:6,], col=alpha(c('red','blue'),0.7)[movie[1:6,]$genre], xlab='kiss count', ylab='kick count', main='movie data')
points(movie[7,]$kiss,movie[7,]$kick, data=movie[7,], pch=15, cex=1.2, col = 'orange')
legend('topright', c(levels(movie$genre), "test"), pch =c(1,1,15), col=c(alpha(c('red','blue'),0.7),'orange'), cex=0.9)
######using packages######################################################
### Data load
movie<-read.csv('/Users/misoni/Desktop/movie.csv',header=F, stringsAsFactors=F)
colnames(movie)<-c("title","kick","kiss","genre")
movie$genre<-factor(movie$genre, levels= c('Romance','Action'))
summary(movie[c("kick",'kiss')])
##normalization
#normalize <-function(x) {
# return ( (x-min(x)) / (max(x)-min(x)) )
#}
####split data
movie_train <- movie[1:6,2:3]
movie_test <- movie[7,2:3]
movie_train
movie_test
movie_train_label <- movie[1:6,4]
movie_test_label <- movie[7,4]
movie_test_label
####modeling
movie_test_pred <- knn(train=movie_train, test=movie_test, cl=movie_train_label, k=3,prob=T)
movie_test_pred
table(movie_test_pred)
library(gmodels)
#CrossTable(x=movie_test_label, y=movie_test_pred)
#####################################################################
###########iris data#######################################################
########normalize data
str(iris)
table(iris$Species)
normalize<-function(x){
return ((x-min(x))/ (max(x)-min(x)))
}
iris_n <- as.data.frame(lapply(iris[1:4], normalize ))
#########split data
set.seed(1)
train <- round(0.7*dim(iris)[1])
train_index = sample(1:dim(iris)[1], train, replace =F)
iris_train <- iris_n[train_index,]
iris_test <- iris_n[-train_index,]
iris_train_label <- iris[train_index,5]
iris_test_label <- iris[-train_index,5]
iris_train_label
prop.table(table(iris_train_label))
prop.table(table(iris_test_label))
###
###########modeling
iris_test_pred <- knn(train=iris_train, test=iris_test, cl=iris_train_label, k=3, prob=T)



CrossTable(iris_test_label,iris_test_pred)
Cell Contents
|-------------------------|
| N |
| Chi-square contribution |
| N / Row Total |
| N / Col Total |
| N / Table Total |
|-------------------------|
Total Observations in Table: 45
| iris_test_pred
iris_test_label | setosa | versicolor | virginica | Row Total |
----------------|------------|------------|------------|------------|
setosa | 15 | 0 | 0 | 15 |
| 20.000 | 5.000 | 5.000 | |
| 1.000 | 0.000 | 0.000 | 0.333 |
| 1.000 | 0.000 | 0.000 | |
| 0.333 | 0.000 | 0.000 | |
----------------|------------|------------|------------|------------|
versicolor | 0 | 13 | 0 | 13 |
| 4.333 | 17.333 | 4.333 | |
| 0.000 | 1.000 | 0.000 | 0.289 |
| 0.000 | 0.867 | 0.000 | |
| 0.000 | 0.289 | 0.000 | |
----------------|------------|------------|------------|------------|
virginica | 0 | 2 | 15 | 17 |
| 5.667 | 2.373 | 15.373 | |
| 0.000 | 0.118 | 0.882 | 0.378 |
| 0.000 | 0.133 | 1.000 | |
| 0.000 | 0.044 | 0.333 | |
----------------|------------|------------|------------|------------|
Column Total | 15 | 15 | 15 | 45 |
| 0.333 | 0.333 | 0.333 | |
----------------|------------|------------|------------|------------|