728x90
[개정판] 파이썬 머신러닝 완벽 가이드 - 인프런 | 강의
이론 위주의 머신러닝 강좌에서 탈피하여 머신러닝의 핵심 개념을 쉽게 이해함과 동시에 실전 머신러닝 애플리케이션 구현 능력을 갖출 수 있도록 만들어 드립니다., [사진]상세한 설명과 풍부
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(): 학습된 모델 활용 예측
- 분류와 회귀 알고리즘에 사용
- fit(): 모델 학습
- transform() method
- 데이터의 차원변환, 클러스터링, feature 추출 담당
- fit()으로 변환을 위한 사전 구조를 맞춘 뒤 실행
- fit(), predict() method
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