붓꽃 데이터 시각화 - buskkoch deiteo sigaghwa

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

- Data Collection

from sklearn.datasets import load_iris
iris_dataset = load_iris()
iris_dataset.keys()
붓꽃 데이터 시각화 - buskkoch deiteo sigaghwa
# 데이터셋에 대한 설명

print(iris_dataset['DESCR'][:193]+'\n')
붓꽃 데이터 시각화 - buskkoch deiteo sigaghwa
# 예측하려는 붓꽃의 품종 이름

iris_dataset['target_names']
붓꽃 데이터 시각화 - buskkoch deiteo sigaghwa
# 특성
# sepal은 꽃받침, petal은 꽃잎

iris_dataset['feature_names']
붓꽃 데이터 시각화 - buskkoch deiteo sigaghwa
# 실제 데이터는 target과 data에 들어있음

# 샘플의 수 확인
iris_dataset['data'].shape
붓꽃 데이터 시각화 - buskkoch deiteo sigaghwa
iris_dataset['data'][:5]
붓꽃 데이터 시각화 - buskkoch deiteo sigaghwa
# target 데이터 확인
iris_dataset['target'].shape
붓꽃 데이터 시각화 - buskkoch deiteo sigaghwa
iris_dataset['target'] # 0 : setosa, 1 : versicolor, 2 : virginica
붓꽃 데이터 시각화 - buskkoch deiteo sigaghwa

- Data Preparation

# 훈련데이터와 테스트데이터 분리

#train_test_split(arrays,          # 분할 시킬 데이터를 입력
#                test_size,        # 테스트 데이터셋의 비율
#                train_size,       # 학습 데이터셋의 비율
#                random_state,     # 데이터 분할 시 셔플이 이루어지는데 이를 위한 시드값
#                shuffle,          # 셔플여부 설정
#                stratify          # 지정한 데이터의 비율을 유지
#                )

from sklearn.model_selection import train_test_split

# train_test_split함수는 디폴트값이 75%의 훈련데이터, 25%의 테스트데이터
X_train, X_test, y_train, y_test = train_test_split(iris_dataset['data'], iris_dataset['target'], random_state = 0)
X_train.shape
붓꽃 데이터 시각화 - buskkoch deiteo sigaghwa
X_test.shape
붓꽃 데이터 시각화 - buskkoch deiteo sigaghwa
# 데이터 분석 : 시각화

# 산점도 그래프를 그리기 위해서는 Numpy배열을 Pandas DataFrame으로 변환해야함
print(X_train.astype)
iris_dataframe = pd.DataFrame(X_train, columns = iris_dataset.feature_names)

# 산점도(scatter) 그리기
# c : 색상, marker : 마커 모양, hist_kwds : 히스토그램 개수, s : 마커 사이즈, alpha : 투명도
pd.plotting.scatter_matrix(iris_dataframe, c = y_train, figsize = (15,15), marker = 'o', hist_kwds = {'bins' : 20},
                          s = 60, alpha = .8)
# 산점도 그래프를 보아 세 클래스가 꽃잎과 꽃받침의 측정값에 따라 잘 구분됨을 알 수 있음
붓꽃 데이터 시각화 - buskkoch deiteo sigaghwa

- Choose a model

from sklearn.neighbors import KNeighborsClassifier

knn = KNeighborsClassifier(n_neighbors=1)

- Train the model

knn.fit(X_train, y_train)
붓꽃 데이터 시각화 - buskkoch deiteo sigaghwa

- Evaluate the model

#예측하기

# 만약 야생에서 꽃받침의 길이가 5cm, 폭이 2.9cm, 꽃잎의 길이가 1cm, 폭이 0.2cm인 붓꽃을 보았다면
X_new = np.array([[5, 2.9, 1, 0.2]])
prediction = knn.predict(X_new)
prediction
# 예측값이 0 즉, setosa
붓꽃 데이터 시각화 - buskkoch deiteo sigaghwa
# 모델 평가하기

# 검증데이터에 대해 예측
y_pred = knn.predict(X_test)
y_pred
붓꽃 데이터 시각화 - buskkoch deiteo sigaghwa
# 정확도 계산하기1
np.mean(y_pred==y_test)
붓꽃 데이터 시각화 - buskkoch deiteo sigaghwa
# 정확도 계산하기2
knn.score(X_test, y_test)
붓꽃 데이터 시각화 - buskkoch deiteo sigaghwa

=> 97%의 확률로 붓꽃의 품종을 정확히 맞춤

+)

  • 산점도 그래프를 보면 sepal length, sepal width 2개의 특성만 가지고도 분류가 가능해보임
  • 2개의 특성만 학습하여 머신러닝을 수행해보자

- Data Preparation

# 훈련데이터와 테스트데이터로 나누기

X_train, X_test, y_train, y_test = train_test_split(iris_dataset['data'][:,:2], iris_dataset['target'], random_state = 0)

- Choose a model

from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=1)

- Train the model

knn.fit(X_train, y_train)
붓꽃 데이터 시각화 - buskkoch deiteo sigaghwa

- Evaluate the model

knn.score(X_test, y_test)
붓꽃 데이터 시각화 - buskkoch deiteo sigaghwa

- Hyperparameter tuning

# 하이퍼파라미터 튜닝(이웃의 수를 조절하며 정확도 보기)

from sklearn import metrics

train_list = []
test_list = []

for k in range(1, 20, 2) :
    knn = KNeighborsClassifier(n_neighbors=k)
    knn.fit(X_train, y_train)
    
    train_pred = knn.predict(X_train)
    train_score = metrics.accuracy_score(train_pred, y_train)
    train_list.append(train_score)
    
    test_pred = knn.predict(X_test)
    test_score = metrics.accuracy_score(test_pred, y_test)
    test_list.append(test_score)
plt.figure(figsize=(8,5))
plt.plot(range(1, 20, 2), train_list, label = 'Train acc')
plt.plot(range(1, 20, 2), test_list, label = 'Test acc')
plt.legend()
plt.xlabel('n_neighbors')
plt.ylabel('Accuracy')
plt.title('Iris')
붓꽃 데이터 시각화 - buskkoch deiteo sigaghwa
# k값이 5일 경우

knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)
붓꽃 데이터 시각화 - buskkoch deiteo sigaghwa
knn.score(X_test, y_test)
붓꽃 데이터 시각화 - buskkoch deiteo sigaghwa