sciPy와 Toolkit을 합쳐서 만들어진 사이킷런(Scikit-Learn)은 파이썬 기반 머신러닝용 라이브러리이다.
사이킷런을 이용하면 머신러닝 알고리즘을 구현할 수 있다.
먼저,
사이킷런에서 제공하는 데이터셋은 특성행렬(Feature Matrix)과 타겟벡터(Target Vector)로 NumPy의 ndarray, Pandas의 DataFrame, SciPy의 Sparse Matrix를 이용해 나타낼 수 있다.
특성행렬은 입력 데이터를 의미하며 [n_samples, n_features] 형태의 2차원 배열 구조를 사용한다.
(n_samples: 행의 개수(표본의 개수), n_features: 열의 개수(특성의 개수))
특성행렬은 NumPy의 ndarray, Pandas의 DataFrame, SciPy의 Sparse Matrix를 사용하여 나타낼 수 있다.
타겟벡터는 입력데이터의 라벨(정답)을 의미하며 라벨의 개수가 벡터의 길이가 되는 [n_samples] 형태의 1차원 배열 구조를 사용한다.
타겟벡터는 NumPy의 ndarray, Pandas의 Series를 사용하여 나타낼 수 있다.
특성행렬의 n_samples와 타겟벡터의 n_samples는 동일해야 한다.
사이킷런의 알고리즘은 파이썬 클래스로 구현되어 있으며 알고리즘을 데이터 양, 라벨(정답)의 유무, 데이터의 종류(수치형, 범주형 등)로 나누고 있으며,
알고리즘의 Task는 Classification, Regression, Clustering, Dimensionality Reduction로 총4가지이다.
Classification용 알고리즘에는 SGD Classifier, KNeighborsClassifier, LinearSVC, NaiveBayes, SVC, Kernel approximation, EnsembleClassifiers로 총 7개의 알고리즘이 있다.
Regression용 알고리즘에는 SGD Regressor, Lasso, ElasticNet, RidgeRegression, SVR(kernel='linear'), SVR(kernel='rbf'), EnsembelRegressor으로 총 7개의 알고리즘이 있다.
사이킷런에서는 훈련 데이터와 테스트 데이터를 나누는 기능을 제공하는 sklearn.model_selection 안의 train_test_split 함수가 있다. 이 함수를 사용하여 훈련 데이터와 테스트 데이터를 랜덤하게 섞을 수 있다.
또, transformer()는 ETL(Extract Transform Load) 기능을 수행하는 함수이다.
사이킷런에서 모델(Model)로 표현되는 클래스는 Estimator이며 Estimator 클래스의 메소드에는 fit()(훈련), predict()(예측)가 있다.
모델의 훈련과 예측이 끝나면 이 2가지 작업을 Pipline()으로 묶어 검증을 수행하게 된다.
위에서 말한 것처럼 사이킷런은 파이썬 기반 머신러닝 라이브러리이기 때문에 최신 버전인 0.23를 사용하기 위해선 다음과 같은 사양이 요구된다.
Python (>= 3.6), NumPy (>= 1.13.3), SciPy (>= 0.19.1), joblib (>= 0.11)
사이킷런 라이브러리 설치를 위해서 아래와 같이 터미널에 입력하면 된다.
$ pip install scikit-learn
설치가 되었다면 버전을 확인한다.
먼저, 회귀 모델을 이용하여 데이터를 예측하는 모델을 만들 것이다.
사이킷런에서 머신러닝 모델을 사용하려면 모델 객체를 생성해야 한다.
지금 사용할 모델의 이름은 LinearRegression이다.
입력 데이터인 x를 모델에 그대로 넣으면 에러가 발생하기 때문에 .reshape()를 사용하여 x를 행렬로 바꿔야한다.
model.fit으로 입력 데이터와 라벨을 이용해 모델 훈련을 시켰다면 새로운 데이터를 넣어 예측을 할 수 있다.
reshape() 함수에서 나머지 숫자를 -1로 넣으면 자동으로 남은 숫자를 계산해 준다.
기존 그래프에서 예측한 값으로 그래프를 그리면 빨간 줄인 직선 그래프가 기존 그래프와 거의 일치하게 나오는 것을 볼 수 있다.
학습된 회귀 모델이 예측을 잘 했는지 모델의 성능을 평가하기 위해서는 RMSE(Root Mean Square Error) 를 사용한다.
from sklearn.metrics import mean_squared_error
error = np.sqrt(mean_squared_error(y, y_new))
print(error)
>>> 9.299028215052264
위의 선형회귀 문제를 해결하는 과정을 간략하게 정리한 그림이다.
이번에는 사이킷런에서 제공하는 데이터셋을 사용하여 모델 학습, 예측을 해 볼 것이다.
sklearn.datasets 모듈은 크게 dataset loaders와 dataset fetchers로 나뉘며, 각각 Toy dataset과 Real World dataset을 제공하고 있다. 지금 사용할 데이터는 Toy dataset 중 분류 문제인 와인 데이터셋을 사용할 것이다.
훈련에 사용한 데이터를 예측에까지 사용한다면 모델의 정확도는 항상 100%가 나오기 때문에 훈련 데이터와 테스트 데이터의 분리는 필수이다.
때문에 데이터를 로드한 후 train_test_split를 사용하여 훈련 데이터셋과 테스트 데이터셋으로 나눈다.
테스트 데이터의 비율은 20%로 하기 위해 test_size = 0.2 인자를 지정해 준다.
훈련 데이터셋과 테스트 데이터셋은 0번부터 순차적으로 데이터를 분할했기 때문에 랜덤하게 데이터를 섞기 위해서는 사이킷런에서 제공하는 random-state를 사용한다.
사용할 모델은 RandomForestClassifier()로 모델의 객체를 선언 한 뒤 model.fit으로 모델 학습을 진행한다.
모델 학습 후 테스트 데이터로 예측을 하여 정확도(정답률)을 출력할 수 있다.
위의 분류 문제를 해결하는 과정을 간략하게 나타낸 그림이다.
이렇게 사이킷런은 사용자에게 편리한 기능을 많이 제공하고 있다.
머신러닝용 라이브러인만큼 기능들을 익혀두고 자주 사용하면서 익숙해지는 것이 좋을 것 같다.