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

3. KPT 회고
✅ Keep
- 메모 습관
- 내 기억력을 믿지 않고, 무조건 메모하는 태도를 유지했다.
- 덕분에 하루치 메모만 봐도 내가 뭘 했는지 바로 떠올릴 수 있었다.
- 즉각적 이해 경험
- 수업 때 드물게 뒷북이 아니라 실시간으로 이해한 순간이 있었다.
- 비록 작은 경험이지만 나한테는 꽤 큰 동기부여가 됐다.
- 자기 인정
- 논리사고는 부족하지만, 그래도 착한 나 자신을 받아들이고 좋아해 주기로 노력했다.
- 부족한 점을 인정하되 스스로를 비하하지 않고 문제 해결 본질을 들여다보기 위해 애썼다.
⚠️ Problem
- 논리사고 부족
- PCCE 시험에서 문제 자체를 이해하지 못하는 순간이 있었다.
- 구조적으로 문제를 해석하는 훈련이 부족하다.
- 코드 작성 어려움
- 실습 때는 그저 타이핑만 따라갔기 때문에 스스로 구조를 짜는 게 힘들다.
- 복습 메모를 남겨도 다시 열어보지 않고 넘어가는 경우가 많았다.
- 실천 부족
- 스스로 정한 약속들을 지키지 못하는 경우가 잦다.
- 작은 약속이라도 성실하게 지키는 습관이 필요하다.
🚀 Try
- 2중 기록 & 당일 복습
- 주피터 주석 + 메모장에 동시에 기록하고, 하루가 넘어가기 전에 반드시 복습하자.
- 이해 못 하고 넘어간 실습들 틈나는 대로 다시 해보고 응용도 하면서 이해력을 높이자.
- 학습 목적 상기
- 오늘 배운 것이 무엇이고, 왜 필요한지 매일 반복적으로 정리하자.
- 내일 배울 것이 무엇인지 미리 훑어보자.
- 자기 칭찬 루틴
- 사소한 성취라도 매일 스스로 칭찬하며 동기부여를 이어가자.
- 자아야 넌 느좋남이야 "느리지만 좋은 남자"
☀️ 여름이었다
'AI 훈련소 기록실' 카테고리의 다른 글
| [플레이데이터 SK네트웍스 Family AI 캠프 19기] 15주차 회고 (0) | 2025.12.10 |
|---|---|
| [플레이데이터 SK네트웍스 Family AI 캠프 19기] 7주차 회고 (2) | 2025.10.06 |
| [플레이데이터 SK네트웍스 Family AI 캠프 19기] 5주차 회고 (0) | 2025.09.22 |
| [플레이데이터 SK네트웍스 Family AI 캠프 19기] 4주차 회고 (2) | 2025.09.16 |
| [플레이데이터 SK네트웍스 Family AI 캠프 19기] 3주차 회고 (첫 번째 팀 프로젝트) (0) | 2025.09.09 |