상세 컨텐츠

본문 제목

머신러닝 (4) - ML 모델 생성과 훈련, 예측, 평가

IT/Machine Learning

by HarimKang 2020. 1. 28. 14:48

본문

Writer: Harim Kang

머신러닝 - 4. End-to-End Machine Learning Project (3)

해당 포스팅은 머신러닝의 교과서라고 불리는 Hands-On Machine Learning with Scikit-Learn & Tensor flow 책을 학습하며 정리하고, 제 생각 또한 함께 포스팅한 내용입니다. 아래의 포스팅에 이어진 내용입니다.

2020/01/22 - [IT/Machine Learning] - 머신러닝 (3) - 데이터 전처리

 

머신러닝 (3) - 데이터 전처리

Writer: Harim Kang 머신러닝 - 3. End-to-End Machine Learning Project (2) 해당 포스팅은 머신러닝의 교과서라고 불리는 Hands-On Machine Learning with Scikit-Learn & Tensor flow 책을 학습하며 정리하고,..

davinci-ai.tistory.com

오늘의 포스팅은 위의 포스팅에 이어지는 ML 모델 생성과 훈련, 예측 방법, 평가 점수 확인하는 방법에 대한 내용입니다. 해당 포스팅은 ML  Model Training, Prediction, Score에 대한 내용을 포함하고 있으며, Scikit-learn 라이브러리 메서드를 사용하여 코드를 작성하였습니다.

ML 모델 훈련 및 예측

알고리즘 선정에 관한 내용과 각각 알고리즘에 대한 자세한 설명은 머신러닝 이후에 정리할 포스팅들에서 정리하겠습니다.

Model 훈련

훈련 데이터 세트를 이용하여 모델을 생성하는 작업입니다. 선정된 모델에게 훈련 데이터를 학습시키는 과정입니다.

  • model.fit()

    • x: training set

    • y: Target values

      from sklearn.linear_model import LinearRegression
      
      lin_reg = LinearRegression()  
      lin_reg.fit(X_train, Y_train)

      예제 코드에서는 LinearRegression()모델을 사용하였습니다. 이 외에도 다양한 모델이 있습니다. 목표에 적합한 모델을 설정하여 사용하면 됩니다. 학습방법은 동일합니다. fit()함수에 준비된 훈련 데이터 세트 X_train, Y_train를 파라미터로 전달하기만 하면 됩니다. Y는 정답이라고 볼 수 있는 Label입니다. X는 각 Y값에 대응하는 특징들, 데이터들 입니다.

fit으로 학습한 데이터세트를 바탕으로 LinearRegression은 weight와 bias를 계산합니다. 수학적으로 말하자면, 선형함수의 기울기와 절편을 구한다고 볼 수 있습니다. 해당 값들은 데이터 세트가 많을수록 정확합니다.

Model 예측

위에서 훈련시킨 모델을 사용하여 예측하는 순서입니다. 앞선 포스팅에서 훈련 데이터 세트와 테스팅 데이터 세트로 나누었습니다. 이 데이터를 각각 X_train, X_test, Y_train, Y_test라고 하겠습니다. 모델이 잘 학습되었는지 테스트하기 위해서, 테스트 데이터 세트를 이용하여 예측을 해보겠습니다.

데이터 나누기: https://davinci-ai.tistory.com/14

  • model.predict()

    • x: input data(전처리가 완료된 데이터)

    • return: array, 예측 결과

      X_test = full_pipeline.transform(X_test)  
      Y_pred = lin_reg.predict(X_test)

      X_test 데이터세트를 훈련 데이터세트와 마찬가지로 이미 존재하는 pipeline으로 데이터를 전처리 해줍니다. 이때 transform함수를 사용하며, 전처리가 완료된 데이터를 모델의 predict라는 함수를 사용하여 전달해주면, 모델이 예측한 값을 Y_pred에 돌려줍니다.

Model 평가

위의 예제에서 Regression을 사용하였기 때문에, 여기서는 평가 기준으로 RMSE점수를 사용하겠습니다. 간단하게 RMSE를 설명하자면 MSE라는 오차 제곱의 평균값을 루트한 값으로서, 상대적으로 큰 오차에 대해 예민한 기준 점수입니다. 0에 가까울수록 좋다고 볼 수 있습니다. 하지만, 너무 0에 가까워도 이것은 과적합(Overfitting)에 해당합니다.

RMSE 설명 : https://davinci-ai.tistory.com/14

import numpy as np
from sklearn.metrics import mean_squared_error
mse = mean_squared_error(Y_test, Y_pred)
rmse = np.sqrt(mse)

scikit-learn 라이브러리에서는 MSE를 계산하는 mean_squared_error 메서드를 제공합니다. 이를 이용하여 sqrt(루트)하면 RMSE값을 계산할 수 있습니다.

코드로 정리

현재까지의 내용을 코드를 이용하여 요약 정리 해보겠습니다. 의사코드이기 때문에 실제로 돌아가는 코드는 아니지만 전체적인 흐름을 살펴볼 수 있습니다.

from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
import numpy as np
from sklearn.metrics import mean_squared_error

# 우선 데이터세트 로드
X, y = load_data()

# 훈련, 테스트 데이터세트 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 파이프라인을 통한 전처리
pipeline = Pipeline([ ('imputer', SimpleImputer(strategy="median")), ('attribs_adder', CombinedAttributesAdder()), ('std_scaler', StandardScaler()), ])
X_train = pipeline.fit_transform(X_train)

# 모델 선언 및 학습: Model은 존재하지 않는 클래스로, 알맞은 모델 클래스를 선언하면 됩니다.
model = Model()
model.fit(X_train, y_train)

# 모델 테스트세트 예측
X_test = pipeline.transform(X_test)
y_pred = model.predict(X_test)

# 모델 평가: 예를 들어 MSE, RMSE 평가 기준 값입니다.
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)

 

관련글 더보기

댓글 영역