22.10.26.
머신러닝 두 번째 날.
오 뭔가 되게 정신없다. 잘 공부해봐야겠다.
정리 시작!
랜덤포레스트란 무엇일까?
랜덤포레스트는 Bagging이라는 방식으로 동작한다.
Bagging이란, Bootstrap + aggregating을 의미한다.
랜덤포레스트에도 여러 매개변수(hyperparameter)들이 있다. 특히 중요한 것은, n_estimators로, 몇개의 트리를 생성할 것이냐라는 인자와, 트리의 최대 깊이 max_depth이다.
회귀는 수치형 변수에 대한 예측이다.
이번 실습파일에서는, 지난번과 마찬가지로 pima indians diabetes database를 사용하는데, 결측값이 많았던 Insulin을 회귀를 통해 예측하여 결측값 처리를 해줄 것이다.
즉, 데이터의 전처리를 위해 머신러닝을 사용한다.
회귀를 구현하는 모델도 여러가지가 있지만, 우리가 지금 사용하고 있는 RandomForest의 Regressor를 사용할 것이다. RandomForest역시 CART모델이므로, 분류와 회귀 모두 가능하다.
이번 실습은 인슐린의 결측값(0으로 표시되어있음)을 예측하여야 하는 실습이었기에, test data set은 인슐린이 결측치인 데이터이다.
즉, train set에는 정답이 있지만, test set에는 정답이 없다. 그럼 모델의 검증, 평가를 어떻게 진행해야 할까?
교차 검증을 실시한다.
교차 검증이란, 종속변수에 대한 예측이 얼마나 잘 작용하는지를 train set만을 통해 검증하는 방법이다.
hold-out validation은 train set을 train set과 하나의 valid set으로 나누어, train set에 대해 학습을 진행하고, valid set으로 검증을 하는 방식이다. 이 방식은 신뢰도는 좀 떨어지지만, 빠르게 결과를 추출해볼 수 있다는 장점이 있다.
k-fold 교차검증은, train set을 k개로 나누어, k개 fold 각각이 모두 valid set이 되도록 train set에 k번의 검증을 거치는 방법이다. 이 방법을 통해서는 총 k개의 모형, k개의 교차검증 성능이 나오겠고, 이를 평균내어 최종 성능을 계산한다.
sklearn의 cross_val_predict 등을 사용하여 구현할 수 있다.
r2_score
교차검증의 정확도를 측정하는 방법 중 하나. 분류에서 처럼 accuracy를 구하면, 분류처럼 딱딱 나누어떨어지는 것이 아니므로 0이 나오곤 한다. 따라서 회귀선의 기울기를 의미하는 r2_score를 평가 지표로 이용하곤 한다. 1에 가까울 수록 좋다.
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(random_state = 42, n_estimators = 900,n_jobs = -1, max_depth = 10)
model
n_estimators의 기본값은 100이다. n_jobs는 모델에서 사용할 컴퓨터의 코어 수를 의미한다. -1을 값으로 주면 모든 코어를 사용한다.
test['accuracy'] = (y_test == y_predict)
test[test['accuracy'] == False]
모델의 예측 결과 중 틀린 값만 봐야 할때 이렇게 사용하면 되겠다.
train = df[df[label_name] > 0]
test = df[df[label_name] == 0]
비율로 따지면 거의 5대 5수준. 보통 train set의 개수를 많이 하는 것이 좋지만, 정답이 있는 것은 아니다! 여기서 나눌 수 있는 최선의 방법으로 나눈다.
y_test = test[label_name]
display(y_test.head(2))
y_test.shape
중간에 display()구문을 사용하면, 값을 확인할 수 있으므로 잘 써먹으면서 진행해야 한다! 값을 중간중간 잘 확인하며 진행해줘야 실수와 오류를 막을 수 있다.
from sklearn.ensemble import RandomForestRegressor
model = RandomForestRegressor(random_state= 42, n_jobs = -1, n_estimators = 100)
model.fit(X_train, y_train)
from sklearn.model_selection import cross_val_predict
y_predict = cross_val_predict(model, X_train, y_train, cv = 5, n_jobs = -1, verbose = 2)
y_predict에는 교차검증을 통해 예측된 값이 들어간다. cv는 나눌 세트의 값(k)이고, verbose는 문구를 몇개나 출력할지에 대한 인자이다.
from sklearn.metrics import r2_score
r2_score(y_train, y_predict)
Decision Tree 모델 같은 경우, 간단하며 빠르고, 동작을 파악하기 좋아 어떤 feature가 중요한 feature 인지 파악해보는 용도의 baseline model로도 많이 사용한다고 한다.
DecisionTree와 달리, RandomForest는 사이킷런을 통해 시각화할 수 없다. 그러나 TreeInterpreter와 같은 도구를 사용한다면, 랜덤포레스트를 통해 만들어진 결과물을 시각화할 수 있다.
DecisionTree의 경우, export_text를 통해 결과물을 text로 볼 수 있다. 코드는 다음과 같다.
from sklearn.tree import export_text
print(export_text(model, feature_names = feature_names))
위 내용은 멋쟁이사자처럼 AI School 오늘코드 박조은 강사님의 수업을 듣고 공부한 내용으로, 자료를 일부 인용했습니다!