-
[3월 4주차-3/27(1)]Titanic 생존 예측 모델 분석 (의사결정나무 & 로지스틱 회귀)Why Not SW CAMP 5기/수업 기록 2025. 3. 27. 16:05
Titanic 데이터셋을 사용하여 의사결정나무와 로지스틱 회귀 모델을 활용하여 생존 여부를 예측하는 과정을 설명합니다. 데이터 전처리부터 모델 학습, 평가, 시각화까지의 과정을 모두 다룹니다.
데이터 전처리
import pandas as pd uri = './data/titanic.csv' df = pd.read_csv(uri, sep='\t') # 컬럼명 소문자로 df.columns = [col.lower() for col in df.columns] # 필요한 컬럼만 추출 df1 = df[['survived', 'pclass', 'name', 'sex', 'age', 'sibsp', 'parch', 'fare']] # female 0, male 1 df1['sex'] = df1['sex'].map({'female': 0, 'male': 1}) # name에 호칭을 숫자로 condition = lambda x:x.split(',')[1].split('.')[0].strip() df1['title'] = df1['name'].map(condition) Special = ['Master', 'Don', 'Rev'] df1['title'] = df1['title'].apply(lambda x: 1 if x in Special else 0) # 동반자 수 컬럼 추가 sibpar = df1['sibsp'] + df1['parch'] df1['num_family'] = sibpar + 1 # 1인당 평균 탑승 요금 넣기 df1['fare'] = df1['fare'] / df1['num_family'] df1.drop(['sibsp', 'parch', 'name'], axis=1, inplace=True) df1.dropna(inplace=True) df1.info()
데이터 분리
raw = df1 np_raw = raw.values train = np_raw[:100] test = np_raw[100:] y_train = [i[0] for i in train] y_test = [i[0] for i in test] X_train = [i[1:] for i in train] X_test = [i[1:] for i in test]
의사결정나무 모델
from sklearn.tree import DecisionTreeClassifier model = DecisionTreeClassifier(criterion='entropy', max_depth=3, min_samples_leaf=5) model.fit(X_train, y_train) model.score(X_train, y_train) # 훈련 데이터 정확도 model.score(X_test, y_test) # 테스트 데이터 정확도
성능 평가
- 정확도 (훈련 데이터): 84%
- 정확도 (테스트 데이터): 88.46%
# 평가 from sklearn.metrics import confusion_matrix # 분류 모델 성능 평가 from sklearn.metrics import accuracy_score # 분류모델 정확도 계산 y_pred=model.predict(X_test) print(accuracy_score(y_test, y_pred)*100) confusion_matrix(y_test, y_pred) ''' array([[18, 1], [ 2, 5]], dtype=int64) 18: TN '0'을 올바르게 예측 1: FP '0'인데 '1'로 예측 2: FN '1'인데 '0'으로 예측 5: TP '1'을 올바르게 예측 ''' feature_names=['pclass', 'sex', 'age', 'title', 'fare', 'num_family'], Tom=[1,1,33,1,50,4] Jane=[2,0,50,0,8,1] model.predict_proba([Tom]) # array([[0.64705882, 0.35294118]]) model.predict_proba([Jane]) # array([[0.16666667, 0.83333333]])
의사결정나무 시각화
# 시각화 from sklearn.tree import export_graphviz export_graphviz( model, out_file='titanic.dot', feature_names=['pclass', 'sex', 'age', 'title', 'fare', 'num_family'], class_names=['0','1'], rounded=True, filled=True) import graphviz import os graphviz_path = "C:\\Program Files\\Graphviz\\bin" os.environ["PATH"] += os.pathsep + graphviz_path with open('titanic.dot') as f: dot_graph = f.read() dot = graphviz.Source(dot_graph) dot.format = 'png' dot.render(filename='titanic_tree', directory = 'image/decision_trees', cleanup= True)
로지스틱 회귀 모델
from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split X = raw.drop(['survived'], axis=1) y = raw['survived'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=13) log_reg = LogisticRegression(C=10., solver='liblinear', random_state=13) log_reg.fit(X_train, y_train) accuracy = log_reg.score(X_test, y_test)
성능 평가
- 정확도: 100%
- 회귀 계수:
array([[ 4.73666302, -0.25330316, -0.50805287, -0.19345317, 0.03131714, 0.00268955, -0.17033199]])
- 회귀 계수는 독립변수들이 생존 여부에 미치는 영향을 의미합니다. 양수일 경우 양의 영향, 음수일 경우 음의 영향을 의미합니다.
결론
의사결정나무와 로지스틱 회귀 모델을 사용하여 Titanic 생존 여부를 예측했습니다. 의사결정나무는 직관적으로 시각화가 가능하며, 로지스틱 회귀 모델은 확률 기반의 예측을 제공합니다. 두 모델을 적절히 비교하여 상황에 맞게 활용할 수 있습니다.
'Why Not SW CAMP 5기 > 수업 기록' 카테고리의 다른 글
[3월 4주차-3/28]경사하강법을 사용한 선형 회귀 학습 및 예측 평가 (0) 2025.03.31 [3월 4주차-3/27(3)]통계 용어 정리+ 최소자승법을 이용한 회귀 분석 (OLS) (0) 2025.03.27 [3월 4주차-3/27(2)]다양한 모델 정리 (0) 2025.03.27 [3월 3주차-3/18]국민청원 데이터 분석 및 120다산콜재단 데이터 RNN 모델링 (0) 2025.03.19 [3월 3주차-3/19]비지도 학습으로 댓글을 분석해보자! (KMeans 군집화) (1) 2025.03.19