ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [혼자 공부하는 머신러닝 + 딥러닝] 5장 트리 알고리즘
    카테고리 없음 2023. 11. 11. 15:42

    테스트 세트를 적게 사용하기

    과대적합인지 과소적합인지 판단하기 위해서 테스트세트를 사용하지 않고

    훈련세트를 사용하기

     

    => 검증세트

    사이킷런에서 제공

    wine = pd.read_csv('https://bit.ly/wine_csv_data')
    data = wine[['alcohol', 'sugar', 'pH']].to_numpy()
    target = wine['class'].to_numpy()
    from sklearn.model_selection import train_test_split
    
    train_input, test_input, train_target, test_target = train_test_split(
        data, target, test_size=0.2, random_state=42)
    sub_input, val_input, sub_target, val_target = train_test_split(
        train_input, train_target, test_size=0.2, random_state=42)
    print(sub_input.shape, val_input.shape)
    #(4157, 3) (1040, 3)
    
    from sklearn.tree import DecisionTreeClassifier
    
    dt = DecisionTreeClassifier(random_state=42)
    dt.fit(sub_input, sub_target)
    
    print(dt.score(sub_input, sub_target))
    print(dt.score(val_input, val_target))
    #0.9971133028626413
    #0.864423076923077

     

    5197개 훈련세트 => 4157 훈련세트 + 1040 검증세트

    sub_input, sub_target , val_input, val_target 를 사용하여 모델을 만들고 평가

    => 과대적합

     

    교차검증

     

    검증세트로 과대적합을 나온 결과를 해결하기 위하여 교차검증 사용

     

    사이킷런 cross_validate() => 훈련세트 전체를 전달

    train_test_split() 함수로 전체 데이터를 섞은 후 훈련세트 넣기

    from sklearn.model_selection import StratifiedKFold
    
    scores = cross_validate(dt, train_input, train_target, cv=StratifiedKFold())
    print(np.mean(scores['test_score']))
    #0.855300214703487
    
    splitter = StratifiedKFold(n_splits=10, shuffle=True, random_state=42)
    scores = cross_validate(dt, train_input, train_target, cv=splitter)
    print(np.mean(scores['test_score']))

     

    하이퍼파라미터 튜닝

    : 모델이 학습할 수 없어서 사용자가 지정해야하만 하는 파라미터

     

    그리드 서치

    : max_depth 의 최적값 min_samples_split 매개변수의 값을 동시에 바꿔가며 최적의 값을

    찾기

    from sklearn.model_selection import GridSearchCV
    
    params = {'min_impurity_decrease': [0.0001, 0.0002, 0.0003, 0.0004, 0.0005]}
    gs = GridSearchCV(DecisionTreeClassifier(random_state=42), params, n_jobs=-1)
    gs.fit(train_input, train_target)
    
    dt = gs.best_estimator_
    print(dt.score(train_input, train_target))
    
    print(gs.best_params_)
    
    print(gs.cv_results_['mean_test_score'])
    
    best_index = np.argmax(gs.cv_results_['mean_test_score'])
    print(gs.cv_results_['params'][best_index])
    
    params = {'min_impurity_decrease': np.arange(0.0001, 0.001, 0.0001),
              'max_depth': range(5, 20, 1),
              'min_samples_split': range(2, 100, 10)
              }
    gs = GridSearchCV(DecisionTreeClassifier(random_state=42), params, n_jobs=-1)
    gs.fit(train_input, train_target)
    
    print(gs.best_params_)
    
    print(np.max(gs.cv_results_['mean_test_score']))
     
     
     

     

    간격을 일정하게 보다는  랜덤으로 두기 위해서 

     

    랜덤서치

    : 매개변수 값의 목록을 전달하는 것이 아닌 매개변수를 샘플링할 수 있는 확률분포객체 전달

     

    randint : 정수값 뽑기

    uniform: 실숫값 뽑기

     

    from scipy.stats import uniform, randint
    rgen = randint(0, 10)
    rgen.rvs(10)
    
    np.unique(rgen.rvs(1000), return_counts=True)
    
    ugen = uniform(0, 1)
    ugen.rvs(10)
    
    from sklearn.model_selection import RandomizedSearchCV
    
    gs = RandomizedSearchCV(DecisionTreeClassifier(random_state=42), params,
                            n_iter=100, n_jobs=-1, random_state=42)
    gs.fit(train_input, train_target)
    
    print(gs.best_params_)
    print(np.max(gs.cv_results_['mean_test_score']))
    
    dt = gs.best_estimator_
    print(dt.score(test_input, test_target))

     

     

    트리의 앙상블 이전 개념정리

     

    앙상블 학습

    : 정형데이트를 다루는데 가장 뛰어난 성과를 내는 알고리즘

     

    랜덤포레스트

    : 앙상블 학습의 대표주자

    : 결정트리의 숲으로 만듦

    - 부트스트랩 샘플 : 먼저 1개를 뽑고 다시 포함해서 랜덤으로 하나 뽑음 => 중복된 샘플을 뽑아서 만들어진 샘플

     

    엑스트라 트리

    : 랜덤포레스트와 비슷하게 동작

    : 기본적으로 100개의 결정트리 훈련

    : 부트스트랩 샘플을 사용하지 않음 

     

     

Designed by Tistory.