flowchart TD
A['1단계 패키지 설정'] --> B['2단계 데이터 준비'] --> C['3단계 탐색적 데이터분석'] --> D['4단계 피처 스케일링'] --> E['5단계 모형화 및 학습'] --> F['6단계 예측']
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
import numpy as np
import matplotlib.pyplot as plt
# 학습용 데이터
# 입력.
X_train = np.array([[25, 25],
[33, 30],
[38, 30],
[45, 35],
[28, 40]])
# 라벨.
y_train = np.array([0,0,1,1,0])
# 테스트용 데이터(새로운 개체)
X_test = np.array([[30, 35]]) # 새로운 개체의 X1, X2
# 산포도.
# 학습용 데이터.
plt.scatter(X_train[:,0], X_train[:,1], c = y_train)
# 테스트용 데이터.
plt.scatter(X_test[:,0], X_test[:,1], c = 'red', marker = 'D', s = 100)
plt.xlabel('x1')
plt.ylabel('x2')
plt.show()

# 피처 스케일링: 학습용 데이터.
scalerX = StandardScaler()
scalerX.fit(X_train)
X_train_std = scalerX.transform(X_train)
print(X_train_std)

# 피처 스케일링 : 테스트용 데이터.
X_test_std = scalerX.transform(X_test)
print(X_test_std)

# 모형화.
knn = KNeighborsClassifier(n_neighbors=3, metric='euclidean')
# 학습.
knn.fit(X_train_std, y_train)
# 에측.
pred = knn.predict(X_test_std)
print(pred)
#클래스별 확률 값을 반환.
knn.predict_proba(X_test_std)

# 인접한 k개의 개체들에 대한 거리와 색인을 반환.
dist,index = knn.kneighbors(X_test_std)
print(dist)
print(index)

K-NN의 꽃잎 분류에의 적용 예.
K-NN의 장단점과 활용 분야.
K-NN의 활용 분야.
# 새로운 값을 분류할 때 .predict() 사용.
unknown_points = [
[0.2,0.1,0.7],
[0.4,0.7,0.6],
[0.5,0.8,0.1]
]
guesses = classifier.predict(unknown_points)
print(guesses)

from sklearn.datasets import load_iris
iris = load_iris()
print(iris.data)

# 4개의 특징 이름을 출력.
print(iris.feature_names)

# 정수는 꽃의 종류를 나타낸다.: 0 = setosa, 1 = versicolor, 2 = virginica
print(iris.target)

from sklearn.model_selection import train_test_split
X = iris.data
y = iris.target
# (80:20)으로 분할.
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state=4)
print(X_train.shape)
print(X_test.shape)

from sklearn.neighbors import KNeighborsClassifier
from sklearn import metrics
knn = KNeighborsClassifier(n_neighbors=6)
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)
scores = metrics.accuracy_score(y_test, y_pred)
#0 = setosa, 1 = versicolor, 2 = virginca
classes = {0:'setosa', 1:'versicolor', 2:'virginca'}
# 아직 보지 못한 새로운 데이터를 제시해보자.
x_new = [[3,4,5,2],
[5,4,2,2]]
y_predict = knn.predict(x_new)
print(classes[y_predict[0]])
print(classes[y_predict[1]])
