Intro

오늘 포스팅에서 다룰 주제는 Facebook에서 공개한 FBprophet 라이브러리를 활용한 시계열 데이터 예측입니다.

해당 라이브러리에 대한 자료는 아리 링크에서 확인하실수 있습니다.

  • https://facebook.github.io/prophet/docs/quick_start.html

해당 데이터는 캐글에 공개된 아보카도의 가격 관련 데이터입니다.

  • https://www.kaggle.com/neuromusic/avocado-prices

오늘 사용할 데이터 셋의 구성과 설명은 아래와 같습니다. 




예측 진행 과정 

FBprophet 라이브러리는 학습을 위해서 

  1. 시간(Timeline)
  2. 예측값

데이터를 필요로 합니다.

따라서 아래와 같이 Date 칼럼과 오늘의 예측값인 AveragePrice를 준비해 줍니다.



  • region을 grouping하여 해당 그룹들을 기준으로 Data에 따른 AveragePrice를 가지고 옴
  • 여기선 TotalUS(즉 모든 그룹들)의 자료를 가지고 옴

결과 해석 


  • 모델을 불러온 후 위에서 처리한 data_price를 파라미터로 줌
  • make_future_dataframe를 통해 기간 설정하며 predict를 통해 예측 진행 - periods=365는 향후 365일을 예측하겠다는 뜻


  • 위 그래프를 통해 가격에 대한 향휴 365일의 예측값을 확인할 수 있음. 
  • 중간 그래프를 통해 큰 틀에서의 트랜드를, 아래 그래프를 통해 최근 1년동안의 트랜드를 파악할수 있음 


Voting Classifiers


Voting Classifiers는 "다수결 분류"를 뜻하는 것으로, 두 가지 방법으로 분류할 수 있습니다.


1. Hard Voting Classifier

여러 모델을 생성하고 그 성과(결과)를 비교합니다. 이 때 classifier의 결과들을 집계하여 가장 많은 표를 얻는 클래스를 

최종 예측값으로 정하는 것을 Hard Voting Classifier라고 합니다.



위와 같이 최종 결과를 1로 예측한 모델이 3개, 2로 예측한 모델이 한 개이므로 Hard Voting Classifier의 최종 결과(예측)은 1이 됩니다.


2. Soft Voting Classifier

앙상블에 사용되는 모든 분류기가 클래스의 확률을 예측할 수 있을 때 사용합니다.

각 분류기의 예측을 평균 내어 확률이 가장 높은 클래스로 예측하게 됩니다 (가중치 투표)



위와 같이 예측 확률에 대한 평균이 높게 나오는 클래스를 최종 예측 클래스로 정하게 됩니다. 


3. 사이킷 런 Sklearn을 통한 구현 

해당 데이터는 캐글의 타이타닉 데이터를 이용하였습니다.

*전체 코드 확인 및 copy가 필요하신 분들은 제 커널 페이지에 가시면 됩니다.


1
2
3
4
5
from sklearn.ensemble import VotingClassifier
from sklearn.model_selection import GridSearchCV, StratifiedKFold
 
# Cross validate model with Kfold stratified cross val
k_fold = KFold(n_splits=10, shuffle=True, random_state=0)
cs

검증엔 10 fold cross validation을 사용합니다. 


오늘 만들 Voting Classifier는 총 네 가지 모델을 사용합니다.

1. Random Forest Classifier

2. Gradient Boosting Classifier

3. XGBoost Classifier

4. Support Vector Machine(SVC) 


Random Forest Classifier에 대한 Grid Search 및 모델 학습, 예측 진행 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
RFC = RandomForestClassifier()
 
 
## Search grid for optimal parameters
rf_param_grid = {"max_depth": [None],
              "max_features": [388],
              "min_samples_split": [238],
              "min_samples_leaf": [138],
              "bootstrap": [False],
              "n_estimators" :[100,300],
              "criterion": ["gini"]}
 
 
gsRFC = GridSearchCV(RFC, rf_param_grid, cv=k_fold, scoring="accuracy",  verbose = 1)
#print(score)
 
gsRFC.fit(train_data,target)
 
RFC_best = gsRFC.best_estimator_
 
# Best score
gsRFC.best_score_
cs


OUT:



Gradient Boosting Classifier에 대한 Grid Search 및 모델 학습, 예측 진행 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
GBC = GradientBoostingClassifier()
gb_param_grid = {'loss' : ["deviance"],
              'n_estimators' : [100,200,300],
              'learning_rate': [0.10.050.01],
              'max_depth': [48],
              'min_samples_leaf': [100,150],
              'max_features': [0.30.1
              }
 
gsGBC = GridSearchCV(GBC,param_grid = gb_param_grid, cv=k_fold, scoring="accuracy", n_jobs= 4, verbose = 1)
 
gsGBC.fit(train_data,target)
 
GBC_best = gsGBC.best_estimator_
 
# Best score
gsGBC.best_score_
cs


OUT:



Support Vector Classifier에 대한 Grid Search 및 모델 학습, 예측 진행 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
### SVC classifier
SVMC = SVC(probability=True)
svc_param_grid = {'kernel': ['rbf'], 
                  'gamma': [ 0.0010.010.11],
                  'C': [11050100,200,3001000]}
 
gsSVMC = GridSearchCV(SVMC,param_grid = svc_param_grid, cv=k_fold, scoring="accuracy", n_jobs= 4, verbose = 1)
 
gsSVMC.fit(train_data,target)
 
SVMC_best = gsSVMC.best_estimator_
 
# Best score
gsSVMC.best_score_
cs


OUT:



XGBoost Classifier에 대한 Grid Search 및 모델 학습, 예측 진행 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
XGBC = XGBClassifier()
xgb_param_grid = {'max_depth':[3,5,7],
                  'min_child_weight':[3,5,6],
                  'gamma': [ 00.0010.010.11],
                  'learning_rate':[0.10.050.01]}
 
gsXGBC = GridSearchCV(XGBC,param_grid = xgb_param_grid, cv=k_fold, scoring="accuracy", n_jobs= 4, verbose = 1)
 
gsXGBC.fit(train_data,target)
 
XGBC_best = gsXGBC.best_estimator_
 
# Best score
gsXGBC.best_score_
 
cs


OUT:



Voting Classifier를 통한 최종 클래스 결정 


1
2
3
4
5
6
7
8
9
#Voting Classifier - voting 파라미터로 hard/soft 선택가능
votingC = VotingClassifier(estimators=[('rfc', RFC_best), 
('svc', SVMC_best),('gbc',GBC_best), ('xgb', XGBC_best)], voting='hard', n_jobs=4)
 
votingC = votingC.fit(train_data, target)
 
#예측 진행
prediction = votingC.predict(test_data) 
 
cs


Prediction으로 최종 예측값을 받아옵니다.


CSV파일 저장 및 확인


1
2
3
4
5
#케글에 제출할 csv파일 저장
submission = pd.DataFrame({
        "PassengerId": test["PassengerId"],
        "Survived": prediction
    })
cs



해당 데이터는 1990년 캘리포니아 주택 가격 데이터입니다.

Hands-on Machine Learning Chapter 2를 참고하였습니다.


*전체 코드 확인 및 copy가 필요하신 분들은 제 커널 페이지에 가시면 됩니다


전체적인 데이터 정보는 위와 같습니다



우선 P-value부터 확인해 보겠습니다.

필요한 라이브러리 및 모듈을 임포트 해줍니다.

features에는 housing data에 있는 칼럼명들을 + 구분자로 저장합니다.



위와 같이 result 변수에 해당 값을 저장한 후, print해 줍니다.





위 설명에 나와있는 것처럼, multicollinearity가 의심된다고 합니다.

P-value가 0.5가 넘을 경우, 다중공산성을 의심해봐야 하기때문에 total_bedrooms 칼럼을 드랍하였습니다.



VIF를 확인해 보겠습니다. 과정은 위와 흡사합니다.




VIF값이 10이 넘을 경우 다중공산성을 의심해볼 필요가 있습니다.

다만 무조건적으로 feature를 drop하는 것이 아닌, drop 전 후 RMSE값의 변화를 체크해보셔야 합니다.





+ Recent posts