Random Forest 실습

DanA·2022년 8월 27일
0

데이터 불러오기 및 아주 간단한 EDA

# 데이터 불러오기
df = pd.read_csv('22_final_data.HepG2.Histone.Enhancer.csv')
# 결측치 확인
import missingno as msno
display(msno.matrix(df))
display(msno.bar(df))

df.describe()

Random Forest 학습

features와 target으로 데이터를 나눠준다.

X_features = df.values[:,2:-1].astype('float')
y_target = df.values[:, -1].astype('float')

RandomForestClassifier 하이퍼 파라미터

  • !n_estimators: 랜덤 포레스트에서 결정 트리의 개수를 지정합니다.
    • int, default=100
    • 많이 설정할수록 좋은 성능을 기대할 수도 있지만, 계속 증가시킨다고 성능이 무조건 향상되는 것은 아닙니다. 또한 늘릴수록 학습 수행 시간이 오래 걸리는 것도 감안해야 합니다. 1000~2000개 정도면 충분함.
  • !max_features : 결정트리에 사용된 max_features 파라미터와 같습니다.
    • 하지만 RandomForestClassifier의 기본 max_features'None'이 아니라 'auto'(즉, 'sqrt'와 같습니다.)
    • 예 : 총 features의 개수가 16개라면, 4개만 참조한다.
  • !max_depth : The maximum depth of the tree.
  • min_samples_split : The minimum number of samples required to split an internal node
  • !min_samples_leaf : The minimum number of samples required to be at a leaf node.
  • bootstrap : bootstrap을 쓸 것이냐 말 것이냐인데, 기본적으로는 쓴다.
  • mean_impurity_decrease
  • class_weight : unbalanced data의 경우에 사용해주는 hyperparameter로, 가중치를 준다든가 하는 방식을 사용하기도 한다.
  • oob_score : 부트스트래핑을 하다보면 트리마다 빠지게 되는 데이터가 있는데, 그런 데이터들을 테스트 데이터로 사용하여 평가를 하며 각 트리별로 계산을 할 것이냐 말 것이냐를 결정
    Whether to use out-of-bag samples to estimate the generalization score.

RandomizedSearchCV

  • estimator : estimator object
  • param_distributions : Dictionary with parameters names (str) as keys and distributions or lists of parameters to try.
  • n_iter : Number of parameter settings that are sampled. n_iter trades off runtime vs quality of the solution.
  • cv : Determines the cross-validation splitting strategy
  • verbose : Controls the verbosity: the higher, the more messages.
  • random_state
  • n_jobs
# TODO PerfectGuide보고 HP튜닝 내용 보충하기.

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import RandomizedSearchCV


# Number of trees in random forest
n_estimators = [int(x) for x in np.linspace(start = 200, stop = 2000, num = 10)]

# Number of features to consider at every split
max_features = ['auto', 'sqrt', 'log2']

# Maximum number of levels in tree
max_depth = list(range(1,30))
max_depth.append(None)

# Minimum number of samples required to split a node
min_samples_split = [2, 5, 10]

# Minimum number of samples required at each leaf node
min_samples_leaf = [1, 2, 4]

# Method of selecting samples for training each tree
bootstrap = [True, False]

# 연속형 범주나 많은 범주를 가진 feature들을 과대평가하는 경향이 있기 때문에 이를 완화시키는 옵션
# mean_impurity_decrease = 0 # float 형태. -> 시간이 너무 오래걸려서 뺌

class_weight = ['balanced', 'balanced_subsample']

# Create the random grid
random_grid = {'n_estimators': n_estimators,
               'max_features': max_features,
               'max_depth': max_depth,
               'min_samples_split': min_samples_split,
               'min_samples_leaf': min_samples_leaf,
               'bootstrap': bootstrap,
               'class_weight': class_weight}
rf_random = RandomizedSearchCV(estimator = rf, 
                               param_distributions = random_grid, 
                               n_iter = 100, 
                               cv = 3, 
                               verbose=2, 
                               random_state=42, 
                               n_jobs = -1)
profile
단아와라라

0개의 댓글