머신러닝

chkkkky·2024년 7월 24일
  1. 머신러닝이란

컴퓨터가 명시적으로 프로그래밍되지 않고도 데이터에서 학습하고 예측 가능

  1. 유형

1) 지도학습
2) 비지도학습
3) 강화학습
4) 신경망 및 딥러닝
5) 자연어
6) LLM
7) 비전

  1. 지도학습 (명확한 답이 존재)

선형회귀, 로지스틱 회귀, 결정 트리, 랜덤 포레스트, 그래디언트 부스팅, SVM, KNN과

같은 알고리즘은

알려진 입력 데이터 세트(특징)와 데이터에 대한 알려진 응답(대상 또는 레이블)을 입력받아 모델을 훈련하여

 새 데이터에 대한 응답에 대한 합리적인 예측을 생성

<알고리즘>
컴퓨터가 따라 할 수 있도록 문제를 해결하는 절차나 방법을 자세히 설명하는 과정

** 두 가지 유형의 문제에 사용

1) 회귀

대상 또는 종속 변수가 연속적이거나 정렬된 전체 값일 때 사용

2) 분류

대상 변수가 범주형일 때

1) 회귀

  • 모델링 목적 :

    	입력 데이터와 연속적인 출력 데이터(실수 값) 사이의 관계 모델링

    ex) 주택 가격 예측, 온도 예측, 판매량 예측

  • 사용되는 알고리즘 :

<linear> 선형회귀 모델

Linear Regression

데이터가 선형적 관계를 가진 경우

	=> 간단하고 빠르며, 수치 예측 문제에 적합

Ridge

L2 정규화(규제) 적용, 계수의 크기 감소

Lasso

L1 정규화(규제) 적용, 변수 선택 기능

ElasticNet

L1 및 L2 정규화(규제) 적용, 두 가지 정규화의 균형 조절

<tree>

Decision Tree Regresssior(의사결정 나무 회귀)

데이터가 비선형 관계를 가진 경우

	=> 직관적인 결정 규칙 생성, 범주형 및 수치형 데이터 모두에 적용 가능

<ensemble>

Random Forest Regressior(랜덤 포레스트 회귀)

다양한 특성을 가진 데이터 셋이나 고차원 데이터에 유용


	=> 여러 결정 트리의 평균 예측을 통해 안정적인 예측 성능을 제공
    

+ GBM, XGBoost, LightGBM(분류, 회귀 모두 사용 가능)

평가 지표 :

  • MSE(평균 제곱 오차)

    mean_squared_error(y_test,y_pred)

    오차의 제곱의 평균

    추정값과 실제값 차이의 평균제곱 측정

  • RMSE(제곱 평균 오차)

    np.sqrt(mean_squared_error)

    MSE의 제곱근

  • MAE(평균 절대 오차)

    mean_absolute_error(y_test,y_pred)

    방향을 고려치 않고 추정값과 실제값 사이의 평균 거리 == 절대 오차의 평균
  • R-squared ...

    r2_score(y_test,y_pred)

    1 - (잔차 제곱합 / 총 제곱합 )

  • 조정된 R제곱

    1 - (1-r2) * (n-1) / (n-p-1)

    n = 데이터포인트의 수
    X_test.shape[0]

    p = 독립변수의 수
    X_test.shape[1]

    ** 교차검증

    cross_val_score

    주어진 모델을 데이터를 여러 번 나누어 학습하고 평가하여 모델의 일반화 성능을 측정

    cross_val_score(model, X, y, cv=5, scoring='neg_mean_squared_error')

    scoring: 성능을 평가할 지표
    (default : accuracy)

    cv : 교차검증 폴드 수

    -> 이 검증의 rmse를 구할려면

    np.sqrt(-cvs로 구한 값).mean()

    => 점수가 높을 수록 더 좋은 사이킷런의 프레임워크에 맞추기 위해 -1을 곱함

    [이 함수는 최종적으로 학습된 모델을 반환하지 않기 때문에, 전체 훈련 데이터셋에 대해 별도로 모델을 학습시켜야 함]

2) 분류

  • 모델링 목적 :
입력 데이터를 미리 정의된 여러 클래스 또는 범주 중 하나로 할당하는 문제 해결


ex) 스팸 메일 분류, 질병 진단, 이미지 분류
  • 출력 데이터 :
이산적인 클래스 또는 범주

ex) 양성/음성, 고양이/개/새
  • 사용되는 알고리즘 :

<Linear>
Logistic Regression(로지스틱 회귀)

이진 분류 문제에 주로 사용

	=> 간단하고 해석이 용이하며, 클래스 확률 추정 가능
    
모든 실수 입력에 대해 0과 1사이의 값을 반환, S자 형태를 띠는 함수
    
 * max_iter : 데이터가 수렴하지 않을 때 반복 횟수를 늘려서 해결 가능
 * solver : 메모리 사용 최소화

<Tree>
Decision Tree Classifier(결정 트리)

 범주형 또는 수치형 데이터를 분류하는데 유용
 
 
 	=> 직관적인 결정 규칙 생성 및 비선형 관계도 학습 가능
    
    
 최대한 많은 데이터가 속할 수 있도록 균일한 데이터 세트를 구성하도록 분할하는 것이 필요
 
 <균일도 측정법>
 
 엔트로피(주어진 데이터 집합의 혼잡도) 이용
 
 criterion ='entropy','gini'
 
 1. 정보 이득 지수
 
  1 - 엔트로피(혼잡도) 지수
  
 정보 이득이 높은 속성기준으로 분할
 
 
 2. 지니계수
 
 	불평등 지수를 나타내는 계수
    
    0 평등, 1 불평등
    
    
 * max_depth : 트리의 최대 깊이
 * min_samples_split : 노드에 있어야 하는 최소 샘플 수
 * min_samples_leaf : 분할 후 리프 노드에 있어야 하는 최소 샘플 수
 * max_features : 노드 분할을 위해 고려되는 최대 기능 수
 * max_leaf_nodes : 트리의 최대 리프 노드 수
 
 -> 위에서 3번째까지는 가지치기작업에 사용됨
 
 => 과적합 방지, 일반화 성능 향상
 
 

 

Random Forest Classifier(랜덤 포레스트)

 고차원 데이터나 다양한 특성을 가진 데이터에 적합
 
  	=> 여러 결정 트리를 앙상블하여 과적합을 줄이고 더욱 정확한 예측 가능
    
    

SVM(서포트 벡터 머신)

 복잡한 데이터 분류에 유용, 데이터의 차원이 높은 경우에도 사용가능
 
 	=> 최대 마진을 활용해 클래스를 분리하는 경계 찾음
 
 
 
 * kernel : 1. linear 2. poly 3. RBF
 1. 간단하고 빠르며, 데이터가 선형적으로 구분될 때
 2. 비선형적으로 분포된 데이터를 더 잘 처리 할 수 있음
 3. 비선형적인 경계를 가진 데이터에서 가장 효과적
 * C매개변수 : 각 데이터 포인트들을 얼마나 정확하게 분류할 것인지 결정
 
 

KNN(K-최근접 이웃)

 데이터가 밀집된 지역에 있는 경웅 유용, 단순한 분류문제도 적용 가능
 
 	=> 이웃한 데이터 포인트의 클래스를 기반으로 예측 수행


KNeighborsClassifier(n_neighbors=k) - default 5

k값에 따라 예측의 정확도가 달라지므로 적당한 k값을 찾아야함

-> 짝수일 경우 동점 발생할 수 있으니 되도록 홀수, 짝수일 땐 거리순으로
  • 평가 지표
< 정확도(accuracy) >

: 전체예측에서 예측이 얼마나 잘 맞았는가
=> 가장 직관적인 분류 성능 평가 지표

(TP+TN) / (TP+TN+FN+TN)

< 정밀도(precision) >

: 양성이라고 예측한 것중에 얼마나 잘 맞았는가

TP / (TP+FP)


< 재현율(recall) >

: 양성인 데이터를 얼마나 잘 예측을 했는가

TP / (TP+FN)


*** 정밀도 / 재현율 trade-off관계

임곗값이 낮아질수록 (양성 예측값이 많아질수록)

FN은 하락(분모가 작아진다) => 재현율은 올라감

FP 증가(분모가 커진다) => 정밀도 내려감


< f1-score >

: 모델이 양성 데이터를 얼마나 잘 예측하는지에 대한 전반적인 측정치

정밀도와 재현율의 조화 평균

 2 * (precision * recall) / (precision + recall)


< roc-auc >

ROC 곡선 : 모델이 양성 클래스를 어떻게 잘 예측하는지에 대한 성능 그래프

FPR이 변할 때 TPR이 어떻게 변하는지 나타내는 곡선


  => 재현율과 1-특이성의 관계를 보여줌
  

[특이성]

실제로 음성인 사례들 중에서 모델이 음성으로 예측한 비율


TNR = TN / (TN+FP)


FPR = FP/(TN+FP) = 1- 특이성 = (TN+FP) /(TN+FP) - TN/(TN+FP)

=> 음성인 사례 중 예측을 잘못한 비율


TPR 재현율



AUC값은 ROC 곡선 아래의 면적, 값이 클수록 모델의 성능이 좋다(0~1)




** 교차검증
GridSearchCV : 하이퍼파라미터 튜닝 기법

모델의 성능을 최적화하기 위해 다양한 하이퍼파라미터 조합을 시도하는 방법

=> 모든 조합을 시도하여 가장 좋은 성능을 내는 조합 찾음

-> bestparams : 최적의 하이퍼파라미터 조합 출력
-> bestscore : 최적 조합에서의 교차 검증 평균 점수 출력

파라미터 그리드 설정
param_grid = {
어느 모델을 쓰냐에 따라 다름
}

모델 초기화

ex) svc = SVC()

그리드 서치 초기화

gird_search = GridSearchCV(svc, param_grid,cv=5)

=> cv = 5 : 교차 검증에서 데이터를 나누는 한 단위 또는 조각(폴드)을 의미

-> ex) 데이터가 100개이고 cv =5이면

첫번째 (샘플 1~20) 테스트 세트로 사용 나머지 폴드(샘플 21~100)를 훈련 세트로 사용
두번째 폴드 (샘플 21~40) 테스트 세트, 나머지(샘플 1-20 및 41-100)를 훈련 세트로 사용
이 과정 반복하여 각 폴드가 한번씩 테스트 세트로 사용되도록

** 혼동행렬을 활용하여 성능 비교

행 : 실제 클래스
열 : 예측된 클래스

[20, 0, 0] 0행 0열 정확한 예측
[0, 45, 1] 1행 1열 정확한 예측 / 1행 2열 잘못된 예측
[0, 2, 30] 2행 2열 정확한 예측 / 2행 1열 잘못된 예측

** 앙상블 학습

=> 서로 다른 또는 같은 알고리즘 결합

  1. 보팅
    : 서로 다른 알고리즘을 가진 분류기 결합
    1) 하드 보팅 : 다수결
    2) 소프트 : 결정 확률을 모두 더해 평균하고 이들 중 가장 높은 레이블 값을 최종 보팅 결과값으로 선정

  2. 배깅
    : 각각의 분류기가 모두 같은 유형의 결합
    -> 원본 훈련 데이터 세트에서 복원 추출 방식을 사용하여 여러 개의 서브셋을 생성
    => 분산 감소, 오버피팅 방지, 병렬 처리 가능
    ex) random forest

  3. 부스팅
    ex) GBM

    여러 약한 학습기를 합하여 강한 학습기를 만드는 방식
    -> 학습기를 순차적으로 학습시키며 이전 학습기의 잔여 오차에 집중하여 학습

    높은 예측 성능을 가지고 있지만 훈련 시간이 오래 걸리고, 하이퍼파라미터 튜닝이 중요한 단점 존재

    이를 기반으로 한 고급 알고리즘 개발

  4. XGBoost, XGBClassifier

  • n_estimators : 트리의 수
  • learning_rate : 과적합 방지를 위해 사용되는 단계 크기 축소
  • max_length : 트리 최대 깊이
  • subsample : 개별 기본 학습자를 피팅하는데 사용되는 샘플의 비율
  • colsample_bytree : max_features 매개변수와 유사 / 각 트리에 사용될 특성의 비율
  1. LightGBM
  • n_estimator

  • learning_rate

  • verbose : 경고와 정보 메시지를 숨기는 설정

    XGB와 차이

    레벨별 성장 : (XGB) 트리의 각 레벨이 다음 레벨로 이동하기 전에 완전히 구축
    -> 다음 수준의 모든 잎이 고려되기 전에 주어진 수준의 모든 잎이 분할됨을 의미

    => 트리를 성장시키는 균형 잡힌 방법

    리프형 성장 : 손실 함수에 따라 최상의 분할을 기반으로 분할 선택
    -> 가장 좋은 잎을 선택하여 나무를 계속 성장 시킴

    => 트리 불균형

    ** 나이브 베이즈 분류

    베이즈의 정리를 적용한 간단한 확률적 분류 알고리즘

    텍스트 분류에서 많이 사용

    P(A∣B)=P(B)P(B∣A)⋅P(A)

    ex) 스팸 분류

  1. 사전 확률
    스팸 이메일의 사전 확률 : 40 / 100 = 0.4
    아닌 이메일 확률 : 60 / 100 = 0.6

  2. 특성별 확률 계산(우도) : 무료라는 단어가 포함 될 때

    스팸 이메일 중 20개가 무료라는 단어 포함 시
    p(무료/스팸) : 20 / 40 = 0.5

    스팸이 아닌 이메일 중 5개가 무료 라는 단어 포함
    p(무료/스팸아님) : 5 / 60 = 0.083

  3. 새 이메일에 무료라는 단어 포함시

    p(무료) : (0.5×0.4)+(0.083×0.6)=0.2+0.0498=0.2498

    -> 무료가 들어간 이메일을 받았을 때 실제 스팸인 경우와 아닌 경우

    p(스팸/무료) = p(무료/스팸) x p(스팸) / p(무료)
    : 0.5×0.4/0.2498=0.8006

    p(스팸아님/무료) : p(무료/스팸아님) x p(스팸아님) / p(무료)
    : 0.083×0.6/0.2498=0.1994

  4. 가장 높은 확률 선택

    p(스팸/무료) : 0.8006
    p(스팸아님/무료) : 0.1994
    => 스팸으로 분류

0개의 댓글