#!/usr/bin/env python3
k_NN(k-최근접 이웃) Classifier[1]
분석을 위해 iris데이터를 로드합니다.
from sklearn.datasets import load_iris
iris = load_iris()
iris데이터의 형태는 다음의 코드로 확인할 수 있습니다.
print('''iris's key ==> {}'''.format(iris.keys()))
# iris's key ==> dict_keys(['data', 'target', 'target_names', 'DESCR', 'feature_names'])
print('''iris's shape ==> {}'''.format(iris.data.shape))
# iris's shape ==> (150, 4)
print('''iris's data의 처음 6행 ==> \n{}'''.format(iris.data[:6]))
# iris's data의 처음 6행 ==>
# [[5.1 3.5 1.4 0.2]
# [4.9 3. 1.4 0.2]
# [4.7 3.2 1.3 0.2]
# [4.6 3.1 1.5 0.2]
# [5. 3.6 1.4 0.2]
# [5.4 3.9 1.7 0.4]]
print('''iris's feature names ==> \n{}'''.format(iris.feature_names))
# iris's feature names ==>
# ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
머신러닝 데이터학습을 위해 데이터를 분할합니다. 이 방법은 앞으로도 계속 사용합니다.
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = \
train_test_split(iris.data, iris.target,
test_size=0.3, random_state=0)
이제 데이터를 분할했으니 머신러닝을 사용할 때입니다.
이번 포스팅에서는 가장 기본적인 KNN 최근접이웃 머신러닝을 사용합니다.
머신러닝 algorithm을 사용하기 위해서는 학습시킬 데이터를 fitting해야합니다.
from sklearn.neighbors import KNeighborsClassifier
# n_neighbors는 가장 가까운 이웃을 몇개를 고를지에 대한 parameter며
# n_jobs는 사용할 코어의 갯수 입니다. -1이면 모든 코어를 사용합니다.
knn = KNeighborsClassifier(n_neighbors=1, n_jobs=-1)
knn.fit(x_train, y_train)
sample data를 만들어 확인해보겠습니다.
import numpy as np
# ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
x_sample = np.array([[5, 2.9, 1, 0.2]])
prediction = knn.predict(x_sample)
results = {p:n for p, n in zip(prediction, iris.target_names[prediction])}
print('sample test ==> {}'.format(results))
# sample test ==> {0: 'setosa'}
knn(n_neighbors=1)를 이용하여 sample test 예측했을 때는 'setosa'라고 결과를 냈습니다.
이제 위에서 분할한 test data로 예측하면
prediction = knn.predict(x_test)
results = [iris.target_names[p] for p in prediction]
print('results의 처음 6개 ==> {}'.format(results[:6]))
# results의 처음 6개 ==> ['virginica', 'versicolor', 'setosa', 'virginica', 'setosa', 'virginica']
bins = np.bincount(prediction)
count = {n:c for n, c in zip(iris.target_names, bins)}
print('test 결과의 빈도수 ==> {}'.format(count))
# test 결과의 빈도수 ==> {'setosa': 16, 'versicolor': 17, 'virginica': 12}
정확도는 2가지 방법으로 구할 수 있습니다.
KNeighborsClassifier의 score메소드를 이용하거나 직접 계산하는 방법입니다.
print('score 메소드 이용 ==> {:.3f}'.format(knn.score(x_test, y_test)))
# score 메소드 이용 ==> 0.978
y_pred = knn.predict(x_test)
print('numpy 이용 ==> {:.3f}'.format(np.mean(y_pred == y_test)))
# numpy 이용 ==> 0.978
훈련 데이터를 시각화 해보겠습니다.
pandas를 이용할 것이기 때문에 훈련 데이터를 DataFrame으로 변환하고
열이름은 featre_names를 사용하겠습니다.
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rc('font', family='AppleGothic') # 한글출력
plt.rcParams['axes.unicode_minus'] = False # 축 - 표시
iris_df = pd.DataFrame(x_train, columns=iris.feature_names)
pd.scatter_matrix(iris_df,
c=y_train, # 색깔로 구분할 데이터
hist_kwds={'bins':30}, # 히스토그램
marker='o', # marker
s=20, # size
alpha=0.5) # 투명도
plt.show()
pandas를 이용한 scatter_matrix
이 그래프를 통해 훈련데이터의 개괄적인 정보를 한번에 파악할 수 있습니다.
참고 자료:
[1]Introduction to Machine Learning with Python, Sarah Guido