파이프라인(pipeline), 특성 스케일링(feature scaling), fit, transform, fit_transform() 메서드의 차이

데이터 변환기, Pipeline 만들기 계층적 샘플링 (Stratified Sampling) 데이터 셋이 충분히 크다면 일반 훈련 데이터 셋을 무작위로 샘플링 하여도 큰 문제가 발생하지 않는다. 하지만 그렇지 않으면 데��

dsbook.tistory.com

위에서 전처리한 데이터들로 학습시켜보자.

 

모델 선택과 평가(교차검증)

1. LinearRegression (선형 회귀)

from sklearn.linear_model import LinearRegression

lin_reg = LinearRegression()

#준비된 데이터와 레이블로 모델 학습
lin_reg.fit(housing_prepared, housing_label)

#학습된 모델을 바탕으로 레이블 예측
housing_predictions = lin_reg.predict(housing_prepared)

이때 사용하는 fit 메서드는 파이프라인에서 사용한 fit 메서드와 사용 방식이 완전히 다르다. 데이터 전처리 과정 중 사용한 fit 메서드는 데이터를 변환하기 위한 설정을 마련하기 위한 용도로 사용되고, 위에서 사용된 fit 메서드는 모델을 해당 데이터와 준비된 레이블로 학습시키기 위함이다. 이렇게 학습된 모델을 바탕으로 predict 메서드를 통해 레이블을 예측한다. 그리고 예측한 결과를 housing_predictions에 초기화시킨다.

from sklearn.metrics import mean_squared_error
lin_mse = mean_squared_error(housing_label, housing_predictions)
lin_rmse = np.sqrt(lin_mse)
lin_rmse

이렇게 예측한 모델을 사이킷런의 mean_squared_error 함수를 사용해 전체 훈련 세트에 대한 회귀 모델의 RMSE(평균 제곱근 오차, 평균 제곱 오차(MSE)의 제곱근)를 측정해보았다. 예측 오차가 $68,628로 실제로 썩 만족스러운 예측 결과가 나오지 못했다. 이는 과소 적합된 사례로 데이터가 충분하지 않거나 모델이 그만큼 강력하지 않다는 것을 말해준다.

 

이렇게 전체 훈련 데이터 세트를 완전히 학습시킨 후 예측 결과로 그 성능을 평가하는 방법도 있지만, Machine Learning (더 좋은 알고리즘 학습을 위한 선택)에서도 언급했듯이 훈련 데이터 세트를 더 작은 훈련 세트와 검증 세트로 나누고 더 작은 훈련 세트에서 모델을 훈련시킨 후 검증 세트로 모델을 평가하는 방법도 있다. 하지만 이 훈련 데이터 세트를 train_test_split 함수를 사용해 더 작은 훈련 세트와 검증 세트로 나누기에는 훈련 데이터 세트 자체가 너무 작으므로 교차검증(cross validation) 기능을 사용하여 모델을 평가해보자.

def display_scores(scores):
    print("점수:", scores)
    print("평균:", scores.mean())
    print("표준편차:", scores.std())


from sklearn.model_selection import cross_val_score

lin_scores = cross_val_score(lin_reg, housing_prepared, housing_labels, score="neg_mean_squared_error", cv=10)
lin_rmse_scores = np.sqrt(-lin.scores)
display_scores(lin_rmse_scores)

여기 사이킷런에서 K-겹 교차 검증(K-fold cross-validation) 기능을 제공하는 cross_val_score 함수가 있다. 해당 함수에 사용하고자 하는 모델의 객체, 훈련 데이터 세트, 데이터 레이블, 평가 방법과 서브셋 개수를 파라미터로 지정해준다. 위 코드에서는 훈련 세트를 폴드(fold)라고 불리는 10개의 서브셋으로 무작위로 분할하여 선형 회귀 모델을 10번 훈련하고 평가한다. 매번 다른 폴드를 선택해 평가에 사용하고 나머지 9개 폴드는 훈련에 사용하므로 총 10개의 평가 점수가 담긴 배열이 결과로 출력된다. 출력 결과는 다음과 같다.

선형 회귀 모델의 교차 검증 결과

 

 

2. DecisionTreeRegressor (결정 트리)

from sklearn.tree import DecisionTreeRegressor

tree_reg = DecisionTreeRegressor()
tree_scores = cross_val_score(tree_reg, housing_prepared, housing_labels, scoring="neg_squared_error", cv=10)
tree_rmse_scores = np.sqrt(-tree_scores)
display_scores(tree_rmse_scores)

 

결정 트리 모델의 교차 검증 결과

선형 회귀 모델보다 더 결과가 안 좋게 나온 것을 알 수 있다.

 

 

3. RandomForestRegressor (랜덤 포레스트)

from sklearn.ensemble import RandomForestRegressor

forest_scores = cross_val_score(forest_reg, housing_prepared, housing_labels, scoring="neg_mean_squared_error", cv=10)
forest_rmse_scores = np.sqrt(-forest_scores)
display_scores(forest_rmse_scores)

랜덤 포레스트 모델의 교차 검증 결과

선형 회귀와 결정 트리 모델에 비해 결과가 좋게 나온 것을 알 수 있다.

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기