- 음파 탐지기의 수진 결과만 보고 광석인지 일반 암석인지를 구분하는 모델
모델 구성
# 1. 환경 구축
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
# 2. 데이터 준비
# !git clone <https://github.com/taehojo/data.git>
df = pd.read_csv('./iris_data/iris3.csv')
# 속성을 X, 클래스를 y로 저장
X = df.iloc[:,:4]
y = df.iloc[:,4]
# 원-핫 인코딩
y = pd.get_dummies(y)
# 3. 모델 구조 설정 및 컴파일
model = Sequential()
model.add(Dense(12, input_dim=4, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(3, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
# 4. 모델 실행
history=model.fit(X, y, epochs=30, batch_size=5)
과적합
# 환경 준비
import pandas as pd
# 데이터 준비
# !git clone <https://github.com/taehojo/data.git> # 깃허브에서 데이터를 가져옴
df = pd.read_csv('./sonar_data/sonar3.csv', header=None) # 광물 데이터를 불러옵니다.
df.head() # 첫 5줄을 확인
# 일반 암석(0)과 광석(1)이 몇 개 있는지 확인
df[60].value_counts()
# 반향 음파의 주파수 별 에너지, 속성을 X로, 광물의 유무(광물:1, 일반 암석:0)를 y에 저장
X = df.iloc[:,0:60]
y = df.iloc[:,60]
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
# 모델을 설정합니다.
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)
Train / Test
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from sklearn.model_selection import train_test_split
import pandas as pd
#!git clone <https://github.com/taehojo/data.git>
df = pd.read_csv('./sonar_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])
실습) 데이터 셋의 65%를 학습 데이터 셋으로 하고 모델을 학습시킨 후 모델 성능 평가를 수행
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from sklearn.model_selection import train_test_split
import pandas as pd
#!git clone <https://github.com/taehojo/data.git>
df = pd.read_csv('./sonar_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.2, 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])
K겹 교차 검증
# 1. 환경 구성 ------------------------------------------------
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from sklearn.model_selection import KFold
from sklearn.metrics import accuracy_score
import pandas as pd
# 2. 데이터 준비 -----------------------------------------------
# !git clone <https://github.com/taehojo/data.git>
df = pd.read_csv('./sonar_data/sonar3.csv', header=None)
# 음파 관련 속성을 X로, 광물의 종류를 y로 저장합니다.
X = df.iloc[:,0:60]
y = df.iloc[:,60]
# 몇 겹으로 나눌 것인지를 결정
k = 5
# KFold 함수를 불러옵니다. 분할하기 전에 샘플이 치우치지 않도록 섞음
kfold = KFold(n_splits=k, shuffle=True)
# 정확도가 채워질 빈 리스트를 준비합니다.
acc_score = []
# 3. 모델 구조 및 파라메타 설정 -------------------------
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'])
# 4. 모델 실행 ---------------------------------------
# kfold.spilt()에 의해 k개의 학습셋, 테스트셋으로 분리
for train_index , test_index in kfold.split(X):
#print(len(train_index), len(test_index))
X_train , X_test = X.iloc[train_index,:], X.iloc[test_index,:]
y_train , y_test = y.iloc[train_index], y.iloc[test_index]
history = model.fit(X_train, y_train, epochs=200, batch_size=10, verbose=0) # verbose = 0, 학습 과정 출력 생략
accuracy = model.evaluate(X_test, y_test)[1] # 정확도를 구합니다.
acc_score.append(accuracy) # 정확도 리스트에 저장합니다.
# 결과 출력 ----------------------------------
print('정확도:', acc_score)
print('정확도 평균:', sum(acc_score)/k)
# 1. 환경 구성 ------------------------------------------------
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from sklearn.model_selection import KFold
from sklearn.metrics import accuracy_score
import pandas as pd
# 2. 데이터 준비 -----------------------------------------------
# 깃허브에 준비된 데이터를 가져옵니다.
# !git clone <https://github.com/taehojo/data.git>
# 광물 데이터를 불러옵니다.
df = pd.read_csv('./sonar_data/sonar3.csv', header=None)
# 음파 관련 속성을 X로, 광물의 종류를 y로 저장합니다.
X = df.iloc[:,0:60] # X.shape : (208, 60)
y = df.iloc[:,60] # y.shape : (208, )
# 몇 겹으로 나눌 것인지를 결정
k = 5
# KFold 함수를 불러옵니다. 분할하기 전에 샘플이 치우치지 않도록 섞음
kfold = KFold(n_splits=k, shuffle=True)
# 정확도가 채워질 빈 리스트를 준비합니다.
acc_score = []
# 모델 구조 생성
def model_fn():
model = Sequential() #딥러닝 모델의 구조를 시작합니다.
model.add(Dense(24, input_dim=60, activation='relu'))
model.add(Dense(10, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
return model
# K겹 교차 검증을 이용해 k번의 학습을 진행.
# for 문에 의해서 k번 반복, spilt()에 의해 k개의 학습셋, 테스트셋으로 분리
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 = model_fn()
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('정확도 평균:', sum(acc_score)/k)
# 결과를 출력합니다.
print('정확도:', acc_score)
print('정확도 평균:', avg_acc_score)
모델 저장 및 불러오기
# 모델 이름과 저장할 위치를 함께 지정
model.save('./data/model/stone_model.keras')
# 모델을 새로 불러옵니다.
model = load_model('./data/model/stone_model.keras')
'빅데이터 분석가 양성과정 > Python - 딥러닝' 카테고리의 다른 글
실습 (0) | 2024.07.17 |
---|---|
모델 성능 향상 (1) | 2024.07.17 |
다중 분류 - iris 데이터 (0) | 2024.07.17 |
딥러닝 (1) | 2024.07.17 |
오류역전파 (0) | 2024.07.17 |