Quiet Time

■ 어제까지 배운 내용 R 내용 복습

  1. R 기본 문법 수업 : 1주일
  2. R 기계 학습 : 
          -2장 : 기계학습 책에 나오는 내용을 이해하기휘한 기본 문법과 함수 소개하는 내용
          -3장 : knn           
               -소개팅
               -과일
               -유방암
               -폐암
          -4장 : 나이브 베이즈
          -5장 : 결정트리
 
 
■ 3장. knn (최근접 이웃을 사용한 분류의 이해)
 
  • 머신러닝의 종류
  • 1.지도학습
    • -분류:knn
    • -회귀: 
  • 2.비지도학습
  • 3.강화학습
          
               
▦ 3장 목차 
  1. knn(k-Nearest Neighbors) 란 무엇인가?
  2. knn(k-Nearest Neighbors)이 필요한 이유?
  3. knn(k-Nearest Neighbors)의 분류의 이해 
  4. knn(k-Nearest Neighbors)의 분류 실습1( 소개팅 데이터 )
  5. knn(k-Nearest Neighbors)의 분류 실습2( 과일 데이터 )
  6. 적당한 k 값 선택
  7. knn(k-Nearest Neighbors)의 분류 실습3(유방암 데이터)
  8. knn(k-Nearest Neighbors)의 분류 실습4(붓꽃 데이터)
  9. knn(k-Nearest Neighbors)의 분류 실습5(폭력과 멜로 분류) 
  10. knn(k-Nearest Neighbors)의 분류 실습6(폐암 데이터) 

▦ 1. knn(k-Nearest Neighbors) 란 무엇인가? 
- 사회적인 관계 관찰해보면?
 대략적으로 비슷한 사람끼리 모이는 성질이 있다.
 비슷한 취향의 사람들끼리 모여서 동호회를 만들고
 비슷한 부류의 계층의 사람들끼리 친분을 맺기도 한다.

- 공간적인 관계를 관찰해보면?
가구점이 모이는 상가지역이 따로 형성이 되어 있거나 
한약방이 밀집되어 있는 지역이 따로 모여있는 경우가 많다.(제기동)

이런 특성을 가진 데이터를 겨냥해서 만들어진 알고리즘이 knn이다.

▦ 2. knn(k-Nearest Neighbors)이 필요한 이유?

- knn 이 왜 필요한지?
 "유방암 종양의 크기에 대한 데이터( 반지름 , 둘레, 면적등 ) 만 
  가지고 이 종양이 악성인지 양성인지를 미리 예측할 수 있다면 
  환자에 대한 치료 스케쥴에 큰 영향을 미칠 수 있다."

- 암 발견과 치료과정 : 
  1. 건강검진 -----> 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 데이터를 알고리즘에 맞게 잘 정제하는 작업이 필요하다 .

  1. 표준화 : R 에서는 scale()이라는 함수를 통해서 
          -1 ~ 1 사이의 데이터로 변경한다. 
     ( 키는 cm 이고 몸무게는 kg니까 서로 데이터의 범위가 달라서 
       결과가 잘 날올리가 없지 ~ 그래서 scale함수로 키와 몸무게를 
       -1 ~ 1 사이의 데이터로 변경을 해주어요 ~ )
    ====> 표준화 

  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')



  1. 테스트 데이터를 만든다 ( 앞으로 ㅅㄱㅁ만나게 될 남학생의 데이터) 
test <- data.frame(talk=70, book=50, travel=30 , school=70, tall=70, skin=40, muscle=50)

test


test 데이터의 남학생이 1타입,2타입,3타입 인지를 알아내고자 한다. 
  1. 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$월수입)

  1. 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"))

box()


▩ 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$genrelevels= 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_testmovie_testmovie_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,]$kissdata=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,]$kickdata=movie[7,], pch=15cex=1.2col = '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$genrelevels= 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_traintest=movie_testcl=movie_train_labelk=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], trainreplace =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_traintest=iris_testcl=iris_train_labelk=3, prob=T)

table(iris_test_pred)














 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 |            |
----------------|------------|------------|------------|------------|






















 

'R(알) ' 카테고리의 다른 글

R 5장. 결정트리  (0) 2017.09.08
R 4장. 나이브 베이즈의 이해활용한 기계학습4  (0) 2017.09.08
R 1장 R기본문법  (0) 2017.09.08
R 3장. knn (최근접 이웃을 사용한 분류의 이해)  (0) 2017.07.14
R 1장 R기본문법  (0) 2017.07.06