LLM 엔지니어링1장 · 머신러닝 프로세스와 기본 개념7 / 23← 이전목차다음 →MetaContents

1장. 머신러닝 프로세스와 기본 개념

scikit-learn 의 네 동작

식당에 새 요리사를 들인다고 해 봅시다. 먼저 누구를 뽑을지 정하고, 레시피를 보여 주며 가르치고, 손님 주문을 받게 하고, 맛을 평가합니다. 요리사가 바뀌어도 이 네 동작은 같습니다. scikit-learn 의 모델도 종류가 달라도 쓰는 법이 늘 같습니다.

모델 만들기, fit, predict, score 의 네 동작을 순서대로 이은 흐름도

요리사를 뽑는 것이 모델 만들기, 가르치는 것이 fit, 주문을 받는 것이 predict, 맛 평가가 score 입니다. 모델만 바꿔 끼우면 나머지 코드는 그대로 둘 수 있습니다. 실습 6에서 로지스틱 회귀를 의사결정나무로 바꿔 끼우는 것이 바로 이 덕분입니다.

네 동작

동작코드넣는 것돌려받는 것
만들기model = LogisticRegression()설정(있으면)아직 아무것도 모르는 모델
학습model.fit(X, y)특성과 정답학습한 모델
예측model.predict(X_new)특성만예측한 답
채점model.score(X, y)특성과 정답점수(분류는 정확도)
Python
from sklearn.linear_model import LogisticRegression

# 거리km 하나만 특성으로 쓰는 아주 작은 예
X = [[3], [5], [8], [40], [120], [200]]
y = [0, 0, 0, 1, 1, 1]   # 정답: 1 이 지연

# 1) 만들기: max_iter 는 답을 찾을 때까지 계산을 되풀이할 최대 횟수
model = LogisticRegression(max_iter=1000)
# 2) 학습: 특성과 정답을 함께 보여 준다
model.fit(X, y)
# 3) 예측: 10km 와 150km 주문의 답을 묻는다
print(model.predict([[10], [150]]))
# 확률로 보기: [정시일 확률, 지연일 확률]
print(model.predict_proba([[150]]).round(3))
# 4) 채점: 분류 모델의 score 는 정확도
print(model.score(X, y))

predict 는 [0 1] 로, 10km 는 정시, 150km 는 지연이라고 답합니다. LogisticRegression 은 이름에 회귀가 들어 있지만 분류 모델입니다. 지연일 확률을 계산하고, 그 확률이 0.5 이상이면 지연이라고 답합니다. predict_proba 로 그 확률을 직접 볼 수 있습니다. 이 예는 너무 쉬워서 확률이 [[0. 1.]] 로 딱 떨어지고, 점수도 1.0 입니다. 확률을 보는 법은 "기준값 바꾸기" 절과 실습 6에서 다시 씁니다.

코드에 나오는 함수

코드쉬운 뜻
from sklearn.linear_model import LogisticRegressionlinear model(선형 모델) 묶음에서 로지스틱 회귀를 불러온다. 로지스틱 함수라는 S자 곡선으로 확률을 계산하는 모델이다
LogisticRegression(max_iter=1000)max_iter 는 maximum iterations(최대 되풀이 횟수)의 줄임말이다. 답을 찾을 때까지 계산을 많아야 1000번 되풀이한다
model.fit(X, y)특성과 정답을 보여 주며 학습시킨다
model.predict([[10], [150]])두 주문의 답(0 또는 1)을 묻는다
model.predict_proba([[150]])proba 는 probability(확률)의 줄임말이다. [정시일 확률, 지연일 확률]을 돌려준다
.round(3)소수 셋째 자리까지 반올림한다
model.score(X, y)넣은 데이터로 채점한다. 분류 모델은 맞힌 비율(정확도)을 돌려준다

이 코드가 뜻하는 것

식당의 새 요리사 이야기로 읽습니다. 요리사를 뽑고, 레시피 여섯 장으로 가르치고, 주문 두 개를 받게 하고, 가르친 레시피대로 다시 만들어 보게 해서 맛을 평가합니다. 여기서 요리사가 model, 레시피가 X 와 y, 손님 주문이 predict 에 넣은 값입니다.

줄하는 일쉽게 말하면
model = LogisticRegression(max_iter=1000)모델을 만든다요리사를 뽑는다
model.fit(X, y)학습시킨다레시피로 가르친다
model.predict([[10], [150]])새 주문의 답을 묻는다손님 주문을 받는다
model.predict_proba([[150]])답의 확신 정도를 본다"이 요리, 얼마나 자신 있어요?" 하고 묻는다
model.score(X, y)점수를 매긴다맛을 평가한다

점수 1.0 은 가르친 여섯 건을 모두 맞혔다는 뜻입니다. 다만 비유와 달리, 배운 레시피로 다시 시험 본 점수라서 실력을 말해 주지 않습니다. 그래서 다음 절에서 시험용 데이터를 따로 뗍니다.

모델만 바꿔 끼워 보기

네 동작이 모델과 상관없이 같다는 것을 확인합니다. 만드는 줄만 의사결정나무로 바꾸고 나머지는 그대로 둡니다.

Python
from sklearn.tree import DecisionTreeClassifier

X = [[3], [5], [8], [40], [120], [200]]
y = [0, 0, 0, 1, 1, 1]

# 모델만 의사결정나무로 바꾸고, 나머지 세 줄은 그대로 쓴다
model = DecisionTreeClassifier(random_state=0)
model.fit(X, y)
print(model.predict([[10], [150]]))
print(model.score(X, y))
출력
[0 1]
1.0
결과읽는 법
[0 1]로지스틱 회귀와 같이 10km 는 정시, 150km 는 지연이라고 답한다
1.0학습한 여섯 건을 모두 맞혔다. 이 예가 아주 쉬워서 두 모델 모두 1.0 이다

요리사가 바뀌어도 "뽑기, 가르치기, 주문 받기, 평가"의 순서는 같습니다. 그래서 실습 6에서도 모델 이름 한 줄만 바꿔 두 모델을 견줍니다.

주의할 점

  • fit 에 넣는 입력은 숫자여야 합니다. 날씨처럼 글자로 된 열은 숫자로 바꿔 넣습니다. 실습 4에서 pd.get_dummies 로 바꿉니다.
  • 예측할 때 넣는 특성은 학습할 때와 열의 개수와 순서가 같아야 합니다. 다르면 오류가 납니다.
  • 이 예처럼 학습한 데이터로 채점한 점수는 믿을 수 없습니다. 다음 절에서 나누는 법을 봅니다.
← 이전 절1장 · 머신러닝 프로세스다음 절 →1장 · 학습용과 시험용 나누기