심장병 분류 모델링 프로젝트 - 개선
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. 결과
- f1-score: 최대 0.32를 넘지 못함. 개선 이전과 달라진 점 없음.
- 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()

=> 데이터는 적지만 이전 데이터에 비해 드문드문 그룹을 형성하고 있는 것이 보임. 약하지만 구조가 존재하며 데이터에 패턴이 존재한다는 증거.
'S > [기록] 프로젝트 기록' 카테고리의 다른 글
| [인공지능 시스템] 팀 프로젝트: AI가 쓴 글과 사람이 쓴 글 구분하기 (0) | 2026.05.31 |
|---|---|
| [Modeling] LDA, QDA, tSNE (0) | 2026.05.26 |
| [Modeling] SVM Support Vector Machine (0) | 2026.05.26 |
| [Modeling] Random Forest (0) | 2026.05.26 |
| [Modeling] Logistic Regression (0) | 2026.05.25 |