Chapter10. 딥러닝 모델 설계하기
https://marin0806.tistory.com/191
25.11.03 개발일지 / 딥러닝 1(모두의 딥러닝 개정4판)
딥러닝 모델 설계# 1.from tensorflow.keras.models import Sequentialfrom tensorflow.keras.layers import Dense# 2.import numpy as np# 3.!git clone https://github.com/taehojo/data.git# 4.Data_set = np.loadtxt("./data/ThoraricSurgery3.csv", delimiter=","
marin0806.tistory.com
Sequential()
: 입력부터 출력까지 순서대로 층을 쌓는 단순 신경망 모델
은닉층
: 기존 입력층 -> 출력층만 있는 선형관계에서는 해결할 수 없던 비선형 문제를 해결할 수 있는 추가된 층
옵티마이저
: 가중치를 업데이트 할 수 있는 인자(예로는 경사 하강법)
모델 컴파일
: 모델을 학습할 방법을 설정하는 과정임
Chapter11. 데이터 다루기
1. 데이터 가져오기
> 데이터는 저자 깃허브의 Data를 활용해야 함
cd Desktop // 바탕화면
git init
git clone https://github.com/taehojo/data.git

2. pandas를 활용한 데이터 조사
1) head()
> 위의 인덱스를 뽑아오기
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.read_csv('data/pima-indians-diabetes3.csv')
print(df.head(5)) // 5개만

2) df[]
> 특정 컬럼을 불러오기
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.read_csv('data/pima-indians-diabetes3.csv')
print(df["diabetes"].value_counts())

3) discribe()
> 컬럼별 정보
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.read_csv('data/pima-indians-diabetes3.csv')
print(df.describe())

▲ count(샘플 수), mean(평균), std(표준편차), min(최솟값), 25~75%(백분위수), max(최댓값)
4) corr()
> 상관관계
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.read_csv('data/pima-indians-diabetes3.csv')
print(df.corr())

4.1) matplotlib을 활용한 그래프 시각화
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.read_csv('data/pima-indians-diabetes3.csv')
print(df.corr())
// 그래프 시각화
colormap = plt.cm.gist_heat // 색상 구성
plt.figure(figsize=(12,12)) // 크기
// 상관계수 행렬, 셀 두께, 색상 최대값, 색상맵, 칸 경계선 색, 셀 안 숫자
sns.heatmap(df.corr(), linewidths=0.1, vmax=0.5, cmap=colormap,
linecolor='white', annot=True)
plt.show()

3. 데이터 추출
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.read_csv('data/pima-indians-diabetes3.csv')
// x축에 표시할 데이터, x축 히스토그램 구간, 히스토그램 형태, 범례 이름
plt.hist(x=[df.plasma[df.diabetes==0], df.plasma[df.diabetes==1]], bins=30,
histtype='barstacked', label=['normal', 'diabetes'])
plt.legend() // label을 실제 표시
plt.show()

> diabetes와 plasma의 상관관계를 그래프로 나타냄
4. 피마 인디언 당뇨병 예측 모델
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
// 텐서플로 케라스 API
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
!git clone https://github.com/taehojo/data.git
df = pd.read_csv('./data/pima-indians-diabetes3.csv')
// x에 모든 행 0~7열을 저장
// y에 모든 행 8열을 저장
x = df.iloc[:,0:8]
y = df.iloc[:,8]
model = Sequential()
model.add(Dense(12, input_dim=8, activation='relu', name='Dense_1'))
model.add(Dense(8, activation='relu', name='Dense_2'))
model.add(Dense(1, activation='sigmoid', name='Dense_3'))
model.summary()
// 예측 모델 컴파일
model.compile(loss='binary_crossentropy', optimizer='adam',
metrics=['accuracy'])
// 예측 모델 실행
history = model.fit(x, y, epochs=100, batch_size=5)


Chapter12. 다중 분류 문제 해결하기
1. 다중분류의 의미
> 이항분류가 둘 중에 하나를 고르는 분류 문제라면, 다중분류는 여러 개의 답 중 하나를 고르는 분류 문제임
2. 상관도 그래프
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
df = pd.read_csv('./data/iris3.csv')
sns.pairplot(df, hue='species')
plt.show()

> 품종(species)에 따른 상관도 그래프
3. 원-핫 인코딩
> 이는 문자열 데이터를 0과 1로만 이루어진 형태로 바꿔주는 과정을 말함
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
df = pd.read_csv('./data/iris3.csv')
x = df.iloc[:,0:4]
y = df.iloc[:,4] # 문자열로 이루어진 상태
y = pd.get_dummies(y) # 원-핫 인코딩 처리
print(y[0:5]) # 결과확인

4. 소프트맥스
> 소프트맥스 함수는 예측 확률을 0과 1 사이의 값으로 나타내 주는 역할을 함
5. 아이리스 품종 예측 모델
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# 아이리스 데이터
df = pd.read_csv('./data/iris3.csv')
# 속성을 x, 클래스를 y
x = df.iloc[:,0:4]
y = df.iloc[:,4]
# 원-핫 인코딩
y = pd.get_dummies(y)
# 모델 설정
model = Sequential()
model.add(Dense(12, input_dim=4, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(3, activation='softmax')) // 출력층 > 소프트 맥스 함수
model.summary()
# 모델 컴파일
model.compile(loss='categorical_crossentropy', optimizer='adam',
metrics=['accuracy'])
# 모델 실행
history = model.fit(x, y, epochs=30, batch_size=5)

Chapter13. 모델 성능 검증하기
1. 데이터 확인 및 예측 실행
> 전과 같은 모델 생성과정임
import pandas as pd
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
# 데이터 준비
df = pd.read_csv('./data/sonar3.csv', header=None)
x = df.iloc[:, 0:60]
y = df.iloc[:, 60]
# 모델 설정
model = Sequential()
model.add(Dense(24, input_dim=60, activation='relu'))
model.add(Dense(10, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
# 모델 컴파일
model.compile(loss='binary_crossentropy', optimizer='adam',
metrics=['accuracy'])
# 모델 실행
history = model.fit(x, y, epochs=200, batch_size=10)

> 정확도는 100이 나오는 모습
2. 과적합
> 과적합이란 학습 데이터 안에서는 예측 정확도가 높게 나오지만, 새로운 데이터를 적용했을 때 잘 맞지 않는 경우를 말함
> 과적합의 발생 문제는 주어진 샘플에만 최적화되어 있어, 다른 데이터에 대한 예측이 제대로 되지 않는 것이라 주어진 샘플을 학습, 테스트용으로 나누는 것이 해결 방법이 될 수 있다.
3. 학습셋과 테스트셋
import pandas as pd
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from sklearn.model_selection import train_test_split
# 데이터
df = pd.read_csv('./data/sonar3.csv', header=None)
x = df.iloc[:,0:60]
y = df.iloc[:,60]
# 학습-테스트셋 구분
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3,
shuffle=True)
# 모델 설정
model = Sequential()
model.add(Dense(24, input_dim=60, activation='relu'))
model.add(Dense(10, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
# 모델 컴파일
model.compile(loss='binary_crossentropy', optimizer='adam',
metrics=['accuracy'])
# 모델 실행
history = model.fit(x_train, y_train, epochs=200, batch_size=10)
# 테스트셋 적용
score = model.evaluate(x_test, y_test)
# 정확도 출력
print('Test accuracy: ', score[1])

> 정확도는 99%인데, 테스트셋 정확도는 80%
4. K겹 교차 검증
from numpy.random import shuffle
import pandas as pd
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from sklearn.model_selection import KFold
from sklearn.metrics import accuracy_score
# 데이터
df = pd.read_csv('./data/sonar3.csv', header=None)
x = df.iloc[:,0:60]
y = df.iloc[:,60]
# K-Fold 교차 검증 학습
k = 5
kfold = KFold(n_splits=k, shuffle=True)
acc_score = []
for train_index, test_index in kfold.split(x):
x_train, x_test = x.iloc[train_index, :], x.iloc[test_index, :]
y_train, y_test = y.iloc[train_index], y.iloc[test_index]
model = Sequential()
model.add(Dense(24, input_dim=60, activation='relu'))
model.add(Dense(10, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam',
metrics=['accuracy'])
history = model.fit(x_train, y_train, epochs=200, batch_size=10,
verbose=0)
accuracy = model.evaluate(x_test, y_test)[1]
acc_score.append(accuracy)
# k번 실시된 정확도 평균
avg_acc_score = sum(acc_score) / k
# 결과 출력
print('정확도: ', acc_score)
print('정확도 평균: ', avg_acc_score)

> 정확도는 85% 정도
Chapter14. 모델 성능 향상시키기
1. 데이터 확인 및 검증셋
> 검증셋은 최적의 가중치를 찾기 위해 사용됨
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from sklearn.model_selection import train_test_split
# 데이터
df = pd.read_csv('./data/wine.csv', header=None)
x = df.iloc[:,0:12]
y = df.iloc[:,12]
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, shuffle=True)
# 모델 설정
model = Sequential()
model.add(Dense(30, input_dim=12, activation='relu'))
model.add(Dense(12, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.summary()
# 모델 컴파일
model.compile(loss='binary_crossentropy', optimizer='adam',
metrics=['accuracy'])
# 모델 실행(검증셋 설정)
history = model.fit(x_train, y_train, epochs=50, batch_size=500,
validation_split=0.25)
# 테스트 결과
score = model.evaluate(x_test, y_test)
print('Test accuracy: ', score[1])

2. 모델 저장하기
from tensorflow.keras.callbacks import ModelCheckpoint
modelpath = "./data/model/all/{epoch:02d}-{val_accuracy:.4f}.keras"
checkpointer = ModelCheckpoint(filepath=modelpath, verbose=1)
# 모델 실행
history = model.fit(x_train, y_train, epochs=50, batch_size=500,
validation_split=0.25, verbose=0, callbacks=[checkpointer])
# 테스트 결과
score = model.evaluate(x_test, y_test)
print('Test accuracy: ', score[1])


> 에포크와 같이 정확도도 같이 기록하여 저장
3. 그래프로 확인
import numpy as np
# 학습
# loss는 실제-예측의 오차, var_loss는 학습 모델 - 검증셋의 오차
history = model.fit(x_train, y_train, epochs=2000, batch_size=500,
verbose=0, validation_split=0.25)
# 결과 확인
hist_df = pd.DataFrame(history.history)
hist_df
# 검증셋 오차
y_vloss = hist_df['val_loss']
# 학습셋 오차
y_loss = hist_df['loss']
# x / 검증셋 오차(빨간색) / 학습셋 오차(파란색)
x_len = np.arange(len(y_loss))
plt.plot(x_len, y_vloss, "o", c="red", markersize=2, label='Testset_loss')
plt.plot(x_len, y_loss, "o", c="blue", markersize=2, label='Trainset_loss')
plt.legend(loc='upper right')
plt.xlabel('epoch')
plt.ylabel('loss')
plt.show()

'LMS 7 > 개발일지' 카테고리의 다른 글
| 25.11.10 개발일지 / 딥러닝5 (0) | 2025.11.14 |
|---|---|
| 25.11.06 개발일지 / 딥러닝3 (0) | 2025.11.14 |
| 25.11.05 개발일지 딥러닝2(모두의 딥러닝 개정 4판) (0) | 2025.11.14 |
| 25.11.03 개발일지 / 딥러닝 1(모두의 딥러닝 개정4판) (0) | 2025.11.14 |
| 25.10.30 개발일지 / C++ MFC 프로젝트 5일차 (0) | 2025.11.14 |