Finder 파일 편집 보기
🔍 🔋 📶 --
˚₊·—̳͟͞͞♡ BAXXUB ♡—̳͟͞͞·₊˚
Welcome to my space ⊹ ࣪ ﹏𓊝

BAXXUB 𐔌՞. .՞𐦯

사과가 되지 말고 도마도가 되어라
S/[기록] 프로젝트 기록 2026. 6. 3. 16:41 by 박혁구

[기계학습] 심장병 분류 모델링 프로젝트 - 개선

심장병 분류 모델링 프로젝트 - 개선

1. 데이터 변경 이전

1-1. 개선 부분: 학습시키지 않았던 feature 3가지 추가하여 재학습

https://colab.research.google.com/drive/1R1c_K2DaJqeNuX5KnehqMiFAUlNQFMKT?usp=sharing

 

기계학습 2차 개선.ipynb

Colab notebook

colab.research.google.com

 

1-2. 결과

  1. f1-score: 최대 0.32를 넘지 못함. 개선 이전과 달라진 점 없음.
  2. t-SNE 시각화

데이터의 overlap이 심함. => 선형이든 비선형적이든 수학적으로 풀기 어려운 문제라는 것을 증명.

1-3. 결론

데이터를 변경.

사용 데이터: https://www.kaggle.com/datasets/johnsmith88/heart-disease-dataset

 

Heart Disease Dataset

Public Health Dataset

www.kaggle.com

 

2. 데이터 변경 이후

2-1. LDA 학습

코드
더보기
더보기
# -*- coding: utf-8 -*-

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

df = pd.read_csv('/content/heart_preprocessed_re.csv')

X = df.drop('target', axis=1)
y = df['target']

x_train, x_test, y_train, y_test, = train_test_split(X, y, test_size=0.2, random_state=42)

lda_model = LinearDiscriminantAnalysis()

lda_model.fit(x_train, y_train)
predictions = lda_model.predict(x_test)

print("\n=== LDA (Linear Discriminant Analysis) 최종 결과 ===")
train_predictions = lda_model.predict(x_train)
print(f"Train Accuracy: {accuracy_score(y_train, train_predictions):.4f}")
print(f"Test Accuracy: {accuracy_score(y_test, predictions):.4f}\n")

print("Confusion Matrix:")
print(confusion_matrix(y_test, predictions))

print("\nClassification_report:")
print(classification_report(y_test, predictions))
=== LDA (Linear Discriminant Analysis) 최종 결과 ===
Train Accuracy: 0.8683
Test Accuracy: 0.8146

Confusion Matrix:
[[76 26]
 [12 91]]

Classification_report:
              precision    recall  f1-score   support

           0       0.86      0.75      0.80       102
           1       0.78      0.88      0.83       103

    accuracy                           0.81       205
   macro avg       0.82      0.81      0.81       205
weighted avg       0.82      0.81      0.81       205

2-2. QDA 학습

코드
더보기
더보기
# -*- coding: utf-8 -*-

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
from sklearn.discriminant_analysis import QuadraticDiscriminantAnalysis

df = pd.read_csv('/content/heart_preprocessed_re.csv')

X = df.drop('target', axis=1)
y = df['target']

x_train, x_test, y_train, y_test, = train_test_split(X, y, test_size=0.2, random_state=42)

qda_model = QuadraticDiscriminantAnalysis(
    priors=[0.5, 0.5],
    reg_param=0.1  # 이게 핵심 - 역행렬 계산 안정화
)
qda_model.fit(x_train, y_train)

predictions = qda_model.predict(x_test)

print("\n=== QDA 최종 결과 ===")
train_predictions = qda_model.predict(x_train)
print(f"Train Accuracy: {accuracy_score(y_train, train_predictions):.4f}")
print(f"Test Accuracy: {accuracy_score(y_test, predictions):.4f}\n")

print("Confusion Matrix:")
print(confusion_matrix(y_test, predictions))

print("\nClassification_report:")
print(classification_report(y_test, predictions))
=== QDA 최종 결과 ===
Train Accuracy: 0.8939
Test Accuracy: 0.8341

Confusion Matrix:
[[79 23]
 [11 92]]

Classification_report:
              precision    recall  f1-score   support

           0       0.88      0.77      0.82       102
           1       0.80      0.89      0.84       103

    accuracy                           0.83       205
   macro avg       0.84      0.83      0.83       205
weighted avg       0.84      0.83      0.83       205

2-3. XGBoost

코드
더보기
더보기
from xgboost import XGBClassifier
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix

xgb_model = XGBClassifier(
    n_estimators=100,
    max_depth=3,
    learning_rate=0.1,
    scale_pos_weight=len(y_train[y_train==0]) / len(y_train[y_train==1]),
    random_state=42,
    eval_metric='logloss'
)

xgb_model.fit(x_train, y_train)
predictions = xgb_model.predict(x_test)

print("\n=== XGBoost 최종 결과 ===")
train_pred = xgb_model.predict(x_train)
print(f"Train Accuracy: {accuracy_score(y_train, train_pred):.4f}")
print(f"Test Accuracy: {accuracy_score(y_test, predictions):.4f}\n")
print("Confusion Matrix:")
print(confusion_matrix(y_test, predictions))
print("\nClassification Report:")
print(classification_report(y_test, predictions))
=== XGBoost 최종 결과 ===
Train Accuracy: 0.9829
Test Accuracy: 0.9366

Confusion Matrix:
[[96  6]
 [ 7 96]]

Classification Report:
              precision    recall  f1-score   support

           0       0.93      0.94      0.94       102
           1       0.94      0.93      0.94       103

    accuracy                           0.94       205
   macro avg       0.94      0.94      0.94       205
weighted avg       0.94      0.94      0.94       205

2-4. t-SNE 시각화 결과

코드
더보기
더보기
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
from sklearn.manifold import TSNE

# t-SNE
X_scaled = StandardScaler().fit_transform(X)
tsne = TSNE(n_components=2, perplexity=30, n_iter=1000, random_state=42)
X_embedded = tsne.fit_transform(X_scaled)

plt.figure(figsize=(10, 8))
scatter = plt.scatter(
    X_embedded[:, 0], X_embedded[:, 1],
    c=y, cmap='tab10', alpha=0.7, s=10  # labels → y로 수정
)
plt.colorbar(scatter)
plt.title('t-SNE Visualization')
plt.tight_layout()
plt.savefig('tsne.png', dpi=150)
plt.show()

=> 데이터는 적지만 이전 데이터에 비해 드문드문 그룹을 형성하고 있는 것이 보임. 약하지만 구조가 존재하며 데이터에 패턴이 존재한다는 증거.

 

 

 

Dock
최소화된 창이 없어요