728x90
반응형
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
from sklearn.preprocessing import LabelEncoder
import warnings
warnings.filterwarnings("ignore")
from sklearn.model_selection import train_test_split
train_x # 독립변수
train_y # 종속변수
test # test 데이터셋
x_train, x_valid, y_train, y_valid = train_test_split(train_x, train_y, test_size=0.1, random_state=42)
평가 지표 설정
from sklearn.metrics import r2_score, mean_squared_error, mean_absolute_error
def evaluation(y_test , pred):
mae = mean_absolute_error(y_test,pred) ## mae
mse = mean_squared_error(y_test,pred) # mse
rmse = np.sqrt(mean_squared_error(y_test,pred)) # rmse
print('mae: {}, mse: {}, rmse:{}'.format(mae, mse, rmse))
RandomForest 기본 예시 코드
from sklearn.ensemble import RandomForestRegressor
# 랜덤 포레스트 모델 초기화
rf_model = RandomForestRegressor()
rf_model.fit(X_train, y_train)
pred = rf_model.predict(X_test)
RandomForest 파라미터 삽입 예시 코드
from sklearn.ensemble import RandomForestRegressor
# 랜덤 포레스트 모델 초기화
rf_model = RandomForestRegressor(n_estimators=100, max_features="sqrt", random_state=42)
rf_model.fit(X_train, y_train)
pred = rf_model.predict(X_test)
RandomForest 하이퍼파라미터 튜닝 예시 코드
from sklearn.model_selection import GridSearchCV
params = {
'n_estimators':[2800, 3000, 3300],
'max_depth' : [6, 8, 10, 12],
'min_samples_leaf' : [8, 12, 18],
'min_samples_split' : [8, 16, 20]
}
rf_clf = RandomForestRegressor(random_state=0, n_jobs=-1)
grid_cv = GridSearchCV(rf_clf , param_grid=params , cv=2, n_jobs=2, verbose=2 )
grid_cv.fit(x_train , y_train) # grid.cv.fit(train_x, train_y)
estimator =grid_cv.best_estimator_
pred = estimator.predict(x_valid) # estimator.predict(test)
print('최적 하이퍼 파라미터:\n', grid_cv.best_params_)
print('최고 예측 정확도: {0:.4f}'.format(grid_cv.best_score_))
evaluation(y_valid , pred)
RandomForest 하이퍼 파라미터
class sklearn.ensemble.RandomForestRegressor(
n_estimators=100,
max_features=1.0,
criterion='squared_error',
max_depth=None,
min_samples_split=2,
min_samples_leaf=1,
min_weight_fraction_leaf=0.0,
max_leaf_nodes=None,
min_impurity_decrease=0.0,
bootstrap=True,
n_jobs=None,
random_state=None,
verbose=0
)
class sklearn.ensemble.RandomForestClassifier(
n_estimators=100,
max_features='sqrt',
criterion='gini',
max_depth=None,
min_samples_split=2,
min_samples_leaf=1,
min_weight_fraction_leaf=0.0,
max_leaf_nodes=None,
min_impurity_decrease=0.0,
bootstrap=True,
n_jobs=None,
random_state=None,
verbose=0,
class_weight=None
)
- n_estimators: 생성할 트리의 개수 (int, default=100)
- 트리의 개수가 많을수록 앙상블 모델의 성능이 향상될 수 있지만, 계산 비용도 증가
- 트리 개수가 일정 수 이상이면 결과의 향상이 크게 나타나지 않음
- max_features: 노드를 분할할 때 고려할 특성의 무작위 하위 집합의 크기
회귀: {“sqrt”, “log2”, None}, int or float, default=1.0
분류: {“sqrt”, “log2”, None}, int or float, default="sqrt"
- 값을 작게 설정하면 분산 감소, 편향 증가, 복잡도 감소, 모델의 성능 감소
- 값을 크게 설정하면 분산 증가, 편향 감소, 복잡도 증가, 모델의 성능 증가, 과적합 위험
- 정수(int): 정수 개의 특성 고려
- 부동소수점(float): 1과 max_features * n_features_in_의 정수 값 중 큰 값 고려
- auto: n_features(회귀) / auto : sqrt(n_features) (분류)
- sqrt: sqrt(n_features)
- log2: log2(n_features)
- None or 1: n_features(회귀) / None: n_features(분류)
- criterion: 노드의 분할 기준을 결정하는 데 사용되는 평가 지표
회귀 {“squared_error”, “absolute_error”, “friedman_mse”, “poisson”}, default=”squared_error”
노드 분할의 품질을 측정하는 기준으로 사용
- "squared_error" (평균 제곱 오차, Mean Squared Error): 각 분할에서 평균 예측값과 실제값 간의 제곱 차이를 계산하고, 이를 모든 분할에 대해 합산하여 평균을 구합니다.
- "friedman_mse":(Friedman의 평균 제곱 오차): "squared_error"와 비슷한 개념이지만, 잠재적인 분할에 대한 Friedman의 개선 점수를 고려합니다. 이 개선 점수는 각 분할의 오차 감소 정도를 측정하여 최적의 분할을 선택하는 데 활용됩니다.
- "absolute_error" (평균 절대 오차, Mean Absolute Error): 각 분할에서 평균 예측값과 실제값 간의 절대 차이를 계산하고, 이를 모든 분할에 대해 평균을 구합니다.
- "poisson" (포아송 손실, Poisson Loss): 각 분할에서 포아송 분포와 실제값 간의 편차를 측정합니다.
분류: {“gini”, “entropy”, “log_loss”}, default=”gini”
노드의 분할 기준은 불순도를 기준으로 결정.
불순도는 해당 노드의 클래스 불균형 정도를 측정하는 지표로서, 불순도는 낮추고, 순도를 높이는 방향으로 분할이 이루어져야 함.분류- "gini": gini 지수가 낮을수록 노드의 순도가 높아짐
- "entropy": entropy가 낮을수록 노드의 순도가 높아짐
▶ 보통은 기본값인 "gini" (또는 "mse")가 잘 동작하지만, 특정 문제에 따라 다른 criterion 값을 실험하여 최적의 성능을 얻을 수도 있습니다. - max_depth: 트리의 최대 깊이 (int, default=None)
- 깊이가 제한된 트리는 각각의 결정 경계를 더 간단하게 만들며, 모델이 데이터에 과적합되는 것을 방지할 수 있습니다.
- 값을 작게 설정하면 모델의 단순성을 증가, 분산 감소, 편향 증가 → 데이터의 다양한 패턴을 잡아내지 못함, 일반화 능력 향상
- 값을 증가시키면 모델의 복잡성, 분산 증가, 편향 감소 → 과적합 가능성, BUT 더 복잡한 패턴을 학습 가능.
- min_samples_split: 노드를 분할하기 위해 필요한 최소한의 샘플 개수 (int or float, default=2)
- 샘플 개수가 이 값보다 작아지면 더 이상 분할하지 않고 리프 노드(말단 노드)로 설정
- 값을 작게 설정하면 모델 복잡성 증가. 더 복잡한 결정 경계를 가진 모델이 생성되어 데이터의 작은 변동에도 민감하게 반응 → 과적합 위험, 적은 수의 샘플을 기반으로 한 결정이 노이즈에 영향을 받을 가능성
- 값을 증가시키면 모델의 편향이 증가, 분산은 감소. 즉, 더 단순한 모델이 생성되어 모델의 복잡도 감소. 이는 결정 경계가 더 단순해지고 일부 정보의 손실이 발생 → 모델이 과적합되는 위험 감소, 너무 큰 값으로 설정하면 모델이 너무 단순해져서 예측 성능이 저하
- min_samples_leaf: 노드를 분할하기 위해 리프 노드가 가져야 할 최소한의 샘플 개수(int or float, default=1)
- 값을 작게 설정하면 모델 복잡성 증가. → 과적합의 위험
- 값을 증가시키면 모델의 편향은 증가하고 분산은 감소. 모델의 복잡도가 낮아지지만, 일부 정보의 손실이 발생
- max_leaf_nodes: 생성될 수 있는 최대 리프 노드의 개수를 제한 (int, default=None)
일반적으로 랜덤 포레스트의 트리는 자라다가 가능한 한 많은 리프 노드를 생성하려는 경향이 있습니다.
그러나 max_leaf_nodes를 설정함으로써 트리의 성장을 제한할 수 있습니다.
max_leaf_nodes를 지정하면 트리는 해당 개수 이상의 리프 노드를 생성하지 않습니다.
이를 통해 과적합을 방지하고, 일반화 능력을 향상시킬 수 있습니다.
작은 max_leaf_nodes 값은 모델의 단순성을 증가시키고 편향을 높일 수 있습니다. - min_impurity_decrease: 노드를 분할하기 위한 최소한의 불순도 감소량.(float, default=0.0)
노드의 분할은 해당 분할이 전체 트리의 불순도를 감소시키는지 여부에 따라 결정
min_impurity_decrease는 불순도 감소량이 이 값보다 크거나 같을 때 분할이 이루어져야 함을 의미.
즉, 분할이 불순도 감소량이 충분히 크지 않으면 노드는 더 이상 분할되지 않고 잎 노드로 유지.- 값을 작게 설정하면 노드의 분할이 더 자주 일어남.(양수로 지정) 모델의 복잡도 증가
- 값이 크게 설정하면 노드의 분할이 덜 발생. 제약이 강해짐
- n_jobs: 모델 학습 및 예측에 사용되는 병렬 작업의 수(int, default=None)
랜덤 포레스트는 결정 트리의 앙상블로 구성되어 있으며, 각각의 결정 트리는 독립적으로 학습 및 예측이 가능합니다.
이러한 특성을 활용하여 n_jobs 파라미터를 설정함으로써 병렬 처리를 통해 모델의 학습 및 예측 속도를 향상시킬 수 있습니다.
파라미터:- 1: 모든 가능한 프로세서를 사용하여 병렬 처리합니다.
- 양의 정수: 지정된 수의 프로세서를 사용하여 병렬 처리합니다.
- bootstrap: 부트스트래핑은 중복을 허용하여 샘플을 랜덤 하게 선택하는 방식, 모델의 다양성을 증가. (bool, default=True)
- random_state: 랜덤 시드를 지정하는 파라미터로, 재현성을 위해 사용됩니다.
동일한 시드 값을 사용하면 같은 결과를 얻을 수 있음.(int, default=None) - verbose: 학습과 예측 시에 출력되는 정보의 상세도를 제어
- verbose=0: 출력이 비활성화되어 가장 적은 양의 정보만 표시.
- verbose=1: 학습 및 예측 과정에서 진행 상황 메시지 표시. 진행 상황을 모니터링하고 싶을 때 유용.
RandomForest 속성
- best_estimator_
GridSearchCV 객체에서 최적의 추정기(estimator)를 반환하는 속성입니다.
GridSearchCV는 주어진 하이퍼파라미터 그리드(param_grid)에서 모든 조합을 시도하고, 교차 검증을 통해 각 조합의 성능을 평가합니다. 그리드 서치가 완료되면 best_estimator_ 속성은 최적의 조합으로 학습된 추정기(estimator)를 반환합니다.
grid_cv.best_estimator_
> RandomForestRegressor(n_estimators = 3000, max_depth=8, min_samples_leaf=8, min_sample_split=8, n_jobs=-1, random_state=0)
- feature_importances_
랜덤 포레스트는 다수의 의사 결정 트리를 앙상블하여 모델을 구성합니다. 각 트리는 피처들을 사용하여 분할을 수행하고, 이 과정에서 피처들의 중요도를 계산합니다. feature_importances_ 속성은 이러한 중요도 값을 모아서 제공합니다.
주로, 중요도 값은 0과 1 사이의 실수 값으로 표현되며, 피처들 간의 상대적인 중요도를 나타냅니다. 중요도 값이 클수록 해당 피처가 예측에 더 큰 영향을 미친다고 해석할 수 있습니다.
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
ftr_importances_values = estimator.feature_importances_
ftr_importances = pd.Series(ftr_importances_values,index=x_train.columns)
ftr_top = ftr_importances.sort_values(ascending=False)
plt.figure(figsize=(8,6))
plt.title('Feature importances')
sns.barplot(x=ftr_top , y = ftr_top.index)
plt.show()
- n_features_in_
RandomForest 모델이 학습 시에 관찰한 특성(feature)의 수를 나타내는 속성입니다.
이 속성은 모델이 fit() 메서드를 사용하여 학습된 후에 사용할 수 있습니다.
grid_cv.n_features_in_
> 13
- feature_names_in_
RandomForest 모델이 학습 시에 사용된 특성(feature)의 이름을 나타내는 속성입니다.
이 속성은 입력 데이터(X)의 특성 이름이 모두 문자열로 되어 있을 때만 해당 속성을 사용할 수 있습니다.
"feature_names_in_"은 각 특성의 이름을 포함하는 배열 또는 리스트로 표현됩니다.
grid_cv.feature_names_in_
> array(['생산년도', '모델출시년도', '브랜드', '차량모델명', '판매도시', '판매구역', '주행거리', '배기량', '압축천연가스(CNG)', '경유', '가솔린', '하이브리드', '액화석유가스(LPG)'], dtype=object)
728x90
반응형
'pythonML' 카테고리의 다른 글
[pythonML] 앙상블(ensemble model)이란? | 앙상블의 종류 | 편향 (Bias)과 분산(Variance) (1) | 2024.08.27 |
---|---|
[pythonML] XGBoost 하이퍼파라미터 (0) | 2023.06.13 |
[pythonML] classification Metrics (분류 평가지표) (1) | 2023.01.26 |
[pythonML] 회귀 트리 (0) | 2022.07.16 |
[pythonML] 회귀- 다항회귀 (0) | 2022.07.16 |