ABC부트캠프

[17일차]이진 분류 모델 실습 (타이타닉 생존자 예측) 및 인공지능 활용 신경망 실습

수야! 2025. 7. 15. 22:46

 

타이타닉 생존자 분석 및 예측하기

1. 데이터 불러오기 및 전처리

📘 1. 데이터 준비하기

  • sns.load_dataset('titanic')로 타이타닉 데이터를 불러옴
  • info()와 describe()로 데이터 구조 및 결측치 파악
raw_data = sns.load_dataset('titanic')
raw_data.info()

📘 2. 데이터 전처리

🔹 2-1. 탐색적 데이터 분석 (EDA)

  • 생존/사망 분포, 성별 분포, 생존율 확인
  • 모든 feature별 생존자 분포 시각화
 
sns.countplot(data=raw_data, x='sex', hue='survived')
sns.countplot(data=raw_data, x=feature, hue='survived')  # 반복

🔹 2-2. 결측치 처리

  • deck, embark_town: 삭제
  • age: NaN 행 삭제
  • embarked: 최빈값으로 대체
rdf = raw_data.drop(['deck', 'embark_town'], axis=1)
rdf = rdf.dropna(subset=['age'], axis=0)
rdf['embarked'].fillna(most_freq, inplace=True)

🔹 2-3. Feature 선택 & 인코딩

  • 사용 변수: ['survived', 'pclass', 'sex', 'age', 'sibsp', 'parch', 'fare', 'embarked']
  • 범주형(sex, embarked)은 원핫인코딩 후 병합
 
onehot_sex = pd.get_dummies(ndf['sex']).astype('int')
onehot_embarked = pd.get_dummies(ndf['embarked']).astype('int')
ndf = pd.concat([ndf, onehot_sex, onehot_embarked], axis=1)
ndf.drop(['sex', 'embarked'], axis=1, inplace=True)

📘 3. 훈련/검증/테스트 데이터 분리

  • survived를 y, 나머지를 X로 분리
  • train:val:test = 81:9:10 비율로 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1, ...)
X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.1, ...)

 

2. 모델 구성, 설정, 학습, 성능 평가, 예측하기

📘 4. 모델 구성

  • 1개의 은닉층 (뉴런 255개, ReLU), 출력층은 sigmoid로 확률 반환
model = Sequential()
model.add(Dense(255, input_shape=(10,), activation='relu'))
model.add(Dense(1, activation='sigmoid'))
 

📘 5. 모델 설정 및 학습

  • 손실 함수: 이진 분류용 binary_crossentropy
  • 옵티마이저: adam
  • 검증 데이터 포함하여 40 epoch 학습
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
history = model.fit(X_train, y_train, validation_data=(X_val, y_val), epochs=40)

📘 6. 학습 결과 확인

  • 손실(loss), 정확도(accuracy) 그래프 시각화
plt.plot(epochs, acc, label='train_accuracy')
plt.plot(epochs, val_acc, label='val_accuracy')

📘 7. 모델 성능 평가

  • 테스트셋으로 평가: accuracy, precision, recall, F1
  • ROC Curve 시각화
scores = model.evaluate(X_test, y_test)
y_pred = (model.predict(X_test) > 0.5).astype('int')
metrics.accuracy_score(y_test, y_pred)

📘 8. 모델 예측

  • 실제 사람의 데이터(dicaprio, winslet)를 입력하여 생존 예측 수행
dicaprio = np.array([...]).reshape(1,10)
d_predict = model.predict(dicaprio)
print('디카프리오 생존 확률: %.2f%%' % (d_predict * 100))

 

1970년대 보스톤 지역의 주택가격 예측

1. 데이터 준비하기 및 전처리

📘 1. 데이터 준비

from keras.datasets.boston_housing import load_data

(X_train, y_train), (X_test, y_test) = load_data(test_split=0.2, seed=777)
  • Keras 내장 보스턴 주택가격 데이터셋 사용
  • 학습: 80%, 테스트: 20% 자동 분리

📘 2. 데이터 전처리

🔹 2-1. 표준화 (Standardization)

mean = np.mean(X_train, axis=0)
std = np.std(X_train, axis=0)

X_train = (X_train - mean) / std
X_test = (X_test - mean) / std
  • 평균 0, 표준편차 1로 정규화
  • 회귀 문제에서는 정규화가 매우 중요

🔹 2-2. 검증셋 분리

from sklearn.model_selection import train_test_split

X_train, X_val, y_train, y_val = train_test_split(X_train, y_train,
                                                  test_size=0.33,
                                                  random_state=777)
  • 학습 데이터에서 33%를 검증(validation) 데이터로 분리

 

2. 모델 구성, 설정, 학습, 성능평가

📘 3. 모델 구성

from keras.models import Sequential
from keras.layers import Dense

model = Sequential()
model.add(Dense(64, input_shape=(13,), activation='relu'))
model.add(Dense(32, activation='relu'))
model.add(Dense(1))
  • 입력층: 13개 입력값
  • 은닉층: 64 → 32 뉴런 (ReLU)
  • 출력층: 1개 (예측된 주택 가격)

📘 4. 모델 설정

model.compile(optimizer='adam', loss='mse', metrics=['mae', 'mse'])
  • 손실함수: MSE (회귀 문제에 적합)
  • 평가지표: MAE (실제 오차 해석 가능)

📘 5. 모델 학습

history = model.fit(X_train, y_train,
                    validation_data=(X_val, y_val),
                    epochs=300)
  • 학습 데이터로 학습 + 검증 데이터로 평가
  • Epoch 수: 300

📘 6. 학습 결과 시각화

# mse & mae 각각 훈련/검증 비교 그래프
ax1.plot(epochs, mse, label='train_mse')
ax1.plot(epochs, val_mse, label='val_mse')
ax2.plot(epochs, mae, label='train_mae')
ax2.plot(epochs, val_mae, label='val_mae')
  • 학습/검증 MSE, MAE 시각화
  • 📉 두 그래프 간격이 벌어지면 → 오버피팅

📘 7. 모델 성능 평가

model.evaluate(X_test, y_test)
  • 테스트 데이터에서 MAE ≈ 2.26
  • 이는 약 $2,300 오차로 예측했다는 의미

🔹 예측 시각화

plt.scatter(y_test, test_predictions)
plt.plot([-100, 100], [-100, 100])
  • 예측값 vs 실제값을 비교한 산점도
  • 점들이 대각선에 가까울수록 성능이 좋음

 

자동차 연비(MPG) 예측하기

1. 데이터 준비하기 및 전처리

📘 1. 데이터 준비하기

df = pd.read_csv('불러올파일이름.csv', header=None)
df.columns = ['MPG','Cylinders','Displacement','Horsepower','Weight',
              'Acceleration', 'Model Year', 'Origin', 'Name']
 
  • .csv 파일 불러오기
  • 컬럼명 지정
  • MPG는 예측 대상 (타겟)

📘 2. 데이터 전처리

🔹 2-1. 결측치 처리

dataset['Horsepower'].replace('?', np.nan, inplace=True)
dataset.dropna(subset=['Horsepower'], axis=0, inplace=True)
dataset['Horsepower'] = dataset['Horsepower'].astype('float')
  • Horsepower 컬럼의 '?' → NaN 처리 후 제거 및 float 변환

🔹 2-2. 범주형 데이터 인코딩 (원핫 인코딩)

origin = dataset.pop('Origin')
dataset['USA'] = (origin == 1) * 1.0
dataset['Europe'] = (origin == 2) * 1.0
dataset['Japan'] = (origin == 3) * 1.0
  • Origin(국가 정보) 컬럼을 USA, Europe, Japan 세 개로 분리 (원핫)

🔹 2-3. 불필요한 컬럼 삭제

del dataset['Name']
  • 차량 모델명(Name) 삭제

📘 3. 훈련/테스트 데이터 분리 및 정규화

🔹 3-1. 데이터 분리

train_dataset = dataset.sample(frac=0.8, random_state=0)
test_dataset = dataset.drop(train_dataset.index)

train_label = train_dataset.pop('MPG')
test_label = test_dataset.pop('MPG')
  • 80:20 비율로 훈련/테스트 분리
  • MPG → 레이블로 분리

🔹 3-2. 정규화 (표준화)

mean = np.mean(train_dataset, axis=0)
std = np.std(train_dataset, axis=0)

train_dataset = (train_dataset - mean) / std
test_dataset = (test_dataset - mean) / std
  • 입력 피처를 평균 0, 표준편차 1로 정규화

 

2. 모델 구성, 설정, 학습, 성능평가

📘 4. 모델 구성

model = Sequential()
model.add(Dense(64, input_shape=(len(train_dataset.columns),), activation='relu'))
model.add(Dense(64, activation='relu'))
model.add(Dense(1))
  • 입력층: 64개 뉴런, ReLU
  • 은닉층: 64개 뉴런, ReLU
  • 출력층: 1개 (MPG 예측값)

📘 5. 모델 설정

model.compile(optimizer=RMSprop(0.001),
              loss='mse', metrics=['mae', 'mse'])
  • 손실 함수: MSE
  • 평가 지표: MAE, MSE
  • Optimizer: RMSprop

📘 6. 모델 학습

history = model.fit(train_dataset, train_label,
                    epochs=500, batch_size=16)
  • Epoch: 500
  • Batch size: 16

📘 7. 학습 결과 시각화

his_dict = history.history
plt.plot(epochs, his_dict['mse'])
plt.plot(epochs, his_dict['mae'])
  • MSE 및 MAE 변화 추이 시각화

📘 8. 모델 성능 평가

model.evaluate(test_dataset, test_label)
  • 테스트셋에서 MAE, MSE 계산

🔹 예측값 시각화

test_predictions = model.predict(test_dataset).flatten()

plt.scatter(test_label, test_predictions)
plt.plot([-100, 100], [-100, 100])
  • 실제값 vs 예측값을 시각화 (회귀 정확도 시각적 확인)

 

마무리

오늘은 굉장히 졸린 하루였습니다..하지만 최선을 다해 들었다능..

<타이타닉 생존자 분석 및 예측하기>에서는 데이터를 전처리하고 성별과 탑승 정보 등을 원핫 인코딩하여 분류 모델을 학습했습니다. 모델은 255개의 뉴런을 가진 은닉층과 sigmoid 출력층으로 구성했으며, 정확도와 ROC 커브로 성능을 평가했답니다. 디카프리오와 윈슬렛 데이터를 입력해 생존 여부를 예측도 해봤는데 디카프리오....너만 살기 위해 노력했어야했어...증말루...

여자는 생존확률이 거의 100%였는데 디카프리오는 15~17%였다는..

<1970년대 보스톤 지역의 주택가격 예측>에서는 keras의 내장 데이터를 불러와 표준화한 뒤 회귀 모델을 구성해 주택 가격을 예측했습니다. 64-32-1 구조의 신경망을 300 에폭 동안 학습하고, MAE 약 2.26의 결과를 얻었는데요. 예측값과 실제값은 산점도로 비교했습니다.

<자동차 연비(MPG) 예측하기>에서는 csv 파일을 불러와 결측치를 처리하고 원핫 인코딩과 정규화를 거친 후, 64-64-1 구조의 모델을 500 에폭 동안 학습했습니다. 테스트셋에서 MAE 약 1.87을 기록했고, 예측 결과를 시각화했습니다.

이번 강의와 실습을 통해 회귀와 분류 문제의 처리 방식 차이와, 전처리 및 모델 구성에 따른 성능 차이를 경험할 수 있었습니다.

그럼 내일도 뺘샤!