Eggs Sunny Side Up
본문 바로가기
Computer Engineering/머신러닝

KNN-iris 분류 실습

by guswn100059 2023. 6. 7.
### 문제정의
- 붓꽃의 품종을 구분하는 머신러닝 모델 만들기
- 지도학습, 분류

### 데이터 수집
- sklearn에서 제공하는 Iris 데이터 셋을 사용

from sklearn.datasets import load_iris
iris_data = load_iris()

iris_data
# 어떤 타입의 데이터?
# 전체적으로는 딕셔너리 타입 - numpy 배열, String 등이 포함
# bunch라는 객체 형식으로 되어 있음.

iris_data.keys()

# 꽃받침 길이, 꽃받침 너비, 꽃잎 길이, 꽃잎 너비
iris_data['data']

# 어떤 품종을 가지고 있는지
# 숫자로 3개의 품종을 구분
iris_data['target']

# 0 : 'setosa', 1: 'versicolor', 2 : 'virginica'
iris_data['target_names']

# 데이터셋이 어려울 때 어떤 형태를 가지고 있는지 - 엑셀파일, 워드파일인지를 표시
# 최신버전으로 업데이트되면서 None으로 변경, 분석에 필요없는 정보
iris_data['frame']

# 데이터셋에 대한 상세 정보
iris_data['DESCR'] # 변수명으로 출력하면 이스케이프 코드를 실행하지 못함
print(iris_data['DESCR']) # print는 이스케이프 코드를 실행하여 깔끔하게 출력을 해줌

i = '\ttest\n'

print(i)

iris_data['feature_names']

# 파일의 위치
iris_data['filename']

iris_data['data_module']

### 데이터 전처리
- 학습용으로 제작된 데이터이기 때문에 전처리와 탐색적 데이터 분석은 생략

### 탐색적 데이터 분석(EDA)

### 모델생성 및 하이퍼 파라미터 튜닝

#### KNN 모델 불러오기

from sklearn.neighbors import KNeighborsClassifier
knn_model = KNeighborsClassifier()

#### 데이터 분리하기

# 데이터프레임을 만들 때 필요한 요소
# 행, 열
iris_data
# 문제에 해당하는 데이터 프레임 만들기 
# 컬럼이름 - feature_names, data - iris_data['data'], 인덱스 - 자동부여

import pandas as pd
# 문제데이터 생성
X = pd.DataFrame(data=iris_data['data'], 
                columns=iris_data['feature_names'])
X

# 정답 데이터 생성
y = iris_data['target']
y

# train(7) : test(3) 데이터 분리
#  150 => 105 : 45

# 데이터를 섞어서 분리해주는 함수
from sklearn.model_selection import train_test_split

# 4개의 결과가 나옴(X_train, X_test, y_train, y_test)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=6, test_size=0.3)

X_train.shape, X_test.shape, y_train.shape, y_test.shape

### 학습

# fit
knn_model.fit(X_train, y_train)

### 평가

import warnings
warnings.filterwarnings('ignore')

# 훈련용 데이터 성능
knn_model.score(X_train, y_train)

# 평가용 데이터 성능
knn_model.score(X_test, y_test)

# 새로운 데이터로 예측
knn_model.predict([[5.0, 3.0, 1.0, 1.0]])

### iris 데이터의 각 특성간 관계를 시각화 해보기

# 산점도 행렬(scatterplot matrix) : 한꺼번에 변수간 관계를 일목요연하게 보여주는 기능

# pandas의 산점도 행렬에서 불필요한 텍스트를 삭제하고 싶을때 matplotlib을 사용
import matplotlib.pyplot as plt

pd.plotting.scatter_matrix(X,
                          figsize=(10, 10),
                          alpha=0.8,
                          c=y)

plt.show()

댓글