1.지도학습 : 정답이 있는 데이터로 기계를 학습 시키는 것
ex ) knn, naivebayes, decision tree, one R, riper, regression, neural network, support vector machine
2. 비지도 학습 : 학습이 없는 데이터로 기계를 학습 시키는 것
apriori : 방대한 데이터에서 연관규칙을 찾기 위한 3가지 성능 척도
(지지도 : P(A∩B), 신뢰도 : P(B|A) , 향상도)
k-means
3. 강화학습 : 환경만 기계에게 주고 환경을 기계가 스스로 이해해 나가면서 데이터를 스스로 만들어 학습하는 것
76 k-means 이론
k-means 알고리즘은 주어진 데이터를 k개의 클러스터로 묶는 알고리즘으로 각 클러스터와 거리차이의 분산을 최소화하는 방식으로 동작하는 알고리즘.
ㅇknn 알고리즘
ㅇk-means는 데이터의 라벨링이 없는 것을 알아내는 것
기계가 알아서 군집화시켜서 분류함
ㅇ 현업에서 k-means의 사례
1. 병원에서 암판별 머신러닝 모델을 만드는데 라벨링이 있는 데이터를 지도학습 시킬 때 비지도 학습도 같이 사용해서 모형의 정확도를 올리는데 참고하고 있음
2. 마케팅쪽에서는 세그멘테이션(segmentation)에 활용. 고객들을 특성에 맞는 사람들끼리 군집화
3. 보험회사에서도 고객들을 segmentation을 해서 맞춤형 보험상품 개발 및 광고에 활용
4. 미국의 유명한 사례 중 경찰의 순찰 지역을 정하는데 활용을 해서 범죄율을 줄이는데 사용하고 있음. ex)마이너리티 리포트
5. 보험 신청 건수들 중에서 사기성이 있어 보이는 것을 걸러내는 작업을 할 때 사용
6. 통신사에서 기지국을 세울 때 활용
ㅇk-means의 원리
1. 군집의 갯수를 몇 개로 할 지 정함
( 양성종양, 악성 종양을 각각 군집화 할 경우 k = 2 / 보험회사 고객들을 4개의 분류로 나눠서 각각의 분류에 속한 사람들의 특징을 파악해서 분류하고 싶다면 k = 4 )
2. 그림처럼 6개의 데이터가 있고 k를 2로 했다면 6개의 데이터 중에 랜덤으로 2개를 골라 각각 해당 군집의 중심점으로 잡음.
3. 4개의 데이터와 2개의 중심점과의 거리를 계산해 자기와 가장 가까운 중심점을 하나의 굼짐으로 묶어줌
4. 묶을 데이터들 끼리의 평균값을 구해서 새로운 중심점을 구해줌
5. 이 새로운 중심점 2개와 나머지 4개와의 거리를 다시 계산해서 자기와 가장 가까운 중심점의 군집으로 군집화 시킴
6. 더 이상 중심점의 이동이 없을 때가지 위의 작업을 반복함.
7. 더 이상 중심점의 이동이 없는 최종적인 군집이 최종 군집이 됨.
> 중심점과 데이터와의 거리를 계산할 때 유클리드 거리 계산 공식을 이용함.
문제408. 아래의 두 점의 유클리드 거리를 구하시오
a <- c(2,5)
b <- c(4,7)
sqrt(sum((b-a)^2)) #2.828427
77 R 로 k-means 모델 만들기
#1. 기본 데이터셋
#2. 데이터셋으로 plot그래프 생성
#3. k-means모델을 생성해 중앙지점을 찾음
#4. 중앙지점 시각화
#5. 원래 데이터를 같이 중앙지점과 시각화 시킴
#1. 기본 데이터셋
c <- c(3,4,1,5,7,9,5,4,6,8,4,5,9,8,7,8,6,7,2,1)
row <- c('A','B','C','D','E','F','G','F','I','J')
col <- c('X','Y')
data <- matrix(c, nrow = 10, ncol = 2, byrow = TRUE, dimnames = list(row,col))
data
#2. 데이터셋으로 plot그래프 생성
plot(data)
#3. k-means모델을 생성해 중앙지점을 찾음
km <- kmeans(data,2) #k값 2
km
K-means clustering with 2 clusters of sizes 5, 5
Cluster means: > 최종적으로 찾은 중앙지점 2개(k값이 2니까)
X Y
1 3 3.8
2 7 8.0
Clustering vector: > 각각의 데이터를 몇 번 군집으로 군집화 했는지 보여줌
A B C D E F G F I J
1 1 2 1 2 1 2 2 2 1
#4. 중심점 시각화
plot(round(km$centers), col = c('indianred','steelblue'), pch = 21, bg = c('indianred','steelblue'),
xlim = range(0:10), ylim = range(0:10), cex = 1.5 )
#4. 중심점 시각화
plot(round(km$centers), col = c('indianred','steelblue'), pch = 21, bg = c('indianred','steelblue'),
xlim = range(0:10), ylim = range(0:10), cex = 1.5 )
par(new = T) # 두 개의 그래프를 합칠 때 사용
plot(data, col = c("red","blue"), xlim = range(0:10), ylim =range(0:10))
> 이 방법보다는 중심점의 바운더리를 만들어주는 시각화에 더 효과적인 방법을 사용해 보겠음
install.packages("factoextra")
library(factoextra)
km <- kmeans(data,2)
fviz_cluster(km, data = data, stand = F)
+) 군집 분류 보고 싶을 때
km$cluster #군집분류
cbind(data, km$cluster)
문제409. 아래의 데이터를 3개의 군집으로 분류해서 시각화 하시오.
c <- c(10,9,1,4,10,1,7,10,3,10,1,1,6,7)
row <- c('apple','bacon','banana','carrot','salary','cheese','tomato')
col <- c('X','Y')
data <- matrix(c, nrow = 7, ncol = 2, byrow = TRUE, dimnames = list(row, col))
data
library(factoextra)
set.seed(1)
km <- kmeans(data,3)
fviz_cluster(km, data = data, stand = F)
문제410. (점심시간 문제) 위의 그림의 군집을 2개로 나눠서 시각화 하시오.
c <- c(10,9,1,4,10,1,7,10,3,10,1,1,6,7)
row <- c('apple','bacon','banana','carrot','salary','cheese','tomato')
col <- c('X','Y')
data <- matrix(c, nrow = 7, ncol = 2, byrow = TRUE, dimnames = list(row, col))
data
library(factoextra)
set.seed(1)
km <- kmeans(data,2)
fviz_cluster(km, data = data, stand = F)
ㅇ국영수 성적 데이터로 학생들 군집화 하기
데이터 : academy.csv
"수학점수와 영어점수로 4개의 군집 생성하기"
#1. 데이터 로드
academy <- read.csv("c:\\data\\academy.csv")
head(academy)
nrow(academy) #52건
#2. 수학점수, 영어점수 선택
a2 <- academy[,c(3,4)]
#3. 4개의 군집 생성(k=4)
# 두 과목 다 잘하는 군집, 두 과목 다 못하는 군집, 영어만 잘하는 군집, 수학만 잘하는 군집
plot(a2)
set.seed(1)
km <- kmeans(a2,4)
km
Cluster means:
수학점수평균 영어점수평균
1 83.72222 65.00000
2 87.17647 85.64706
3 59.81818 77.27273
4 47.83333 44.16667
#4. 학생번호, 수학점수, 영어점수, 군집번호를 같이 출력
result <- cbind(academy[,c(1,3,4)], km$cluster)
result
#5. 군집 시각화
library(factoextra)
fviz_cluster(km, data = a2, stand = F)
유방암 데이터로 악성 종양과 양성 종양을 분류하는 지도학습 머신러닝 모델을 생성했었음. 과연 비지도 학습(k-means)으로도 분류할 수 있을까?
ㅇ유방암 데이터의 악성 종양과 양성 종양을 k-means 알고리즘으로 2개로 군집화해서 분류해보기
"정답 없이 데이터만 보고 분류하는 알고리즘"
#1. 데이터 로드
#2. 필요한 컬럼 선택
#3. 비지도 학습으로 2개로 군집화
#4. 시각화
#5. 마침 정답이 있는 데이터이므로 비지도 학습 모델이 얼마나 잘 맞췄는지 정확도를 확인해 봄
(원래 비지도 학습은 성능평가 할 게 없음. 이 데이터는 정답 데이터가 있으므로 한 번 해보는 것)
#1. 데이터 로드
wisc <- read.csv("c:\\data\\wisc_bc_data.csv") #비지도학습이라서 Factor로 가져올 필요 없음
nrow(wisc) #569건
ncol(wisc) #32개의 컬럼
head(wisc)
#2. 필요한 컬럼 선택(환자번호와 정답 데이터 제외)
wisc2 <- wisc[,3:32]
head(wisc2)
#3. 비지도 학습으로 2개로 군집화
km <- kmeans(wisc2, 2)
km
cbind(wisc[,c(1,2)],km$cluster)
#4. 시각화
library(factoextra)
fviz_cluster(km, data = wisc2, stand = F)
#5. 마침 정답이 있는 데이터이므로 비지도 학습 모델이 얼마나 잘 맞췄는지 정확도를 확인해 봄
library(gmodels)
CrossTable(wisc$diagnosis, km$cluster)
> 486/569 #0.8541301의 정확도를 보이고 있음
> k-means 비지도 학습 구현시 성능을 올리기 위해 반드시 해야하는 작업?
k-means 비지도 학습이 이상치에 민감. 그래서 이상치의 영향력을 줄일 수 있는 정규화 작업을 해줘야함.(0~1사이의 데이터로 변경)
그림처럼 이상치 하나 때문에 분류가 이상하게 되어버림. 그래서 이상치의 영향력을 작게 만드는 작업 필요. 모든 데이터 0~1사이로 정규화해주면 됨.
문제411. 위의 유방암 데이터를 min/max 정규화하고 다시 비지도 학습을 시켜 정확도를 확인해보시오.
#1. 데이터 로드
wisc <- read.csv("c:\\data\\wisc_bc_data.csv") #비지도학습이라서 Factor로 가져올 필요 없음
nrow(wisc) #569건
ncol(wisc) #32개의 컬럼
head(wisc)
#2. 필요한 컬럼 선택(환자번호와 정답 데이터 제외)
wisc2 <- wisc[,3:32]
head(wisc2)
#3.데이터 정규화
normalize <- function(x){return( (x-min(x)) / (max(x)-min(x)))}
wisc3 <- sapply(wisc2, normalize)
#4. 비지도 학습으로 2개로 군집화
set.seed(1)
km <- kmeans(wisc3, 2)
km
cbind(wisc[,c(1,2)],km$cluster)
#5. 시각화
library(factoextra)
fviz_cluster(km, data = wisc3, stand = F)
#6. 마침 정답이 있는 데이터이므로 비지도 학습 모델이 얼마나 잘 맞췄는지 정확도를 확인해 봄
library(gmodels)
CrossTable(wisc$diagnosis, km$cluster)
528/569 #0.9279438
> 528/569 #0.9279438 정확도도 개선되고 FN값도 많이 줄어들었음을 확인할 수 있음.
문제412. iris2.csv 데이터를 이용해서 아이리스 꽃 품종을 k-means로 분류하는 모델을 생성하시오.
군집을 3개로 나누시오.
#1. 데이터 로드
iris <- read.csv("c:\\data\\iris2.csv")
ncol(iris) #5개 컬럼
nrow(iris) #150건
head(iris) #label컬럼 = Species
#2. 컬럼 선별
iris2 <- iris[,-5]
#3. k-means 군집화
set.seed(1)
km_iris <- kmeans(iris2, 3)
km_iris
#4. 시각화
library(factoextra)
fviz_cluster(km_iris, data = iris2, stand = F)
#5. 정확도 비교
cbind(iris[,c(5)], km_iris$cluster)
a <- ifelse(km_iris$cluster == 3, "Iris-setosa", ifelse(km_iris$cluster == 1, "Iris-versicolor", "Iris-virginica" ))
library(gmodels)
CrossTable(iris$Species, a)
sum(iris$Species == a) / length(a) #0.8933333
#6. 정규화 후 다시 진행
normalize <- function(x){return( (x - min(x)) / (max(x)-min(x)) )}
iris3 <- sapply(iris2, normalize)
set.seed(1)
km_iris_norm <- kmeans(iris3, 3)
km_iris_norm
fviz_cluster(km_iris_norm, data = iris3, stand = F)
cbind(iris[,c(5)], km_iris_norm$cluster)
b <- ifelse(km_iris$cluster == 3, "Iris-setosa", ifelse(km_iris$cluster == 1, "Iris-versicolor", "Iris-virginica" ))
sum(iris$Species == b) / length(b) #0.8933333 정확도
78 파이썬으로 k-means 모델 만들기
#1. 데이터 로드
#2. 군집에 필요한 컬럼들만 선택
#3. data 시각화
#4. kmeans함수로 2개의 데이터 군집화
#1. 데이터 셋
import numpy as np
import pandas as pd
c = np.array([3,4,1,5,7,9,5,4,6,8,4,5,9,8,7,8,6,7,2,1]).reshape(10,2)
row = ['A','B','C','D','E','F','G','H','I','J']
col = ['X','Y']
df = pd.DataFrame(c, columns = col, index = row)
df
#2. 위의 데이터 프레임의 x와 y컬럼을 각각 x좌표와 y좌표로 시각화 하시오
import seaborn as sns
sns.set_style('whitegrid')
sns.swarmplot(x='X',y='Y', data = df, size = 7, color = 'steelblue')
#3. k-means 모델 생성(군집 2개)
from sklearn.cluster import KMeans
model = KMeans(n_clusters = 2, random_state = 1)
#4. 군집화한 결과 확인
model.fit(df)
km = model.labels_
#5. df 파생변수 = km, 컬럼명 cluster
df['cluster'] = km
df
import matplotlib.pyplot as plt
ft1 = df[:][df.cluster == 1]
ft0 = df[:][df.cluster == 0]
plt.scatter(ft1.iloc[:,0],ft1.iloc[:,1], color = 'indianred' )
plt.scatter(ft0.iloc[:,0],ft0.iloc[:,1], color = 'steelblue' )
plt.show()
문제413. 아래의 데이터 프레임을 생성하고 2개의 군집으로 군집화 하시오
import seaborn as sns
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
#1. 데이터 로드
item = pd.DataFrame( {'ingredient': ['apple','bacon','banana','carrot','celery','cheese'],
'sweetness':[10,1,10,7,3,1],
'crunchiness':[9,4,1,10,10,1],
'food_type':['fruit','protein','fruit','vegetable','vegetable','protein']} )
#2. 위의 데이터 프레임의 x와 y컬럼을 각각 x좌표와 y좌표로 시각화 하시오
sns.set_style('whitegrid')
sns.swarmplot(x='sweetness',y='crunchiness', data = item, size = 7, color = 'steelblue')
#3. 3개의 군집으로 군집화
df2 = item.iloc[:,[1,2]] #필요한 데이터 선택
model = KMeans(n_clusters = 3, random_state = 1)
model.fit(df2)
km = model.labels_
item['cluster'] = km
item
#4. 시각화
ft0 = item[:][item.cluster == 0]
ft1 = item[:][item.cluster == 1]
ft2 = item[:][item.cluster == 2]
plt.scatter(ft0.iloc[:,1],ft0.iloc[:,2],color = 'indianred' )
plt.scatter(ft1.iloc[:,1],ft1.iloc[:,2], color = 'steelblue' )
plt.scatter(ft2.iloc[:,1],ft2.iloc[:,2], color = 'green' )
plt.show()
문제414. (오늘의 마지막 문제) 국영수 데이터(academy.csv)를 파이썬으로 4개의 군집으로 군집화하고 시각화하시오.
import pandas as pd
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
#1. 데이터 로드
acdm = pd.read_csv("c:\\data\\academy.csv", encoding = 'CP949')
acdm.head()
#2. 필요한 컬럼 선택(수학, 영어)
acdm2 = acdm.iloc[:,[2,3]] # 2: 수학점수, 3: 영어점수
#3. 군집화
model = KMeans(n_clusters = 4, random_state = 1)
model.fit(acdm2)
#4. 군집된 결과 파생변수로 추가
acdm['cluster'] = model.labels_
#5. 시각화
ft_list = [ 'ft' + str(i) for i in range(4)]
for i,k in enumerate(ft_list):
globals()[k] = acdm[:][acdm.cluster == i]
plt.scatter(globals()[k].iloc[:,2], globals()[k].iloc[:,3]) # 2: 수학점수, 3: 영어점수
plt.show()
'Study > class note' 카테고리의 다른 글
머신러닝 / k-means 함수를 파이썬으로 직접 만들기 (0) | 2022.03.02 |
---|---|
머신러닝 / 파이썬으로 k-means 모델 만들기2 (0) | 2022.03.02 |
머신러닝 / 파이썬으로 연관규칙 모델 구현하기 (0) | 2022.02.25 |
머신러닝 / 연관규칙 이론, R 로 연관규칙 모델 구현하기 (0) | 2022.02.24 |
머신러닝 / 파이썬으로 서포트 벡터 머신 모델 만들기 (0) | 2022.02.24 |