1장. 머신러닝 프로세스와 기본 개념
scikit-learn 의 네 동작
식당에 새 요리사를 들인다고 해 봅시다. 먼저 누구를 뽑을지 정하고, 레시피를 보여 주며 가르치고, 손님 주문을 받게 하고, 맛을 평가합니다. 요리사가 바뀌어도 이 네 동작은 같습니다. scikit-learn 의 모델도 종류가 달라도 쓰는 법이 늘 같습니다.
요리사를 뽑는 것이 모델 만들기, 가르치는 것이 fit, 주문을 받는 것이 predict, 맛 평가가 score 입니다. 모델만 바꿔 끼우면 나머지 코드는 그대로 둘 수 있습니다. 실습 6에서 로지스틱 회귀를 의사결정나무로 바꿔 끼우는 것이 바로 이 덕분입니다.
네 동작
| 동작 | 코드 | 넣는 것 | 돌려받는 것 |
|---|---|---|---|
| 만들기 | model = LogisticRegression() | 설정(있으면) | 아직 아무것도 모르는 모델 |
| 학습 | model.fit(X, y) | 특성과 정답 | 학습한 모델 |
| 예측 | model.predict(X_new) | 특성만 | 예측한 답 |
| 채점 | model.score(X, y) | 특성과 정답 | 점수(분류는 정확도) |
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 LogisticRegression | linear 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 은 가르친 여섯 건을 모두 맞혔다는 뜻입니다. 다만 비유와 달리, 배운 레시피로 다시 시험 본 점수라서 실력을 말해 주지 않습니다. 그래서 다음 절에서 시험용 데이터를 따로 뗍니다.
모델만 바꿔 끼워 보기
네 동작이 모델과 상관없이 같다는 것을 확인합니다. 만드는 줄만 의사결정나무로 바꾸고 나머지는 그대로 둡니다.
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로 바꿉니다.- 예측할 때 넣는 특성은 학습할 때와 열의 개수와 순서가 같아야 합니다. 다르면 오류가 납니다.
- 이 예처럼 학습한 데이터로 채점한 점수는 믿을 수 없습니다. 다음 절에서 나누는 법을 봅니다.