yon11b

[SK 쉴더스 루키즈] 머신러닝(지도학습, 회귀/분류 알고리즘) 본문

보안/SK 쉴더스 루키즈

[SK 쉴더스 루키즈] 머신러닝(지도학습, 회귀/분류 알고리즘)

yon11b 2026. 3. 29. 00:46
반응형

상관계수와 상관행렬

상관계수: 두변수 간의 선형 관계의 강도와 방향

범위

  • -1: 하나가 증가하면 다른 것은 감소(음의 상관관계)
  • 0: 관계가 없거나 비선형적
  • +1: 하나가 증가하면 다른 것도 증가(양의 상관관계)

 

회귀분석

Y=aX+b


a와 b의 값을 구하는것이 머신러닝을 하는 것
회귀=예측

 

상관관계: 두 변수 간의 변화가 함께 나타나는 경우
인과관계; 한 변수의 변화가 다른 변수에 직접적인 영향을 미치는 경우


우리는 상관관계보다 인과관계를 알아내야 한다.(상관관계는 인과관계가 아닐 수 있음)
e.g. 아이스크림 판매량과 에어컨 판매량의 상관계수는 양의 관계를 보일 수 있지만(둘 다 여름철과 관련이 있음) 이는 인과관계가 아님

 

관계분석의 도구

  • 상관계수
  • 산점도
  • 회귀분석

 

머신러닝

규칙(패턴)을 찾는 것
딥러닝:머신러닝의 한 종류

 

지도학습

  • 문제-답
  • data 클래스 비중을 잘 줘야 한다.
    • 스팸o 99%, 스팸x 1% -> no!
    • 스팸o 50%, 스팸x 50% -> good!
  • e.g.
    • 스팸메일 분류
    • 집값 예측
    • 이미지 분류

용어
입력: Features / 출력: Target

 

회귀 알고리즘 == 예측

  • 지도학습에서 쓰임
  • 회귀: 연속적인 숫자값을 예측하는 알고리즘
  • 예측 결과는 특정 숫자로 나타남
  • 입력 데이터와 출력 값 간의 수학적 관계(함수)를 모델링
  • 가장편차가 작은 회귀선을 찾는 것! 최종적으로 절편과 기울기를 찾는 것
    • input이 들어갔을 때 outpu이 나오는 선을 찾는 것
  • 집 값 예측, 판매량 예측, 온도 예측

 

분류 알고리즘 => 분류

  • 지도학습에서 쓰임
  • 데이터를 미리 정해진 범주 중 하나로 분류하는 알고리즘
  • 예측 결과는 숫자가 아닌 범주이다.
  • 로지스틱 회귀(이름은 회귀지만 분류 알고리즘이다.....)
    • 선형회귀를 응용한 알고리즘. 출력값을 특정 범주로 분류
    • 결과는 0~1 사이의 확률 값이다. 특정 기준을 넘어가면 해당 범주로 분류하는 식
  • 중간에 분류하는 선을 찾는 것!

  • 스팸 분류, 질병 진단, 이미지 분류

 

학습 데이터와 테스트데이터의 분리

모델 과적합
학습된 데이터로만 했을 때는 성능이 좋음. 하지만 일반화된 데이터를 input으로 넣었을 때는 성능이 안 좋음

  • 학습 Data 너무 많거나 학습 횟수 너무 많은 경우
  • e.g.
    • 1+1=2 → 10000번 학습함
    • 예측) 1+3 =2 로 잘못 예측할 수 있음.
      ⇒ 일반화가 안 된다.
      ⇒ 그래서 특정 데이터가 많게 하는 걸 방지하기 위해 데이터를 먼저 잘 분류시켜야 하는 것이다. 정규분포 형태로 나타나게!

학습데이터 : 테스트데이터 = 8:2 / 7:3

# Gender는 숫자로 변환 (Label Encoding)
df['Gender'] = df['Gender'].map({'Male': 0, 'Female': 1})
# 특성과 타겟 분리
X = df[['Age', 'Gender', 'PurchaseAmount']] # 입력 데이터
y = df['Satisfaction'] # 출력 데이터
print(X)
print(y)

from sklearn.model_selection import train_test_split
# 데이터 분리
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 8:2로 구성

print("학습 데이터 크기:", X_train.shape)
print("테스트 데이터 크기:", X_test.shape)
print(X_train) # 학습 데이터의 입력 데이터
print('*'*10)
print(y_train) # 학습 데이터의 출력 데이터
print('*'*10)
print(X_test) # 테스트 데이터의 입력 데이터
print('*'*10)
print(y_test) # 테스트 데이터의 출력 데이터

 

선형회귀

y=mx+b라는 직선 방정식으로 표현

 

경사하강법
기울기(m)와 y절편(b)의 변화량 계산

m_gradient = -(2 / len(X)) * sum(X * error)
b_gradient = -(2 / len(X)) * sum(error)

m, b의 값을 계속 바꿔가면서 반복한다.
최종 목표: 점에서 직선까지의 거리를 최소화하는 직선을 찾는 것

scikit learn 라이브러리에는 경사하강 코드가 구현되어 있다.

 

성능지표

MSE
직선과 실제 데이터 간의 차이값을 구함

error = y - y_pred
mse = (error ** 2).mean()

오차가 크면 큰 패널티를 줌. 큰 오차에 민감한 평가 방법

 

RMSE
mse에 루트 씌움

 

MAE
오차의 절대값 평균을 단순 계산 실수의 평균 크기를 직접 보는 역할.

 

R2
모델이 얼마나 적합한가?를 백분율로 나타낸 것(1점 만점)

model() → fit() → predict() → mse, rmse, mae, r2

 

전체 코드

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score

# 1. 데이터 준비
X = np.array([1, 2, 3, 4, 5]).reshape(-1, 1) # 공부 시간 (2D 배열로 변환)
y = np.array([50, 55, 65, 70, 75]) # 시험 점수
# 2. 모델 학습
model = LinearRegression() # 선형 회귀 모델 생성
model.fit(X, y) # 모델 학습

# 3. 학습된 모델의 기울기와 절편 확인
m = model.coef_[0] # 기울기
b = model.intercept_ # 절편
print(f"학습된 기울기(m): {m:.2f}")
print(f"학습된 y절편(b): {b:.2f}")
# 4. 예측 값 계산
y_pred = model.predict(X) # 학습 데이터에 대한 예측 값

# 5. 성능 평가
mse = mean_squared_error(y, y_pred) # MSE 계산
rmse = np.sqrt(mse) # RMSE 계산
mae = mean_absolute_error(y, y_pred) # MAE 계산
r2 = r2_score(y, y_pred) # R^2 계산
print(f"MSE: {mse:.2f}")
print(f"RMSE: {rmse:.2f}")
print(f"MAE: {mae:.2f}")
print(f"R^2: {r2:.2f}")

# 6. 학습 결과 시각화
plt.rc('font', family='batang') # For Windows
plt.scatter(X, y, color='blue', label='실제 데이터') # 실제 데이터
plt.plot(X, y_pred, color='red', label='학습된 모델') # 학습된 직선
plt.xlabel('공부 시간 (시간)')
plt.ylabel('시험 점수 (점수)')
plt.legend()
plt.title('Scikit-learn을 이용한 선형 회귀 학습 결과')
plt.show()

# 7. 새로운 데이터 예측
new_study_hours = np.array([6, 8, 10]).reshape(-1, 1) # 새로운 공부 시간
predicted_scores = model.predict(new_study_hours) # 예측
print("새로운 공부 시간에 따른 예측 점수:", predicted_scores)

 

다른 지도학습 알고리즘들

의사결정트리

  • 과적합 가능성
  • 너무 전문가. 깊은 트리 ⇒ 특성이 많다는 것

랜덤포레스트 → 최근에 많이 씀

  • 의사결정트리의 과적합 단점을 개선

n_estimators=100 결정트리. 이거에 따라 성능이 좌우됨.

model = RandomForestRegressor(n_estimators=100, random_state=42)

 

 

분류

핵심: sigmod 함수 -> 0에서 1 사이의 확률로 리턴해줌

 

미세 조정하는 방법

1. 임계값 조절

2. 가중치 조절

 

성능 평가 지표

  • 정확도
  • precision
  • recall(중요, 오탐)
  • F1-score

혼동행렬

약자 첫 글자 (결과) 둘째 글자 (예측)
TP True = 맞췄다 Positive = 양성이라고 예측
FP False = 틀렸다 Positive = 양성이라고 예측
TN True = 맞췄다 Negative = 음성이라고 예측
FN False = 틀렸다 Negative = 음성이라고 예측

 

첫 글자 = 내가 맞았냐, 둘째 글자 = 내가 뭐라고 했냐

맞췄는데, 양성이라고 예측해서 맞췄다.

FP(오탐): 틀렸는데, 양성이라고 예측해서 틀렸다. => "오해해서 양성" (억울한 사람 생김)

맞췄는데, 음성이라고 예측해서 맞췄다.

FN(미탐): 틀렸는데, 음성이라고 예측해서 틀렸다. => "놓쳐버린 양성" (위험한 실수)

 

 

 

 

 

 

 

 

 

 

728x90