붓꽃 데이터 시각화 - 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()
# 데이터셋에 대한 설명 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)

Toplist

최신 우편물

태그