| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
- SK쉴더스
- 루키즈 31기
- 동적분석
- 프랑스어 #프랑스어배우기 #프랑스어독학 #델프인강 #시원스쿨프랑스어 #delf독학 #델프 #프랑스어기초 #프랑스어공부
- 예술의 전당
- React
- 루키즈31기
- 레나튜토리얼
- 악성코드 분석
- 애플리케이션 계층
- 코리안챔버오케스트라
- c
- 위상 정렬
- Dreamhack
- 웹개발
- sk쉴더스 루키즈
- linux
- 자바
- SK쉴더스루키즈
- 백엔드
- 우테코
- Practical Malware Analysis Labs
- 서울청년문화패스
- 깃
- 우아한테크코스
- 알고리즘
- webhacking
- 진입차수
- 프리코스
- sk 쉴더스 루키즈
- Today
- Total
yon11b
[SK 쉴더스 루키즈] 머신러닝(지도학습, 회귀/분류 알고리즘) 본문
상관계수와 상관행렬
상관계수: 두변수 간의 선형 관계의 강도와 방향
범위
- -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(미탐): 틀렸는데, 음성이라고 예측해서 틀렸다. => "놓쳐버린 양성" (위험한 실수)
'보안 > SK 쉴더스 루키즈' 카테고리의 다른 글
| [SK 쉴더스 루키즈] 네트워크 - ARP, Wireshark, tshark (1) | 2026.04.08 |
|---|---|
| [SK 쉴더스 루키즈] 네트워크 - TCP, UDP, IP 헤더, ICMP, 단편화 (1) | 2026.04.06 |
| [SK 쉴더스 루키즈] 파이썬 기초 5(상속, 모듈, 라이브러리, pandas, numpy) (0) | 2026.03.17 |
| [SK 쉴더스 루키즈] 파이썬 데이터 통계2 (전처리) (0) | 2026.03.14 |
| [SK 쉴더스 루키즈] 파이썬 데이터 통계1 (크롤링, RDBMS) (0) | 2026.03.14 |
