머신러닝 (3일차) [KT 에이블스쿨] 2025.04.09(수)
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
응원합니다 ! 모두들 (나도) 파이팅 !!!!!
