벌써 6월ㄷ
오늘 한 일
저번주에 품경기친다고 빠진날 팀원분들이 가설 세운거 시각화 하셔서
그 가설 근거? 찾는다고 논문 엄청 많이 찾아봄
근데 뭔가 딱 맞는 가설 찾기 어려웟다 ㅜㅜ
그러고 나서 머신러닝 시작
1. 빈칸 제거
2. 머신 돌리기
3. 변수 생성
-로지스틱
코드( 장문 주의)
파이썬 코드는 클로드의 힘을 빌려서...
더보기
import pandas as pd
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import (
accuracy_score, classification_report,
confusion_matrix, roc_auc_score
)
import warnings
warnings.filterwarnings('ignore')
# ─────────────────────────────────────────
# 1. 데이터 로드
# ─────────────────────────────────────────
df_train = pd.read_csv('train_data_merged_cleaned.csv', encoding='utf-8')
df_test = pd.read_csv('test_data_merged_cleaned.csv', encoding='utf-8')
TARGET = 'dd10 CM Content'
# ─────────────────────────────────────────
# 2. 타겟 이진 분류 변환
# 필요에 따라 threshold 값을 조정
# ─────────────────────────────────────────
threshold = 70
print(f"[타겟 변환] 기준값(중앙값): 70")
print(f" 0 (< 70) : {(df_train[TARGET] < threshold).sum()}개")
print(f" 1 (>= 70): {(df_train[TARGET] >= threshold).sum()}개\n")
df_train['target'] = (df_train[TARGET] >= threshold).astype(int)
df_test['target'] = (df_test[TARGET] >= threshold).astype(int)
# ─────────────────────────────────────────
# 3. 피처 / 타겟 분리
# ─────────────────────────────────────────
drop_cols = [TARGET, 'target']
feature_cols = [c for c in df_train.columns if c not in drop_cols]
X_train = df_train[feature_cols]
y_train = df_train['target']
X_test = df_test[feature_cols]
y_test = df_test['target']
print(f"[데이터 형태]")
print(f" X_train: {X_train.shape}, X_test: {X_test.shape}\n")
# ─────────────────────────────────────────
# 4. 결측값 처리 (중앙값으로 대체)
# ─────────────────────────────────────────
X_train = X_train.fillna(X_train.median())
X_test = X_test.fillna(X_train.median()) # train 중앙값 기준 유지
# ─────────────────────────────────────────
# 5. 스케일링 (로지스틱 회귀는 스케일에 민감)
# ─────────────────────────────────────────
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# ─────────────────────────────────────────
# 6. 로지스틱 회귀 모델 학습
# ─────────────────────────────────────────
model = LogisticRegression(
C=1.0, # 규제 강도 (작을수록 강한 규제)
max_iter=1000, # 최대 반복 횟수
random_state=42,
solver='lbfgs'
)
model.fit(X_train_scaled, y_train)
print("[모델 학습 완료]\n")
# ─────────────────────────────────────────
# 7. 예측
# ─────────────────────────────────────────
y_pred = model.predict(X_test_scaled)
y_pred_prob = model.predict_proba(X_test_scaled)[:, 1]
# ─────────────────────────────────────────
# 8. 성능 평가
# ─────────────────────────────────────────
print("=" * 45)
print(" 모델 성능 평가 결과")
print("=" * 45)
print(f" Accuracy : {accuracy_score(y_test, y_pred):.4f}")
try:
print(f" ROC-AUC : {roc_auc_score(y_test, y_pred_prob):.4f}")
except Exception:
print(" ROC-AUC : 계산 불가 (클래스 분포 확인 필요)")
print()
print("[Classification Report]")
print(classification_report(y_test, y_pred,
target_names=['Low (0)', 'High (1)']))
print("[Confusion Matrix]")
print(confusion_matrix(y_test, y_pred))
# ─────────────────────────────────────────
# 9. 주요 피처 중요도 (회귀 계수 기준)
# ─────────────────────────────────────────
coef_df = pd.DataFrame({
'feature' : feature_cols,
'coefficient': model.coef_[0]
}).reindex(
pd.Series(model.coef_[0]).abs().sort_values(ascending=False).index
)
print("\n[상위 10개 중요 피처]")
print(coef_df.head(10).to_string(index=False))
결과
더보기
[타겟 변환] 기준값(중앙값): 70
0 (< 70) : 17개
1 (>= 70): 25개
[데이터 형태]
X_train: (42, 84), X_test: (18, 84)
[모델 학습 완료]
=============================================
모델 성능 평가 결과
=============================================
Accuracy : 0.5000
ROC-AUC : 0.4935
[Classification Report]
precision recall f1-score support
Low (0) 0.40 0.57 0.47 7
High (1) 0.62 0.45 0.53 11
accuracy 0.50 18
macro avg 0.51 0.51 0.50 18
weighted avg 0.54 0.50 0.50 18
[Confusion Matrix]
[[4 3]
[6 5]]
[상위 10개 중요 피처]
feature coefficient
Average DO concentration gradient d0 0.657418
dd7 Cell Density 0.649458
dd2 Average pH -0.564780
dd2 Average of 2nd derivative DO 0.552175
dd3-dd5 Cell Density Gradient 0.551666
dd0 Glucose Concentration -0.542109
dd7 Average pH 0.524655
Average DO concentration gradient dd6 -0.505755
dd3 Cell Density -0.470095
dd4 Average pH Gradient 0.432385
- 랜덤포레스트
코드
더보기
import pandas as pd
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import (
accuracy_score, classification_report,
confusion_matrix, roc_auc_score
)
import warnings
warnings.filterwarnings('ignore')
# ─────────────────────────────────────────
# 1. 데이터 로드
# ─────────────────────────────────────────
df_train = pd.read_csv('train_data_merged_cleaned.csv', encoding='utf-8')
df_test = pd.read_csv('test_data_merged_cleaned.csv', encoding='utf-8')
TARGET = 'dd10 CM Content'
# ─────────────────────────────────────────
# 2. 타겟 이진 분류 변환
# 필요에 따라 threshold 값을 조정
# ─────────────────────────────────────────
threshold = 70
print(f"[타겟 변환] 기준값(중앙값): 70")
print(f" 0 (< 70) : {(df_train[TARGET] < threshold).sum()}개")
print(f" 1 (>= 70): {(df_train[TARGET] >= threshold).sum()}개\n")
df_train['target'] = (df_train[TARGET] >= threshold).astype(int)
df_test['target'] = (df_test[TARGET] >= threshold).astype(int)
# ─────────────────────────────────────────
# 3. 피처 / 타겟 분리
# ─────────────────────────────────────────
drop_cols = [TARGET, 'target']
feature_cols = [c for c in df_train.columns if c not in drop_cols]
X_train = df_train[feature_cols]
y_train = df_train['target']
X_test = df_test[feature_cols]
y_test = df_test['target']
print(f"[데이터 형태]")
print(f" X_train: {X_train.shape}, X_test: {X_test.shape}\n")
# ─────────────────────────────────────────
# 4. 결측값 처리 (중앙값으로 대체)
# ─────────────────────────────────────────
X_train = X_train.fillna(X_train.median())
X_test = X_test.fillna(X_train.median()) # train 중앙값 기준 유지
# ─────────────────────────────────────────
# 5. 스케일링
# (랜덤포레스트는 스케일 불변이지만
# 로지스틱 회귀와 동일 조건 유지)
# ─────────────────────────────────────────
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# ─────────────────────────────────────────
# 6. 랜덤포레스트 모델 학습
# ─────────────────────────────────────────
model = RandomForestClassifier(
n_estimators=100, # 트리 개수
max_depth=None, # 트리 최대 깊이 (None = 제한 없음)
min_samples_split=2, # 노드 분할 최소 샘플 수
min_samples_leaf=1, # 리프 노드 최소 샘플 수
max_features='sqrt', # 분할 시 고려할 피처 수
random_state=42,
n_jobs=-1 # 전체 CPU 코어 사용
)
model.fit(X_train_scaled, y_train)
print("[모델 학습 완료]\n")
# ─────────────────────────────────────────
# 7. 예측
# ─────────────────────────────────────────
y_pred = model.predict(X_test_scaled)
y_pred_prob = model.predict_proba(X_test_scaled)[:, 1]
# ─────────────────────────────────────────
# 8. 성능 평가
# ─────────────────────────────────────────
print("=" * 45)
print(" 모델 성능 평가 결과")
print("=" * 45)
print(f" Accuracy : {accuracy_score(y_test, y_pred):.4f}")
try:
print(f" ROC-AUC : {roc_auc_score(y_test, y_pred_prob):.4f}")
except Exception:
print(" ROC-AUC : 계산 불가 (클래스 분포 확인 필요)")
print()
print("[Classification Report]")
print(classification_report(y_test, y_pred,
target_names=['(0)', '(1)']))
print("[Confusion Matrix]")
print(confusion_matrix(y_test, y_pred))
# ─────────────────────────────────────────
# 9. 피처 중요도 (불순도 감소량 기준)
# ─────────────────────────────────────────
importance_df = pd.DataFrame({
'feature' : feature_cols,
'importance': model.feature_importances_
}).sort_values('importance', ascending=False).reset_index(drop=True)
print("\n[상위 10개 중요 피처]")
print(importance_df.head(10).to_string(index=False))
결과
더보기
[타겟 변환] 기준값(중앙값): 70
0 (< 70) : 17개
1 (>= 70): 25개
[데이터 형태]
X_train: (42, 84), X_test: (18, 84)
[모델 학습 완료]
=============================================
모델 성능 평가 결과
=============================================
Accuracy : 0.5000
ROC-AUC : 0.5844
[Classification Report]
precision recall f1-score support
(0) 0.00 0.00 0.00 7
(1) 0.56 0.82 0.67 11
accuracy 0.50 18
macro avg 0.28 0.41 0.33 18
weighted avg 0.34 0.50 0.41 18
[Confusion Matrix]
[[0 7]
[2 9]]
[상위 10개 중요 피처]
feature importance
dd0-dd1 Aggregate Size Gradient 0.065223
Start Preculture Perfusion [h after inoc] d1-d2 0.047616
Presence of IWP2 [h] 0.037372
d0 Average pH Gradient 0.027505
dd6 Average pH Gradient 0.027160
dd2 Average pH 0.025733
dd2 Cell Density 0.023106
dd1 Cell Density 0.022780
dd0 Average of 2nd derivative DO 0.022255
d0 Average pH 0.021793
- XGBoost
코드
더보기
import pandas as pd
import numpy as np
from xgboost import XGBClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import (
accuracy_score, classification_report,
confusion_matrix, roc_auc_score
)
import warnings
warnings.filterwarnings('ignore')
# ─────────────────────────────────────────
# 1. 데이터 로드
# ─────────────────────────────────────────
df_train = pd.read_csv('train_data_merged_cleaned.csv', encoding='utf-8')
df_test = pd.read_csv('test_data_merged_cleaned.csv', encoding='utf-8')
TARGET = 'dd10 CM Content'
# ─────────────────────────────────────────
# 2. 타겟 이진 분류 변환
# 필요에 따라 threshold 값을 조정
# ─────────────────────────────────────────
threshold = 70
print(f"[타겟 변환] 기준값(중앙값): 70")
print(f" 0 (< 70) : {(df_train[TARGET] < threshold).sum()}개")
print(f" 1 (>= 70): {(df_train[TARGET] >= threshold).sum()}개\n")
df_train['target'] = (df_train[TARGET] >= threshold).astype(int)
df_test['target'] = (df_test[TARGET] >= threshold).astype(int)
# ─────────────────────────────────────────
# 3. 피처 / 타겟 분리
# ─────────────────────────────────────────
drop_cols = [TARGET, 'target']
feature_cols = [c for c in df_train.columns if c not in drop_cols]
X_train = df_train[feature_cols]
y_train = df_train['target']
X_test = df_test[feature_cols]
y_test = df_test['target']
print(f"[데이터 형태]")
print(f" X_train: {X_train.shape}, X_test: {X_test.shape}\n")
# ─────────────────────────────────────────
# 4. 결측값 처리 (중앙값으로 대체)
# XGBoost는 결측값을 자체 처리할 수 있으나
# 동일 조건 유지를 위해 명시적으로 처리합니다.
# ─────────────────────────────────────────
X_train = X_train.fillna(X_train.median())
X_test = X_test.fillna(X_train.median()) # train 중앙값 기준 유지
# ─────────────────────────────────────────
# 5. 스케일링
# (XGBoost는 스케일 불변이지만
# 동일 조건 유지를 위해 적용)
# ─────────────────────────────────────────
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# ─────────────────────────────────────────
# 6. XGBoost 모델 학습
# ─────────────────────────────────────────
model = XGBClassifier(
n_estimators=100, # 부스팅 라운드 수 (트리 개수)
max_depth=6, # 트리 최대 깊이
learning_rate=0.1, # 학습률 (eta)
subsample=0.8, # 각 트리 학습에 사용할 샘플 비율
colsample_bytree=0.8, # 각 트리 학습에 사용할 피처 비율
gamma=0, # 분할 최소 손실 감소량
reg_alpha=0, # L1 규제
reg_lambda=1, # L2 규제
use_label_encoder=False,
eval_metric='logloss',
random_state=42,
n_jobs=-1
)
model.fit(X_train_scaled, y_train)
print("[모델 학습 완료]\n")
# ─────────────────────────────────────────
# 7. 예측
# ─────────────────────────────────────────
y_pred = model.predict(X_test_scaled)
y_pred_prob = model.predict_proba(X_test_scaled)[:, 1]
# ─────────────────────────────────────────
# 8. 성능 평가
# ─────────────────────────────────────────
print("=" * 45)
print(" 모델 성능 평가 결과")
print("=" * 45)
print(f" Accuracy : {accuracy_score(y_test, y_pred):.4f}")
try:
print(f" ROC-AUC : {roc_auc_score(y_test, y_pred_prob):.4f}")
except Exception:
print(" ROC-AUC : 계산 불가 (클래스 분포 확인 필요)")
print()
print("[Classification Report]")
print(classification_report(y_test, y_pred,
target_names=['Low (0)', 'High (1)']))
print("[Confusion Matrix]")
print(confusion_matrix(y_test, y_pred))
# ─────────────────────────────────────────
# 9. 피처 중요도 (gain 기준 — 분할 시 손실 감소량)
# ─────────────────────────────────────────
importance_df = pd.DataFrame({
'feature' : feature_cols,
'importance': model.feature_importances_
}).sort_values('importance', ascending=False).reset_index(drop=True)
print("\n[상위 10개 중요 피처]")
print(importance_df.head(10).to_string(index=False))
결과
더보기
[타겟 변환] 기준값(중앙값): 75.35
0 (Low, < 75.35) : 21개
1 (High, >= 75.35): 21개
[데이터 형태]
X_train: (42, 84), X_test: (18, 84)
[모델 학습 완료]
=============================================
모델 성능 평가 결과
=============================================
Accuracy : 0.8333
ROC-AUC : 0.8889
[Classification Report]
precision recall f1-score support
Low (0) 0.88 0.78 0.82 9
High (1) 0.80 0.89 0.84 9
accuracy 0.83 18
macro avg 0.84 0.83 0.83 18
weighted avg 0.84 0.83 0.83 18
[Confusion Matrix]
[[7 2]
[1 8]]
[상위 10개 중요 피처]
feature importance
Average DO concentration dd6 0.113308
dd0 Average pH Gradient 0.057261
dd2 Average pH 0.053408
Average DO concentration gradient d0 0.051998
Start Preculture Perfusion [h after inoc] d1-d2 0.048932
dd0-dd1 Aggregate Size Gradient 0.047391
dd7 Cell Density 0.043916
Average DO concentration dd7 0.034615
Preculture Time [h] 0.034192
dd2 Aggregate Size 0.033126
랜덤포레스트 (0) 예측률?이 0이나왔다 !! -> 전체 18개 케이스 중 7개를 잡아내야 하는데 하나도 못잡았다는 뜻. 왜지
tmi
+) 공가 제출 해야되는데 응시확인서가 시험 다음날(토요일)부터 발급 가능이라... 금요일에 시험 치고 나서는 기억하고있었는데 자고일어나서 싹 잊어버려가지고 오늘 아침에 다시 생각남... 그래도 공가 발생 다음날까지 서류제출인데 영업일 기준이라 다행히 다시 제출했다 ㅜㅜ 아찔....
'내일배움캠프(본캠프)' 카테고리의 다른 글
| [내일배움캠프] 본캠프 6/5 (0) | 2026.06.05 |
|---|---|
| [내일배움캠프] 본캠프 6/2 (0) | 2026.06.02 |
| [내일배움캠프] 본캠프 5/28 (0) | 2026.05.28 |
| [내일배움캠프] 본캠프 5/27 (0) | 2026.05.27 |
| [내일배움캠프] 본캠프 5/26 (0) | 2026.05.26 |