AI

[AI] 딥러닝(정리중)

usingsystem 2025. 11. 27. 16:01
728x90

목차

  • 머신러닝 역사 & 기본 개념
  • 머신러닝의 종류
  • 머신러닝에 주로 사용되는 파이썬 라이브러리
  • Scaling(스케일링)과 정규화
  • 스케일링 종류
  • Feature Engineering 
  • 머신러닝 Model 개발 플로우
  • 전통적인 지도학습 알고리즘
  • 평가 지표
  • 용어 정리

1. 머신러닝 역사 & 기본 개념

전통적 프로그래밍 (Traditional Programming)

전통적인 프로그래밍 방식은 사람이 규칙(rule) 을 직접 만들어주는 rule base 방식이다. 이 방식은 데이터가 많아질수록 규칙을 모두 사람이 정의하기 어려워지는 한계가 있다.

  • 예: if-else 규칙 기반 시스템
  • 특징: 규칙은 알지만, 답은 모르는 방식 → 사람이 "조건"을 정의해야 하고, 컴퓨터는 그 규칙을 실행만 한다.

머신러닝 (Machine Learning)

머신러닝은 전통적인 프로그래밍과 정반대 개념이다. 답을 알고 있어 여러가지 규칙을 만들어 낼 수 있다. 즉, 데이터 속에서 패턴을 스스로 학습해 규칙을 만들어내는 방식이다.

  • 답(정답 데이터)은 알고 있지만,
  • 그 답을 만드는 규칙(패턴) 은 컴퓨터가 도출한다.

2. 머신러닝의 종류

1) 지도학습 (Supervised Learning)

  • 정답(label)이 있는 데이터를 학습으로 패턴 인식 알고리즘이다.
    • 분류(Classification): 개/고양이, 스팸/정상 → 범주 예측
    • 회귀(Regression): 주가 예측, 집값 예측 → 연속값 예측

딥러닝(Deep Learning)도 지도학습 기반으로 많이 활용되며 정답이 있는 데이터로 패턴을 익혀, 새 데이터의 정답을 예측하는 모델을 만든다.

2) 비지도학습 (Unsupervised Learning)

  • 정답(label)이 없는 데이터를 학습으로 패턴 인식 알고리즘이다.
    • 군집화(Clustering): 비슷한 데이터끼리 자동으로 묶기
    • 차원 축소(Dimension Reduction)

비지도학습은 “이 묶음이 어떤 의미인지”는 사람이 해석해야 한다.

3) 강화학습 (Reinforcement Learning)

  • 스스로 시행착오를 반복해 최적의 행동을 학습 신경망(neural)알고리즘에 속한다
  • 분류도 회귀도 아니고 의사결정(Decision Making) 을 학습하는 방식
  • 데이터가 미리 정해져 있는 것이 아니라, 행동 → 보상 → 정책 학습 구조를 갖는다.

3. 머신러닝에 주로 사용되는 파이썬 라이브러리

  1. scikit-learn (sklearn) - 전통적인 머신러닝 도구로 전처리, 지도/비지도 학습 알고리즘, 모델 평가
  2. TesorFlow - Google 개발, 딥러닝(Deep Learning) 프레임워크
  3. Keras - TensorFlow 상위 API, 코드가 간단하고 직관적이어서 입문자 친화적
  4. PyTorch - Meta(Facebook) 개발,  연구자 및 딥러닝 커뮤니티에서 가장 많이 사용되는 프레임워크
  5. Matplotlib - 파이썬 기반 데이터 시각화 라이브러리, 그림구조 : Figure > Axes > Axis

4. Scaling(스케일링)과 정규화

스케일링은 각 Feature의 단위와 범위를 맞추는 과정이다. 스케일이 서로 다른 상태에서는 머신러닝 모델이 제대로 학습할 수 없기 때문이다.

1) 큰 값이 모델을 지배함( 특징값의 크기가 다르면 큰 값이 모델을 지배함)

  • 예) 키: 170 | 몸무게: 70 | 연봉: 50,000,000

“연봉” 값이 너무 커서 모델이 연봉만 중요하다고 착각한다.

2) 거리 기반 모델(KNN, K-means)에 영향

distance = sqrt((x1 - y1)^2 + (x2 - y2)^2)

Feature 값의 단위가 다르면 특정 Feature가 거리를 거의 전부 결정해버립니다. → 스케일이 큰 축으로만 거리 계산됨.

단위가 큰 Feature가 전체 거리를 좌우함 → 잘못된 분류 가능.

3) 경사하강법(Gradient Descent)의 최적화 수렴 속도 개선

딥러닝이나 선형 모델은 경사하강법을 쓰는데 스케일이 다르면 손실함수의 모양이 길쭉한 타원이 되어 최적점으로 수렴하는 데 오랜 시간이 걸닌다.
스케일링하면 → 매끄러운 곡면 → 빠르게 수렴

4) 모든 Feature를 동일 기준으로 해석하게 함

모든 Feature를 동일한 기준(0~1 또는 평균 0, 분산 1)으로 맞추면 모델이 Feature 간 중요도를 제대로 비교할 수 있고 학습 과정이 안정적이고 불필요한 큰 값 영향 제거 즉, 학습 효율과 안정성, 성능 모두 좋아짐. 스케일링은 “특징값의 크기·단위 차이”를 없서 모델이 공정하게 학습하도록 만드는 기술.

 

특정 feature 의 value 가 다른 feature 들 보다 훨씬 크면, 그 값이 목적함수를 지배하게 되므로 정확한 학습이 되지 않음

5. 스케일링 종류

1) Simple Feature Scaling

2) Min–Max Scaling (정규화 Normalization)

최솟값 0, 최댓값 1로 맞춤

  • 장점 : 값이 0~1 범위로 깔끔해짐
  • 단점 : 이상치(outlier)가 있으면 전체 스케일 왜곡됨

3) Standard Scaling (Z-score)

가장 많이 쓰이는 방식으로 평균과 표준편차를 이용하여 scaling  하는 방식이다.

  1. 데이터가 평균 0, 분산 1의 형태로 변환
    → 대부분의 머신러닝 알고리즘(특히 선형모델, SVM, 로지스틱 회귀, KNN, PCA 등)은 데이터가 정규분포에 가깝다고 가정하기 때문에 StandardScaler가 가장 잘 맞습니다.
  2. 이상치(outlier)의 영향이 상대적으로 적음
    Min-Max Scaling은 이상치가 하나만 있어도 전체 스케일이 망가짐. 하지만 Standard Scaling은 평균과 표준편차 기반이라 상대적으로 안정적입니다.
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
# 평균/표준편차 계산
X_train = sc.fit_transform(X_train)
# 평균/표준편차 계산 안해줌. 테스트데이터나 새 데이터는 평균 표준편차 계산을 하면안됨.
X_test  = sc.transform(X_test)

6. Feature Engineering (특성 or 컬럼)

머신러닝에서 말하는 feature(특성) 은 데이터셋에서의 컬럼(column) 을 의미합니다.하지만 "그냥 컬럼"이 아니라 모델이 학습에 사용하는 의미 있는 컬럼을 뜻합니다.

  • target과의 높은 관련성이 있어야함. ex. 무작위 숫자, 중복되는 컬럼, 주민등로번호 등은 좋은 feature가 될 수 없다.
  • prediction(예측) 시점에 알수 있음 ex. sales data는 익월에 집계
  • numeric 타입이어야한다. 문자열은 머신러닝이 이해하지 못 함.
  • 충분한 데이터 수를 가져야한다.
  • missing values 처리(.fillna)
  • 편향 처리
  • Data Normalization -> feature scaling
  • Binning ( 연속된 숫자의 범위 지정 ) ex) 가격에 범위를 지정해서 비싼지, 중간인지, 싼지를 구분해주면 좋
  • categorical 변수의 수치화(머신러닝은 numeric 타입만 가능하기 때문) ex. 남자 :0, 여자: 1
    • ordinal category (순서/크기가 있는 feature) ex. L>M>S -> 3,2,1 
    • nominal category (순서/크기가 없는 feature) ex. color의 숫자 표시, 남자 여자
      • one-hot encoding 사용하면됨. 0,1 로 변경하는 방법 
#one-hot-encoding
pd.get_dummies(df_titanic)

7. 머신러닝 Model 개발 플로우

문제 정의 -> data 준비 -> model 선택 -> model 작성 -> model 평가 -> model 개선 -> 결과 보고

import libraries - sklearn, numpy, pandas, matplotlib, etc
↓
data load - csv, sklearn.datasets, etc
↓
data 내용 파악 - shape, statistics(특성), visualize(시각화)
↓
train/ test dataset 분할 : sklearn, manual 
↓
feature scaling 정규화
↓
model train : fit() fit은 scikit-learn에서 사용되는 전통적 ml 훈련 메소드
↓
모델평가 및 시각화

8. 전통적인 지도학습 알고리즘

1) 회귀 모델

(1) 단변수 선형회귀(Univariate Linear Regression)

- 한개의 변수로 결과 예측 (ex. 혈압으로 당뇨병 여부 예측)
- x,y가 주어지고 w,b 가 미지수 선형회귀에서 X는 입력(독립변수, feature) y는 출력(종속변수, 정답) 역할을 합니다.
- w,b 를 infer(추정)

y=wx+by = w x + b

  • w: 기울기  → x가 1 증가할 때 y가 얼마나 증가하는지
  • b: 절편  → 그래프가 y축을 만나는 지점 
    w,b 둘 다 학습해야 하는 파라미터

평가 지표: R² Score(결정계수) 

from sklearn.metrics import r2_score
r2_score(diabetes_y_test, y_pred)

 

(2) 다변수 선형회귀(Multivariate Regression)

변수가 여러 개일 뿐 단변수 선형회귀와 개념은 동일

2) 분류 모델

(1) KNN (K-Nearest Neighbors)

- 다른 observation(관측치, x data)과의 유사성에 따른 분류 

- 서로 가까이 있는 data 들을 이웃(neighbor)이라고 부름
- 가까이 있는 이웃의 label들 중 가장 많은 것을 unknown case의 predication으로 응답한다.
- 장단점 : 간단하지만 dataset이 커지면 상당히 느려진다. 다차원 공간에서의 unknown 포인트와 새로들어온 데이터 거리를 다 계산해야 하기 때문.

from sklearn.neighbors import KNeighborsClassifier
clf = KNeighborsClassifier(n_neighbors=15, weights='uniform')
clf.fit(X_train, y_train)

(2) Decision Tree (결정트리)

  • 규칙을 if-else로 자동 생성해주는 모델
  • 장점: 해석 용이(white-box model) 즉 설명이 필요한 분야에 주로 쓰임(EX.은행), data preprocessing이 필요없이 데이터를 그대로 사용가능
  • 단점: 과적합(overfitting) 위험 높아 훈련데이터는 잘 맞지만 검증데이터에서는 정답률 낮은 현상이 자주 발생한다. 훈련 데이터의 작은 변화에도 매우 민감하다.

- 추후 앙상블 모델과 밀접한 연관이 있음.
- 모든 가능한 결정 경로(decision path)를 tree 형태로 구성한다. 
- 각 node는 test를 의미하고 branch는 test의 결과에 해당한다.
- left node는 classification(분류)에 해당한다.

- 알고리즘 종류
      - ID3 기본적 알고리즘 정보이득을 이용한 트리 구성
      - CART, C4.5, C5.0, CHAID, MARS

- Decision Tree에서는 엔트로피가 높은 상태에서 낮은 상태가 되도록 데이터를 특정 조건을 찾아 나무 모양으로 구분해 간다.

from sklearn import tree
clf = tree.DecisionTreeClassifier(max_depth=2, criterion='entropy') # max_depth를 잘 조절해야 정답률 차이가남. max_depth를 너무 크게잡으면 새로운 데이터를 못 맞출 확률 높음.
clf.fit(X_train, y_train)

(3) Logistic Regression(로지스틱 회귀)

- 회귀모델중 유일하게 분류 모델로 선형회귀를 분류 문제에 적용할 수 있지 않을까? 라는 의문으로 부터 시작됨. 선형회귀 그래프의 y값의 일정 부분이 넘으면 0으로 이하면 1로 분류 하는 문제이다. (ex. 0.5이상이면 암으로 분류, 이하면 종양으로 분류) 하지만 이런 형태는 애매한 구역 발생. 그래서 Sigmoid 함수가 나옴.  
- Sigmoid 함수는 0과 1을 출력하는 이진분류 모델이며 미분가능한 성질을 갖는다.

from sklearn.linear_model import LogisticRegression
lr_classifier = LogisticRegression(solver='lbfgs', random_state=0)
lr_classifier.fit(X_train, y_train)

3) 회귀 분류 앙상블 학습 알고리즘(Ensemble Learning)

여러 개의 모델을 묶어 예측 성능을 높이는 기법으로 여러 모델을 평균내거나(회귀) 투표하거나(분류) 해서 더 좋은 결과를 얻습니다. 

다수의 약한 학습기 (weak learner)를 조합하여 더 높은 성능 추출을 목표로 합니다.

 

분류(Classification)와 회귀(Regression)에서의 앙상블 예시

분류 - 여러 모델의 다수결 투표로 클래스를 결정합니다.

회귀 - 여러 모델의 평균값 또는 가중평균을 사용해 예측값을 계산합니다.

  • Random Forest Classifier (분류)  or Regressor (회귀) (많이 사용됨)
  • Gradient Boosting Classifier (분류)  or Regressor (회귀)  (많이 사용됨)
  • XGBoost / LightGBM / CatBoost (분류 모드 or 회귀 모드)
  • Voting Classifier(분류) or Regressor(회귀)
  • Bagging Classifier (분류)  or Regressor (회귀)

(1) Bagging (Bootstrap Aggregating)

Bagging은 같은 알고리즘의 모델을 여러 개 만들고, 각 모델이 조금씩 다른 무작위 데이터 샘플(모든 attribute 사용)로 학습하도록 한 뒤예측을 평균(회귀) 또는 투표(분류) 로 합치는 기법입니다. 즉, “데이터 다양하게 뽑아서 여러 모델을 독립적으로 훈련 → 최종 결합”

  1. 원본 데이터에서 중복을 허용하며(bootstrap) 랜덤 샘플링
  2. 여러 개의 모델을 병렬로 독립적 학습
  3. 예측 결과를 평균/투표로 합치기
  • 장점
    • 분산(Variance) 감소 → 과적합 방지
    • 모델이 안정적이고 일관됨
    • 병렬(Parallel) 학습 가능 → 빠름
  • 단점
    • 편향(Bias) 감소 효과는 크지 않음
    • 단순한 데이터 구조에서 Boosting처럼 고성능은 아님

※ Random Forest (Bagging + Decision Tree) 모델

  • 단순 bagging 알고리즘을 강화한 기법 으로 대표 모델에 속함
  • bagging은 랜덤하게 추출한 데이터의 모든 attribute를 모두 학습시킨다. 모든 attribute를 가지고 Tree를 만들 경우 매우 강한 attribute가 모든 tree에 항상 포함된다. 이를 막기 위한 방법으로 무작위로 추출한 데이터의 서로 다른 특성으로 Tree를 만드는 기법(ex. 30개중 10개만 random selection) 즉, bagging을 보완한 알고리즘
구분 Bagging Random forest
데이터 샘플링 O (bootstrap) O (bootstrap)
특성(feature) 샘플링 없음 있음 (feature bagging)
트리 간 다양성 보통 낮음 훨씬 높음
성능 더 좋음(보통)
과적합 억제 보통 더 강함
from sklearn.ensemble import RandomForestClassifier

# Training set 에 대해 Random Forest Classifier model 을 fitting
rf = RandomForestClassifier(n_estimators=10, criterion='entropy', random_state=0)
rf.fit(X_train, y_train)

y_pred = rf.predict(X_test)

print(y_pred)
print("Test set true counts = ", sum(y_test))
print("predicted true counts = ", sum(y_pred))
print("accuracy = {:.2f}".format(sum(y_pred == y_test) / len(y_test)))

# making confusion matrix
print("confution matrix\n", 
      confusion_matrix(y_test, y_pred, labels=[1, 0]))
print("f1 score\n", f1_score(y_test, y_pred, labels=[1, 0]))

 

(2) Boosting 

Boosting은 약한 모델(weak learners)을 여러 개 순차적으로(이전 모델의 오류를 보완하면서) 학습시키는 기법입니다.즉, “앞 모델이 못한 부분을 뒤 모델이 점점 보완해 나가는 것”

 

  Gradient Boosting (XGBRegressor)모델

  • 대표 모델에 속함
  • 앞 모델이 만든 오차(잔차, gradient)를 다음 모델이 학습해서 보완하는 방식
  • "경사하강법(gradient descent)"의 개념을 트리 모델에 적용한 것입니다.
  • 동작 방식
    1. 첫 번째 모델 예측 → 오차 계산
    2. 오차(=잔차) 를 다음 트리가 학습
    3. 계속해서 잔차를 줄이는 방향으로 트리를 추가
    4. 모든 트리의 예측을 더해 최종 모델을 완성
  • 장점
    • 순차적(병렬x)으로 오류를 줄여 성능이 매우 높다 -> 복잡한 패턴도 차근차근 학습 가능
    • 트리라서 데이터 스케일링 필요 없음 - > 정규화/스케일링을 안 해도 됨, 이상치(outlier)에 상대적으로 강함
  • 단점
    • 과적합(Overfitting) 위험이 Random Forest보다 큼 -> learning_rate, depth 튜닝 필요
    • 순차 학습이라 병렬화 어렵다. -> XGBoost 등장 이유
from sklearn.ensemble import GradientBoostingClassifier
#- min_samples_split : node 분리에 필요한 최소 sample 수 => overfitting 방지  
#- max_depth : tree 깊이 조절 => overfitting 방지
#- learning_rate : 각 tree 의 기여도 조정, n_estimators 와 trade-off 
#- n_estimators : number of sequential trees
gb = GradientBoostingClassifier(learning_rate=0.1, n_estimators=500, max_depth=5)
gb.fit(X_train, y_train)

y_pred = gb.predict(X_test)

print(y_pred)
print("Test set true counts = ", sum(y_test))
print("predicted true counts = ", sum(y_pred))
print("accuracy = {:.2f}".format(
            sum(y_pred == y_test) / len(y_test)))
            
# making confusion matrix
print("confution matrix\n", 
      confusion_matrix(y_test, y_pred, labels=[1, 0]))
print("f1 score\n", f1_score(y_test, y_pred, labels=[1, 0]))

# xgbregressor
from xgboost import XGBRegressor

model_ts = XGBRegressor(
    n_estimators=500, learning_rate=0.05, max_depth=6, subsample=0.8, colsample_bytree=0.8)
model_ts.fit(centeral_X_train, centeral_Y_train)

9. 전통적인 비지도학습 알고리즘

비지도 학습은 개발자도 정답을 모르며 데이터만 가지고 있다. AI에게 데이터를 전달해 패턴을 찾게 시키는 방법이다.

정답을 모르기 때문에 모델이 정답을 맞췄는지 못 맞췄는지 비교하기 어려움이 있다.

 

clustering(군집화)이란 비슷한 object들끼리 모으는 것 으로 label data가 없는 것이 classification(분류)모델과 차이 라고 할 수 있다.

적용 사례 

- 고객의 구매 형태별 분류

- 고객의 취향에 맞는 책, 동영상 추천

- 뉴스 자동 분류 및 추천

- 유전자 분석

- 신용카드 정사 및 비정상 유형 찾기

1) Clustering(군집화) 알고리즘

군집화는 비지도 학습의 한 종류로, 레이블 없이 데이터 자체의 내재된 패턴을 찾아 유사한 데이터끼리 묶는 것입니다. 예측이나 분류와는 다르.

(1) K-Means Clustering

다차원에서 샘플간 거리를 계산하는 방식으로 K-Means는 미리 정한 K개의 중심을 초기화하고, 각 데이터를 가장 가까운 중심으로 할당 후, 중심을 업데이트하며 반복하는 방식으로 군집을 찾는다.

그룹핑을 직접정하기 때문에 아웃라이어(Outlier) 디텍션에 약하다. 그래서 그룹핑을 지정하는 k의 개수를 잘 정하는 것이 중요하다.

  1. Random 하게 k개의 centroid(중심점)를 정한다.
  2. 각 centroid로 부터 각 data point 까지의 거리를 계산한다.
  3. 각 data point 를 가장 가까운 centroid에 할당하여 cluster를 생성한다.
  4. k centroid 의 위치를 다시 계산한다.
  5. centroid가 더 이상 움직이지 않을 때까지 2~4단계를 반복한다.
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs

centroidLocation = [[3,2], [1,-1],[-1,2]]

X, _ = make_blobs(n_samples=1500, centers=centroidLocation)

plt.scatter(X[:,0], X[:,1], marker='.')

k_means = KMeans(n_clusters=3)
k_means.fit(X)

from matplotlib.colors import ListedColormap

colors_bold = ListedColormap(['#FF0000', '#00FF00', '#0000FF'])
colors_light = ListedColormap(['#FFAAAA', '#AAFFAA', '#AAAAFF'])

plt.figure(figsize=(8,6))

for i in range(nclusters):
    members = k_means.labels_ == i
    plt.plot(X[members, 0], X[members, 1], '.', 
             color=colors_light(i), markersize=10, label=i)
    plt.plot(centers[i, 0], centers[i, 1], 'o', 
             color=colors_bold(i), markeredgecolor='k', markersize=20)

plt.title("KMeans")
plt.legend()

(2) DBSCAN (Density-based Clustering)

DBSCAN은 밀도 기준에 따라 핵심 포인트, 경계 포인트, 이상치를 구분하며, K-Means와 달리 군집 수를 미리 정하지 않아도 되고 비구형 군집에 강점이 있어요.

K-Means의 경우 임의로 cluster 지정하므로 same cluster 내의 data point 들이 실제로는 유사하지 않을 수 있다. 이런 부분을 보완하기 위해 DBSCAN은 밀도가 높은 지역과 낮은 지역을 서로 분리한다. 

Outlier의 영향을 적게 받고, cluster 숫자를 미리 정해주지 않아도 되는 것이 장점이다.

즉 포인트들의 집합간 밀도를 파악 해서 군집화 해서 불규칙한 그룹핑도 가능하기 떄문에 밀도에서 벗어난 아웃라이어(Outlier) 디텍션에 강력하다.

from sklearn.cluster import DBSCAN

epsilon = 0.3 # 반경
minimumSamples = 7
db = DBSCAN(eps=epsilon, min_samples=minimumSamples).fit(X)

(3) Hierarchical Clustering(dendrogram)

생물학에서 많이 쓰이는 알고리즘.

(4) 차원 축소 기법 - PCA (Principal Component Analysis) 주성분 분석

차원이 증가함에 따라 vector 공간내의 spcae도 증가하는데 데이터의 양이 적으면 빈공간이 많이 발생하여 에측의 정확도가 떨어진다. 이런 경우 유사한 성격의 feature( 키, 신장 등)는 하나의 새로운 feature로 성분을 합칠 수 있다.

 

데이터의 분산을 최대한 보존하면서 서로 직교하는 새 축을 찾아, 고차원 공간의 표본들을 선형 연관성이 없는 저차원 공간으로 변환하는 방법이다.

 

PCA를 사용하여 해결하고자 하는 주요 문제는 고차원 데이터 공간의 희소성(차원의 저주)를 하결하고자 한다. 차원의 저주는 특성(Feature) 수가 많아질수록 데이터 공간이 기하급수적으로 커져 데이터가 희소해지는 현상으로 PCA는 차원을 줄여 이 문제를 완화한다.

 

PCA는 데이터의 분산을 가장 잘 설명하는 새로운 축(주성분)을 찾아 데이터를 투영함으로써(이때 분산을 최대한 보존하려함), 원본 데이터의 정보 손실을 최소화하며 차원을 줄인다.

# Apply kernel PCA
from sklearn.decomposition import PCA

pca = PCA(n_components=2) # 2 개 component 로 차원(열) 축소

X_train_pca = pca.fit_transform(X_train)
X_test_pca = pca.transform(X_test)

print(pca.components_.shape)
print("첫번째 주성분(고유벡터) :")
print(pca.components_[0])
print("두번째 주성분(고유벡터) :")
print(pca.components_[1])
print()
print('설명된 분산(고유값)의 비율: {}, 두 성분의 합: {:.2f}'.format(pca.explained_variance_ratio_,sum(pca.explained_variance_ratio_)))
      
# pca를 사용한 축소된 차원 데이터 사용해서 로지스특 돌려보기
clf = LogisticRegression(solver='lbfgs', random_state=0)
clf.fit(X_train_pca, y_train)

10. 평가 지표

1) 지도학습 회귀 모델 성능 평가

(1) MSE (Mean Squared Error)

MSE는 “회귀(regression)”에서 사용하는 대표적인 손실 함수(loss function)

오차(예측값과 실제값의 차이)를 제곱하여 평균방법 으로 값이 작을수록 모델이 잘 맞추고 있는 것

  • 큰 오차에 더 큰 패널티
  • 이상치에 민감

(2) MAE (Mean Absolute Error)

오차의 절대값 평균, 이상치에 덜 민감

MSE vs MAE

  • MSE: 정규분포 + 큰 오차 잡고 싶을 때

이상치가 거의 없는 데이터, 큰 오차를 더 강하게 잡고 싶을 때

선형회귀처럼 전통적인 회귀 모델, 미분하기 쉬워서 학습이 안정적
→ 수학적으로 예쁘고 최적화에 유리

  • MAE: 이상치 많은 실제 데이터에서 유리

이상치(outlier)가 있을 가능성이 높음, Robust한(튼튼한) 모델이 필요할 때
에러의 크기를 있는 그대로 반영하고 싶을 때, 오차에 선형적 패널티를 주고 싶을 때
→ 실제 현장 데이터에서 MAE가 더 유리한 경우 많음

 

최적화(Gradient Descent) 관점

MSE
미분 가능하고 부드러워서 최적화가 쉽다. Gradient가 큰 오차에서 커짐 → 학습 빠름
MAE
|x|은 x=0에서 미분 안 됨. 최적화가 상대적으로 까다롭고 느릴 수 있음

항목 MSE (Mean Squared Error)  MAE (Mean Absolute Error)
수식 의미 제곱 오차의 평균 절대 오차의 평균
큰 오차 영향 아주 크게 반영됨 (벌칙 큼) 반영되지만 선형적으로 증가
이상치(Outlier) 영향 매우 민감함 비교적 둔감함
최적화 특성 미분 가능하여 학습이 쉽고 안정적 기울기 0 구간 존재로 불안정할 수 있음
사용 상황 정규분포·이상치 적은 데이터 이상치 많고 현실 데이터 분포에 적합
패널티 형태 오차 증가 시 패널티가 급격히 증가 (제곱) 오차 증가에 따라 선형 증가
오차 곡선 형태 U자 형태 (parabolic) 절대값 형태 (V자 형태)

(3) R² Score(결정계수)

설명력 지표 (0~1)로 모델이 데이터를 얼마나 잘 설명하는지(설명력)를 0~1 사이에서 표현한 값 
모델이 y를 얼마나 잘 설명하는지 평가하는 지표1에 가까울수록 좋고, 0이면 평균 수준, 음수면 매우 나쁨
회귀(regression) 모델의 “성능 점수”라고 보면 됩니다.

R2 = 1−(예측값에 대한 분산의 합/분산의 합​)
R² 값  의미
1.0 완벽한 예측
0.0 모델이 실제 평균값을 그대로 사용하는 것과 동일한 수준
음수 평균보다도 못 맞추는 매우 나쁜 모델
from sklearn.metrics import r2_score
r2 = r2_score(y_true, y_pred)
print("R2:", r2)

2) 지도학습 분류모델 성능 평가

Confusion Matrix(혼돈행렬)을 이용한 평가 

실제 예측 Positive Negative
Positive TP FN
Negative FP TN
  • classification(분류) 성능의 정확성 측정
  • TP(True Positive) : 1을 1로 제대로 분류
  • FP(False Positive) : 0을 1로 잘못 분류
  • FN(False Negative) : 1을 0로 잘못 분류
  • TN(True Positive) : 0을 0으로 제대로 분류
from sklearn.metrics import confusion_matrix
cm  = confusion_matrix(y_test, y_pred, labels=[1, 0])

print("confution matrix\n", cm)

plt.figure(figsize=(5,4))

ax = sns.heatmap(cm, annot=True, fmt='d', xticklabels=[1, 0], yticklabels=[1, 0])
ax.set_ylabel('Predicted')
ax.set_title('Confusion Matirx\nGround Truth')

 

Classification rate(정확도) : (TP+TN) / (TP+TN+FP+FN) 

  • 단순히 정확도(Accuracy) 계산(전체 데이터 중 제대로 분류된 데이터 비율)

Precision(정밀성) : TP / (TP+FP)

  • Model이 sample을 True로 분류했을 때 얼마나 자주 맞췄는가 (1에 가까울 수록 좋음)
  • 더 정확한 데이터만 사용하고 싶을 때

Recall(민감도, 재현율) : TP / (TP+FN)

  • 전체 Positive 데이타 중에서 Positive로 분류한 비율 (1에 가까울 수록 좋음)
  • Positive한 부분을 놓치기 싫을 때 사용. 잘못 분류된게 많아도 다 알고 싶을 때 사용한다. (정확도는 떨어짐)
from sklearn.metrics import accuracy_score, precision_score, recall_score

# predict는 예측된 클래스 번호 array([0., 0., ...])
y_pred = 모델.predict(X_test)

print("Test set의 실제 true 갯수 = ", sum(y_test))
print("모델이 예측한 true 갯수 = ", sum(y_pred))
print("accuracy = {:.2f}".format(accuracy_score(y_test, y_pred)))
print("precision = {:.2f}".format(precision_score(y_test, y_pred)))
print("recall = {:.2f}".format(recall_score(y_test, y_pred)))
---
# predict_proba는 각 클래스의 확률 [0.85, 0.15]
y_pred_proba = 모델.predict_proba(X_test)
print(y_pred_proba)
---
y_pred_proba_1 = y_pred_proba[:, 1]
threshold = 0.4
y_pred_1 = y_pred_proba_1 > threshold
print("threshold가 {}일 때 1 로 분류된 갯수: ".format(threshold), sum(y_pred_1))
print("precision = {:.2f}".format(precision_score(y_test, y_pred_1)))
print("recall = {:.2f}".format(recall_score(y_test, y_pred_1)))
print("f1 score = ", f1_score(y_test, y_pred_1))

 

precision과 recall은 반비례를 갖는다.

  • Confidence(정확도) 수준을 올리고 싶으면 Precision을 높이고 Recall을 낮춰 Threshold를 조정한다.
  • 너무 많은 Case를 놓치고 싶지 않은 경우 ReCall을 높이고 Precision을 낮춘다.

F1-score(조화평균)

  • 전체적 성능 측정에 활용
    F1 점수는 정밀도와 재현율의 조화 평균로 계산되며, 두 값이 모두 높을 때 높은 값을 가집니다. 불균형 데이터 세트에서 모델 성능을 평가할 때 특히 유용하게 사용돼요.
  • F1-Score = 2 * (Precision * Recall) / (Precision + Recall)
    0일경우 precision과 recall둘다 좋지 않음, 1일경우 둘 다 좋음.

정밀도·재현율의 조화평균
불균형 데이터에서 특히 중요

from sklearn.metrics import f1_score
f1_score(y_test, y_pred_1)

ROC Curve (수신자 조작 특성 곡선 Receiver operating characteristic Curve)

  • FPR = FP / (FP + TN)
  • 선 아래 면적(AUC)이 클수록 좋다
from sklearn.metrics import roc_curve, roc_auc_score

y_probas = lr_classifier.predict_proba(X_test)
y_scores = y_probas[:,1]

fpr, tpr, _ = roc_curve(y_test, y_scores)
auc = roc_auc_score(y_test, y_scores)

plt.plot(fpr, tpr, label="auc="+ "{:.2f}".format(auc))
plt.legend(loc=4)
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')

11. 신경망(Neural Network)과 딥러닝

중요한 feature를 스스로 구분하여 weight를 부여한다. 어러 층에 걸친 내부 parameter를 스스로 학습하여 적용하기 쉽고 빠르다. raw data를 거의 그대로 사용한다.(computer vision, 언어처리) 

Unsupervised(비지도학습), supervised(지도학습) learning이 모두 가능하다. 

 

input, hidden, output 으로 신경망은 구성됨.

 

신경망에서 neural은 perceptron이라고도 불리며 함수임, neural안에는 pre-activation(활성함수)와 activation 2가지 존재.

 

pre-activation Functions 종류

sigmoid - output에서 많이 사용됨 범위 (0~1)

tanh - 시계열 데이터 처리에서 많이 사용됨 (-1 ~ 1)

relu -  현대 deep learning은 거의 relu사용 범위 ( 0~x), 기울기가 항상 1

 

activation(출력) 종류

Softmax Activation Function - 출력값의 다중 class 분류를 위해 출력값에 대해 정규화 (확률 분포 출력)

1) Neural Network 훈련의 핵심 방법

손실함수 → 역전파로 gradient 계산 → 경사하강법으로 업데이트

이 세 가지는 훈련 과정에서 모두 필수적으로 연결되어 동작합니다.

(1) 손실함수

경사하강법과 오차 역전파가 동작하려면 손실함수가 필요. 모델의 예측과 정답 사이의 차이를 수치로 나타냅니다.

비용함수(cost function), 목적함수(object function) 등으로 불리며 경사하강법이 가능하도록 미분 가능한 함수를 정의

 

대표적 손실함수 3가지 ( 대부분 이 3가지를 사용 )

  • Linear Regression (선형회귀) - MSE(Mean Squared Error)
  • Binary Classification (이진분류 or Logistic Regression) - Binary-Cross-Entropy
  • Multi-Class Classification (다중분류) - Categorical-Cross-Entropy

(2) Backpropagation (오차 역전파)

손실 함수를 기준으로, 각 가중치가 얼마나 손실에 기여했는지 미분(gradient)합니다.즉 손실함수를 최소화 하는 방향으로 신경망 전체의 parameter(w혹은 b)가 update 되도록 하는 기법

(3) Gradient Descent (경사하강법)

미분에 의한 함수 기울기를 구해 최소값을 찾아가는 방법으로 역전파로 계산된 gradient를 사용해 가중치를 실제로 업데이트합니다.

목적 - 실제값과 예측값의 차이를 최소화 하는 parameter(w혹은 b) 발견

방법 - 손실함수를 정의하여 손실함수의 값이 0으로 수렴하도록 parameter (w혹은 b) 조절

new w = old w - (learning rate) * (gradient)

ㄴ learning rate - 이동속도

ㄴ gradient - 미분 기울기 방향 cost function, 음의기울기면 +, 양의 기울기면 - 

개념 역할 요약
손실 함수 예측이 얼마나 틀렸는지 평가 평가 기준
역전파(backprop) 모든 파라미터의 gradient 계산 gradient 계산 알고리즘
경사하강법(optimizer) gradient를 이용해 실제 파라미터 업데이트 가중치 최적화 방법

 


12. 용어 정리

1) 회귀(Regression)

연속 값을 예측하는 문제 유형으로 출력값이 연속적인 수치일 때 이를 예측하는 모델을 통틀어 회귀 라고 부릅니다.
X를 설명 변수로 하여 Y(연속 값)를 예측하는 통계 기법 전반을 지칭.
ex) 기온 예측, 집 값 예측, 

2) 표준편차 (Standard Deviation)

표준 편차는 데이터가 평균을 중심으로 얼마나 흩어져 있는지 나타내는 통계값이다.

3) 내적 행렬(Dot Product)

왼쪽 행렬의 행 × 오른쪽 행렬의 열을 곱해 더하는 연산
벡터의 유사도, 신경망 계산 등에 널리 쓰임

이 결과는 각 원소별 내적의 합이 되는 스칼라 값이 됩니다. 이는 벡터의 내적을 행렬 곱셈으로 확장한 것이라고 볼 수 있습니다. 

4) 사분위수 (Quartile)

데이터를 크기 순으로 나열한 뒤, 전체를 4등분하는 경계값을 말합니다.
가장 많이 사용되는 세 가지 사분위수로는 제1사분위수(Q1), 제2사분위수(Q2), 그리고 제3사분위수(Q3)가 있습니다.

25%(1사분위 수), 50%(2사분위 수), 75%(3사분위 수)

5) Loss function(손실 함수)

실무에서 cost(비용 함수)보다 많이 사용

하나의 데이터에 대해 모델이 얼마나 틀렸는지 측정하는 함수 (개별 데이터 오차)

6) Cost function(비용 함수)

전체 데이터에 대한 손실(Loss)의 평균 또는 합 오류 (전체 데이터의 평균 오차) 가설이 얼마나 틀렸는지 측정

7) Objective function (목적 함수)

최적화 대상이 되는 함수(cost 포함 더 큰 개념)

8) 엔트로피(Entropy)

주어진 데이터 집합의 혼잡도(데이터가 분류되지 않고 얼마나 뒤죽박죽이냐). 즉, 우리가 가지고 있지 않은 정보의 양을 의미
혼잡도에 따라 엔트로피가 높으면 혼잡도 높음, 엔트로피가 낮으면 혼잡도가 낮음 
(0~1)로 표현하며 혼잡도는 0으로 갈 수록 낮아짐.

9) 데이터 세트 분할

과적합(Overfitting)

  • Traing Data에 비해 Test data의 Error율이 높게 나타나는 경우를 과적합 이라고 한다.
  •  과적합된 모델을 High Variance Model이라고함.
  •  학습 Data와 실제 Data 분포의 차이에 의한 error가 발생할 수 있다. 이를 줄이기 위해 충분한 복잡도를 갖는 모델의 DataSet의 크기를 늘려야한다.

과소적합(UnOverfitting)

  • - 반대로 모델이 너무 단순해서 데이터의 내재된 구조를 학습하지 못하는 경우 과소적합 이라고 한다.
  • 과소적합된 모델을 High Bias Model이라고함.
  • Approximation Model(근사치로 만든 함수)과 true function(실제 데이터) 의 차이에 의한 error가 발생한다. **이를 줄이기 위해 데이터가 충분히 있는 상태에서 모델의 Complexity(복잡도)를 올린다.**

현실에서의 데이터 무한 수집과 true function도 알 수 없을 때 간접적 방법

Traing set과 Testing set은 섞이면 안되고 동일한 분포를 유지해야 한다.(검증할 데이터를 Traing set에 넣을 경우)

 

Cross Validation(교차검증)

  • Traing set이 부족하여 testSet으로 나누기 불 충분할경우 사용하는 방법.
  • traing set을 여러개의 sub-set(ex. 하나의sub-set에 5개의 데이터로 나눴다면 4개는 train, 1개는 test)으로 나누고 각 모델을 이 sub-set의 조합으로 훈련시키고 나머지 부분으로 검증하는 방법이다.
  • Precision / Recall / F1-Score

dataset split - 3split

데이터 set을 3개로 나누어 학습시키는 방법이 가장 좋다고 한다.
- training : 학습용
- validation : hyper parameter tuning 용(ex. cross validation 등 사용)
- test : test용

 

10) 경사하강법

오차(loss)가 최소가 되는 지점을 찾기 위해, 기울기(gradient)가 내려가는 방향으로 파라미터를 조금씩 업데이트하는 최적화 방법

11) 아웃라이어(Outlier)

아웃라이어(Outlier)는 데이터 전체의 패턴에서 벗어난 극단적인 값을 의미하며, 통계적으로는 평균이나 중앙값에서 크게 떨어진 값으로 정의됩니다. 아웃라이어는 데이터 분석 결과를 왜곡할 수 있어, 이를 탐지하고 처리하는 것이 중요합니다. 대표적인 탐지 방법으로는 Z-score와 IQR(사분위수 범위)을 이용한 통계적 방법과, 밀도 기반 알고리즘인 DBScan, 트리 계열 알고리즘인 Isolation Forest 등이 있습니다

12) 차원의 저주

차원의 저주는 특성(Feature) 수가 많아질수록 데이터 공간이 기하급수적으로 커져 데이터가 희소해지는 현상으로 PCA를 사용하여 차원을 줄여 이 문제를 완화한다.

 

 

728x90