꽃게꽃게
2025. 1. 3. 19:42ㆍ데이터 분석/딥러닝(인공신경망)
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from imblearn.over_sampling import SMOTE
from keras.models import Sequential
from keras.layers import Dense, Dropout, BatchNormalization, LeakyReLU, Input
from keras.callbacks import EarlyStopping
from sklearn.metrics import classification_report, confusion_matrix, ConfusionMatrixDisplay
import matplotlib.pyplot as plt
# 데이터 로드
df = pd.read_csv("./train.csv")
# 특성으로 사용할 열 선택
df_selected = df[['Length', 'Diameter', 'Height', 'Weight', 'Shucked Weight', 'Viscera Weight', 'Shell Weight']]
# Sex 열에 대해 원-핫 인코딩
df_encoded = pd.get_dummies(df, columns=['Sex'])
# Age를 기준으로 y값 생성 (10 이상: 1, 10 미만: 0)
df_encoded['eat'] = (df_encoded['Age'] >= 10).astype(int)
df_encoded["eat"].value_counts()
# 특성(X)과 타겟(y) 분리
X = df_encoded[['Length', 'Diameter', 'Height', 'Weight', 'Shucked Weight', 'Viscera Weight', 'Shell Weight', 'Sex_Female', 'Sex_Indeterminate', 'Sex_Male']]
y = df_encoded['eat']
# 학습/테스트 데이터 분리
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)
# 데이터 스케일링
scaler = StandardScaler()
x_train_scaled = scaler.fit_transform(x_train)
x_test_scaled = scaler.transform(x_test)
# SMOTE로 학습 데이터 증강 (클래스 불균형 문제 해결)
smote = SMOTE(random_state=42)
x_train_resampled, y_train_resampled = smote.fit_resample(x_train_scaled, y_train)
# 2. 모델 구성
model = Sequential([
Input(shape=(x_train_resampled.shape[1],)),
Dense(128, activation=None),
LeakyReLU(alpha=0.1),
BatchNormalization(),
Dropout(0.3),
Dense(64, activation="relu"),
BatchNormalization(),
Dropout(0.3),
Dense(32, activation="relu"),
Dense(1, activation="sigmoid")
])
model.compile(optimizer="adam", loss="binary_crossentropy", metrics=["accuracy"])
# 학습
early_stopping = EarlyStopping(monitor="val_loss", patience=10, restore_best_weights=True)
history = model.fit(
x_train_resampled, y_train_resampled,
epochs=40, batch_size=128,
validation_split=0.2, verbose=1,
callbacks=[early_stopping]
)
# 4. 평가
score = model.evaluate(x_test_scaled, y_test)
print(f"Test Accuracy: {score[1]*100:.2f}%")
# 5. 상세 지표 출력
y_pred = model.predict(x_test_scaled)
y_pred_classes = (y_pred > 0.5).astype( int)
print("\nClassification Report:")
print(classification_report(y_test, y_pred_classes))
# 새로운 데이터 불러오기
new_data = pd.read_csv("test.csv")
# 'Sex' 컬럼 원-핫 인코딩
test_data_encoded = pd.get_dummies(new_data, columns=['Sex'])
# train.csv에서 사용한 특성만 선택
test_data_selected = test_data_encoded[['Length', 'Diameter', 'Height', 'Weight', 'Shucked Weight', 'Viscera Weight', 'Shell Weight', 'Sex_Female', 'Sex_Indeterminate', 'Sex_Male']]
# 데이터를 스케일링
new_x_scaled = scaler.transform(test_data_selected)
# 예측 생성
predictions = (model.predict(new_x_scaled).squeeze() > 0.5).astype(int)
# 예측 결과를 새로운 데이터에 추가하고 파일로 저장
new_data['y'] = predictions
new_data.to_csv('test.csv', index=False)
'데이터 분석 > 딥러닝(인공신경망)' 카테고리의 다른 글
[기초] 파이썬 프레임 합치기 / 정수형 컬럼만 뽑아내기 / datetime타입변경 / f-string (1) | 2025.01.03 |
---|---|
커플성사예측 (0) | 2025.01.03 |
[파이썬 코딩으로 확인하는 선형 회귀] (1) | 2024.10.04 |