Writer: Harim Kang
해당 포스팅은 머신러닝의 교과서라고 불리는 Hands-On Machine Learning with Scikit-Learn & Tensor flow 책을 학습하며 정리하고, 제 생각 또한 함께 포스팅한 내용입니다. 아래의 포스팅에 이어진 내용입니다.
2020/01/22 - [IT/Machine Learning] - 머신러닝 (3) - 데이터 전처리
오늘의 포스팅은 위의 포스팅에 이어지는 ML 모델 생성과 훈련, 예측 방법, 평가 점수 확인하는 방법에 대한 내용입니다. 해당 포스팅은 ML Model Training, Prediction, Score에 대한 내용을 포함하고 있으며, Scikit-learn 라이브러리 메서드를 사용하여 코드를 작성하였습니다.
알고리즘 선정에 관한 내용과 각각 알고리즘에 대한 자세한 설명은 머신러닝 이후에 정리할 포스팅들에서 정리하겠습니다.
훈련 데이터 세트를 이용하여 모델을 생성하는 작업입니다. 선정된 모델에게 훈련 데이터를 학습시키는 과정입니다.
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를 계산합니다. 수학적으로 말하자면, 선형함수의 기울기와 절편을 구한다고 볼 수 있습니다. 해당 값들은 데이터 세트가 많을수록 정확합니다.
위에서 훈련시킨 모델을 사용하여 예측하는 순서입니다. 앞선 포스팅에서 훈련 데이터 세트와 테스팅 데이터 세트로 나누었습니다. 이 데이터를 각각 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에 돌려줍니다.
위의 예제에서 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)
머신러닝 (6) - Fine Tuning Model (2) | 2020.02.12 |
---|---|
머신러닝 (5) - Cross Validation(교차검증) (9) | 2020.01.28 |
머신러닝 (3) - 데이터 전처리 (0) | 2020.01.22 |
머신러닝 (2) - ML프로젝트를 위한 데이터 선택 및 준비 (0) | 2020.01.21 |
추천 시스템 (2) - 실제 시스템 분석 (3) | 2020.01.14 |