scikit-learn 시작하기
scikit-learn 시작하기 (Getting Started)
머신러닝을 처음 실무에 붙일 때, 모델 하나를 고르고 데이터를 넣어 학습시키는 흐름을 빠르게 경험해 보는 게 중요해요. scikit-learn 은 지도·비지도 학습을 모두 지원하는 오픈소스 머신러닝 라이브러리로, 모델 피팅·전처리·모델 선택·평가 도구를 한데 갖추고 있어요. 이 가이드는 fit 과 predict 를 중심으로 핵심 동작을 훑어줘요.
피팅과 예측: estimator 기초
scikit-learn은 estimator 라 부르는 수십 가지 내장 ML 알고리즘·모델을 제공해요. 각 estimator는 fit 메서드로 데이터에 학습(fitting)할 수 있어요. 예를 들어 RandomForestClassifier 를 아주 단순한 데이터에 피팅해 보죠.
>>> from sklearn.ensemble import RandomForestClassifier
>>> clf = RandomForestClassifier(random_state=0)
>>> X = [[ 1, 2, 3], # 2개 샘플, 3개 피처
... [11, 12, 13]]
>>> y = [0, 1] # 각 샘플의 클래스
>>> clf.fit(X, y)
RandomForestClassifier(random_state=0)
fit 은 보통 두 입력을 받아요.
- 샘플 행렬 X: 크기가
(n_samples, n_features)로, 샘플이 행, 피처가 열이에요. - 타깃 값 y: 회귀에선 실수, 분류에선 정수(또는 이산 값)이에요. 비지도 학습에선 y 를 지정하지 않아요. y 는 보통 1차원 배열로, i번째 원소는 X의 i번째 행(샘플)의 타깃이에요.
X와 y는 보통 numpy 배열이나 array-like 타입이어야 해요. 일부 estimator는 희소 행렬 같은 다른 형식도 받아요.
피팅이 끝나면 새 데이터에 대한 타깃 예측을 할 수 있고, 다시 학습할 필요가 없어요.
>>> clf.predict(X) # 학습 데이터의 클래스 예측
array([0, 1])
>>> clf.predict([[4, 5, 6], [14, 15, 16]]) # 새 데이터의 클래스 예측
array([0, 1])
변환기(transformer)와 전처리
머신러닝 워크플로는 보통 데이터를 변환·보정하는 전처리 단계 와 타깃을 예측하는 최종 예측기 로 나뉘어요. scikit-learn에서 전처리기와 변환기는 estimator와 같은 API를 따르고, predict 대신 transform 으로 새로 변환된 샘플 행렬 X를 돌려줘요.
>>> from sklearn.preprocessing import StandardScaler
>>> X = [[0, 15],
... [1, -10]]
>>> StandardScaler().fit(X).transform(X)
array([[-1., 1.],
[ 1., -1.]])
피처마다 다른 변환을 적용하고 싶다면 ColumnTransformer 가 이런 경우를 위해 설계돼 있어요.
파이프라인: 전처리기와 estimator 연결
변환기와 예측기는 Pipeline 으로 하나로 묶을 수 있어요. 파이프라인은 일반 estimator와 같은 API를 제공해서 fit 과 predict 로 다룰 수 있어요. 무엇보다 파이프라인을 쓰면 데이터 누수(data leakage) 를 막을 수 있어요. 즉, 테스트 데이터의 정보가 학습 데이터로 새어 나가는 것을 방지해요.
>>> from sklearn.preprocessing import StandardScaler
>>> from sklearn.linear_model import LogisticRegression
>>> from sklearn.pipeline import make_pipeline
>>> from sklearn.datasets import load_iris
>>> from sklearn.model_selection import train_test_split
>>> from sklearn.metrics import accuracy_score
>>> pipe = make_pipeline(
... StandardScaler(),
... LogisticRegression()
... )
>>> X, y = load_iris(return_X_y=True)
>>> X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
>>> pipe.fit(X_train, y_train)
Pipeline(steps=[('standardscaler', StandardScaler()),
('logisticregression', LogisticRegression())])
>>> accuracy_score(pipe.predict(X_test), y_test)
0.97...