본문 바로가기
AI SCHOOL/TIL

[DAY 53] RandomForest, One Hot Encoding, get_dummies, train_test_split

2023. 3. 13.

DecisionTree를 여러 개 사용하는 형태인 앙상블 모델 RandomForest를 사용하여 분류 예측을 했다.

원핫인코딩과 train_test_split을 통해 모델의 예측 성능을 높였다.

Random Forest

Decision Tree(의사결정 트리) 기반의 ensemble(앙상블) 알고리즘 중 하나.
Classification(분류)와 Regression(회귀) 문제 모두에 적용 가능한 인기 있는 머신러닝 알고리즘이다.

여러 개의 Decision Tree를 생성하고 각 트리가 독립적으로 예측한 결과를 종합하여 하나의 최종 예측 결과를 도출한다. 이를 통해 overfitting을 방지하고 모델의 예측 성능을 높일 수 있다.

일반적으로 트리를 많이 사용할수록 더 좋은 성능을 내지만 속도가 느려진다. 또한 너무 많은 트리를 사용할 경우 overfitting 발생을 유의해야 한다.

데이터 준비

Kaggle에 있는 Telco Customer Churn 데이터를 로드하여 활용한다.
인구통계와 구독에 관련된 정보 등 고객 정보가 들어 있으며 이를 이용해 Churn(이탈 여부)을 예측하였다.

index 지정, 결측치 제거 등 과정을 거쳐 7032행 20열 데이터프레임을 변수 df에 저장했다.

info
df.info() 결과

거의 모든 컬럼이 object 타입인 것이 보인다.

nunique
df.nunique() 결과

각 object 타입 컬럼의 nunique가 4개 이하인 것을 확인할 수 있다.

# Churn 빈도 비율 확인
df['Churn'].value_counts(normalize=True)

# 실행 결과
No     0.734215
Yes    0.265785

예측해야 할 Churn의 빈도 비율은 약 7:3이다.

데이터 나누기, 인코딩

label_name = 'Churn'  # target

# scikit-learn에서 데이터는 대문자 X(2차원,행렬)로 표기
# 레이블은 소문자 y(1차원,벡터)로 표기
X_raw = df.drop(columns=label_name)
y = df[label_name]

# X와 y가 동일한 행 수를 가지는지 확인
X_raw.shape, y.shape

# 실행 결과
((7032, 19), (7032,))

머신러닝 모델에 범주형 데이터를 활용하기 위해 One Hot Encoding을 한다.

One Hot Encoding이란?
- 사람이 이해하는 데이터를 컴퓨터가 이해할 수 있도록 숫자 형태로 바꾸어 주는 것
- 머신러닝에서 분류 모델을 다루거나 범주형 데이터 혹은 카테고리컬한 문제는 만난다면 컴퓨터가 데이터를 인식할 수 있도록 변환
- 범주형 변수의 모든 값을 binary 표현으로 바꾼다
- One Hot Encoding 결과 데이터는 0과 1로 이루어진 형태기 때문에 컴퓨터가 인식하고 학습하기 용이하다

One Hot Encoding 동작

범주 n개가 있는 컬럼 하나를 One Hot Encoding 하면 컬럼 n개가 된다.

X = pd.get_dummies(X_raw)

pandas의 get_dummies 함수를 사용해서 One Hot Encoding 완료.
- 문자형에서 숫자형으로 변환 결과 메모리 사용량이 대폭 감소
- 데이터프레임의 컬럼 수가 대폭 증가 => 45 columns

학습, 예측 데이터셋으로 분할

# train_test_split : 무작위로 데이터셋을 train과 test로 split
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y,
                                                    stratify=y,
                                                    test_size=0.2,                                                    
                                                    random_state=42)
                                                    
X_train.shape, X_test.shape, y_train.shape, y_test.shape

# 실행 결과
((5625, 45), (1407, 45), (5625,), (1407,))

7032행의 데이터가 train 5625행, test 1407행으로 분할되었다.
stratify=y를 통해 y의 범주 비율을 유지하며 분할, test_size=0.2를 통해 train:test = 8:2 분할

stratify
유지되는 비율

 

머신러닝 모델로 예측

scikit-learn의 앙상블 분류 모델 RandomForestClassifier 사용

from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(n_estimators=200, random_state=42)
model.fit(X_train, y_train)  # 학습
y_predict = model.predict(X_test)  # 예측

RandomForestClassifier를 사용한 후 Accuracy score를 측정한 결과 0.791이 계산되었다.
DecisionTreeClassifier를 사용한 경우 0.73이 계산되었는데, 그에 비해 유의미하게 성능이 증가된 것을 확인했다.

피처 중요도

fi = pd.DataFrame(model.feature_importances_)
fi.index = model.feature_names_in_
fi = fi.sort_values(0, ascending=False)
fi.head(15)

feature_importances_를 통해 모델의 피처 중요도 상위 15위를 추출했다.

feacure

이를 막대그래프로 시각화하면 아래와 같다.

bar

피처 중요도 상위 15개에 대한 시각화를 통해 TotalCharges, tenure, MonthlyCharges의 중요도가 가장 높은 것을 확인할 수 있었다.

지난 시간에는 범주형 데이터는 제외하고 수치형 데이터 4개의 컬럼만 머신러닝에 활용했는데, 범주형 데이터를 One Hot Encoding을 통해 수치형 데이터로 변경하고 더 많은 feature를 이용해 모델을 다루었다.
RandomForest와 Encoding의 개념을 익혔다.

반응형

댓글