현업에 있으면, 직면하는 데이터는 항상 범주형(카테고리) 데이터 셋이다. 다른 모델로 하였을 경우 범주형 데이터는 항상 원-핫 인코딩을 하여 계산 하여야 만 했다. 하지만, 원-핫 인코딩을 하지 않고, 범주형 데이터를 이용하는 것에 대하여 매우 인상 적이다.
하지만 그라이언트 부스팅 방법은 과대적합(overfitting)의 문제를 가지고 있으므로, 각종 파라미터를 잘 검토하여, 실행 하여야 하며, 모델을 실행한 후에 모델 평가를 통해 반드시 검증해야 하는 알고리즘이다.
Light GBM |
Ligth GBM 간략 소개
1. GBM(Gradient Boosting Machine) 트리기반 학습 알고리즘을 사용
- Weak learners (decision trees) : 약 학습기
- Gradient Optimization : 그라디언트 최적화
- Boosting Technique : 부스팅 테크닉
1) lgbm 결정트리 (약 학습기)는 아래와 같이 순차적으로 생성
- 첫번째 트리는 대상 변수를 맞추는 방법을 알아야 한다.
- 두번째 트리는 첫번째 트리의 예측과 정답 간의 잔차(차이)에 맞추는 방법을 알아야 한다.
- 세번째 트리는 두번째 트리의 잔차를 맞추는 방법을 알아야 한다.
위와 같은 모든 트리는 시스템 전체에 걸쳐 오류에 대해 기울기를 전파하여, 훈련된다.
2) dart 그라이언트 부스팅
신경망의 표준인 드롭아웃을 사용하여, 모델을 정규화를 개선 하는 문제이다. gbdt 그라이언트 부스팅은 전문적인 영역이다.
3) lgbm gross(기울기 기반 단측 샘플링)
표준 gbdt는 신뢰할 수 있지만, 대규모 데이터세트에서 충분히 빠르지 않다, 그래서, 전체 검색 공간을 검색하지 않도록 그라디언트 기반의 샘플링 방법을 제안한다.
여러가지 파라미터 조정같은 문제도 있지만, 지금은 카테고리 변수를 기반으로 하는 그라디언트 부스팅을 다루는 것으로 아래와 같이 진행 하겠다.
데이터 셋 소개
1) 데이터셋 : Telco Customer Churn (통신회사 고객 이탈)
2) 데이터 개요
"고객을 유지하기 위한 행동 예측", 모든 관련 고객 데이터를 분석하고 집중적인 유지 프로그램 개발
3) 데이터 내용
각 열에는 고객의 속성이 있다.
- 지난달에 떠난 고객 이탈한 고객은 Churn 컬럼에 있다.
- 고객이 가입한 서비스 : 전화, 다중회선, 인터넷, 온라인 보안, 온라인 백업, 장치보호, 기술지원, 스트리밍 TV &영화
- 고객 계정 정보 : 고객 유지기간, 계약, 지불방법, 청구정보, 월별요금 및 총요금
- 고객에 대한 통계정보 - 성별, 연령대 및 부양가족 정보등
Ligt GBM Pyhon 분석
모듈을 로딩 한다. 모듈에는 lightgbm 이 있다.
Churn 데이터 셋을 불러온다. 구글 드라이브에 있는 데이터 셋이다.
df = pd.read_csv('https://drive.google.com/u/0/uc?id=1bZAvMeStnTCIG6spQO3obmGZWy3iLWFC&export=download')
. 데이터는 7043개 데이터의 21개의 변수가 있다.
(7043, 21)
데이터정보를 본다. 데이터 정보는 21개의 변수와 속성이 있다. 아래의 정보를 보면, 데이터 Type이 object로 되어 있는 것은 머신러닝이 되지 않는다.
<class 'pandas.core.frame.DataFrame'> RangeIndex: 7043 entries, 0 to 7042 Data columns (total 21 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 customerID 7043 non-null object 1 gender 7043 non-null object 2 SeniorCitizen 7043 non-null int64 3 Partner 7043 non-null object 4 Dependents 7043 non-null object 5 tenure 7043 non-null int64 6 PhoneService 7043 non-null object 7 MultipleLines 7043 non-null object 8 InternetService 7043 non-null object 9 OnlineSecurity 7043 non-null object 10 OnlineBackup 7043 non-null object 11 DeviceProtection 7043 non-null object 12 TechSupport 7043 non-null object 13 StreamingTV 7043 non-null object 14 StreamingMovies 7043 non-null object 15 Contract 7043 non-null object 16 PaperlessBilling 7043 non-null object 17 PaymentMethod 7043 non-null object 18 MonthlyCharges 7043 non-null float64 19 TotalCharges 7043 non-null object 20 Churn 7043 non-null object dtypes: float64(1), int64(2), object(18) memory usage: 1.1+ MB
여기에서 불필요한 데이터 셋을 제거 한다. 불 필요한 데이터는 customerID와 TotalCharges 이다. 이건은 고객의 행동하고 관련성이 없기 때문이다.
데이터 셋을 만든다. y는 target value이고, X는 Feature이다. 머신러닝에서는 feature 데이터 셋 가지고 target을 예측 한다.
머신러닝 할 수 있는 데이터 범주형 데이터를 만든다. 범주형 데이터를 만들어야 머신러닝을 돌릴 수 있다.
X.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 7043 entries, 0 to 7042 Data columns (total 18 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 gender 7043 non-null category 1 SeniorCitizen 7043 non-null int32 2 Partner 7043 non-null category 3 Dependents 7043 non-null category 4 tenure 7043 non-null int32 5 PhoneService 7043 non-null category 6 MultipleLines 7043 non-null category 7 InternetService 7043 non-null category 8 OnlineSecurity 7043 non-null category 9 OnlineBackup 7043 non-null category 10 DeviceProtection 7043 non-null category 11 TechSupport 7043 non-null category 12 StreamingTV 7043 non-null category 13 StreamingMovies 7043 non-null category 14 Contract 7043 non-null category 15 PaperlessBilling 7043 non-null category 16 PaymentMethod 7043 non-null category 17 MonthlyCharges 7043 non-null float32 dtypes: category(15), float32(1), int32(2) memory usage: 187.4 KB
데이터 학습셋과 테스트 셋을 만들어 보자 학습셋은 80%이고 테스트셋은 20%로 나눈다.
#Train/test split
print('length of y_train and y_test: ', len(y_train), len(y_test))
length of X_train and x_test: 5634 1409 length of y_train and y_test: 5634 1409
ligth GBM모델을 만든다. n_estimators는 기본값 400으로 한다. 이것을 너무 높이면 과대적합이 발생할 가능성이 있다.
모델을 돌린다. 이건은 카테고리(범주형) 변수를 가지고 하는 예제이기 때문에, 별도의 모델 튜닝을 하지 않는다. 아래의 결과를 보면 그라디언트 디센트 하면서, loss 값이 최저 한 값에서 early_stop 하였다.
[114] valid_0's binary_logloss: 0.464457 valid_0's binary_logloss: 0.464457 [115] valid_0's binary_logloss: 0.464627 valid_0's binary_logloss: 0.464627 [116] valid_0's binary_logloss: 0.465021 valid_0's binary_logloss: 0.465021 [117] valid_0's binary_logloss: 0.465076 valid_0's binary_logloss: 0.465076 [118] valid_0's binary_logloss: 0.465218 valid_0's binary_logloss: 0.465218 [119] valid_0's binary_logloss: 0.465271 valid_0's binary_logloss: 0.465271 [120] valid_0's binary_logloss: 0.466261 valid_0's binary_logloss: 0.466261 [121] valid_0's binary_logloss: 0.46665 valid_0's binary_logloss: 0.46665 [122] valid_0's binary_logloss: 0.467187 valid_0's binary_logloss: 0.467187 [123] valid_0's binary_logloss: 0.46765 valid_0's binary_logloss: 0.46765 [124] valid_0's binary_logloss: 0.468006 valid_0's binary_logloss: 0.468006 Early stopping, best iteration is: [24] valid_0's binary_logloss: 0.435181 valid_0's binary_logloss: 0.435181
LGBMClassifier(n_estimators=400)
모델에 대하여 예측 한다.
모델에 대한 예측 결과를 아래와 같이 확인 한다.
# Print the prediction accuracy
Prdiction: 0.7927608232789212
아래는 어떠한 변수가 영향을 많이 받았는가에 대한 이야기 이다.
모델의 영향을 받음 LightGBM |
lightGBM 소스 |
댓글 없음:
댓글 쓰기