오늘의 학습 주제 : 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 앞으로 바라는 것 : 프로젝트, 공모전 등을 준비하면서도 틈틈이 파이썬 기초 문법들을 익혀 챗지피티에 너무 의존하지 않고 간단한 함수들은 직접 작성할 수 있도록 할 것
'[패스트캠퍼스] 데이터분석 부트캠프' 카테고리의 다른 글
| [7주차 학습일지] 패스트캠퍼스 파이썬 프로젝트 중간점검2 (11) | 2025.08.07 |
|---|---|
| [6주차 학습일지] 패스트캠퍼스 파이썬 프로젝트 중간점검 (11) | 2025.08.01 |
| [4주차 학습일지] 패스트캠퍼스 김인섭 강사님 파이썬 크롤링 (7) | 2025.07.18 |
| [3주차 학습일지] 패스트캠퍼스 김상모 강사님 파이썬 기초 문법 (탐색반) (2) | 2025.07.11 |
| [2주차 학습일지] 이동훈 강사님 엑셀 및 기초 수학/통계 시작하기 요약 (1) | 2025.07.02 |