본문 바로가기

Euron/정리

[Week 8] 🥑💰 PyCaret 및 EDA를 사용한 아보카도 가격 회귀 💹

8주차 복습과제

PyCaret이라는 회귀 방법을 이용해 아보카도 가격을 예측한다.

 


0. PyCaret이란?

 

최소한의 코드로 머신러닝 과정을 자동화할 수 있도록 작성된 머신러닝 패키지.

모델 수행 분석을 위해 약 25개의 알고리즘과 10개의 그래프가 포함된다.

어셈블리, 하이퍼 파라미터, 스태킹 등 모든 러신 머닝 솔루션의 또 다른 소스이다.

또한 PyCaret을 이용해 다양한 회귀 모듈을 구현 가능하다.

https://pycaret.org/ 

 

Home - PyCaret

With PyCaret, you don’t have to leave your Notebook. Train your model, analyze it, iterate faster than ever before, and deploy it instantaneously as a REST API or even build a simple front-end ML app. All from the comfort of your Notebook.

pycaret.org

(Pycaret 참고 사이트)


1. 아보카도 DataSet 불러오기

 

3개의 Catogorical variables, 9개의 Continuous variables, 1개의 date, 1개의 index를 포함해 총 14개의 variables 존재

 

# --- Print Dataset Info ---
print('\033[92m\033[1m'+'.: Imported Dataset Info :.'+'\033[0m')
print('\033[92m*' * 30+'\033[0m')
print('Total Rows:'+'\033[92m\033[1m', ds.shape[0])
print('\033[0m'+'Total Columns:'+'\033[92m\033[1m', ds.shape[1])
print('\033[0m\033[92m'+'*' * 30+'\033[0m')
print('\n')

# --- Print Dataset Detail ---
print('\033[92m\033[1m'+'.: Dataset Details :.'+'\033[0m')
print('\033[0m\033[92m'+'*' * 30+'\033[0m')
ds.info(memory_usage = False)

초기 데이터 탐색

먼저, 범주형(Catogorical) 변수를 탐색한다.

탐색 후 가능하면 그래프로 표현하였다.

년도별 그래프 표현

  • 종류별 아보타도 수량
  • 년도별 아보카도 수량
  • 지역별 아보카도 수량

 

# --- Descriptive Statistics ---
ds[['AveragePrice', 'Total Volume', '4046', '4225', '4770', 'Total Bags', 'Small Bags', 'Large Bags',
    'XLarge Bags']].describe().T.style.background_gradient(cmap='YlOrBr').set_properties(**{'font-family': 'Segoe UI'})

아보카도 수치(Numerical) 변수 탐색 결과, 평균 가겨의 변화 폭이 작고 나머지 열은 더 많은 변화 폭을 가짐을 알 수 있다.

표준 편차(standard deviation)가 작다는 것은 데이터가 평균을 중심으로 군집되어있음을 의미한다.

 

# --- Skewness of Continuous Variables ---
print('\033[92m\033[1m'+'.: Continuous Columns Skewness :.'+'\033[0m')
print('\033[92m*' * 34+'\033[0m')
ds[['AveragePrice', 'Total Volume', '4046', '4225', '4770', 'Total Bags', 'Small Bags', 'Large Bags',
    'XLarge Bags']].skew(axis = 0, skipna = True)
    
# --- Kurtoisis of Continuous Variables ---
print('\033[92m\033[1m'+'.: Continuous Columns Kurtosis :.'+'\033[0m')
print('\033[92m*' * 34+'\033[0m')
ds[['AveragePrice', 'Total Volume', '4046', '4225', '4770', 'Total Bags', 'Small Bags', 'Large Bags',
    'XLarge Bags']].kurt(axis = 0, skipna = True)

사행도(비대칭도, skewness)와 첨도(Kurtoisis) 분석 결과, 대부분의 열이 극단적인 이상치와 매우 오른쪽으로 치우쳐진 사행도를 가짐을 알 수 있다.

그러나 평균 가격은 열이 적당하게 오른쪽으로 치우치고 이상치가 약간 있다.

 

EDA 결과

 

데이터 세트를 탐색과 이해한 후, 특성을 시각화하고 요약한다.

  • 종류별, 지역별 판매량
    • 전통적인 아보카도가 유기농에 비해 높은 판매량을 지닌다.
    • West와 California 지역이 두 종류 모두 가장 높은 판매량을 지닌다. 
  • 종류별, 지역별 가격
    • 유기농 아보카도가 전통적인 아보카도보다 비싸다.
    • 전통적인 아보카도 가격의 분포는 모든 지역에서 같다.
    • HartfordSpringfield, SanFrancisco에서는 아보카도 가격이 높다.
  • PLU, 상자 사이즈별 판매량
    • 둘다 전통적인 아보카도 판매량이 훨씬 높다.
    • PLU는 4046, 4225 수치일 때 비슷하게 높으며, Bags 사이즈는 작을수록 판매량이 높다.
  • 년도별 종류에 따른 가격분포

이건 이미지로 설명

  • 판매되는 아보카도 총량과 상자 총량 사이의 산점도
    • 판매되는 아보카도 두 종류 모두 아보카도 총량이 증가하면 상자 총합도 증가한다.
    • 유기농 아보카도는 전통 아보카도에 비해 분포가 낮다.
  • 시간별 아보카도 평균 가격

결론 :

  • 가격이 저렴한 전통적인 아보카도를 선택할 확률이 높다.
  • 전통적인 아보카도를 팔기 기장 좋은 시기는 연말부터 연초이다.
  • 작은 아보카도 봉지는 다른 아보카도 봉지에 비해 평균 개수가 가장 많다.

02. 데이터 전처리

 

  • Target 변수는 평균 가격으로 한다.
  • train set의 사이즈는 8:2로 한다.
  • 범주형 변수(종류, 연도, 지역, 월) 정의
  • 이전 관측치에서 이상치가 있으므로 robust 기법을 이용해 정규화를 진행하고, 낮은 variance는 무시된다.
# --- Change `Date` Format to 'datetime' ---
ds.Date = pd.to_datetime(ds.Date)

# --- Extracting Month Number from `Date`  ---
ds['month'] = pd.DatetimeIndex(ds['Date']).month

# --- Setup PyCaret Regression Module ---
avc = setup(data = ds, target = 'AveragePrice', train_size = 0.8,
            categorical_features = ['type', 'year', 'region', 'month'], normalize = True, normalize_method = 'robust', 
            silent = True, ignore_low_variance = True, session_id = 123)


03.모델 수행/평가

 

R2 score를 이용해 모델 수행 및 평가를 진행한다.

# --- Comparing All Models ---
best_models = compare_models(sort='R2')

Extra Tree Regressor, Random Forest Regressor, XGBoost, LightGBM 순으로 높은 score를 기록한다.

 

# --- Plot Feature Importance for Tuned Best Model ---
plot_model(tuned_best, plot = 'feature')

best_model(ET) 분석하며 feature importance를 알 수 있다.

type과 region feature가 중요함을 알 수 있다.

 

# --- Tuning Best Model ---
tuned_best = tune_model(best_models)

best_model을 튜닝한다.

그러나 튜닝한 뒤 정확도가 줄어들었고, Pycaret이 Extra Regressor 최적화의 실패했음을 알 수 있다.

 

이외에 RF와 LGB model을 이용하여 튜닝 및 정확도를 측정하였으나, 여전히 best_model보다는 정확도가 낮았다.

세 모델의 정확도 결과는 다음과 같다.

세 모델 모두 튜닝 후 결과가 낮게 나왔다.

Extra Tree Regressor과 Train/Test set 모두에서 높은 결과를 보여주었다.

 

# --- Prediction using Best Model ---
predict_model(best_models)

predict_model을 이용해 Test data set에 대한 예측 결과를 확인할 수 있다.

 

# --- Save Final Model into Pickle File ---
save_model(final_best,'Final_Best_Model_caesarmario_06May2022')

Pickle File에 Final Model을 저장한 후 끝!

 


+ 추가

 

추가로 본문에서 사용하지 않은 Decision Tree를 이용해 튜닝/평가를 진행하였다.

다른 모델들과 마찬가지로 튜닝 후 R2 Score는 증가하지 않았고, ET보다 낮은 결과가 나왔다.

Decision Tree는 다른 모델들보다 더 빠른 결과가 나온 것 같다.

# --- Create Light Decision Tree ---
dt = create_model('dt')

# --- Tuning Decision Tree ---
tune_dt = tune_model(dt)

# --- Plot the Residual of Tuned Decision Tree ---
plot_model(tune_dt)

# --- Plot Error Prediction for Tuned Decision Tree ---
plot_model(tune_dt, plot = 'error')

# --- Plot Feature Importance for Tuned Decision Tree --
plot_model(tune_dt, plot = 'feature')

튜닝 후 결과
튜닝 후 feature importance


# 회고

 

전체적인 회귀 모델에 대해 평가, 튜닝 등 많은 것을 지원해주는 PyCaret을 사용해보았다.

시간이 굉장히 오래걸렸다. 모델이 많으니까...라이브러리 설치에도 오래걸림. 그래도 편리하긴 하다.

'Euron > 정리' 카테고리의 다른 글

[Week11] 07. 군집화(2)  (0) 2023.11.15
[Week11] 07. 군집화(1)  (0) 2023.11.15
[Week9] 06. 차원 축소  (1) 2023.11.02
[Week8] 05. 회귀 - 캐글 실습  (1) 2023.10.19
[Week5] 05. 회귀(2)  (1) 2023.10.08