KT에이블스쿨/수업 복습 정리

머신러닝 (3일차) [KT 에이블스쿨] 2025.04.09(수)

PaperDrop 2025. 4. 12. 16:56

2025.04.09 (수)

 

 

 

 

오늘은 머신러닝 3일차 시간입니다 ! 

정말 .. 짧은 시간 안에 많은 것을 배우면서 머신러닝도 마지막 시간입니다. 

오늘 수업에서는 실습 위주로 머신러닝 과정을 작성해 실행해보는 시간을 많이 가졌습니다.

 

그럼 어제에 이어서 오늘도 가볼까요?

 

 

 

실습문제 - 회귀

 

0. 구글 드라이브 마운트

 

코드 실습에 앞서 데이터를 이용하는 실습이기 때문에 구글 마운트에 연결해줍니다.

 

구글 마운트 실행 과정

 

① 구글 코랩 좌측 면에 1번 동그라미 파일 모양 카테고리 선택

② 2번 동그라미 그림이 추가된 파일 모양을 클릭

③ 생성된 코드를 실행시켜 마운트 실행

④ 데이터 파일이 포함된 파일의 경로를 복사한 후, '%cd '를 입력하고 뒤에 경로 복사하고 실행

 

그러면 이제 구글 드라이브에 연결되어 파일을 주고 받을 수 있다.

 

1. 데이터 불러오기

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

df = pd.read_csv('./data/premium.csv')
df.head()

→ 필요한 라이브러리를 불러오고, 필요한 데이터셋을 이용가능한 DataFrame형태로 불러온다. 

 

2. 데이터 탐색(EDA)

 

df.info() 메소드를 이용해 데이터의 컬럼들의 이름, 타입, 결측치 등을 요약하여 확인할 수 있다.

→ 이 과정에서 각 컬럼의 데이터 수, 결측치 존재 여부, 데이터의 균형, 전처리가 필요한 타입 등을 확인한다.

→ 추가로 df['컬럼 명'].value_counts()와 df.describe() 메소드를 이용해

     원하는 컬럼의 데이터 균형, 수치형 변수들의 요약통계량을 확인한다.

 

3. 데이터 전처리

① 중복 데이터 삭제

print('전: ', df.shape)

df[df.duplicated()]
df = df.drop_duplicates()

print('후: ', df.shape)

→ 중복 데이터를 정의하고 drop을 써서 삭제한다.

 

② 결측치 여부 확인 및 치환

df.isnull().sum()

#1
df['bmi'].fillna(df['bmi'].mean(),inplace=True)
#2
df['bmi'] = df['bmi'].fillna(df['bmi'].mean())

isnull() 메소드에 컬럼 별 합계 수치를 확인하고, 존재한다면 fillna() 메소드로 처리한다.

→ 1번은 fillna() 메소드에서 바로 inplace=True 명령어를 통해 치환한 것이고, 2번은 변수를 재정의하여 치환하는 방법이다.

 

③ 범주형 데이터 수치화

→ Label Encoder 방법으로 범주형 데이터를 수치화한다. (앞에서 다룬 방법이니 생략)

 

④ 시각화

import matplotlib.pyplot as plt
import seaborn as sns

sns.boxplot(data=df, x='bmi')
plt.show()

→ 데이터를 시각화하여 이상치의 분포를 확인하고, 추가로 처리해야할 이상치가 있는지 확인한다.

 

⑤ 데이터 정규화 

from sklearn.preprocessing import MinMaxScaler

scaler =  MinMaxScaler()
df_scaled = scaler.fit_transform(df)

→ MinMaxScaler() 메소드를 이용해 데이터를 정규화한다.

→ 메소드 객체를 먼저 생성하고, DataFrame에 적용하고 적용한 데이터는 구별 가능하게 다른 이름으로 정의한다.

 

4. 학습/테스트 데이터 분리

import numpy as np
from sklearn.model_selection import train_test_split

# 정답 데이터 컬럼을 분리
y = df_scaled[:,-1]
x = df_scaled[:, :-1]

# 학습/테스트 데이터 나누기
x_train, x_test, y_train, y_test = train_test_split(
    x, y, test_size=0.2, random_state=0
)

print(x_train.shape)
print(x_test.shape)
print(y_train.shape)
print(y_test.shape)

→ 힌트(문제)/정답 데이터를 분리하고, 학습/테스트 데이터를 분리한다.

→ test data의 크기는 20%로 정의한다. 

→ 데이터의 shape를 적용해 적절하게 나누어졌는지 확인한다.

 

 

이전에 말씀하셨던 중요한 코드 !

언제든 이용할 수 있게 외우라고 하셨는데 아주 유용하게 사용하고 있습니다 !! :D

 

 

5. 모델 선택 및 학습

     → LinearRegression() / RandomForestRegression() / Ridge() / Lasso()

from sklearn.linear_model import LinearRegression

model = LinearRegression()
model.fit(x_train, y_train)

→ 모델은 회귀 모델 중에 '선형 모델'을 선정하여 LinearRegression() 메소드를 사용한다.

→ 객체를 생성하고, fit()을 통해 원하는 데이터들을 모델에 학습시킨다.

 

다양한 모델로 동일한 데이터를 학습시켜, 어떤 모델이 해당 데이터에 가장 적절한지 확인한다.

 

6. 예측 및 평가

# 모델 평가 전, Test data로 예측 진행
pred = model.predict(x_test)

# 성능평가지표 적용
from sklearn.metrics import mean_squared_error, mean_absolute_error

mae = mean_absolute_error(y_test, pred)
mse = mean_squared_error(y_test, pred)

print('MAE : ', mae)
print('MSE : ', mse)

→ Test data로 모델이 학습을 잘했는지 확인해보는 예측을 진행한다. 

→ 예측한 데이터와 test의 정답 데이터를 비교하여 성능평가지표를 이용해 오차를 계산한다.

 

※ MAE (Mean Absolute Error, 평균 절대 오차) : 실제값과 예측값의 차이를 절댓값으로 반환해 평균을 구함.

※ MSE (Mean Squared Error, 평균 제곱 오차) : 실제값과 예측값의 차이를 제곱하여 평균을 구함.

 

☆ 분석할 데이터가 어떤 모델에 가장 적합한지 판단하기 위해, 성능평가지표 비교를 통해 결정한다.

# LinearRegression 모델 -  MAE : 0.0704 /  MSE : 0.0107
# RandomForestRegressor 모델 -  MAE : 0.0478 /  MSE : 0.0072
# Ridge 모델 -  MAE : 0.0704 /  MSE : 0.0107
# Lasso 모델 -  MAE : 0.1582 /  MSE : 0.0431

→ 각 지표별 특징과 한계가 존재하나, 작을수록 좋은 결과라고 생각할 수 있다.

→ 성능지표를 바탕으로 판단하면, RandomForest 모델이 가장 예측 결과가 좋은 것을 확인할 수 있다.

 

4. 머신러닝 모델 - 분류

 

○ 분류 학습

  : 종속 변수가 범주형 데이터일 때 사용하는 지도 학습 방법

    데이터를 특정 그룹(클래스)으로 분류하는 모델을 만들 때 활용

 

○ 분류 학습의 특징

  - 출력값이 범주형 데이터

  - 입력 데이터가 어느 그룹에 속하는 예측

  - 다중 클래스 문제도 가능

 

○ 분류 모델 종류

  ① 로지스틱 회귀(Logistic Regression)   (※ 이름은 회귀지만 분류에 속한다.)

       : 출력값이 0 또는 1(이진 분류) 혹은 다중 분류로 나뉨

      → 시그모이드 함수(Sigmoid Function)를 사용해 확률 값으로 변환

 

  ② 결정 트리(Decision Regression)

       : 여러 개 규칙 기반 예측

      → 과적합 위험 있음

 

  ③ 랜덤 포레스트(Random Forest)

       : 여러 개의 의사결정트리 조합

      → 과적합 방지

 

  ④ 그래디언트 부스팅 모델(Gradient Boosting Classifier)

        : 여러 개의 약한 모델을 조합해 강력한 모델 생성

      → 예측 성능이 좋으나, 학습 속도가 느림

      → 단점을 보완하여 나온 모델 - XGboost(eXtreme Gradient Boosting) : 병렬처리로 속도를 향상

 

☆ XGboost이 성능이 월등히 좋고 속도도 많이 개선 되어서 해커톤에서 공식처럼 사용한다 !

 

○ 분류 모델 성능 평가지표

  ① 혼동 행렬, 오차 행렬

       : 분류의 예측 범주와 실제 데이터 분류 범주를 교차 표 형태로 정리한 행렬

  ② 정확도(Accuracy)

       : 모델이 전체 문제 중 정답을 맞출 확률

  ③ 재현율(Recall) (=민감도)

       : 실제로 정답인 것 중에 모델이 정답이라고 예측한 비율

  ④ 정밀도(Precision)

       : 모델이 정답이라고 예측한 것 중에 실제 정답인 비율 

  ⑤ F1-score

       : 재현율과 정밀도의 조화평균

 

→  2 ~ 5번은 1에 가까울수록 좋다.

 

 

 


 

 

 

 

이후에 '머신러닝 모델 - 군집화'에 대해서도 일부 나갔지만,

이어지는 내용이라 내일 한꺼번에 다루겠습니다 ! 

 

오늘은 출력값이 범주형 데이터인 머신러닝 모델 중 분류에 대해 배워봤습니다 !

회귀와 비슷한 부분도 있고 다른 부분도 있었습니다. 

분류형이라도 수치형 데이터로 변환하고 구분해서 어디쪽에 가깝냐를 수치로 계산하게 된다면

회귀와 비슷해지는 면도 있는 것 같습니다.

 

아 근데 정말 새로운 개념을 배우려니까 어렵네요...

저는 완전한 원리를 배우는 것도 아닌거 같은데 개념 자체가 이해하기 어렵습니다...

정말 강화학습은 그 자체도 이해가 안되는데 직접 코드를 짜본다고 하면 정말... 

그것이 바로 제가 데이터 분석을 지원한 이유기도 합니다 !

 

저는 사실 이번 과정을 마쳐도 컴퓨터 전공 학생들의 지식과 수준을 따라갈 수 없다고 생각합니다. 

그래서 제가 원래 희망하던 항공우주 혹은 방산 분야에서 데이터 분석이 필요한 설계 공정 쪽으로 공부하고 지원해볼 예정입니다 !

여러분은 염두해두시거나 지원하고 계시는 분야가 있으신가요? 

저도 궁금하니 기회가 되면 댓글로 부탁드려요 :D 

응원합니다 ! 모두들 (나도) 파이팅 !!!!!

 

 

 

 

 

 

 

 

 

 

댓글수0