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 |
댓글