일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- Deep Learning Specialization
- r
- ML
- pytorch
- sklearn
- 이코테
- matplotlib
- 딥러닝
- SQLD
- 머신러닝
- 데이터 분석
- 코딩테스트
- 데이터분석준전문가
- SQL
- scikit learn
- 회귀분석
- 태블로
- 데이터분석
- 데이터 전처리
- Google ML Bootcamp
- ADsP
- 자격증
- tableau
- pandas
- 시각화
- IRIS
- 파이썬
- 통계
- Python
- 이것이 코딩테스트다
- Today
- Total
함께하는 데이터 분석
[Scikit Learn] Random Forest 본문
랜덤 포레스트(Random Forest)
- 배깅 방식을 적용한 의사결정 나무(Decision Tree)의 앙상블
- 따라서 사이킷런의 BaggingClassifier에 DecisionTreeClassifier를 넣어 만들거나 RandomForestClassifier를 사용
사이킷런
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_moons
X, y = make_moons(n_samples=500, noise=0.3, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
사이킷런의 moons 데이터를 훈련 세트와 테스트 세트로 분리
from sklearn.ensemble import RandomForestClassifier
rnd_clf = RandomForestClassifier(n_estimators=500, max_leaf_nodes=16, n_jobs=-1, random_state=42)
rnd_clf.fit(X_train, y_train)
y_pred_rf = rnd_clf.predict(X_test)
500개의 트리로 이루어진 랜덤 포레스트 분류기를 모든 CPU 코어를 사용해 학습한 코드
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
bag_clf = BaggingClassifier(
DecisionTreeClassifier(splitter="random", max_leaf_nodes=16, random_state=42),
n_estimators=500, max_samples=1.0, bootstrap=True, n_jobs=-1, random_state=42)
bag_clf.fit(X_train, y_train)
y_pred = bag_clf.predict(X_test)
Decision Tree의 배깅을 사용하여 랜덤 포레스트를 구현한 코드
np.sum(y_pred == y_pred_rf) / len(y_pred)
>>> 0.976
RandomForestClassifier를 사용한 것과 BaggingClassifier를 사용한 결과가 매우 유사한 것을 확인 가능
하지만 랜덤 포레스트 알고리즘은 트리의 노드를 분할할 때 전체 특성 중
최선의 특성을 찾는 대신 무작위로 선택한 특성 후보 중 최적의 특성을 찾는 식으로 무작위성을 더 주입
결국 트리를 더욱 다양하게 만들고 편향을 손해 보는 대신 분산을 낮추어 전체적으로 더 훌륭한 모델을 만들어 냄
특성 중요도
랜덤 포레스트의 장점은 특성의 상대적 중요도를 측정하기 쉬움
사이킷런은 어떤 특성을 사용한 노드가 평균적으로 불순도를 얼마나 감소시키는지 확인하여 특성의 중요도를 측정
또 훈련이 끝난 뒤 특성마다 자동으로 점수를 계산하고 중요도의 전체 합이 1이 되도록 결괏값을 정규화
from sklearn.datasets import load_iris
iris = load_iris()
rnd_clf = RandomForestClassifier(n_estimators=500, n_jobs=-1, random_state=42)
rnd_clf.fit(iris["data"], iris["target"])
for name, score in zip(iris["feature_names"], rnd_clf.feature_importances_):
print(name, score)
>>> sepal length (cm) 0.11249225099876375
sepal width (cm) 0.02311928828251033
petal length (cm) 0.4410304643639577
petal width (cm) 0.4233579963547682
이 값은 feature_importances_ 변수에 저장되어 있음
앞서 본 iris 데이터셋에서 랜덤 포레스트를 훈련시키고 각 특성의 중요도를 확인하면
꽃받침의 길이, 꽃받침의 너비, 꽃잎의 길이, 꽃잎의 너비는 각각 11%, 2%, 44%, 42%로
꽃받침에 관한 특성의 중요도가 매우 떨어지는 것을 확인 가능
https://www.hanbit.co.kr/store/books/look.php?p_code=B9267655530
핸즈온 머신러닝
최근의 눈부신 혁신들로 딥러닝은 머신러닝 분야 전체를 뒤흔들고 있습니다. 이제 이 기술을 거의 모르는 프로그래머도 데이터로부터 학습하는 프로그램을 어렵지 않게 작성할 수 있습니다. 이
www.hanbit.co.kr
'데이터분석 공부 > ML | DL' 카테고리의 다른 글
[Python] 파이토치(Pytorch) 설치하기 (0) | 2022.09.07 |
---|---|
[Scikit Learn] PCA (0) | 2022.08.28 |
[Python] 시각화 / graphviz (0) | 2022.08.21 |
[Ensemble] 머신러닝 앙상블 기법 (0) | 2022.08.19 |
[Scikit Learn] One-Hot Encoding (0) | 2022.05.13 |