[Boostcourse] ML (6)

BBakHye·2022년 11월 5일
0

🦁 AI SCHOOL 7기

목록 보기
18/52
post-thumbnail

✨ 처음부터 차근차근, 내 페이스 대로 ✨

강의: 부스트코스 - 프로젝트로 배우는 데이터사이언스
데이터셋 출처: Pima Indians Diabetes Database | Kaggle

4. 머신러닝 알고리즘

4.1. DecisionTreeClassifier

from sklearn.tree import DecisionTreeClassifier

model = DecisionTreeClassifier(max_depth=3, random_state=42)

DecisionTreeClassifier의 옵션값을 변경해주는 것만으로도 트리의 성능을 올릴 수 있음.

최적의 max_depth값 찾기

4.1.1. for문으로 찾기

# for문 안에 모델을 넣으면 max_depth 파라미터를 바꿔가면서 모델을 학습시킵니다.
from sklearn.metrics import accuracy_score

for max_depth in range(3, 12):
    model = DecisionTreeClassifier(max_depth=max_depth, random_state=42)
    y_predict = model.fit(X_train, y_train).predict(X_test)
    score = accuracy_score(y_test, y_predict) * 100
    print(max_depth, score)

4.1.2. GridSearchCV()로 찾기

  • 지정한 범위 안에서만 가장 좋은 hyper parameter값을 찾는다.
from sklearn.model_selection import GridSearchCV

model = DecisionTreeClassifier(random_state=42)
param_grid = {"max_depth" : range(3, 12), 
              "max_features" : [0.3, 0.5, 0.7, 0.9, 1]}
clf = GridSearchCV(model, param_grid=param_grid, n_jobs=-1, cv=5, verbose=1)

# 학습
clf.fit(X_train, y_train)

# best parameters
clf.best_params_

# 우리가 넣어준 옵션 중에서 가장 베스트 옵션을 찾아준다
clf.best_estimator_

# 베스트 값
clf.best_score_

# 예측
clf.predict(X_test)

# 정확도
clf.score(X_test, y_test)

4.1.3. RandomSearchCV()로 찾기

# max_depth를 랜덤하게 1부터 20 사이의 값중에 랜덤하게 10개~
max_depth = np.random.randint(1, 20, 10)

max_features = np.random.uniform(0.4, 1.0, 100)

param_distributions = {"max_depth" : max_depth, 
                      "max_features" : max_features,
                      "min_samples_split" : list(range(2, 7))
                      }
param_distributions

# n_iter: 설정한 수만큼 돌면서 하이퍼파라미터를 찾는 기능

from sklearn.model_selection import RandomizedSearchCV

clf = RandomizedSearchCV(model, param_distributions, n_iter=100, scoring="accuracy", n_jobs=-1, cv=5, random_state=42)

# 학습
clf.fit(X_train, y_train)

clf.best_params_
clf.best_estimator_
clf.best_score_
clf.predict(X_test)
clf.score(X_test, y_test)

점수 확인하고 난 후 max_depth와 max_features 범위를 best estimator값과 비슷하게 수정해서 RandomizedSearchCV를 다시 실행해보며 성능이 더 좋아지는지 확인

4.2 RandomForest

  • 트리를 여러개 사용하는 방식의 알고리즘 (Bagging)
from sklearn.ensemble import RandomForestClassifier

model = RandomForestClassifier(n_estimator= 100, random_state=42)

model.fit(X_train, y_train)

model.feature_importances_

sns.barplot(x=model.feature_importances_, y=feature_names)

y_predict = model.predict(X_test)

(y_predict = y_test).mean()
  • 실습에서는 randomforest 알고리즘의 성능이 DecisionTree 알고리즘을 사용했을 때보다 더 좋았다.
  • DecisionTree는 트리를 하나만 그리는 반면 randomforest는 트리를 여러개 그리기 때문에 시각화하기가 쉽지않다.
  • 그래서 트리를 그리는 대신 feature_importances를 시각화한다.

🤔 DecisionTree 알고리즘을 RandomForest보다 먼저 사용한 이유?

  • DecisionTree를 통해서 피처의 중요도를 확인하고 데이터를 전처리 했을 때 트리모양이 어떻게 달라지는지 분석하기 위해.

4.3 Boosting

  • 트리에 가중치를 부여하는 방식의 알고리즘
from sklearn.ensemble import GradientBoostingClassifier

model = GradientBoostingClassifier(random_state=42)

model.fit(X_train, y_train)

model.feature_importances_

sns.barplot(x=model.feature_importances_, y=feature_names)

y_predict = model.predict(X_test)

(y_predict = y_test).mean()

✨ 해당 실습에서는 3개의 알고리즘 중 RandomForest 알고리즘의 성능이 제일 좋았다.

여러 개의 알고리즘을 사용해서 비교하기

# 알고리즘 불러오기
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier

estimators = [DecisionTreeClassifier(random_state=42),
             RandomForestClassifier(random_state=42),
             GradientBoostingClassifier(random_state=42)
             ]

# 3개의 알고리즘 이름을 results 리스트에 계속 담도록 for문 돌리기
results = []
for estimator in estimators:
    result.append(estimator.__class__.__name__) 
    results.append(result)
results

# clf를 estimators가 있는 for문 안으로 넣어서 3개의 모델을 모두 번갈아 학습시킬 수 있도록 합니다.
from sklearn.model_selection import RandomizedSearchCV

max_depth = np.random.randint(2, 20, 10)
max_features = np.random.uniform(0.3, 1.0, 10)

param_distributions = {"max_depth": max_depth, 
                       "max_features": max_features}

results = []
for estimator in estimators:
    result = []
    if estimator.__class__.__name__ != 'DecisionTreeClassifier':
        param_distributions["n_estimators"] = np.random.randint(100, 200, 10)
        
    clf = RandomizedSearchCV(estimator, 
                       param_distributions, 
                       n_iter=100,
                       scoring="accuracy",
                       n_jobs=-1,
                       cv=5, 
                       verbose=2
                      )

    clf.fit(X_train, y_train)
    result.append(estimator.__class__.__name__)
    result.append(clf.best_params_)
    result.append(clf.best_score_)
    result.append(clf.score(X_test, y_test))
    result.append(clf.cv_results_)
    results.append(result)

# 알고리즘별로 가장 성능이 좋은 모델 확인
df = pd.DataFrame(results, 
             columns=["estimator", "best_params", "train_score", "test_score", "cv_result"])
             
# 가장 성능이 좋은 모델의 정확한 파라미터 설정 수치 확인
pd.DataFrame(df.loc[0, "cv_result"]).sort_values(by="rank_test_score").head()
  • 좋은 성능이 나오는 구간으로 계속 iteration을 돌리는게 좋음.
  • 하이퍼 파라미터 튜닝을 여러 번 할수록 좋은 성능을 얻을 수 있음.

학습과 예측 전체 과정

  • feature_names : 학습(훈련), 예측에 사용할 컬럼을 리스트 형태로 만들어서 변수에 담아줍니다.
  • label_name : 정답값
  • X_train : feature_names 에 해당되는 컬럼만 train에서 가져옵니다.
    학습(훈련)에 사용할 데이터셋 예) 시험의 기출문제
  • X_test : feature_names 에 해당되는 컬럼만 test에서 가져옵니다.
    예측에 사용할 데이터셋 예) 실전 시험문제
  • y_train : label_name 에 해당 되는 컬럼만 train에서 가져옵니다.
    학습(훈련)에 사용할 정답 값 예) 기출문제의 정답
  • model : 학습, 예측에 사용할 머신러닝 알고리즘
  • model.fit(X_train, y_train) : 학습(훈련), 기출문제와 정답을 가지고 학습(훈련)하는 과정과 유사합니다.
  • model.predict(X_test) : 예측, 실제 시험을 보는 과정과 유사합니다. => 문제를 풀어서 정답을 구합니다.
  • score: 시험을 봤다면 몇 문제를 맞고 틀렸는지 채점해 봅니다.
  • metric: 점수를 채점하는 공식입니다. (예를 들어 학교에서 중간고사를 봤다면 전체 평균을 계산해 줍니다.)
profile
데이터 분석가가 되기 위한 기록 ✏️

0개의 댓글