데이터를 기반으로 스스로 학습하여 패턴을 발견하고, 이를 통해 미래의 결과를 예측 또는 의사결정을 내리는 기술
데이터와 함께 해당 데이터에 대한 정답(라벨)을 제공하여 모델이 학습하도록 하는 방법
-> 질문과 답을 주고 학습시키는 방식
회귀(Regression): 연속적인 값(숫자)를 예측하는 문제를 해결
ㄴ> 입력 데이터와 출력 값 간의 수학적 관계(선형/비선형)를 모델링
선형 회귀(Linear Regression): 입력 변수-출력 변수 사이 관계를 직선으로 표현
분류(Classification): 데이터를 미리 정의된 범주로 나누는 문제를 해결
ㄴ> 입력 데이터를 보고 각 데이터가 어떤 범주에 속하는지 판단
선형 회귀(Linear Classification): 출력 값을 특정 범주로 분류하고 그 결과는 0-1 사이 확률 값으로 나타냄 -> 특정 기준을 넘어가면 해당 범주로 분류
데이터는 있지만 정답(라벨)은 주어지지 않은 상태에서 학습하는 방법
-> 질문만 주고 답은 스스로 찾도록 하는 방식
모델이 데이터를 학습하는 과정과 평가하는 과정을 분리하기 위해 필요
① 특성과 타겟 분리
② 학습 데이터와 테스트 데이터 분리
연속적인 숫자 데이터를 예측하는데 사용되는 지도학습 알고리즘
① 학습 데이터 수집: 입력 데이터(독립 변수)와 정답(종속 변수)을 준비
② 모델 학습: 데이터를 이용하여 입력-출력 사이 수학적 관계를 찾음
③ 예측: 학습한 모델을 사용해 새로운 데이터를 입력 -> 그 결과를 예측
데이터 간의 직선 관계를 찾는 알고리즘
① 데이터 시각화: 데이터를 그래프에 표시
② 최적의 직선 찾기: 직선이 데이터 점과 얼마나 가까운지 측정 -> 이 거리(오차)를 측정하는 방법이 손실 함수
③ 손실 함수(MSE): 데이터 점-직선 사이의 거리(오차)의 제곱 평균
④ 기울기와 y절편 업데이트: MSE를 최소화하는 방향으로 기울기와 y절편을 조금씩 조정 -> 경사하강법
ㄴ> 반복적으로 업데이트하여 오차가 최소화될 때까지 학습
⑤ 모델 학습의 결과 시각화
⑥ 새로운 데이터 예측: 학습된 모델로 새로운 데이터 예측
import numpy as np
import matplotlib.pyplot as plt
# 1. 데이터 준비
X = np.array([1, 2, 3, 4, 5]) # 공부 시간(입력 데이터)
y = np.array([50, 55, 65, 70, 75]) # 시험 점수(출력 데이터)
# 2. 초기 값 설정
m = 0 # 초기 기울기
b = 0 # 초기 y절편
learning_rate = 0.01 # 학습 속도
epochs = 1000 # 학습 반복 횟수
# 3. 경사하강법을 이용한 학습
for _ in range(epochs):
y_pred = m * X + b # 예측 값 계산
error = y - y_pred
mse = (error ** 2).mean() # 손실 함수(MSE) 계산
m_gradient = -(2 / len(X)) * sum(X * error) # 기울기(m)와 y절편(b)의 변화량 계산
b_gradient = -(2 / len(X)) * sum(error)
m -= learning_rate * m_gradient # 기울기와 절편 업데이트
b -= learning_rate * b_gradient
# 4. 학습 결과 시각화
y_pred = m * X + b # 학습된 모델의 예측 값
plt.scatter(X, y, color='blue', label='실제 데이터')
plt.plot(X, y_pred, color='red', label='학습된 모델')
plt.xlabel('공부 시간 (시간)')
plt.ylabel('시험 점수 (점수)')
plt.legend()
plt.title('선형 회귀 학습 결과')
plt.show()
# 5. 새로운 데이터 예측
new_study_hours = np.array([6, 8, 10]) # 새로운 공부 시간
predicted_scores = m * new_study_hours + b
① 데이터 준비
② 모델 학습: LinearRegression 객체를 생성 -> fit 메서드로 학습
③ 성능 평가: MSE, MAE, R^2
④ 결과 시각화
⑤ 예측
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_ # 절편
# 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 계산
# 6. 학습 결과 시각화
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)
모델이 데이터에 너무 치우치거나 일반화를 잘하지 못할 때 발생
데이터를 너무 많이 학습한 상태 -> 작은 노이즈까지 학습
ㄴ> 학습 데이터에서는 성능이 좋지만, 새로운 데이터(테스트 데이터)에서는 성능이 나쁨
과소적합(Underfitting): 모델이 데이터를 제대로 학습하지 못한 상태
ㄴ> 학습 데이터와 테스트 데이터 모두에서 성능이 나쁨
주어진 데이터를 특정 범주나 클래스로 분류하는 작업
① 데이터 수집 및 전처리
② 모델 학습: 입력 데이터(특징)와 레이블(정답)을 활용하여 모델을 학습
③ 예측: 학습한 모델을 사용해 새로운 데이터를 입력 -> 그 결과를 예측
④ 평가: 모델 예측 결과를 평가하여 성능 지표를 측정함
데이터를 분석하고 특정 데이터가 특정 클래스에 속할 확률을 예측하는 알고리즘
① 선형 회귀의 확장: 선형 회귀처럼 데이터를 학습하고, 예측 값을 분류 문제에 적합하도록 변환
② 시그모이드 함수 적용: 예측 값 z를 시그모이드 함수를 사용하여 0-1 사이 값으로 변환
③ 클래스 결정: 결과가 0.5 이상이면 1, 아니면 0으로 분류 -> 임계값 변경 가능
① 가설 설정: 입력 데이터의 특징을 선형 결합하여 z 계산 -> 시그모이드 함수에 통과시켜 확률 계산
② 손실 함수 정의: 로그 손실 함수(Log Loss)를 사용함
③ 모델 학습: 경사 하강법을 사용하여 가중치와 절편 값 업데이트
ㄴ> 모델이 점점 정확히 데이터를 분류하도록 학습
모델 성능을 평가하기 위해 다양한 평가 지표가 사용되는데 이때 각 지표는 모델의 성능을 다양한 관점에서 분석하여 특정 문제에 더 적합한 지표를 선택 해야함
정확도(Accuracy): 모델이 올바르게 예측한 비율 -> Accuracy = TP + TN / TP + TN + FP + FN
장점: 전체적인 예측 성능을 간단히 측정
단점: 데이터의 클래스 불균형 시 신뢰도 하락
=> 클래스가 균형 잡혀 있을 때 적합
정밀도(Precision): 모델이 Positive로 예측한 것 중에 실제 Positive인 비율 -> Precision = TP / TP + FP
장점: False Positive를 줄임
단점: Positive 데이터를 놓칠 수 있음 (Recall도 낮아질 수 있음)
=> False Positive가 중요한 경우 적합
재현율(Recall): 실제 Positive 중에 모델이 Positive로 올바르게 예측한 비율 -> Recall = TP / TP + FN
장점: False Positive를 줄임
단점: Positive로 예측하는 경향이 커져 정밀도 하락할 수 있음
=> False Negative가 중요한 경우 적합
F1-Score: 정밀도와 재현율의 조화 평균 -> F1-Score = 2 * precision * Recall / precision + Recall
장점: 정밀도와 재현율 모두 종합적인 성능 평가 가능
단점: 클래스 불균형이 심한 데이터에서는 추가적인 분석 필요
=> 정밀도와 재현율의 균형이 중요할 때 적합
새로운 데이터 포인터가 주어졌을 때, 이를 가장 가까운 데이터 포인트들의 그룹(이웃)으로 분류하거나 값을 예측할 때 사용
① 훈련 데이터 준비: 여러 개의 특성으로 구성된 데이터 -> 각 데이터는 특정 레이블이나 값을 갖고 있음
② 거리 계산: 새로운 데이터 포인트(예측하려는 데이터)와 훈련 데이터 사이 거리를 계산
ㄴ> 유클리드 거리 공식 사용
③ K개의 이웃 선택: 가장 가까운 K개의 데이터 포인트 선택 -> 값에 따라 모델 성능이 달라짐
④ 결과 결정
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import classification_report, accuracy_score
# 1. 데이터 로드 및 확인
iris = load_iris() # Iris 데이터셋 로드
X = iris.data # 특성 데이터 (꽃잎/꽃받침의 길이와 너비)
y = iris.target # 레이블 데이터 (품종: Setosa, Versicolor, Virginica)
# 2. 데이터 분리 (훈련 세트와 테스트 세트)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 3. KNN 모델 생성
k = 3 # 가장 가까운 이웃의 개수
knn = KNeighborsClassifier(n_neighbors=k) # KNN 분류기 생성
# 4. 모델 학습
knn.fit(X_train, y_train) # 훈련 데이터로 모델 학습
# 5. 모델 평가
y_pred = knn.predict(X_test) # 테스트 데이터 예측
accuracy = accuracy_score(y_test, y_pred) # 정확도 계산
# 6. 분류 성능 세부 보고서 출력
print(classification_report(y_test, y_pred, target_names=iris.target_names))
# 7. 새로운 데이터 예측
new_data = [[5.0, 3.5, 1.3, 0.3]]
prediction = knn.predict(new_data)
predicted_class = iris.target_names[prediction][0]
데이터 크기
작은 데이터셋: 값을 작게 설정
큰 데이터셋: 값을 크게 설정
홀수 값의 선택: 보통 홀수로 설정하는 것이 좋음 -> 동률을 방지
성능 평가를 위한 테스트교차 검증: 다양한 K값을 시도하면서 모델 성능(정확도)를 비교 -> 최적의 K값 선택