반응형

데이터마이닝 수업 듣다가.. 코드부분은 2학년때 배웠던 것들이라 슝슝 넘어가서 정리할겸 상세하게 써본다.

실습 예제는 iris data set이다. 여기서 0, 1행(Sepal length, Sepal width)를 data로 넣어 target(Type)을 구할 것이다.

1. 패키지 import

import numpy as np

import matplotlib.pyplot as plt

from matplotlib.colors improt Listed Colormap

from sklearn import neighbors, datasets

// import 와 from의 차이:

import 모듈: 모듈 전체 추출. 일반적으로 이걸 씀. 후자(from 모듈) 사용할 경우 해당 변수와 코드에서 사용하는 변수와 겹칠우려.

from 모듈 import 변수나 함수: 모듈에서 필요한 변/함수만 추출

2. 데이터 로딩

n_neighbors = 15 #최근접 이웃 개수 미리 설정. k=15

iris = datasets.load_iris() # sklearn에 기본적으로 내장된 iris 데이터셋 로딩

print(iris) #로딩한 데이터 확인

print(iris.keys()) #데이터셋 종류 확인(딕셔너리 키값)

3. 데이터 확인 # iris key중 두개 keys에 대해 값 확인

print(iris.data)

print(iris.target)

4. 속성 두 개 선택

X = iris.data[ :, :2] #행은 전체를 가져오고, 열은 속성값 2개만. 2개만해야 그래프 그릴때 보기 쉬움

Y = iris.target #X에 따른 결과값

5. 추후 그래프 색칠위해 컬러맵 세팅

# Create color maps # http://htmlcolorcodes.com/

cmap_light = ListedColormap(['#FFAAAA', '#AAFFAA', '#AAAAFF']) # RGB Hex code

cmap_bold = ListedColormap(['#FF0000', '#00FF00', '#0000FF'])

6. 모델 생성, 데이터 피팅

#k-neighbors classifier를 생성하여 학습데이터에 맞춘다.

clf = neighbors.KNeighborsClassifier(n_neighbors, weights='uniform')

# weights='uniform' 거리 상관없이 주변에 있는 label들에 모두 동일한 점수를 측정하겠다.

clf.fit(X, Y)

사진 설명을 입력하세요.

7. 신규데이터 범위 세팅

#전체 영역 만들기

x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1 # 0열(sepal length)에서의 최소, 최대값

x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1 # 1열(sepal width)에서의 최소, 최대값

# 각 값을 출력해보자

8. 신규 좌표 만들기 - x1/x2축 눈금 확인 #np.meshgrid로 격자무늬 그물망 만듦

h= .02 #격자무늬 그물망 간격

xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, h), np.arange(x2_min, x2_max, h))

하나씩 뜯어보자.

np.arange(x1_min, x1_max, h) # h간격(0.02)로 x1_min(3.3) 에서 x1_max(8.9)까지 범위 설정

np.arange(x2_min, x2_max, h)

8.2. 신규 좌표 만들기 - X1/X2좌표 준비

h= .02 #격자무늬 그물망 간격

xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, h), np.arange(x2_min, x2_max, h)) #위랑 코드 같음.

X 좌표 Y 좌표

8.3. 신규 좌표 만들기 - X1/X2 매칭

x1/x2는 행렬 형태(2차원 배열)로 되어있으니 이것들을 1차원 배열로 바꿔줌

그게 xx1.ravel(), xx2.ravel().

그럼 각각은 220행 * 280열이었으니 61600행이 됨.

이것들을 쌍으로 만들어서 한 행렬로 만듦. 그럼 이것도 역시 61600행

np.c_[xx1.ravel(), xx2.ravel()]

9. Nearest Neighbor classification

z=clf.predict(np.c_[xx1.ravel(), xx2.ravel()])

#신규 샘플들에 대한 예측, 그 결과. target은 0, 1, 2뿐이었으므로 Z는 0, 1, 2만 있음

9-1. Z formatting

Z=Z.reshape(xx1.shape)

print(Z)

# z의 포맷(1차원)을 xx1 포맷(2차원)으로 바꿔줌.

for 그래프 그릴려고. 첨부터 2차원으로 하지 왜? -> predict는 2차원이 안됨

9-3. 그래프 준비

plt.figure() # 그래프 준비

plt.pcolormesh(xx1, xx2, Z, cmap=cmap_light)

/*

xx1, xx2를 pair로 점을 만들고, 그때 label에 해당하는 것이 z.

z는 위에서 0-2 사이 값이었고 . cmap_light는 아까 5번에서 3개 색을 넣어줬었음.

따라서 z가 0이라면 #FFAAAA 값이 그래프에 칠해짐.

*/

사진 설명을 입력하세요.

Z= 빨강: 0, 파랑: 1, 초록: 2

9-4. 학습 데이터 표시

plt.pcolormesh(xx1, xx2, Z, cmap=cmap_light) #배경(신규 좌표값, 그에 대한 예측결과를 표시)

plt.scatter(X[:, 0], X[:, 1], c=Y, cmap=cmap_bold, edgecolor='k', s=20) # 학습데이터 점 찍고

plt.xlim(xx1.min(), xx1.max()) #x,y 축 범위 수동지정인데 여기선 의미가 없어보인다.

plt.ylim(xx2.min(), xx2.max())

plt.title("3-Class classification (k=%i, weights='%s')" % (n_neighbors, 'uniform')) #제목 찍기

plt.show()

결론

그래프의 배경(pcolormesh)은

기존 X,Y 데이터의 각 최소-최대값을 구해 0.02간격으로 데이터셋을 나눠 다시 만들어준 예측값(Z)들이다.

실제 값들은(X[:,0],X[:,1]===> y) scatter 로 더 진하게(cmap_bold) 그려줌.

결국 예측값이나 실제값이나 거의 똑같은 것을 볼 수 있음.

scatter의 초록-파랑부분에 색이 섞인 이유는,

k-nearest 하다보니 주위가 파랑이 더 많으면 파랑, 초록이 더 많으면 초록이 되다보니 겹치는 구간에 색이 저렇게 나타남.

다음은 linear regression

반응형

+ Recent posts