ABOUT ME

Today
Yesterday
Total
  • [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 생존 여부를 예측했습니다. 의사결정나무는 직관적으로 시각화가 가능하며, 로지스틱 회귀 모델은 확률 기반의 예측을 제공합니다. 두 모델을 적절히 비교하여 상황에 맞게 활용할 수 있습니다.

Designed by Tistory.