본문 바로가기
AI/Machine Learning

[ML] 붓꽃의 품종 분류(지도학습 / 분류)

by 안녕나는현서 2021. 4. 29.
728x90
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()

# 데이터셋에 대한 설명

print(iris_dataset['DESCR'][:193]+'\n')

# 예측하려는 붓꽃의 품종 이름

iris_dataset['target_names']

# 특성
# sepal은 꽃받침, petal은 꽃잎

iris_dataset['feature_names']

# 실제 데이터는 target과 data에 들어있음

# 샘플의 수 확인
iris_dataset['data'].shape

iris_dataset['data'][:5]

# target 데이터 확인
iris_dataset['target'].shape

iris_dataset['target'] # 0 : setosa, 1 : versicolor, 2 : virginica

 

- 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

X_test.shape

# 데이터 분석 : 시각화

# 산점도 그래프를 그리기 위해서는 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)
# 산점도 그래프를 보아 세 클래스가 꽃잎과 꽃받침의 측정값에 따라 잘 구분됨을 알 수 있음

 

- Choose a model

from sklearn.neighbors import KNeighborsClassifier

knn = KNeighborsClassifier(n_neighbors=1)

 

- Train the model

knn.fit(X_train, y_train)

 

- 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

# 모델 평가하기

# 검증데이터에 대해 예측
y_pred = knn.predict(X_test)
y_pred

# 정확도 계산하기1
np.mean(y_pred==y_test)

# 정확도 계산하기2
knn.score(X_test, y_test)

=> 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)

 

- Evaluate the model

knn.score(X_test, y_test)

 

- 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')

# k값이 5일 경우

knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)

knn.score(X_test, y_test)

728x90

'AI > Machine Learning' 카테고리의 다른 글

[ML] 경사하강법 - 편미분  (0) 2021.05.10
[ML] 경사하강법- 미분  (0) 2021.05.10
[ML] KNN - bmi model  (0) 2021.04.29
[ML] 일반화, 과대적합, 과소적합  (0) 2021.04.29
[ML] KNN 알고리즘 - AND, XOR 연산  (0) 2021.04.29

댓글