import pandas as pd
!git clone https://github.com.taehojo/data.git
df = pd.read_csv('./data/sonar3.csv', header=None)
df.head()

df[60].value_counts() 해야 함value_counts()는 선택된 열의 각 카테고리별 원소의 개수를 출력한다.
# iloc는 [행, 열] 형태로 데이터에 접근함.
X = df.iloc[:, 0:60] # [:, 0:60]은 [모든 행, 0부터 59까지의 열]을 뜻함
y = df.iloc[:, 60] #[:, 60]은 [모든 행, 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)
batch_size: 한번에 학습할 데이터 뭉치. 일반적으로 32, 64, 128 등의 값을 많이 사용한다고 함input_dim: 입력 데이터의 특성의 개수 (여기에서는 .head()로 출력해봤을 때 봤던 0부터 59까지 60개의 특성이 있으므로 60으로 설정함)

그래프의 빨간 선을 보면, 주어진 샘플에만 너무 최적화되어있어서 새로운 데이터에 적용하면 정확한 분류가 어려워짐

test set으로 실험해서 정확도를 살펴보며 학습이 얼마나 잘 되었는지를 체크할 수 있음. test set의 필요성: test set 없이는 학습이 얼마나 진행되었는지만을 파악할 수 있음. 이 경우 새로운 데이터에 적용했을 때 어느정도의 성능이 나올지는 알 수 없음. 

!pip install sklearn
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, shuffle=True)
# test_size가 테스트셋의 크기(30%)를 의미함. 나머지 70%는 학습셋임.
score = model.evaluate(X_test, y_test) # model.evaluate 함수는 loss, accuracy 두가지를 저장함.
print('Test accuracy:', score[1]) # 그 중 두번째(인덱스로는 1)인 accuracy를 출력함

# 저장할 위치/모델이름.hdf5 형식으로 적음
model.save('./data/model/my_model.hdf5')
# 테스트를 위해 모델 삭제하기
del model
# 다시 불러오기
from tensorflow.keras.models import Sequential, load_model
model = load_model('./data/model/my_model.hdf5')

from sklearn.model_selection import KFold
k = 5 # 전체 데이터셋을 다섯개로 나눔
kfold = KFold(n_splits = k, shuffle = True) # 데이터들이 어느 한 쪽으로 치우치지 않도록 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]
accuracy = model.evaluate(X_test, y_test)[1] # 정확도 구하기
acc_score.append(accuracy) # 미리 만들어둔 리스트에 저장하기
