본문 바로가기
빅데이터 부트캠프/머신러닝&딥러닝

빅데이터 부트캠프 19&20일차

by Mecodata 2022. 8. 1.

머신러닝의 정의

인공지능의 한 분야로 컴퓨터 스스로 방대한 양의 데이터를 분석하여 미래 혹은 결과를 예측하는 것

 

머신러닝의 종류

지도학습(Supervised Learning)

정답이 있는 데이터를 바탕으로 데이터 분류 및 올바른 결과 예측

비지도학습(Unsupervised Learning)

정답이 없는 데이터를 바탕으로 데이터의 유의미한 패턴 혹은 구조 발견

강화학습(Reinforcement Learning)

- 행동에 대한 보상을 통해 누적 보상을 최대화 하는 의사결정

 

회귀(Regression)

- 주어진 연속적인 데이터로부터 변수들 간의 상관관계를 찾아 결과를 예측하는 것

  (데이터의 경향성하나의 선을 그어서 표현하는 것)

- 예측 결과가 연속형 데이터(숫자)일 때 주로 사용

 

분석(Classification)

- 주어진 비연속적인 데이터를 정해진 카테고리(범주)에 따라 분류하는 것

- 예측 결과가 비연속형 데이터(숫자가 아닐 때) 주로 사용

 

※ 보통 Classifier 알고리즘이 존재하면 같은 모델명Regressor 알고리즘도 존재

ex) RandomForestClassifier, RandomForestRegressor

 

scikit-learn

- 다양한 머신러닝 관련한 기술들을 통일되고 쉬운 인터페이스로 사용할수 있게 해주는 라이브러리

- 머신러닝 관련 알고리즘과 개발을 위한 프레임워크와 API 제공

- import sklearn

 

파리미터와 하이퍼파라미터

- 파라미터 = 모델 내부에서 결정되는 변수 (사용자가 직접 설정하는 것이 아니라 모델링에 의해 자동으로 결정)

- 하이퍼파라미터 = 모델링할 때 사용자가 직접 세팅해주는 값

 

Bunch

- scikit-learn에서 대용량의 데이터를 저장하기 위해 사용하는 자료구조 중 하나 (파이썬에서의 딕셔너리와 비슷)

- data: 독립 변수 ndarray 배열
- target: 종속 변수 ndarray 배열

※ Bunch에서 target label 같은 개념
- feature_names: 독립 변수 이름 리스트
- target_names: 종속 변수 이름 리스트
- DESCR: 자료에 대한 설명 (info()와 비슷)

 

머신러닝 모델링 과정

데이터 전처리 -> 데이터 셋 분리 -> 모델 생성학습 -> 예측 수행 -> 평가

 

지도학습(Supervised learning)

- y=f(X)에서 X독립변수(data), y종속변수(target)

- 모델이 학습할 데이터(X)와 그에 맞는 정답 레이블(y)쌍을 데이터셋으로 구성하여 사용하는 학습 방법
- 사이킷런에 있는 모든 지도학습용 estimator는 fit(X, y) 형태로 학습하고 predict(X) 형태로 예측
- classification 문제라면 y는 특정 클래스, regression 문제라면 y는 연속적인 변수의 특정 값이 됨.

 

train_test_split

- 해당 data set을 training data set와 test data set으로 분리

- from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split() 꼴로 입력

 

- X_train = 학습용 피처 데이터 세트, X_test = 테스트용 피처 데이터 세트

- y_train =  학습용 레이블 데이터 세트 , y_test = 테스트용 레이블 데이터 세트

 

※ train_test_split 하이퍼파라미터 

- data = 분리할 데이터셋 설정

- test_size = 전체 데이터 세트 중 테스트 데이터 세트 비율, 기본값 = 0.25 (높을수록 정확도 하락)
- random_state = 랜덤 시드 지정 (지정하지 않으면 수행할 때마다 다른 학습/테스트용 데이터가 생성)

- shuffle = 무작위로 섞을지(셔플) 여부 설정 (기본값은 True이며 False로 설정시 정확도 하락)

- stratify = 타깃데이터 입력시 클래스의 비율에 맞게 데이터를 나눔

 

DecisionTreeClassifier 

- 의사결정트리를 이용한 학습

- from sklearn.tree import DecisionTreeClassifier

 

- DecisionTreeClassifier 객체(모델) 생성 (모델의 학습을 위해)
dt_clf = DecisionTreeClassifier() - 의사 결정 트리 이용해 학습,예측 수행

- 학습 수행 
dt_clf.fit(X_train, y_train) = 주어진 데이터로 알고리즘을 훈련(학습)

- 학습이 완료된 DecisionTreeClassifier 객체에서 테스트 데이터 세트로 예측 수행. 
dt_clf.predict(X_test) = 생성된 모델을 사용해 test 데이터의 결과 예측 

- 정확도 평가
dt_clf.score(X_test,y_test) = 모델의 정확도 평가 (0~1)

정확도를 측정할 때는 score(X_test,y_test) 이외에도 accuracy_score(y_test, pred)도 같은 역할

    이때, pred = dt_clf.predict(X_test) 

 

과대적합

- 모델이 학습 데이터에만 과도하게 최적화되어, 실제 예측을 다른 데이터로 수행할 경우에는 예측 성능이 과도하게 떨어지는 것

 

과소적합

- 모델이 너무 단순하여 학습 데이터를 충분히 학습하지 못하거나 데이터가 불충분하여 학습이 부족함

 

K-fold 교차 검증 

- 과대적합과 과소적합을 방지하기 위해 사용

- 전체 데이터를 K개로 나눠서 교차 검증을 수행(검증은 1개, 훈련은 K-1개)

 

- from sklearn.model_selection import KFold

- n_split = 전체 데이터를 몇개로 나눌지 지정 

ex) KFold(n_splits=5) -> 전체 데이터를 5개로 나눈뒤 1개는 검증 데이터, 나머지는 훈련 데이터

 

cross_val_score(dt_clf, X, y, scoring=, cv=) 

- 교차 검증 편리하게 수행할 수 있게 해주는 API
- 폴드세트 설정, 학습 테스트 데이터 index 추출, 반복적 학습, 예측 수행 및 성능 평가를 한번에 처리

 

- from sklearn.model_selection import cross_val_score

 

※ cross_val_score 주요 하이퍼파라미터

- scoring : 평가 기준 설정 (보통 'accuracy')
- cv : 교차 검증 폴드 수 (기본값 5) - n_split과 역할 비슷
​ -> 지정된 cv 횟수만큼 scoring 파라미터로 지정된 평가 지표로 평가 결괏값을 배열로 반환

 

ex)

from sklearn.model_selection import cross_val_score, cross_validate

dt_clf = DecisionTreeClassifier()

data = iris.data # X, ndarray (숫자만 들어가도록)
label = iris.target # y 

scores = cross_val_score(dt_clf, data, label, scoring='accuracy', cv=3) # cv=3 : n_splits=3 
print('교차 검증 정확도: ', np.round(scores, 4))
print('평균 검증 정확도: ', np.round(np.mean(scores), 4))
# 교차 검증 정확도:  [0.98 0.92 0.98]
# 평균 검증 정확도:  0.96

 

GridSearchCV(dt_clf, param_grid=, cv-=)

- 교차검증을 기반으로 하이퍼파라미터의 최적값 찾게 해줌

- dict 구조의 하이퍼파라미터값 적용

- from sklearn.model_selection import GridSearchCV

 

※ GridSearchCV 주요 하이퍼파라미터

- param_grid = 딕셔너리 형태의 파라미터 지정
- scoring = 평가 기준 설정  (보통 'accuracy')

- n_jobs = 병렬 실행에 사용할 CPU 코어의 개수 지정 (기본값은 1이며 -1을 입력하면 모든 코어 사용) 
- cv = 교차 검증 폴드 수 (기본값 5) - n_split과 역할 비슷

 

ex)

from sklearn.model_selection import GridSearchCV

X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.25, random_state=121)

# DecisionTreeClassifier를 활용한 객체 생성
dt_clf = DecisionTreeClassifier()

# 딕셔너리 형식의 파리미터
parameters = {'max_depth':[1,2,3], 'min_samples_split':[2,3]}

# GridSearchCV를 통해 최적의 하이퍼파라미터 도출
gs = GridSearchCV(dt_clf, param_grid=parameters, cv=3)

# 학습을 통한 모델 개발
gs.fit(X_train,y_train)

# GridSearchCV 결과를 확인하는 데이터프레임 출력
score_df = pd.DataFrame(gs.cv_results_)
score_df

 

오차 행렬(Confusion Matrix)

- 분류의 예측 범주와 실제 데이터의 분류 범주를 교차 표(Cross Table) 형태로 정리한 행렬

- from sklearn.metrics import confusion_matrix(생성), ConfusionMatrixDisplay(시각화)

- True Negative(TN) = 예측값을 Negative 값 0으로 예측했고, 실제 값도 Negative 값 0
- False Positive(FP) = 예측값을 Positive 값 1로 예측했는데, 실제 값은 Negative 값 0. 제 1종 오류
- False Negative(FN) = 예측값을 Negative 값 0으로 예측했는데, 실제 값은 Positive 값 1. 제 2종 오류
- True Positive(TP) = 예측값을 Positive 값 1로 예측했고, 실제 값도 Positive 값 1

- 그림 출처 = https://mashavasilenko.medium.com/dont-be-confused-by-a-confusion-matrix-25f7ea759163

 

- cm = confusion_matrix(y_test, pred)
  disp = ConfusionMatrixDisplay(confusion_matrix=cm)
  disp.plot() -> 행렬 그래프 출력

 

 

 

 

 

정확도, 정밀도, 재현율, F1-Score

- 모두 0~1 사이의 값을 가지며, 1에 가까워질수록 성능이 좋다는 것을 의미

- from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score

- F1 = 2 * (precision * recall) /  (precision + recall) 

 정밀도와 재현율을 결합한 지표이며느 정밀도와 재현율이 어느 한쪽으로 치우치지 않을 때 높은 값을 가짐

- 모두 메서드명(y_true, pred) 꼴로 사용

 

- from sklearn.metrics import classification_report

- classification_report(y_true, pred)로 정확도, 정밀도, 재현율, f1-score한눈에 확인 가능

 

 

 

KNeighborsClassifier(k-최근접 이웃 분류 알고리즘)

- 가장 고전적이고 직관적인 머신러닝 분류 알고리즘
- 기하학적 거리 분류기
- 가장 가깝게 위치하는 멤버로 분류하는 방식
- hyperparameter인 K값은 근처에 참고할 이웃의 숫자 (홀수)

- from sklearn.neighbors import KNeighborsClassifier

n_jobs = 병렬 실행에 사용할 CPU 코어의 개수 지정 (기본값은 1이며 -1을 입력하면 모든 코어 사용) 

n_neighbors = 이웃의 수 설정

 

- KNeighborsClassifier 객체 생성

knn = KNeighborsClassifier() - 경우에 따라 n_neighbors 설정

 

학습 수행 
knn.fit(X_train,y_train) = 주어진 데이터로 알고리즘을 훈련(학습)

- 학습이 완료된 KNeighborsClassifier 객체에서 테스트 데이터 세트로 예측 수행. 
pred = knn.predict(X_test) = 생성된 모델을 사용해 test 데이터의 결과 예측 

- 정확도 평가
knn.score(X_test,y_test) = 모델의 정확도 평가 (0~1)

※ 최적의 n_neighbors 찾기

for k in range(1, 11):
    knn = KNeighborsClassifier(n_neighbors=k, n_jobs=-1)
    knn.fit(X_train, y_train)
    score = knn.score(X_test, y_test)
    print('k: %d, accuracy: %.2f' % (k, score*100))

 

 

from sklearn.model_selection import GridSearchCV

# 데이터 세트 분리
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.3, random_state=121)

# 딕셔너리 형식의 파리미터
parameters = {'n_neighbors':list(range(1,11))}

gs = GridSearchCV(knn, param_grid=parameters)

# 학습을 통한 모델 개발
gs.fit(X_train,y_train)

# 최적값 출력
gs.best_estimator_.get_params()

 

make_classification

- 설정에 따른 분류용 가상 데이터(더미 데이터)를 생성하는 메서드 

- from sklearn.datasets import make_classification

 

- n_samples: 표본 데이터의 수 (기본값 = 100)
- n_features: 독립 변수의 수, (기본값 = 20)
- n_informative: 독립 변수 중 서로 독립사건인 변수의 수 (기본값 = 2)
- n_redundant: 독립 변수 중 서로 종속사건인 변수의 수 (기본값= 2)
- n_repeated: 독립 변수 중 단순 중복된 성분의 수 (기본값 = 0)
- n_classes: 종속 변수의 클래스 수 (기본값 = 2)
- n_clusters_per_class: 클래스 당 클러스터의 수 (기본값 = 2)
- weights: 각 클래스에 할당된 표본 수
- random_state: 랜덤 시드 지정

댓글