본문 바로가기

AI 훈련소 기록실

[플레이데이터 SK네트웍스 Family AI 캠프 19기] 6주차 회고

1.  train_test_split()

 

벌써 6주 차 회고록 ㄷㄷ

 

train_test_split

데이터를 학습 및 검증하는 단계에 쓰이는 함수라고 배웠다.

 

자. 그럼 학습과 검증이 가장 필요한 건 누굴까?

마음 같아서는 '김성욱.csv'를 업로드하고 split을 조지고싶

 

train_test_split()scikit-learn이라는 외장 라이브러리의 model_selection 모듈 안에 있는 함수다.

얘는 파이썬 기본 라이브러리가 아니기 때문에 사용하기 위해서는 불러오는 작업이 필요하다는 거다.

게다가 scikit-learn 라이브러리는 굉장히 방대하기 때문에 효율을 위해 필요한 기능만 가져다 쓰는 걸 원칙으로 한다.

 

# 외장 라이브러리는 import 과정이 필요하다.
from sklearn.model_selection import train_test_split

 

길어서 안 외워질 때에는 멜로디와 리듬을 넣어 흥얼거리면 효과가 있다고 한다.

더보기

train_test_split()

 

 

 

Made by. KUGNUS

 

 

 

 

ooh~~ ooh~~

train_test_split !

 
uh, 내 눈에 넌 너무 예뻐

너의 feature 내 심장을 so, wake up

있는 그대로의 널 원해 raw data

널 알고 싶어 여태 버리지 못해 Null

 
type은 모르겠지만 일단 난 true 야

의미 없는 말은 없어 모두 다 parse, yah

널 저장한 뒤 맘껏 불러보는 사치야

상상은 자유랬어, 널 이리저리 시.각.화.

 
from sklearn.model_selection import

널 더욱 알고싶어

train! test! split!
 

넌 나의 전부야 난 Null 조차 못지웠어

너의 빈공간 마저 의미를 부여하게 됐어

fillna() 못해 넌 내겐 고유값

결측은 없었어, 넌 그냥 너였어, 넌 그냥 너였어
 

ooh~~ ooh~~

train! test! split!

ooh~~ ooh~~

train! test! split!
 

넌 정말 예측이 안 돼

non-linear 한 감정선

내 마음은 sigmoid,

내 머리 속을 어지럽혀 noise

 
parameter 조절을 해봐도

너의 output은 random 같아,

그래도 괜찮아, 그게 너니까

난 계속 학습할 거야, 널
 

from sklearn.model_selection import

널 더욱 알고싶어

train! test! split!
 

넌 나의 전부야 난 Null 조차 못지웠어

너의 빈공간 마저 의미를 부여하게 됐어

fillna() 못해 넌 내겐 고유값

결측은 없었어, 넌 그냥 너였어, 넌 그냥 너였어

 
너한테 grid search 했는데  

optimal 한 내가 안 나와  

random_state 줬는데  

내 심박수는 계속 커져만 가
 

max_iter=1000 을 줬는데

epoch 돌려도 넌 converge 안 해  

답이 없는 classification

널 여전히, train!!  test!!  split!!!!
 

넌 나의 전부야 난 Null 조차 못지웠어

너의 빈공간 마저 의미를 부여하게 됐어

fillna() 못해 넌 내겐 고유값

결측은 없었어, 넌 그냥 너였어, 넌 그냥 너였어
 

ooh~~ ooh~~

train! test! split!
 

If I’m the Machin, Learning about You

fit(), predict(), score(), thinkin’ bout You

I’ll be a somethin’ Model, Only for You

train! test! split!

 

 

 

AI 프롬프팅 + MIDI 시퀀싱 하이브리드 방식이 사용 되었습니다.

train_test_split 플레이어 바로가기

 

 

- 언급된 머신러닝 용어 모음집 -

train_test_split 데이터를 학습용(train)과 테스트용(test)으로 분할하는 함수 (scikit-learn). 모델이 과적합되지 않도록 검증 데이터셋을 따로 떼어내는 과정.
feature 입력 변수, 모델이 학습할 수 있도록 제공되는 데이터의 속성 값.
raw data 가공/전처리되지 않은 원본 데이터.
Null 결측치(missing value). 값이 없는 상태.
type 파이썬 데이터 타입(int, str 등).
True 불리언 값 (참).
parse 데이터 구조를 분석하거나 해석하는 과정. 문자열을 특정 포맷으로 분리해 의미 있는 데이터로 변환.
시각화 (visualization) 데이터를 그래프, 차트 등 시각적 도구로 표현.
from sklearn.model_selection import 파이썬에서 scikit-learn 모듈의 model_selection 패키지를 불러오는 코드.
fillna() Pandas 메서드. 데이터프레임에서 결측치를 특정 값으로 채우는 기능.
고유값 (unique value) 데이터셋에서 중복되지 않는 값.
non-linear 비선형. 직선/단순한 관계가 아닌, 복잡한 패턴을 가진 함수나 모델.
sigmoid S자 모양 함수. 0~1 사이의 값을 출력, 이진 분류에서 확률로 자주 사용.
noise 데이터 내 불필요한 잡음/랜덤성. 모델 성능을 떨어뜨림.
parameter 모델이 내부적으로 가지는 값 (예: 가중치, bias). 학습하면서 조정됨.
output 모델이 입력을 처리하고 내놓는 결과 값.
random_state 무작위성을 통제하는 시드(seed) 값. 같은 데이터 분할이나 학습 결과를 재현 가능하게 함.
max_iter 모델이 최적화 과정에서 반복할 최대 횟수.
epoch 딥러닝에서 학습 데이터 전체를 한 번 모두 학습하는 주기.
converge 수렴. 반복 학습 후 모델이 안정된 최적 해에 도달하는 것.
classification 분류 문제. 주어진 데이터를 특정 클래스(라벨)로 구분하는 것.
grid search 여러 하이퍼파라미터 조합을 전부 탐색해서 최적 조합을 찾는 기법.
optimal 최적의, 가장 좋은 성능을 내는 설정.
fit() 모델을 학습(train)시키는 메서드.
predict() 학습된 모델로 새로운 입력에 대한 출력을 예측하는 메서드.
score() 모델의 성능 평가 메서드 정확도, R² (결정계수) 등.
model 머신러닝에서 데이터를 학습하고 예측을 수행하는 수학적/알고리즘적 구조.

 

chatGPT한테 용어를 잔뜩 알려달라고 하고 어감이 마음에 들면 썼기 때문에 수업 때 안 배운(내가 잊었을지도 모를) 용어들이 있다.

그래서 optimal, converge, epoch 이 세 가지에 대한 맥락, 실무에서의 사용빈도가 어떻게 되는지 정리해보았다.

 

 

1. Optimal (최적의)

  • 맥락: “최적의 해, 최적의 하이퍼파라미터” → 보통 Grid Search, Hyperparameter Tuning 파트에서 다룸.
  • 입문 수업에서는 “최적 모델”이라는 말 정도는 쓸 수 있어도, 수학적 최적화는 깊게 안 들어가는 경우가 많음.
  • 👉 지분 있음 (중요 개념), 다만 기초과정에서는 슬쩍 언급하는 정도.

2. Converge (수렴하다)

  • 맥락: 반복 학습/최적화 과정에서 더 이상 값이 변하지 않고 안정되는 상태.
  • 경사하강법(Gradient Descent) 같은 최적화 알고리즘을 배울 때 나오는 말.
  • 👉 대부분의 “머신러닝 기초 수업”에서는 경사하강법 자체를 가볍게 다루거나, 그냥 “반복하다 보면 수렴한다” 정도로 지나감.
  • 👉 지분 있음 (특히 딥러닝/최적화에서 중요), 하지만 입문 수업에서는 비중 적음.

3. Epoch (에포크)

  • 맥락: 딥러닝에서 전체 데이터셋을 한 번 다 학습하는 주기.
  • scikit-learn 같은 전통 ML에서는 잘 안 쓰이고, 딥러닝(keras, pytorch) 수업에서 본격적으로 등장.
  • 👉 지분 적음 (순수 ML 기초에서는 거의 안 다룸), 딥러닝 파트 들어가야 의미 있음.

 

✅ 정리:

 

  • Optimal → 머신러닝 전반에서 자주 나옴 (지분 큼)
  • Converge → 최적화/반복학습 설명할 때 중요 (지분 중간)
  • Epoch → 전통 ML보다 딥러닝 쪽 개념 (입문 ML 수업에선 지분 낮음)

 

다시 train_test_split 으로 돌아와서

기본 구조에 대해 간단히 알아보자.

 


📌 기본 구조

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(
    X, y,
    test_size=0.2,       # 테스트셋 비율 (20%)
    random_state=42,     # 랜덤 시드 (재현성 보장)
    stratify=y           # (선택) 클래스 비율 유지
)

 

📌 파라미터 설명

 

  • X: 입력 데이터 (feature)
  • y: 정답(label, target)
  • test_size: 테스트 데이터 비율 (0.2 = 20%, 0.3 = 30%)
  • random_state: 랜덤 시드 → 매번 같은 결과 나오게 고정
  • stratify=y: 분류 문제에서 클래스 비율(train/test 동일하게 유지)

 

📌 반환값

 

  • X_train: 훈련용 입력 데이터
  • X_test: 테스트용 입력 데이터
  • y_train: 훈련용 정답
  • y_test: 테스트용 정답

 

✅ 한 줄 요약:

데이터(X, y)를 훈련셋과 테스트셋으로 나누는 함수 → 비율, 랜덤성, 클래스 비율 등을 조절 가능.

 

 


 

 

 

회고록을 비교적 자유롭게 작성하는 편이긴 하지만, 학습능력을 향상할 수 있다는데 복습이 빠질 수 없다.

최근 수업 실습 내용 중 이해를 잘 못하고 넘어간 교차 검증 (Cross Validation)의 로직을 살펴보자.

 

2.  교차 검증 (Cross Validation)

 

  • 모델을 더욱 신뢰성 있게 평가하는 방법
  • 데이터셋을 여러 개로 나누고, 각 부분이 한 번씩 검증 데이터로 사용되도록 하는 방법
  • 훈련과 검증을 반복하면서 학습을 진행하며, 과대적합 방지에 효과적

 

이라고 수업 때 배웠다. 

그럼 실습내용을 순서대로 살펴보면서 이해를 해보자.

 

 

1. 라이브러리 불러오기

# 실습에 필요한 외부 라이브러리들을 불러오자.

import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score
from sklearn.metrics import accuracy_score

 

 

2. 데이터 준비

# 데이터 로드 및 전처리
fish_df = pd.read_csv('./data/fish.csv')

# 특성(X)과 라벨(y) 분리
fish_input = fish_df.drop('Species', axis=1) # fish_input은 fish데이터 중 Species를 제외한 나머지 (즉 특성만 가져오기)
fish_target = fish_df['Species']	# fish_target은 fish데이터 중 Species만 가져오기 (즉 정답만)

# 데이터 분할 및 표준화
X_train, X_test, y_train, y_test = train_test_split(fish_input, fish_target, random_state=42, stratify=fish_target)

# 데이터 스케일링
scaler = StandardScaler()                           # 표준화 객체 생성
X_train_scaled = scaler.fit_transform(X_train)      # 훈련 데이터에 맞춰서 스케일링
X_test_scaled = scaler.transform(X_test)            # 테스트 데이터도 같은 기준으로 스케일링

 

전처리가 필요한 이유

생선의 데이터는 길이, 높이, 무게 등 서로 다른 단위와 다른 범위 데이터로 이루어져 있음.

이 중 무게는 길이보다 숫자만 봤을 때에 압도적으로 크다, 이는 알고리즘이 무게가 가장 중요한 특성이라고 착각할 수 있음

그렇기에 동등한 비중으로 계산될 수 있게 처리해줘야 함.

 

 

 

3. 모델 생성

# 모델 생성
lr_clf = LogisticRegression(max_iter=1000, solver='newton-cg')

# 교차 검증 점수
scores = cross_val_score(lr_clf, X_train_scaled, y_train, scoring='accuracy', cv=5)
print(scores)
print(np.mean(scores))

# 학습/예측/결과 평가
lr_clf.fit(X_train_scaled, y_train)
y_pred = lr_clf.predict(X_test_scaled)
acc_score = accuracy_score(y_test, y_pred)
print(acc_score)

 

여기부터가  중요하니 자세히 살펴보고 이해하자.

 

 

1. 모델 생성

lr_clf = LogisticRegression(max_iter=1000, solver='newton-cg')

 

  • 로지스틱 회귀 분류기 객체 생성
  • 최대 반복 횟수 1000, 최적화 알고리즘은 newton-cg 사용

 

2. 교차 검증 & 검증 점수

scores = cross_val_score(
    lr_clf, X_train_scaled,
    y_train,
    scoring='accuracy',
    cv=5
)
print(scores)
print(np.mean(scores))

 

  • 훈련 데이터를 5 등분해서 5-Fold 교차검증 수행
  • 각 폴드(fold)마다 학습/검증 반복 후 정확도 반환
  • scores: 각 폴드별 정확도 배열
  • np.mean(scores): 5회 평균 정확도 → 모델의 안정적인 성능 추정치

검증 점수는 이렇게 나왔다.

print(scores)  ->  [0.875 0.83333333 0.83333333 0.79166667 0.73913043]

print(np.mean)scores))  ->  0.8144927536231885

 

해석하자면 교차검증 5-Fold에서 나온 각 폴드별 정확도 다섯 개를 출력했고 그다음에는 평균값을 출력했다.

즉, 이. 이 모델은 훈련 데이터 기준으로 대략 81.4%의 정확도를 보여준다.


 

3. 최종 학습 & 테스트 평가

lr_clf.fit(X_train_scaled, y_train)
y_pred = lr_clf.predict(X_test_scaled)
acc_score = accuracy_score(y_test, y_pred)
print(acc_score)
    • 전체 훈련 데이터로 최종 학습
    • 독립된 테스트 데이터로 예측 후 정확도 평가
    • acc_score: 최종 테스트 정확도
    • print(acc_score): 테스트 정확도 출력

훈련 데이터를 전제로 다시 학습한 모델의 정확도는 소폭 상승했다.

print(acc_score)  ->  0.825

 

결과에 대해 정리를 해보자.


📌  왜 교차검증 점수 평균(0.814) 보다 테스트 점수(0.825)가 더 높을까?

      • 일반적으로는 테스트 점수가 더 낮게 나오는 경우가 많음 (과적합 방지 때문에).
      • 그런데 지금은 약간 더 높게 나옴 → 크게 이상한 건 아님.
        1. 데이터 분할 시 랜덤성이 있어서, 테스트 셋이 운 좋게 “쉬운 데이터”일 수도 있음.
        2. 교차검증은 훈련 셋 안에서 “폴드마다 일부를 검증”했기 때문에, 항상 조금 더 까다로운 평가가 됨.
        3. 따라서 교차검증 평균(81.4%)과 실제 테스트 정확도(82.5%)는 비슷하게 나왔으니 모델이 잘 일반화된 거라고 보면 됨.

 


 

요즘 몸이 그냥 여기저기 쑤시고 피로를 달고산다고

 

 

3.  KPT 회고

 

 

✅ Keep

 

  1. 메모 습관
    • 내 기억력을 믿지 않고, 무조건 메모하는 태도를 유지했다.
    • 덕분에 하루치 메모만 봐도 내가 뭘 했는지 바로 떠올릴 수 있었다.
  2. 즉각적 이해 경험
    • 수업 때 드물게 뒷북이 아니라 실시간으로 이해한 순간이 있었다.
    • 비록 작은 경험이지만 나한테는 꽤 큰 동기부여가 됐다.
  3. 자기 인정
    • 논리사고는 부족하지만, 그래도 착한 나 자신을 받아들이고 좋아해 주기로 노력했다.
    • 부족한 점을 인정하되 스스로를 비하하지 않고 문제 해결 본질을 들여다보기 위해 애썼다.

 


 

⚠️ Problem

 

  1. 논리사고 부족
    • PCCE 시험에서 문제 자체를 이해하지 못하는 순간이 있었다.
    • 구조적으로 문제를 해석하는 훈련이 부족하다.
  2. 코드 작성 어려움
    • 실습 때는 그저 타이핑만 따라갔기 때문에 스스로 구조를 짜는 게 힘들다.
    • 복습 메모를 남겨도 다시 열어보지 않고 넘어가는 경우가 많았다.
  3. 실천 부족
    • 스스로 정한 약속들을 지키지 못하는 경우가 잦다.
    • 작은 약속이라도 성실하게 지키는 습관이 필요하다.

 


 

🚀 Try

 

  1. 2중 기록 & 당일 복습
    • 주피터 주석 + 메모장에 동시에 기록하고, 하루가 넘어가기 전에 반드시 복습하자.
    • 이해 못 하고 넘어간 실습들 틈나는 대로 다시 해보고 응용도 하면서 이해력을 높이자.
  2. 학습 목적 상기
    • 오늘 배운 것이 무엇이고, 왜 필요한지 매일 반복적으로 정리하자.
    • 내일 배울 것이 무엇인지 미리 훑어보자.
  3. 자기 칭찬 루틴
    • 사소한 성취라도 매일 스스로 칭찬하며 동기부여를 이어가자.
    • 자아야 넌 느좋남이야 "느리지만 좋은 남자"

 


 

 

☀️ 여름이었다