본 프로젝트는 멋쟁이사자처럼 AI School 6기 8팀이 함께 진행했습니다.
import seaborn as sns
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = sns.load_dataset("titanic")
df.shape
(891, 15)
df.info()
df.isnull().sum()
# deck 이라는 변수 드랍 시키기
df=df.drop("deck", axis=1)
# 결측치가 들어있는 행 삭제 시키기
df=df.dropna()
메모리를 효율적으로 사용하기 위해
df=df.drop('alive', axis=1)
df=df.drop('adult_male', axis=1)
df=df.drop("class", axis=1)
string 값으로 들어가 있는 칼럼들을 다음과 같이 바꿔준다.
def change_to_index(columns):
tmp = {string : i for i,string in enumerate(df[columns].unique())}
df[columns] = df[columns].map(tmp)
print(tmp)
df['survived'].value_counts()
_=df.hist(bins=50, figsize=(12,8))
_=sns.heatmap(data=df.corr())
# 종속변수 이름 설정하기
label_name='survived'
# 독립변수 이름 리스트 설정하기
feature_names=df.columns.tolist()
feature_names.remove(label_name)
feature_names
# 각 X와 y 만들어주기
X=df[feature_names]
y=df[label_name]
X.shape, y.shape
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.tree import plot_tree
from sklearn.metrics import accuracy_score
from sklearn.model_selection import cross_val_predict
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import RandomizedSearchCV
X_train, X_test, y_train, y_test = train_test_split(X,
y,
test_size=0.2,
stratify=y,
random_state=42)
우선 하이퍼파라미터 따로 튜닝 하지 않고,
* max_depth=15
* max_features=0.9
* random_state=42
를 이용하여 의사결정나무 모델을 구축해보도록 하겠다
알고리즘 가져오기
model = DecisionTreeClassifier(max_depth=10,
max_features=0.9,
random_state=42)
학습시키기
model.fit(X_train, y_train)
y_predict = model.predict(X_test)
plt.figure(figsize=(20, 20))
plot_tree(model, filled=True, fontsize=14, feature_names=feature_names)
plt.show()
Feature 중요도 확인하기
sns.barplot(x=model.feature_importances_, y=feature_names)
위의 결과를 통해 who의 중요도가 가장 높게 나왔고, embark_town의 중요도가 가장 낮은 것으로 나오는것을 확인할 수 있었다.
정확도 측정하기
accuracy_score(y_test, y_predict)
0.7132867132867133
정확도는 대략 78% 정도가 나왔음을 확인할 수 있다.
# 각 파라미터에 대한 리스트를 만들어주기
max_depth_list = [2,3,5,7,9,12,15,20,40]
max_features_list =[0.1,0.2, 0.3,0.4,0.5,0.6,0.7,0.8,0.9,1]
학습시키기
#GridSearchCV에 적용하기
parameters = {'max_depth':max_depth_list, 'max_features':max_features_list}
clf=GridSearchCV(model, param_grid=parameters, scoring="accuracy", n_jobs=-1, cv=5)
clf.fit(X_train,y_train)
clf.best_estimator_
DecisionTreeClassifier(max_depth=3, max_features=0.7, random_state=42)
clf.best_score_
0.8382394038192829
Feature 중요도 확인하기
who의 중요도가 더 상승하였고, pclass, age, fare 순으로 중요도를 가지고 있음을 확인할 수 있었다.
best_model_grid=clf.best_estimator_
best_model_grid.fit(X_train,y_train)
sns.barplot(x=best_model_grid.feature_importances_,y=feature_names)
max_depth_list = [2,3,5,7,9,12,15,20,40]
max_features_list =[0.1,0.2, 0.3,0.4,0.5,0.6,0.7,0.8,0.9,1]
학습시키기
param_distributions={"max_depth": max_depth_list, "max_features":max_features_list }
clf=RandomizedSearchCV(model, param_distributions,cv=5,n_jobs=-1,random_state=42,n_iter=5)
clf.fit(X_train,y_train)
같은 조건에서
clf.best_estimator_
DecisionTreeClassifier(max_depth=5, max_features=0.3, random_state=42)
clf.best_score_
0.8137401024685609
Feature 중요도 확인하기
위와 같이 who의 중요도가 가장 높았고 pclass, age, fare 순으로 중요도가 높았다
best_model_rand=clf.best_estimator_
best_model_rand.fit(X_train,y_train)
DecisionTreeClassifier(max_depth=5, max_features=0.3, random_state=42)
sns.barplot(x=best_model_rand.feature_importances_,y=feature_names)
max_feature을 np.random으로 파라미터 리스트 만들어서 진행하기
max_depth_list=[i for i in range(1,11)]
max_features_list=np.random.uniform(0.3,0.9,20)
함수로 만들어서 한번에 비교하기
매번 넣어주는 리스트의 구성마다 매번 다를 거기 때문에 함수로 만들어서 진행하기
def compare_GR(depth,feature):
#gridsearch
import time
start = time.time()
parameters = {'max_depth':max_depth_list, 'max_features':max_features_list}
clf=GridSearchCV(model, param_grid=parameters, scoring="accuracy", n_jobs=-1, cv=5)
clf.fit(X_train,y_train)
grid_score=clf.best_score_
print(f'GridSearch\n')
print(f'Best Score parameters: {clf.best_estimator_}\n')
print(f'Best Score: {grid_score}\n')
print(f'Time: {time.time() - start}\n')
print('-------------------------------------------------------------\n')
#randsearch
start = time.time()
param_distributions={"max_depth": max_depth_list, "max_features":max_features_list }
clf=RandomizedSearchCV(model, param_distributions,cv=5,n_jobs=-1,random_state=42,n_iter=5)
clf.fit(X_train,y_train)
rand_score=clf.best_score_
print(f'RandSearch\n')
print(f'Best Score parameters: {clf.best_estimator_}\n')
print(f'Best Score: {rand_score}\n')
print(f'Time: {time.time() - start}\n')
print('-------------------------------------------------------------\n')
#비교하기
if grid_score > rand_score:
print('GridSearhcv의 정확도가 더 높습니다.')
elif grid_score < rand_score:
print('RandSearhcv의 정확도가 더 높습니다.')
elif grid_score==rand_score:
print('같습니다')
else:
print('뭔가 이상합니다')
compare_GR(max_depth_list,max_features_list)
GridSearch
Best Score parameters: DecisionTreeClassifier(max_depth=3, max_features=0.7513902397624934,
random_state=42)
Best Score: 0.8382394038192829
Time: 0.8767976760864258
RandSearch
Best Score parameters: DecisionTreeClassifier(max_depth=5, max_features=0.39089207858316505,
random_state=42)
Best Score: 0.8137401024685609
Time: 0.04804348945617676
GridSearhcv의 정확도가 더 높습니다.