ML & DL/파이썬 머신러닝 실전 가이드

[Python ML Guide] Section 2.1: Scikit Learn & iris classification

Jae. 2023. 8. 25. 00:18
728x90

https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EC%99%84%EB%B2%BD%EA%B0%80%EC%9D%B4%EB%93%9C

 

[개정판] 파이썬 머신러닝 완벽 가이드 - 인프런 | 강의

이론 위주의 머신러닝 강좌에서 탈피하여 머신러닝의 핵심 개념을 쉽게 이해함과 동시에 실전 머신러닝 애플리케이션 구현 능력을 갖출 수 있도록 만들어 드립니다., [사진]상세한 설명과 풍부

www.inflearn.com


1. Scikit Learn 개요

 

 

Scikit Learn 소개

  • Python기반의 다른 ML 패키지도 사이킷런 스타일의 API를 지향할 정도로 쉽고 가장 Python스러운 API를 제공
  • 머신러닝을 위한 매우 다양한 알고리즘과 개발을 위한 편리한 프레임워크와 API를 제공
  • 오랜 기간 실전 환경에서 검증됐으며, 매우 많은 환경에서 사용하는 성숙한 라이브러리
  • 주로 Numpy와 Scipy 기반 위에서 구축된 라이브러리

 

Scikit Learn 한계

Torch나 TensorFlow와 같은 딥러닝 전문 프로그램보다 구현할 수 있는 알고리즘의 수준이 낮음

 

 


2. Scikit Learn Workflow / Framework

 

 

Scikit Learn 활용 ML 워크플로우

  • Load Data: 데이터셋 준비
  • Preprocessing: 데이터 전처리(fit, transform)
  • Model Train: 모델 학습 (fit), 모델 활용 예측 (predict)
  • Evaluation: 모델 성능 평가 (accuracy, precision, recall, f1, roc_auc)

 

 

 

Scikit Learn 기반 Framework - Estimator와 fit(), predict()

 

 

Estimator

  • 지도학습의 모든 알고리즘을 구현한 Class
  • 분류 알고리즘인 Classifier와 회귀 알고리즘인 Regressor를 포함 
    • fit(), predict() method
      • fit(): 모델 학습
        • 일반적으로 함수 인자로 verbose가 있으면 함수 수행시 발생하는 상세한 정보들을 표준 출력으로 자세히 내보낼 것인가를 나타냄
        • 보통 0 은 출력하지 않고, 1은 자세히, 2는 함축적인 정보만 출력하는 형태로 되어 있음
      • predict(): 학습된 모델 활용 예측
      • 분류와 회귀 알고리즘에 사용
    • transform() method
      • 데이터의 차원변환, 클러스터링, feature 추출 담당
      • fit()으로 변환을 위한 사전 구조를 맞춘 뒤 실행

 

Estimator 종류

  • Classifier(분류)
    •  DecisionTreeClassifier
    • RandomForestClassifier
    • GradientBoostingClassifier
    • GaussianNB
    • SVC
  •  Regressor(회귀)
    •  LinearRegression
    • Ridge
    • Lasso
    • RandomForestRegressor
    • GradientBoostingRegressor

 

Scikit Learn의 주요 Module

 

  • 모듈(module)
    • Module은 함수, 변수, 클래스를 모아놓은 것을 말함
    • 일반적으로 한 파일을 말하는데 예를 들어 .py와 같은 하나의 파일 안에 함수와 변수, 클래스가 모여있는 것으로 볼 수 있음

 

 

Scikit Learn 내장 데이터 셋 - 분류 및 회귀용

 

Scikit Learn 주요 module

  • sklearn.datasets: 사이킷런에 내장되어 예제로 제공하는 데이터셋
    • datasets.load_boston(): 회귀용도, 미국 보스턴의 집 feature들과 가격에 대한 data set
    • datasets.load_breast_cancer(): 분류 용도, 위스콘신 유방암 feature들과 악성/음성 label data set
    • datasets.load_diabetes(): 회귀 용도, 당뇨 data set
    • datasets.load_digits(): 분류 용도, 0에서 9까지 숫자의 이미지 픽셀 data set
    • datasets.load_iris(): 분류 용도, 붓꽃에 대한 feature를 가진 data set
  • sklearn.preprocessing: 데이터 전처리에 필요한 다양한 가공 기능 제공 (정규화, 스케일링 등)
  • sklearn.model_selection: 데이터 분리 및 파라미터  튜닝

 

  • 내장 예제 data set 구성
    • dataset이 Dict처럼 구성되어 있음
    • dataset.data: Feature의 Data set을 가리킴
    • dataset.feature_names: Feature의 이름을 나타냄
    • dataset.target: 분류 시 Label값, 회귀 시 숫자 결과값 Data Set
    • dataset.target_names: 개별 Label의 이름을 나타냄
    • dataset.DESCR: Data Set에 대한 설명과 각 Feature의 설명을 나타냄

 

X, y = load_dataset(return_X_y=True, asframe=True)

로 설정할 경우 Feature Data Set(X)와 Target값(Label값, y) 을 바로 구할 수 있다

 

또한 X, y가 ndarray 형태가 아닌 DataFrame / Series 형태로 반환된다

 

 

아래의 둘은 동일한 코드이다

from sklearn.datasets import load_iris

X, y = load_iris(return_X_y=True)

X, y
from sklearn.datasets import load_iris

iris = load_iris()

iris.data, iris.target

 

 

train_test_split(X, y, test_size, shuffle, random_state, stratify)

머신러닝 모델을 학습하고 그 결과를 검증하기 위해서 원본 데이터를 train/validation/test 용도로 나눠줘야함

머신러닝 모델의 성능을 평가할 땐, 모델이 처음 보는 데이터를 사용해야 하므로 데이터셋 분리가 필요함

  • sklearn.model_selection으로 호풀
  • test_size: 학습용 데이터셋의 크기 결정
  • shuffle: 데이터를 섞어 효율적인 학습 진행
  • random_state: 동일한 학습/테스트 데이터셋 호출
  • stratify: stratify=y로 설정하면 y(기존 데이터셋의 target 값)의 Label 분포와 최대한 동일하게 y_train, y_test 각각 생성해준다

 

from sklearn.datasets import load_iris

iris = load_iris()
print(type(iris))
keys = iris.keys()
print("붓꽃 데이터 set의 key들:", keys)

# 붓꽃 데이터 set의 key들: dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename', 'data_module'])
print("\n feature_names 의 type:", type(iris.feature_names))
print(" feature_names 의 shape:", len(iris.feature_names))
print(iris.feature_names)

print("\n target_names 의 type:", type(iris.target_names))
print(" feature_names 의 shape:", len(iris.target_names))
print(iris.target_names)

print("\n data 의 type:", type(iris.data))
print(" data 의 shape:", iris.data.shape)
print(iris["data"])

print("\n target 의 type:", type(iris.target))
print(" target 의 shape:", iris.target.shape)
print(iris.target)

 

 

 


3. Scikit Learn을 이용한 붓꽃(Iris) 데이터 분류(classification)

 

 

 

붓꽃 데이터 분류

  • 붓꽃 데이터 세트로 붓꽃의 품종을 분류(classification) 하는 것
  • 붓꽃 데이터 세트는 꽆잎의 길이와 너비, 꽃받침의 길이와 너비 feature를 기반으로 꽃의 품종(Label)을 예측하기 위한 것

 

Feature(피처)

  • Data Set의 일반 속성
  • ML은 2차원 이상의 다차원 데이터에서도 많이 사용되므로 Target값을 제외한 나머지 속성을 모두 Feature로 지칭

 

Label, Class, Target(값), 결정(값) : 다 같은 말

  • Target값 또는 결정값은 Supervised Learning시 데이터의 학습을 위해 주어지는 정답 Data
  • Supervised Learning 중 Classification의 경우에는 해당 결정값을 Label 또는 Class로 지칭

 

Supervised Learning - Classification

  • 분류는 대표적인 지도학습 방법의 하나
  • 지도학습(Supervised Learning)은 학습을 위한 다양한 feature과 분류 결정값인 Label 데이터로 모델을 학습한 뒤 별도의 test data set에서 미지의 Label을 예측함
  • 즉 지도학습은 정답이 주어진 데이터를 먼저 학습한 뒤 미지의 정답을 예측하는 방식
  • 이 때 학습을 위해 주어진 데이터 세트를 training data set
  • ML 모델의 예측 성능을 평가하기 위해 별도로 주어진 데이터 세트를 test data set로 지칭

 

 

iris data 분류 예측 프로세스

  • 데이터 세트 분리: 데이터를 training data와 test data로 분리
  • 모델 학습: training data를 기반으로 ML 알고리즘을 적용해 모델을 학습시킴
  • 예측 수행: 학습된 ML 모델을 이용해 test data의 분류(붓꽃 종류)를 예측
  • 평가: 예측된 결과값과 test data의 실제 결과값을 비교해 ML 모델의 성능을 평가

 

import sklearn
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split

 

import pandas as pd

# 붓꽃 데이터 세트를 로딩합니다
iris = load_iris()

# iris.data는 iris 데이터 세트에서 feature만으로 된 데이터를 numpy로 가지고 있음
iris_data = iris.data

# iris.target은 붓꽃 데이터 세트에서 Label(결정 값) 데이터를 numpy로 가지고 있음
iris_label = iris.target
print("iris target값:", iris_label)
print("iris target명:", iris.target_names)

# 붓꽃 데이터 세트를 자세히 보기 위해 DataFrame으로 변환함
iris_df = pd.DataFrame(data=iris_data, columns=iris.feature_names)
iris_df["label"] = iris.target
iris_df.head()


# iris target값: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
#  0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
#  1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
#  2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
#  2 2]
# iris target명: ['setosa' 'versicolor' 'virginica']

 

  • 학습 데이터와 테스트 데이터 세트로 분리
    • 관습적으로 대문자: Feature & 소문자: Target

 

X_train, X_test, y_train, y_test = train_test_split(
    iris_data, iris_label, test_size=0.2, random_state=11
)

# X_train: 학습용 Feature Data set
# X_test: test용 Feature Data set
# y_train: 학습용 Target 값들
# y_test: test용 Target 값들

# test_size: 전체 data set 중에서 train_data가 아닌 test_data로 사용하는 data의 비율
# random_state: 반복할 때마다 동일하게 결과가 반환되도록 고정값으로 넣는 값 (어떤 값이 와도 상관없음)

 

  • Train(학습) Data set 로 학습(Train) 수행
    • fit(Feature_train_dataset, target_train_dataset)

 

왼쪽 -> 오른쪽으로 predict 적용하여 학습된 Model 활용 예측

 

 

 

# DecisionTreeClassifier 객체 생성
df_clf = DecisionTreeClassifier(random_state=11)

# 학습 수행
df_clf.fit(X_train, y_train)

# fit(Feature_train_dataset, target_train_dataset)

 

  • Test(테스트) Data set으로 예측(Predict) 수행
# 학습이 돤료된 DecisionTreeClassifier 객체에서 테스트 데이터 세트로 예측 수행

pred = df_clf.predict(X_test)
pred

 

  • 예측 정확도 평가
from sklearn.metrics import accuracy_score

print(f"예측 정확도: {accuracy_score(y_test,pred):.4f}")

# 예측 정확도: 0.9333
728x90