< 11주차 다양한 데이터 분석과 ML 모델 만들어보기 03 >
Classification 모델링이란?
: 데이터를 다양한 클래스로 분류하는 것이다.
ex. 이메일 스팸 감지, 질병 진단, 이미지 인식 등
이진 분류 (Binary)
: 두 개의 클래스로 분류
다중 클래스 분류 (Multi-class)
: 세 개 이상의 클래스로 분류
다중 레이블 분류 (Multi-label)
: 한 데이터가 여러 개의 클래스에 소속될 수 있음
ex. 뉴스 기사가 여러 카테고리에 속함
Classification 알고리즘의 종류
Logistic Regression
: 이진 분류 문제에 자주 사용. 어떠한 확률 이상이면 해당 클래스로 분류
Decision Tree
: 강력하고 직관적이고 시각화하기 쉬움
: Feature의 중요도가 나오도 동작방식을 쉽게 이해&설명 가능
(Regression으로도 사용 가능)
Random Forests
Support Vector Machines
: 복잡한 분류 문제에 효과적
Feature space를 변환하여 분류 작업 수행
Deep Learning
: 고급 분류 문제, 이미지 및 음성 인식에 사용
굳이 복잡하지 않은 문제에 사용할 필요가 없음
Classification 모델 성능 평가
Confusion Matrix
- TP (True Positive) : 예측을 positive로 했는데, 맞춘 경우
- TN (True Negative) : 예측을 negative로 했는데, 맞춘 경우
- FP (False Positive) : 예측을 positive로 했는데, 틀린경우
- FN (False Negative) : 예측을 negative로 했는데, 틀린경우
- Precision = TP / (TP+FP)
- Recall = TP / (TP+FN)
- Accuracy: (TP + TN)/(TP + TN + FP + FN)
from sklearn.metrics import classification_report
# 정답: expected, 예측: predicted
classificationReport = classification_report(expected, predicted)
ROC 커브
: Receiver Operating Characteristic
: Binary classifier의 정확도를 보기 위한 용도로 사용
True Positive Rate을 Y축, False Positive Rate을 X축으로 그려진 그래프
(TPR : 스팸메일을 판정했을 때 맞을 확률 / FPR : 스팸메일이 아닌 것들을 스팸 메일로 판정하는 확률)
=> ROC 커브를 통해 TPR과 FPR을 최적의 위치에서 조정
머신러닝 모델의 큰 흐름 과정
1. 머신러닝 알고리즘과 모델 성과 지표 결정
2. 데이터셋 로딩
3. 데이터셋을 훈련 데이터와 테스트 데이터로 분리 (Hold Out)
4. 훈련 데이터 전처리
5. 훈련 데이터로 모델 빌딩
6. 테스트 데이터 전처리
7. 레이블 정보 제외 테스트 데이터를 모델에 입력으로 지정
8. 모델 결과와 정답 레이블을 비교하여 성과 계산
피처 추출과 변환
: 피처 값들을 모델 훈련에 적합한 형태로 바꾸는 것
https://scikit-learn.org/stable/data_transforms.html
Feature extraction
- Loading features from dicts
- Feature hashing
- Text feature extraction : 이름을 통해 성별을 구분함
- Image feature extraction
카테고리를 숫자로 변환
범주형 데이터를 숫자로 변환
from sklearn.preprocessing import XxxEncoder
# OneHotEncoder / LabelEncoder / OrdinalEncoder
# 방법1
enc = XxxEncoder()
enc.fit(X)
X_enc = enc.transform(X)
# 방법2
X_enc = XxxEncoder().fit_transform(X)
OneHotEncoder
: 서로 관계없는 카테고리들을 인코딩하는 경우
ex. City: Seoul, Tokyo, Beijing, ...
LabelEncoder
: 레이블 필드를 인코딩하는 경우
y = ['recurrence-events', 'no-recurrence-events', 'recurrence-events']
enc = LabelEncoder()
enc.fit(y)
y_labeled = enc.transform(y)
print(y_labeled)
# [1, 0, 1]
OrdinalEncoder
: 순서가 있는 카테고리들을 인코딩하는 경우
ex. Rating: bad, average, good
ex. Education level: high school, bachelor, master
숫자 필드값의 범위 표준화(Preprocessing data)
: 숫자 필드의 값 범위를 특정 범위로 변환 (피처 스케일링 = 정규화)
StandardScaler
: 각 값에서 평균을 빼고 이를 표준편차로 나눔. 값의 분포를 정규분포를 따르게 변환
from sklearn.preprocessing import StandardScaler
import numpy as np
X_train = np.array([[ 1., -1., 2.],
[ 2., 0., 0.],
[ 0., 1., -1.]])
scaler = StandardScaler().fit(X_train)
X_scaled = scaler.transform(X_train)
# X_scaled= StandardScaler().fit_transform(X_train)
MinMaxScaler
: 모든 값을 0과 1 사이로 스케일링. 각 값에서 최소값을 빼고 (최대값-최소값)으로 나눔
RobustScaler
: 이상치 처리를 잘 하는 scaler
MaxAbsScaler
값이 없는 필드 채우기 (Imputation of missing values)
: 결측치 채우기 (impute한다고 부름)
SimpleImputer
: 간단한 통계(평균, 중앙값, 최다 빈도 or 상수)를 지정하여 누락된 값 대체
from sklearn.impute import SimpleImputer
# 평균값으로 대체
imputer = SimpleImputer(missing_values=np.nan, strategy='mean')
imputed_data = imputer.fit_transform(data)
print(imputed_data)
Iterativelmputer
: 아직 베타단계. 비어있는 필드의 값을 레코드 상의 다른 값으로 추정함
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
data = np.array([
[1, np.nan, 3],
[4, 3, np.nan],
[np.nan, 6, 9],
[8, 5, 2] ])
# max_iter을 수행하며, 비슷한 필드값을 찾음 (아직 실험적인 기능!)
iterative_imputer = IterativeImputer(max_iter=10, random_state=0)
imputed_data = iterative_imputer.fit_transform(data)
print(imputed_data)
모델 테스트
# Hold out 테스트: train_test_split
from sklearn.model_selection import train_test_split
# Cross Validation (X-Fold) 테스트: cross_validate
from sklearn.model_selection import cross_validate
scikit-learn의 파이프라인
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
X, y = make_classification(random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
pipe = make_pipeline(StandardScaler(), LogisticRegression())
pipe.fit(X_train, y_train)
pipe.score(X_test, y_test)
'STUDY > DevCourse' 카테고리의 다른 글
[데브코스][데이터 분석] ML 모델 개발 절차 및 프레임워크 (0) | 2024.05.02 |
---|---|
[데브코스][데이터 분석] Regression 모델 만들기 (1) | 2024.05.02 |
[데브코스][데이터 분석] 데이터 EDA와 머신러닝 소개 (0) | 2024.04.29 |
[데브코스][데이터 분석] 선형 회귀와 선형 분류 (2) | 2024.04.26 |
[데브코스][데이터 분석] 지도학습 알아보기 (0) | 2024.04.23 |