내일배움캠프

[본캠프] 데이터기반 QA/QC 부트캠프 34일차

min0jun 2026. 6. 29. 21:32

1. 오늘의 학습 목표

오늘은 머신러닝에서 자주 사용되는 여러 알고리즘을 한 번에 정리했다.

이전까지는 선형회귀, 로지스틱 회귀, 데이터 전처리, 모델 평가 흐름을 중심으로 배웠다면, 오늘은 그 다음 단계로 다양한 머신러닝 알고리즘이 어떤 방식으로 동작하는지를 살펴봤다.

오늘의 학습 목표는 크게 세 가지였다.

첫 번째는 의사결정나무, 랜덤포레스트, KNN, 부스팅처럼 자주 사용되는 지도학습 알고리즘을 이해하는 것이다.

두 번째는 정답이 없는 데이터에서 패턴을 찾아내는 비지도학습, 특히 K-means 군집화와 RFM 기반 고객 세그멘테이션을 정리하는 것이다.

세 번째는 머신러닝에서 더 확장된 개념인 딥러닝의 기본 구조를 이해하는 것이다. 인공신경망, 퍼셉트론, 경사하강법, 활성화 함수, Hidden Layer, epoch 같은 개념을 중심으로 딥러닝이 어떤 흐름으로 동작하는지 확인했다.


2. 오늘 학습한 내용

머신러닝

의사결정나무

의사결정나무는 말 그대로 의사결정 규칙을 나무 구조로 표현하는 알고리즘이다.

타이타닉 생존 예측 문제를 예로 들면, 성별이 남자인지 여자인지, 나이가 얼마인지, 객실 등급이 무엇인지 같은 조건을 기준으로 데이터를 나누어 예측을 수행할 수 있다.

나무의 시작점은 루트 노드라고 한다. 여기서 첫 번째 분할 조건이 정해지고, 이후 조건에 따라 여러 노드로 나뉜다. 최종적으로 도착하는 노드는 리프 노드라고 한다.

의사결정나무에서 중요한 개념 중 하나는 불순도다. 불순도는 한 노드 안에 여러 클래스가 얼마나 섞여 있는지를 나타낸다. 지니 계수는 불순도를 측정하는 방법 중 하나이며, 값이 낮을수록 한쪽 클래스로 잘 분리된 상태라고 볼 수 있다.

의사결정나무의 장점은 해석하기 쉽다는 점이다. 어떤 조건으로 데이터를 나누었는지 눈으로 확인할 수 있기 때문에 모델의 판단 과정을 이해하기 쉽다. 또한 분류와 회귀 모두에 사용할 수 있고, 이상치에 비교적 견고하며 스케일링이 필수는 아니다.

하지만 단점도 있다. 나무가 너무 깊게 성장하면 학습 데이터에 과하게 맞춰져 과적합이 발생할 수 있다. 또 데이터가 조금만 바뀌어도 나무의 구조가 크게 달라질 수 있어 불안정할 수 있다.

from sklearn.tree import DecisionTreeClassifier

model = DecisionTreeClassifier()
model.fit(X_train, y_train)

의사결정나무는 직관적이지만, 혼자 사용하면 과적합에 빠지기 쉽다는 점을 조심해야 한다.

랜덤포레스트

랜덤포레스트는 의사결정나무의 단점을 보완하기 위해 나온 알고리즘이다.

의사결정나무 하나만 만들면 데이터 변화에 민감하고 과적합이 생길 수 있다. 그래서 랜덤포레스트는 여러 개의 나무를 만들고, 그 결과를 합쳐 최종 예측을 만든다.

이름 그대로 나무 하나가 아니라 숲을 만드는 방식이다.

랜덤포레스트의 핵심은 배깅이다. 배깅은 Bootstrapping과 Aggregating을 합친 개념이다.

Bootstrapping은 데이터를 복원 추출해서 비슷하지만 조금씩 다른 여러 데이터셋을 만드는 것이다. Aggregating은 여러 모델의 예측 결과를 합치는 것이다.

예를 들어 어떤 승객에 대해 세 개의 나무가 예측했다고 해보자. 두 개의 나무는 생존, 하나의 나무는 사망이라고 판단했다면 최종 결과는 다수결에 따라 생존으로 결정할 수 있다.

랜덤포레스트는 여러 나무의 판단을 합치기 때문에 단일 의사결정나무보다 안정적인 성능을 기대할 수 있다.

from sklearn.ensemble import RandomForestClassifier

model = RandomForestClassifier()
model.fit(X_train, y_train)

랜덤포레스트의 장점은 과적합을 줄일 수 있고, 이상치에 비교적 강하며, 변수 중요도를 확인할 수 있다는 점이다.

다만 여러 개의 모델을 동시에 사용하는 앙상블 방식이기 때문에 컴퓨터 리소스를 더 많이 사용하고, 단일 의사결정나무보다 해석이 어려울 수 있다.

KNN

KNN은 K-Nearest Neighbor의 줄임말로, 최근접 이웃 알고리즘이라고 한다.

이 알고리즘은 주변 데이터를 보고 새 데이터의 값을 예측한다. 쉽게 말하면 “가까운 친구들을 보고 판단하는 방식”이다.

예를 들어 K가 3이라면 새 데이터와 가장 가까운 3개의 데이터를 확인한다. 그중 어떤 클래스가 더 많은지 보고 새 데이터의 클래스를 예측한다.

KNN에서 중요한 것은 두 가지다.

첫 번째는 K를 몇으로 정할지다. K가 너무 작으면 주변 일부 데이터에 너무 민감해질 수 있고, K가 너무 크면 전체적인 패턴에 묻혀 세밀한 분류가 어려울 수 있다.

두 번째는 거리 계산 방식이다. KNN은 거리 기반 알고리즘이기 때문에 데이터 간 거리를 계산해서 가까운 이웃을 찾는다. 대표적인 거리 계산 방식으로는 유클리드 거리가 있다.

from sklearn.neighbors import KNeighborsClassifier

model = KNeighborsClassifier(n_neighbors=5)
model.fit(X_train, y_train)

KNN은 이해하기 쉽고 직관적이며, 분류와 회귀 모두에 사용할 수 있다.

하지만 단점도 있다. 거리 기반 알고리즘이기 때문에 변수의 단위에 영향을 많이 받는다. 그래서 표준화나 정규화 같은 스케일링이 중요하다. 또한 차원이 많아질수록 계산량이 많아지고 성능이 떨어질 수 있다.

처음에는 KNN이 단순해 보여서 쉬운 알고리즘처럼 느껴졌는데, 오히려 K값과 거리 기준, 스케일링 여부가 성능에 크게 영향을 줄 수 있다는 점이 중요했다.

부스팅

부스팅은 여러 개의 약한 학습기를 순차적으로 학습시키면서 성능을 높이는 앙상블 방법이다.

랜덤포레스트가 여러 나무를 만들어 결과를 합치는 방식이라면, 부스팅은 앞 모델이 틀린 부분을 다음 모델이 더 집중해서 학습하는 방식에 가깝다.

즉, 잘못 예측한 데이터에 더 큰 가중치를 주면서 오류를 점점 줄여나간다.

부스팅 계열 알고리즘에는 Gradient Boosting, XGBoost, LightGBM 등이 있다.

Gradient Boosting은 경사하강법의 아이디어를 이용해 오류를 줄여나간다.

XGBoost는 트리 기반 앙상블 기법으로 성능이 좋아 Kaggle 같은 대회에서도 자주 사용된다. 병렬 학습이 가능해 속도 면에서도 강점이 있다.

LightGBM은 XGBoost와 함께 많이 사용되는 알고리즘이다. 학습 시간이 짧고 메모리 사용량이 적다는 장점이 있지만, 데이터가 너무 적으면 과적합이 발생할 수 있다.

from sklearn.ensemble import GradientBoostingClassifier

model = GradientBoostingClassifier()
model.fit(X_train, y_train)

부스팅은 성능이 좋은 경우가 많지만, 모델이 복잡해질 수 있고 튜닝할 값도 많아진다. 그래서 단순히 좋다고 바로 쓰기보다는 데이터 크기와 목적에 맞게 선택해야 한다.

지도학습 모델 비교

오늘 배운 지도학습 모델을 정리하면 다음과 같다.

의사결정나무는 해석이 쉽고 직관적이지만 과적합에 주의해야 한다.

랜덤포레스트는 여러 개의 나무를 사용해 의사결정나무의 불안정성을 보완한다.

KNN은 가까운 이웃을 기준으로 예측하는 방식이라 이해하기 쉽지만, 거리 기반이기 때문에 스케일링이 중요하다.

부스팅은 여러 약한 학습기를 순차적으로 학습시키며 성능을 높이는 방식이다.

각 알고리즘은 장점과 단점이 다르기 때문에 “어떤 알고리즘이 무조건 좋다”라기보다는 데이터의 형태와 목적에 맞게 선택해야 한다.

비지도학습과 군집화

이후에는 비지도학습을 학습했다.

지금까지 배운 회귀와 분류는 대부분 지도학습이었다. 지도학습은 X와 Y가 함께 주어진 상태에서 모델이 정답을 맞히도록 학습하는 방식이다.

반면 비지도학습은 정답 Y가 없는 데이터에서 패턴을 찾아내는 방식이다.

예를 들어 고객 데이터를 가지고 헤비유저, 일반유저, 이탈 가능 고객처럼 그룹을 나눌 수 있다. 이때 누가 어떤 그룹인지 미리 정답이 주어진 것이 아니라, 데이터의 특성을 기준으로 비슷한 고객끼리 묶는 것이다.

비지도학습은 정답이 없기 때문에 지도학습보다 해석에 주관이 들어갈 수 있다. 그래서 결과를 어떻게 해석하고 활용할지가 중요하다.

K-means 군집화

K-means는 대표적인 군집화 알고리즘이다.

K-means는 먼저 몇 개의 군집으로 나눌지 K를 정한다. 이후 임의의 중심점을 잡고, 각 데이터가 가장 가까운 중심점에 속하도록 그룹화한다. 그다음 각 그룹의 평균 위치로 중심점을 이동하고, 다시 데이터를 그룹화한다.

이 과정을 반복하면서 군집을 만들어간다.

from sklearn.cluster import KMeans

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

labels = kmeans.labels_
centers = kmeans.cluster_centers_

K-means는 적용하기 쉽고 많이 사용되는 알고리즘이다.

하지만 단점도 있다. 거리 기반 알고리즘이기 때문에 차원이 많아질수록 성능이 떨어질 수 있고, 반복 횟수가 많아지면 시간이 오래 걸릴 수 있다. 또한 K를 몇으로 정할지 분석가가 결정해야 한다는 점도 있다.

그리고 평균 중심점을 기준으로 계산하기 때문에 이상치에 취약할 수 있다.

군집 평가와 실루엣 계수

비지도학습은 정답이 없기 때문에 평가가 어렵다.

그래도 군집이 잘 나뉘었는지 확인하기 위해 실루엣 계수를 사용할 수 있다.

실루엣 계수는 같은 군집 안의 데이터끼리는 얼마나 가깝고, 다른 군집과는 얼마나 멀리 떨어져 있는지를 나타내는 지표다.

값이 1에 가까울수록 군집화가 잘 된 것이고, -1에 가까울수록 잘못 군집화되었을 가능성이 높다.

from sklearn.metrics import silhouette_score

score = silhouette_score(X, labels)

좋은 군집화는 같은 군집끼리는 가깝고, 다른 군집과는 멀리 떨어져 있어야 한다.

RFM 기반 고객 세그멘테이션

군집화 실습에서는 RFM 기반 고객 세그멘테이션을 다뤘다.

RFM은 Recency, Frequency, Monetary value의 약자다.

Recency는 고객이 얼마나 최근에 구매했는지를 의미한다.

Frequency는 고객이 얼마나 자주 구매했는지를 의미한다.

Monetary value는 고객이 총 얼마를 구매했는지를 의미한다.

이 세 가지 기준을 이용하면 고객을 여러 유형으로 나눌 수 있다. 예를 들어 최근에 자주 구매하고 금액도 큰 고객은 핵심 고객으로 볼 수 있고, 오래전에 한 번만 구매한 고객은 이탈 가능성이 있는 고객으로 볼 수 있다.

고객 세그멘테이션은 CRM 분야에서 자주 활용된다. 고객 특성에 따라 맞춤형 마케팅이나 서비스를 제공하는 데 사용할 수 있다.

실습 흐름은 데이터를 불러오고, 결측치를 제거하고, 필요한 데이터만 추린 뒤, RFM 기준으로 데이터를 가공하는 방식이었다. 이후 StandardScaler를 적용하고 K-means로 고객을 군집화했다.

from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans

scaler = StandardScaler()
rfm_scaled = scaler.fit_transform(rfm_df)

kmeans = KMeans(n_clusters=4)
rfm_df['cluster'] = kmeans.fit_predict(rfm_scaled)

이 부분은 실제 업무와 연결되는 느낌이 강했다. 단순히 알고리즘을 공부하는 것이 아니라, 고객을 그룹화하고 마케팅 전략에 활용할 수 있다는 점에서 비지도학습의 쓰임이 조금 더 현실적으로 보였다.


딥러닝

머신러닝과 딥러닝의 차이

딥러닝은 머신러닝의 한 분야다.

머신러닝과 딥러닝은 모두 데이터를 기반으로 패턴을 학습하고 예측이나 분류를 수행한다는 점에서 공통점이 있다.

차이점은 내부 구조에 있다. 머신러닝은 데이터 안의 통계적 관계를 찾아 예측하거나 분류하는 방식이고, 딥러닝은 인간의 신경세포 구조를 모방한 인공신경망을 사용한다.

딥러닝은 특히 이미지 처리, 자연어 처리, 음성 처리처럼 복잡한 데이터에서 큰 성능을 보인다.

퍼셉트론과 인공신경망

딥러닝의 기본 단위는 퍼셉트론이다.

퍼셉트론은 입력값에 가중치를 곱하고, 편향을 더한 뒤, 결과를 출력하는 구조다.

선형회귀와 연결해서 생각하면 조금 더 이해하기 쉽다. 입력값 X에 가중치 w를 곱하고 편향 b를 더해 예측값을 만드는 방식이다.

y_pred = w * x + b

처음에는 인공신경망이라고 하면 굉장히 복잡한 개념처럼 느껴졌는데, 가장 기본은 결국 입력값, 가중치, 편향, 출력값으로 구성된다는 점이 인상적이었다.

이 퍼셉트론이 여러 개 모이고, 여러 층으로 쌓이면 인공신경망이 된다.

경사하강법

경사하강법은 모델의 손실 함수를 최소화하기 위해 가중치를 반복적으로 조정하는 최적화 방법이다.

회귀 문제에서는 실제 값과 예측 값의 차이를 줄이는 것이 목표다. 이때 MSE 같은 손실 함수를 사용하고, 이 손실이 가장 작아지는 방향으로 가중치를 조금씩 바꿔간다.

new_weight = old_weight - learning_rate * gradient

쉽게 생각하면 산에서 가장 낮은 곳으로 내려가는 과정과 비슷하다. 현재 위치에서 기울기가 낮아지는 방향으로 조금씩 이동하면서 손실이 작아지는 지점을 찾는 것이다.

여기서 learning rate는 한 번에 얼마나 이동할지를 결정한다. 너무 크면 최적 지점을 지나칠 수 있고, 너무 작으면 학습 속도가 느려질 수 있다.

활성화 함수와 Hidden Layer

딥러닝에서는 활성화 함수가 중요하다.

활성화 함수는 인공신경망에 비선형성을 추가하는 역할을 한다. 만약 활성화 함수가 없다면 여러 층을 쌓아도 결국 단순한 선형 조합에 가까워질 수 있다.

로지스틱 회귀에서 배웠던 시그모이드 함수도 활성화 함수의 한 예다.

또한 딥러닝에는 Hidden Layer라는 개념이 있다. Hidden Layer는 Input Layer와 Output Layer 사이에 있는 숨은 층이다. 이 층을 통해 모델은 더 복잡한 패턴과 고차원적인 특성을 학습할 수 있다.

이미지나 자연어처럼 단순한 선형 관계로 설명하기 어려운 데이터를 처리할 수 있는 이유도 이런 구조 덕분이다.

하지만 층을 많이 쌓는다고 무조건 좋아지는 것은 아니다. 역전파 과정에서 아래층으로 갈수록 기울기가 작아지는 기울기 소실 문제가 발생할 수 있다. 이를 완화하기 위해 ReLU 같은 활성화 함수가 사용된다.

순전파와 역전파

인공신경망의 학습 과정에는 순전파와 역전파가 있다.

순전파는 입력 데이터가 신경망의 각 층을 지나 최종 출력까지 전달되는 과정이다.

역전파는 예측 결과와 실제 값의 차이를 바탕으로 오류를 뒤쪽에서 앞쪽으로 전달하며 가중치를 조정하는 과정이다.

즉, 순전파로 예측하고, 손실을 계산한 뒤, 역전파로 가중치를 수정하면서 모델이 점점 학습된다.

이 흐름을 반복하면서 모델은 더 나은 예측을 하도록 조정된다.

epoch, batch, iteration

딥러닝에서는 학습 반복과 관련된 용어도 중요하다.

epoch는 전체 데이터가 신경망을 한 번 통과하는 사이클을 의미한다. 예를 들어 100 epoch는 전체 데이터를 100번 반복해서 학습한다는 뜻이다.

batch는 전체 데이터를 한 번에 모두 학습하지 않고 작은 묶음으로 나눈 단위다.

iteration은 한 epoch 안에서 batch가 몇 번 학습되는지를 의미한다.

예를 들어 데이터가 1000개이고 batch size가 100이라면, 1 epoch에서 iteration은 10번 발생한다.

이 개념은 처음에는 용어가 비슷해서 헷갈렸는데, 전체 반복은 epoch, 묶음은 batch, 묶음별 학습 횟수는 iteration으로 구분하니 조금 정리됐다.

TensorFlow와 Keras

딥러닝 실습에서는 TensorFlow와 Keras를 사용했다.

TensorFlow는 구글이 공개한 머신러닝 라이브러리이고, Keras는 딥러닝 모델을 더 쉽게 만들 수 있게 해주는 API다.

모델은 Sequential 방식으로 만들 수 있다. model.add()로 층을 쌓고, model.compile()로 학습 방법을 설정한 뒤, model.fit()으로 모델을 학습한다.

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

model = Sequential()

model.add(Dense(64, activation='relu', input_shape=(X_train.shape[1],)))
model.add(Dense(1, activation='sigmoid'))

model.compile(
    optimizer='adam',
    loss='binary_crossentropy',
    metrics=['accuracy']
)

model.fit(X_train, y_train, epochs=10)

Dense는 완전 연결층을 의미한다. units는 해당 층의 유닛 수이고, input_shape는 입력 데이터의 형태를 지정한다.

모델 구조는 model.summary()로 확인할 수 있고, 테스트 데이터 평가는 model.evaluate(), 새로운 데이터 예측은 model.predict()로 수행할 수 있다.

딥러닝의 최신 활용

딥러닝은 자연어 처리와 이미지 처리에서 많이 활용된다.

자연어 처리는 인간의 언어를 데이터화하는 분야다. 단순하게는 단어의 빈도수를 기반으로 문장을 표현하는 Bag of Words 방식이 있다. 하지만 언어는 문맥이 중요하기 때문에, 최근에는 문맥을 더 잘 이해하는 딥러닝 기반 모델이 발전했다.

최근에는 GPT, PaLM, LLaMA 같은 LLM이 등장했다. 이런 모델은 대규모 언어 데이터를 학습하여 문장을 이해하고 생성하는 데 사용된다.

이미지 분야에서는 이미지 자체가 RGB 값으로 이루어진 데이터라는 점이 중요했다. 이미지는 숫자로 표현할 수 있기 때문에 딥러닝 모델이 학습할 수 있다.

이미지 처리에서는 CNN 같은 합성곱 신경망이 많이 사용되었고, 최근에는 텍스트를 입력하면 이미지를 생성하는 Stable Diffusion 같은 멀티모달 모델도 등장했다.

딥러닝이 단순히 모델 하나를 배우는 것이 아니라, 자연어, 이미지, 음성 등 다양한 데이터 형태로 확장된다는 점이 인상적이었다.


3. 나의 간단 소감

오늘은 머신러닝 알고리즘을 많이 훑어본 하루였다. 의사결정나무, 랜덤포레스트, KNN, 부스팅까지 보니까 알고리즘마다 문제를 바라보는 방식이 다르다는 것이 느껴졌다.

의사결정나무는 조건을 따라가며 판단하는 방식이라 직관적이었다. 하지만 나무가 너무 깊어지면 과적합이 생길 수 있다는 점이 확실히 단점으로 보였다. 랜덤포레스트는 여러 나무를 만들어서 그 단점을 줄인다는 점에서 꽤 현실적인 개선 방식처럼 느껴졌다.

KNN은 가까운 데이터를 보고 판단한다는 점이 가장 이해하기 쉬웠다. 다만 거리 기반 알고리즘이라 스케일링이 중요하다는 점을 보면서, 이전에 배운 전처리가 왜 계속 중요한지 다시 연결됐다. 알고리즘만 따로 있는 게 아니라 전처리와 평가까지 같이 묶여 있다는 느낌이었다.

부스팅은 약한 모델을 순차적으로 보완해간다는 점이 인상적이었다. 앞에서 틀린 부분을 다음 모델이 더 신경 쓰는 방식이라, 단순하지만 강력한 아이디어처럼 보였다. XGBoost나 LightGBM이 왜 실무나 대회에서 자주 쓰이는지도 조금 이해됐다.

비지도학습에서는 정답이 없는 데이터를 다룬다는 점이 생각보다 어려웠다. 회귀나 분류는 정답이 있어서 맞고 틀림을 비교할 수 있는데, 군집화는 나눈 결과를 사람이 해석해야 한다. 그래서 K-means는 알고리즘 자체보다 K를 어떻게 정하고 결과를 어떻게 해석할지가 더 중요해 보였다.

RFM 고객 세그멘테이션은 실제 업무와 연결되는 느낌이 강했다. 고객을 최근 구매일, 구매 빈도, 구매 금액으로 나누고 그룹화한다는 방식이 단순하면서도 마케팅에 바로 쓸 수 있어 보였다. 비지도학습이 “정답 없는 데이터에서 의미 있는 그룹을 찾는 일”이라는 게 조금 더 와닿았다.

딥러닝은 개념이 갑자기 넓어지는 느낌이었다. 퍼셉트론, 가중치, 편향까지는 선형회귀와 연결되어 이해가 됐는데, Hidden Layer, 활성화 함수, 역전파까지 들어가니 확실히 구조가 복잡해졌다. 그래도 결국 핵심은 입력값을 받아 예측하고, 오차를 줄이는 방향으로 가중치를 조정하는 흐름이라는 점은 같았다.

오늘 내용은 양이 많아서 한 번에 완전히 익숙해지기는 어렵지만, 머신러닝의 큰 지도를 한 번 본 느낌이었다. 지도학습, 비지도학습, 딥러닝이 각각 어떤 문제를 풀기 위해 등장했는지를 정리할 수 있었고, 이제 알고리즘 이름을 봤을 때 대략 어떤 방식인지 감을 잡을 수 있게 된 하루였다.