본문 바로가기

Code-note

[AI] 머신러닝 기초개념 정리

 

머신러닝 기본 개념 스쳐가며 보기 (지도학습)

<머신러닝 기본개념>

## 모델학습이란
- 목표: 최적 직선 구하기 -> 직선별 손실함수 구하기 -> 손실함수 최소값 구하기

## 머신러닝 프로세스
- 데이터 수집 -> 데이터 정리 -> 모델학습 -> 모델 테스트 -> 모델 배포

## Linear Regression(선형회귀) 이란?

- 직선을 그어 데이터 경향을 나타내는 것! 

## 가장 잘 맞는 직선이란? 
- y = wx + b
- 최적의 w, b알기 -> cost fucntino 계산

## Cost Function 
- MSE(Mean Squared Error : (실제 - 예측)**2 / N : 실제값과 예측값의 차이의 변환 값
- Error가 적을수록 좋은 모델

## Cost Function 최적화
- Cost Function은 x^2 포물선 함수로 나타남
- Cost 가 가장 적은 시점에서의 w(weight)를 구해야 함 -> w는 기울기
- gradient descent(경사하강법) 방법 사용함 : 최적의 가중치 파라미터 찾기

 

<머신러닝 기술원리>

## 큰 분류
- 지도학습: 레이블(정답) 있음 
- 비지도학습 : 레이블 없음 -> 자체적인 패턴분석 ; 군집분석, 차원축소

## 지도학습
- 분류모델 : 레이블 값이 이산적으로 나누어지는 문제 -> 성별
- 예측모델: 레이블 값이 연속적 -> 주가

## 데이터 셋 분리
- Train set: 모델 학습을 위한 
- Validation set : 모델의 성능 검사 ; 모의고사(추가적인 검사)
- Test set : 모델의 최종 성능 검사

## 모델 선택
- 좋은 모델: 데이터의 패턴을 비슷하게 잘 따라감 : 어느정도의 오차는 있음
- 과적합(overfitting): 학습데이터에 대해 결과가 잘 나오지만, test 데이터에서는 많이 틀림
- 모델 성능 평가: 학습 반복횟수(epochs)가 증가 -> training set과 test set에서의 Error가 비슷하게 하락하는지?
(차이가 많이 벌어지면 overfitting)

## 성능지표
# 회귀모델 성능지표: MSE, MAE, R2
- MSE(Mean Squered Error) : 예측값에 대한 실제 오차의 제곱값의 평균
- MAE(Mean Absolute Error) : 예측값에 대한 실제값의 오차의 절댓값의 평균
- R2: 독립변수가 종속변수를 얼마나 잘 설명해주는 지 나타내는 지표 (R2 score가 1에 가까울수록 좋음)

# 분류모델 성능지표: 정확도, 정밀도, 재현율, F1-점수
- Confusion Matrix: 실제값(T/F)과 예측값(T/F)을 비교한 2x2 행렬
- 정확도:  전체 데이터 중에서 모델이 실제값을 맞춘 것의 비율
- 정밀도: 모델이 True라고 분류한 것 중에서 실제 True인 것의 비율
- 재현율: 실제 True인 것 중에서 모델이 True라고 예측한 것의 비율
- F1 점수: 정밀도와 재현율

 

<머신러닝 주요 알고리즘>

##  Scikit-laern: 많은 알고리즘 내장

## 알고리즘 분류
- 회귀: Linear Regression
- 분류: Logistic Regression
- 회귀분류: Decision Tree, Random Forest, K-Nearest Neighbor

## Linear Regression - 회귀모델
- 회귀: 데이터의 값의 선형 추세선 확인
# 변수정의
- 불러오기 : from sklean.linear_model import LinearRegression()
- 모델 정의 : model = LinearRegression()
- 모델학습 :model.fit(X_train, y_train) 
- 모델예측: pred = model.predict(X_test)

## Logistic Regression - 분류모델
- 로지스틱 함수 : 결과값을 0~1 사이의 값으로 변환하여 이진분류. ex. 0.5보다 크면  1, 작으면 0
- from sklearn.linear_model import LogisticRegression
- model = LogisticRegression()

## k-Nearest Neighbor
- 새로운 데이터가 주어졌을 때, 가장 가까운 K개의 이웃의 정보로 새로운 데이터를 예측(어느쪽 그룹에 속할지)
- 알고리즘이 간단하며 큰데이터셋과 고차원 데이터에는 적합하지 않음
- from sklearn.neigbors import KNeighborsClassifier
- knn = KNeighborsClassifier(n_neighbors=k) # k는 하이퍼파라미터 (모델에게 직접 주어지는 정보)
(선형회귀에서 y = wx+b에서 w,x는 모델이 학습하는 "파라미터" 라고함 )

## Decision Tree - 분류, 회귀
- 분류와 회귀 작업이 가능한 머신러닝 알고리즘
- 복잡한 데이터셋 가능, 랜덤 포레스트의 기본요소
- 예측 결과 설명가능한 학습 방법
- from sklearn.tree import DecisionTreeClassifier
- model = DecisionTreeClassifier(max_depth=2) # 최대 깊이

## Random Forest - 분류, 회귀
- 일련의 예측기(분류, 회귀모델)로 부터 예측을 수집하면 가장 좋은 모델 하나보다 더 좋은 예측 획득
- 앙상블 계열의 모델 : Decision Tree의 subset(서로 다른 데이터)을 만들어서 학습과 예측
- from sklean.ensemble import RandomForestClassifier
- model = RandomForestClassifier(n_estimators = 50)
# 하이퍼파라미터
- n_estimators = 사용할 내부 Decision Tree개수 / default = 100
- max_depth = 트리의 최대 깊이 / default = None
- min_samples_split = 노드를 분할하기 위해 필요한 최소한의 샘플개수 / default = 2

 

## Random Forest 변수 중요도
- feature_importances_: 변수에 대한 중요도 값을 제공(각 feature가 성능에 기여한 정도)

## GridSearchCV
- 최적의 하이퍼파라미터 찾아주는 함수
- 여러 하이퍼파라미터를 순차적으로 입력해 학습하고 성능 측정해서 최적값 찾기
# 변수정의
- from sklearn.model_selection import GridSearchCV
- rfc = RandomForestClassifier()
- params = {'n_estimators':[100,150], 'max_depth':[2,5]}
- grid_rfc = GridSearchCV(rfc, param_grid = params)
- grid_rfc.fit(X_train, y_train)
- grid_rfc.best_params_ : 최적의 파라미터 리스트
- grid_rfc.best_scores_ : 최적의 파라미터일때의 Score

 

<머신러닝 모델 추가 내용>

## 분류 모델
# 단일 분류예측 모델 : LogisticRegression, KNN, DecisionTree

# 앙상블(Ensemble) 모델 : RandomForest, XGBoost, LGBM, Stacking, Weighted Blending
- 배깅(Bagging) : 여러개의 DecisionTree를 활용하고 샘플 중복 생성을 통해 결과 도출. ex) RandomForest
- 부스팅(Boosting) : 이전 학습에 대하여 잘못 예측한 데이터에 가중치를 부여. ex) XGBoost, LGBM
- 스태킹(Stacking) : 여러 모델을 기반으로 예측된 결과를 통해 Final 학습기(meta 모델)이 다시한번 예측

##  XGBoost
- 여러개의 Decision Tree를 결합하여 Strong Learner 만드는 Boosting 앙상블 기법
- from xgboost import XGBClassifier # scikit-Learn 모델이 아님
- xgb = XGBClassifier(n_estimators=3, random_state=42)