Random Forest
ㄴ 여러 개의 결정 트리들을 임의적으로 학습하는 방식의 앙상블 방법
ㄴ 여러가지 학습기들을 생성한 후 이를 선형 결합하여 최종 학습기를 만드는 방법
ㄴ 특징
ㄴ 임의성 : 서로 조금씩 다른 특성의 트리들로 구성
ㄴ 비상관화 : 각 트리들의 예측이 서로 연관되지 않음
ㄴ 견고성 : 오류가 전파되지 않아 노이즈에 강함
ㄴ 일반화 : 임의화를 통한 과적합 문제 극복
ㄴ 여러 개의 기본 모델을 조합하여 예측을 수행하는 방법
RandomForestClassifier
ㄴ 분류 문제를 해결하기 위한 앙상블 모델
ㄴ 여러 개의 의사 결정 트리(Decision Tree)를 생성하고, 각각의 트리에서 예측한 결과를 다수결 투표 방식으로 종합하여 최종 예측을 수행합니다.
각 트리는 부트스트랩 샘플링(중복을 허용한 샘플링)과 무작위로 선택된 변수들을 기반으로 학습됩니다.
분류 문제에서 클래스 불균형을 잘 다루고, 특히 범주형 변수를 다루는 데 강점을 가지며, 과적합을 줄이는 효과가 있습니다.
RandomForestRegressor
ㄴ 회귀 문제를 해결하기 위한 앙상블 모델
ㄴ 여러 개의 의사 결정 트리를 생성하고, 각각의 트리에서 예측한 결과를 평균 또는 중간값을 활용하여 종합하여 최종 예측을 수행
ㄴ 회귀 문제에서 연속적인 값을 예측하며, 각 트리의 예측 결과의 평균을 사용하여 보다 안정적이고 일반화된 예측을 할 수 있음
ㄴ 데이터의 특성을 잘 파악하고, 다양한 변수 간의 상호작용을 학습할 수 있어서 비선형 회귀 문제에 잘 적용됨
RandomForestClassifier와 RandomForestRegressor
ㄴ 과적합에 강함
ㄴ 일반화 성능이 좋음
ㄴ 변수의 중요도를 평가할 수 있음
ㄴ Ensemble 모델 중에서도 랜덤 포레스트(Decision Tree 기반) 알고리즘을 사용한 분류와 회귀 모델
RandomForestClassifier
ml05_ensemble_iris.py
# 1. iris
import numpy as np
from sklearn.svm import SVC, LinearSVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler, StandardScaler
from sklearn.preprocessing import MaxAbsScaler, RobustScaler
# 1. 데이터
datasets = load_iris() # 다중분류
x = datasets['data']
y = datasets.target
# print(x.shape, y.shape) # (150, 4) (150,)
# print('y의 라벨 값 :', np.unique(y)) # y의 라벨 값 : [0 1 2]
x_train, x_test, y_train, y_test = train_test_split(
x, y, train_size=0.7, random_state=100, shuffle=True
)
# Scaler 적용
scaler = MinMaxScaler()
scaler.fit(x_train) # train 은 fit, transform 모두 해줘야 함
x_train = scaler.transform(x_train) # train 은 fit, transform 모두 해줘야 함
x_test = scaler.transform(x_test) # test 는 transform 만 하면 됨
# 2. 모델
model = RandomForestClassifier()
# 3. 훈련
model.fit(x_train, y_train)
# 4. 평가, 예측
result = model.score(x_test, y_test)
print('결과 acc : ', result)
# SVC() 결과 acc : 0.9777777777777777
# LinearSVC() 결과 acc : 0.9777777777777777
# my tf keras 모델 결과 acc : 1.0
# MinMaxScaler() 결과 acc : 0.9777777777777777
# ===============================================
# tree 결과 acc : 0.9555555555555556
# ===============================================
# ensemble 결과 acc : 0.9555555555555556
ml05_ensemble_cancer.py
# 2. cancer
import numpy as np
from sklearn.svm import SVC, LinearSVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler, StandardScaler
from sklearn.preprocessing import MaxAbsScaler, RobustScaler
import tensorflow as tf
tf.random.set_seed(77) # weight 의 난수값 조정
# 1. 데이터
datasets = load_breast_cancer() # 이진분류
x = datasets['data']
y = datasets.target
x_train, x_test, y_train, y_test = train_test_split(
x, y, train_size=0.7, random_state=100, shuffle=True
)
# Scaler 적용
scaler = StandardScaler()
scaler.fit(x_train) # train 은 fit, transform 모두 해줘야 함
x_train = scaler.transform(x_train) # train 은 fit, transform 모두 해줘야 함
x_test = scaler.transform(x_test) # test 는 transform 만 하면 됨
# 2. 모델
model = RandomForestClassifier()
# 3. 훈련
model.fit(x_train, y_train)
# 4. 평가, 예측
result = model.score(x_test, y_test)
print('결과 acc : ', result)
# SVC() 결과 acc : 0.9064327485380117
# LinearSVC() 결과 acc : 0.9122807017543859
# my tf keras 모델 결과 acc : 0.9298245614035088
# StandardScaler() 결과 acc : 0.9766081871345029
# ===============================================
# tree 결과 acc : 0.9415204678362573
# ===============================================
# ensemble 결과 acc : 0.9590643274853801
ml05_ensemble_wine.py
# 3. wine
import numpy as np
from sklearn.svm import SVC, LinearSVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler, StandardScaler
from sklearn.preprocessing import MaxAbsScaler, RobustScaler
import tensorflow as tf
tf.random.set_seed(77) # weight 의 난수값 조정
# 1. 데이터
datasets = load_wine() # 다중분류
x = datasets['data']
y = datasets.target
x_train, x_test, y_train, y_test = train_test_split(
x, y, train_size=0.7, random_state=100, shuffle=True
)
# Scaler 적용
scaler = MinMaxScaler()
scaler.fit(x_train) # train 은 fit, transform 모두 해줘야 함
x_train = scaler.transform(x_train) # train 은 fit, transform 모두 해줘야 함
x_test = scaler.transform(x_test) # test 는 transform 만 하면 됨
# 2. 모델
model = RandomForestClassifier()
# 3. 훈련
model.fit(x_train, y_train)
# 4. 평가, 예측
result = model.score(x_test, y_test)
print('결과 acc : ', result)
# SVC() 결과 acc : 0.5555555555555556
# LinearSVC() 결과 acc : 0.7222222222222222
# my tf keras 모델 결과 acc : 0.9259259104728699
# MinMaxScaler() 결과 acc : 0.9814814814814815
# =================================================
# tree 결과 acc : 0.8518518518518519
# =================================================
# ensemble 결과 acc : 1.0
RandomForestRegressor
ml05_ensemble_california.py
# 4. california (SVR, LinearSVR)
import numpy as np
from sklearn.svm import SVR, LinearSVR
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import accuracy_score
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler, StandardScaler
from sklearn.preprocessing import MaxAbsScaler, RobustScaler
import tensorflow as tf
tf.random.set_seed(77) #weight의 난수값 조절
#1. 데이터
datasets = fetch_california_housing()
x = datasets.data
y = datasets.target
x_train, x_test, y_train, y_test = train_test_split(
x, y, train_size = 0.7, random_state=100, shuffle= True
)
# Scaler 적용
# scaler = MinMaxScaler()
# scaler = StandardScaler()
# scaler = MaxAbsScaler()
scaler = RobustScaler()
scaler.fit(x_train) # train 은 fit, transform 모두 해줘야 함
x_train = scaler.transform(x_train) # train 은 fit, transform 모두 해줘야 함
x_test = scaler.transform(x_test) # test 는 transform 만 하면 됨
# 2. 모델
model = RandomForestRegressor()
# 3. 훈련
model.fit(x_train, y_train)
# 4. 평가, 예측
result = model.score(x_test, y_test)
print('결과 r2 : ', result)
# SVR() 결과 r2 : -0.01663695941103427
# 결과 r2 : 0.06830124384888547
# my tf keras 모델 r2스코어 : 0.5346585367965508
# RobustScaler 적용 후 결과 r2 : 0.6873119065345796
# ====================================================
# tree 결과 r2 : 0.612701922946608
# ====================================================
# ensemble 결과 r2 : 0.8114840410530733
'네이버클라우드 > AI' 카테고리의 다른 글
AI 6일차 (2023-05-15) 인공지능 기초 _머신러닝 - K-Fold 와 StratifiedKFold (0) | 2023.05.15 |
---|---|
AI 6일차 (2023-05-15) 인공지능 기초 _머신러닝 - All_Estimator (0) | 2023.05.15 |
AI 6일차 (2023-05-15) 인공지능 기초 _머신러닝 - Tree 모델 : DecisionTreeClassifier, DecisionTreeRegressor (0) | 2023.05.15 |
AI 6일차 (2023-05-15) 인공지능 기초 _머신러닝 - 스케일링 (Scaling) (0) | 2023.05.15 |
AI 6일차 (2023-05-15) 인공지능 기초 _머신러닝 - Linear 모델과 SVM 모델 : SVC, SVR (0) | 2023.05.15 |