8주차 복습과제
PyCaret이라는 회귀 방법을 이용해 아보카도 가격을 예측한다.
0. PyCaret이란?
최소한의 코드로 머신러닝 과정을 자동화할 수 있도록 작성된 머신러닝 패키지.
모델 수행 분석을 위해 약 25개의 알고리즘과 10개의 그래프가 포함된다.
어셈블리, 하이퍼 파라미터, 스태킹 등 모든 러신 머닝 솔루션의 또 다른 소스이다.
또한 PyCaret을 이용해 다양한 회귀 모듈을 구현 가능하다.
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')
# 회고
전체적인 회귀 모델에 대해 평가, 튜닝 등 많은 것을 지원해주는 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 |