No sweet without sweat

[Machine Learning] - KNN_iris분류 본문

Machine Learning

[Machine Learning] - KNN_iris분류

Remi 2022. 9. 4. 01:32
728x90
반응형

1. 문제정의

- iris(붓꽃) 데이터를 활용

- 꽃잎 길이, 꽃잎 너비, 꽃받침 길이, 꽃받침 너비 4가지 특징을 통해 3가지 품종을 구분

- KNN모델의 이웃의 숫자를 조절해보자 (Hyperparameter)

2. 데이터수집 - sklearn 에서 제공하는 붓꽃 데이터 사용

1) 먼저 라이브러리 임포트

from sklearn.datasets import load_iris

2) 데이터 불러오기

load_iris()'

 

3) 변수에 저장

iris_data = load_iris()

4) keys 확인 .keys()

5) values 확인 .values()

6) 데이터 프레임 실제 값 확인하고 문제데이터 보기

iris_data['data']

7) 문제에 대한 정답 데이터 확인

iris_data['target']

- 정답 값이 0,1,2임을 확인할 수 있다.

8) 정답 데이터 이름 확인

0 -> setosa

1 -> versicolor

2 -> virginica

* 다른 데이터 상세 정보확인

print(iris_data['DESCR'])

 

* 데이터 경로 확인

print(iris_data['DESCR'])
iris_data['filename']

9) numpy를 이용해 데이터프레임 가져오기

(1) 라이브러리 임포트 해오기

import numpy as np import pandas as pd

(2) Dataframe 형성하기

pd.DataFrame(np.arange(10).reshape(5,-1))

-1의 의미는 행이나 열의 개수를 보고 자동으로 행 또는 열을 맞춰주는 기능이다.

3. 데이터 전처리

1) 문제 데이터 구성하기

iris_df = pd.DataFrame(iris_data['data'], # 어떤속성값인지 알고 columns = iris_data['feature_names']) # 어떤 속성 값인지 모를 때

 

2) 문제, 정답 데이터로 구분하기

X = iris_df # 문제 y = iris_data['target'] # 정답

# 문제는 보통 2차원으로 구성되어있음 (행/열)

# 정답은 1차원으로 이루어져 있음 (백터배열은 소문자를 사용)

3) 데이터를 섞어서 나누자

- train_test_split

- X_train, X_test, y_train, y_test

random_state = 3 -> 3번 방식으로 Data 섞어주는 기능

test_size = 몇퍼센트로 섞겠다.

(1) 라이브러리 임포트

from sklearn.model_selection import train_test_split

 

(2) 데이터 나누기

X_train, X_test, y_train, y_test = train_test_split(X,y, random_state = 3, test_size = 0.3) # 퍼센트

 

(3) X_train

(4) y_train

4. 탐색적 데이터 분석

- 우선 skip

5. 모델 선택 및 하이퍼파라미터 튜닝

- knn 모델 받아오기

knn = KNeighborsClassifier()

 

6. 학습

# X_train : 문제_훈련용

# y_train : 정답_훈련용

knn.fit(X_train,y_train)

 

7. 평가

# 예측 점수 : score(X_test,y_test)

# score는 정확도를 통해서 점수를 나타내줌

# X_test를 통해서 예측값을 출력하다

# 실제정답인 y_test와 비교를 해 점수를 나타내줌

knn.score(X_test,y_test)

----------------------------------

문제 변형

1. 이웃의 수 변경

knn3 = KNeighborsClassifier(n_neighbors=3)

2. 학습하기

knn3.fit(X_train, y_train)

3. 점수확인

----------------------------------

문제 변형 : 하이퍼 파라미터(n_neighbors)에 변화를 주면 scoreㄱ밧에 어떤 변화가 있는지 확인해보자

# train train_list = [] for k in range(1,101):
# k : 이웃의 수
# 5. 모델 선택 및 하이퍼 파라미터 튜닝 model = KNeighborsClassifier(n_neighbors = k) # 6. 모델학습 model.fit(X_train,y_train) # 7. 모델 평가 train_list.append(model.score(X_train,y_train))

# test testList = [] for k in range(1,101):
     model2 = KNeighborsClassifier(n_neighbors=k) model2.fit(X_train,y_train) #학습 = 훈련
     testList.append(model2.score(X_test,y_test))

 

시각화

plt.figure(figsize=(25,5)) # 출력할 그래프의 크기 
plt.plot(range(1,101), # X데이터 = 1~100 train_list, # y데이터 c= 'red') 
plt.plot(range(1,101), # X데이터 = 1~100 testList, # y데이터 c= 'blue') 
plt.xticks(range(1,101)) 
plt.grid() # 기준선 plt.show()

# 최적의 이웃 수 : 9, 13, 17

knn_model = KNeighborsClassifier(n_neighbors=9, p = 1, weights='distance')
knn_model.fit(X_train,y_train)

점수확인 :

train/test_list에 저장된 학습값 확인하기

예측 :

728x90
반응형
Comments