✨ 처음부터 차근차근, 내 페이스 대로 ✨
강의: 부스트코스 - 프로젝트로 배우는 데이터사이언스
데이터셋 출처: Pima Indians Diabetes Database | Kaggle
from sklearn.tree import DecisionTreeClassifier
model = DecisionTreeClassifier(max_depth=3, random_state=42)
DecisionTreeClassifier의 옵션값을 변경해주는 것만으로도 트리의 성능을 올릴 수 있음.
# 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)
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)
# 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를 다시 실행해보며 성능이 더 좋아지는지 확인
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를 시각화한다.
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: 점수를 채점하는 공식입니다. (예를 들어 학교에서 중간고사를 봤다면 전체 평균을 계산해 줍니다.)