머신러닝의 정의
인공지능의 한 분야로 컴퓨터 스스로 방대한 양의 데이터를 분석하여 미래 혹은 결과를 예측하는 것
머신러닝의 종류
지도학습(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: 랜덤 시드 지정
'빅데이터 부트캠프 > 머신러닝&딥러닝' 카테고리의 다른 글
빅데이터 부트캠프 26&27일차 (1) | 2022.08.10 |
---|---|
빅데이터 부트캠프 25일차 (0) | 2022.08.08 |
빅데이터 부트캠프 23&24일차 (0) | 2022.08.05 |
빅데이터 부트캠프 22일차 (0) | 2022.08.04 |
빅데이터 부트캠프 21일차 (0) | 2022.08.03 |
댓글