본문 바로가기
[패스트캠퍼스] 데이터분석 부트캠프

[5주차 학습일지] 패스트캠퍼스 김인섭 강사님 머신러닝 특강

by 클로버심 2025. 7. 25.

오늘의 학습 주제 : Sklearn을 이용한 머신러닝 학습

 

import sklearn
from sklearn.model_selection import train_test_split

 

모델 학습 전 선행되어야 할 것

(1) 원본 데이터
  
(2) EDA (Exploratory Data Analysis)

모델 학습 전, 데이터를 이해하고 문제 정의하는 과정

  • 어떤 feature가 중요한지 시각화 및 통계로 파악
  • 이상치, 결측치, 분포 확인
  • 의미 없는 컬럼 제거, 필요한 컬럼 선택
  • 예:
    • 사용자 나이는 정규화가 필요할까?
    • 카테고리명은 어떤 방식으로 인코딩할까?

  
(3) Feature Selection (특성 선택)

분석 목적에 맞는 유의미한 feature만 골라냄

  • Y에 영향을 미치는 X값들은 어떤 것들이 있을까? (Label에 영향을 주는 컬럼을 찾는 것)
  • 예: 'user_id', 'timestamp', '주소'는 제거
  • 대신 '상품 분류', '총 구매횟수'는 유지

(4) Feature Engineering (숫자화, 파생을 통한 특성 가공)

모델이 이해할 수 있도록 숫자형으로 변환하거나 파생 변수 생성

  • object인 경우 데이터 변환 필요 (컴퓨터는 문자를 이해 못하므로)
  • 레이블 인코딩 : 범주 → 숫자 하나로 변환 (예: male → 0, female → 1)
  • 원-핫 인코딩 : 각 범주마다 새로운 컬럼을 만들고 해당하는 곳만 1, 나머지는 0으로 채우는 방식
import pandas as pd

# 예시 데이터
df = pd.DataFrame({
    'Fruit': ['Apple', 'Banana', 'Apple', 'Cherry', 'Banana']
})
df

# pd.get_dummies : 범주형 데이터를 원-핫 인코딩(one-hot encoding)하는 방법 중 하나

df_encoded = pd.get_dummies(df, columns=['Fruit'])
df_encoded

  • 범주형 변수 인코딩 (pd.get_dummies, LabelEncoder)
# ex) 타이타닉 Age 컬럼

import seaborn as sns

sns.histplot(df_train['Age'])

import numpy as np
age_bins = [0, 19, 50, np.inf] # 0~19, 19~50, 50~무한
age_labels = [0, 1, 2]

df_train['Age'] = pd.cut(df_train['Age'], bins=age_bins, labels = age_labels)
df_test['Age'] = pd.cut(df_test['Age'], bins=age_bins, labels = age_labels)

# seaborn을 통해 숫자의 범위가 넓은 값을 구간으로 나눌 수 있다
  • 날짜 → 요일, 주말여부 등 파생 컬럼
  • 스케일링 (표준화, 정규화 등)
  • 이상치 처리, 결측치 채우기
# ex) 타이타닉 Embarked 컬럼

df_train['Embarked'].value_counts()
# value_counts()로 최빈값을 확인

df_train['Embarked'].fillna('S', inplace=True)
df_test['Embarked'].fillna('S', inplace=True)
# 결측치를 'S'로 채움

df_train['Embarked'] = df_train['Embarked'].replace({'S':0, 'C':1, 'Q':2})
df_test['Embarked'] = df_test['Embarked'].replace({'S':0, 'C':1, 'Q':2})
# Q, S, C => 문자 => replace() => 치환
작업 예시 설명
새로운 컬럼 생성 ex. is_organic, year, weekday
결측치 처리 평균값 대체, 행 제거 등
스케일링 정규화/표준화
이상치 처리 IQR, Z-score 활용
범주형 인코딩 pd.get_dummies(), LabelEncoder()
중요 변수 선택 불필요한 컬럼 제거

(5) train_test_split

숫자형 데이터 준비 완료 → 학습 가능

(6) 모델 학습 → 예측 → 평가

 

함수 정리

(1) 데이터 분리 – train_test_split

  • 하나의 DataFrame을 학습 데이터(train data)테스트 데이터(test data)로 나눔
  • 학습용은 모델을 학습시키는 데 사용, 테스트용은 성능 평가용
  • train_data(모의고사), test_data(수능) → 8:2
  • 원본 데이터가 150개일 경우 학습용 데이터 120개, 훈련용 데이터 30개가 되는 것
X_train, X_test, y_train, y_test = train_test_split(df.drop(columns='label'), df['label'], test_size=0.2)

# 여기서 test_size = 0.2는 train과 test의 비율을 8:2로 한 것이며 이는 변경할 수 있음
# train_test_split()은 feature와 label을 동시에 나눔
# X_train, X_test: 입력값 (학습용 feature, label)
# y_train, y_test: 정답값 (훈련용 feature, label)
# test셋에도 label(y_test)은 존재하며 모델의 성능 측정용으로 사용

(2) 학습 알고리즘 선택

  • 이 때, feature(입력값)label(정답값)숫자형이어야 함
  • 이번 특강에서는 Classification으로 DecisionTreeClassifier() 알고리즘 사용
  • 아래 홈페이지에서 목적에 따른 다른 알고리즘도 확인 가능
  • https://scikit-learn.org/stable/modules/tree.html
# label 데이터의 형태 : 0, 1, 2 (카테고리)=> Supervised Learning => Classification

from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier

df_clf = DecisionTreeClassifier() # 알고리즘 선택한 것

 

(3) 모델 학습 – fit()

  • 설명) 모의고사 문제를 가지고 풀어본다
dt_clf.fit(X_train, y_train) # X_train : feature, y_train : label

(4) 예측 – predict()

  • 설명) 수능 시험을 본다
  • 테스트 데이터를 입력하면 모델이 결과를 예측함
    → 마치 시험 문제를 푸는 과정과 같음
pred = dt_clf.predict(X_test)
pred

(5) 성능 평가 – accuracy_score()

  • 설명) 당일 채점
  • 모델이 예측한 결과가 실제 정답과 얼마나 일치하는지 평가
    → 시험 채점 같은 역할
# 채점 : pred(나의 정답지 체크 OMR카드), y_test(실제 정답)

from sklearn.metrics import accuracy_score
accuracy_score(y_test, pred) # 예측 정확도

 

Scikit-Learn 라이브러리 심화 - 교차 검증

(1) 일반 K-Fold

  • 데이터를 여러 조각(K개)으로 나눠 여러 번 학습 & 검증 반복
  • 성능의 일관성 확인 가능
from sklearn.model_selection import KFold

 

(2) Stratified K-Fold

  • 불균형 데이터에 적합 (예: 불량 10개 vs 정상 9990개)

(3) cross_val_score()

  • 교차 검증을 쉽게 도와주는 함수

 

4주차 소감

더보기

<<4Ls 회고법>>


1. Liked 좋았던 것 : 프로젝트를 시작하고 오히려 활기가 생긴 것, 수업을 다 이해하지 못하더라도 내가 해보고 싶은 방향을 설정하고 검증 과정에서 필요한 함수들을 사용하려고 하니 이제 조금 익숙해지는 느낌이 드는 것
2. Lacked 아쉬웠던 것 : 좀 더 깊이 있게 이해하고 있다면 더 다양한 분석을 할 수 있을 것 같은데 아는 범위 내에서만 구현이 가능하다는 것이 아쉬움. 챗지피티를 활용 또한 내가 알아야 질문을 하고 구상을 할 수 있다는 것을 느낌
3. Learned 배운 것 : 확장반 수업 청강으로 classification 머신러닝으로 타이타닉 문제를 풀어봄
4. Longed for 앞으로 바라는 것 : 프로젝트, 공모전 등을 준비하면서도 틈틈이 파이썬 기초 문법들을 익혀 챗지피티에 너무 의존하지 않고 간단한 함수들은 직접 작성할 수 있도록 할 것