피마 인디언 데이터 가져오기&분석
# 라이브러리 설정
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 데이터 가져오기
# 데이터에 header가 없어 names로 각 속성별 이름 붙여줌
data = pd.read_csv('C:/Users/kwonk/juno1412-1/juno1412/DL/모두의 딥러닝/dataset/pima-indians-diabetes.csv', names = ["pregnant", "plasma", "pressure", "thickness", "insulin", "bmi", "pedigree", "age", "class"])
# 데이터 확인
print(data.head(5))
print(data.info())
print(data.describe())
# 데이터 전처리
# 속성별 정보의 당뇨병 발병 상관관계 계산
# as_type = pregnant정보 옆 새로운 index 생성
# sort_values(by='pregnant', ascending=True -> pregnant 기준 오름차순 정렬
print(data[['pregnant','class']].groupby(['pregnant'], as_index=False).mean().sort_values(by='pregnant', ascending=True))
# 데이터 시각화
# vmax = 색상의 밝기, cmap = matplotlib의 색상 설정값 부여
plt.figure(figsize=(10,10))
sns.heatmap(data.corr(), linewidths=0.1, vmax=0.5, cmap=plt.cm.gist_heat, linecolor='white', annot=True )
plt.show()
sns.heatmap(data.corr(), linewidths=0.1, vmax=0.5, vmin=-0.5, cmap='RdYlBu_r', linecolor='white', annot=True )
plt.show() : 표 보여주기
class(생존여부)와 가장 상관관계가 높은 plasma(혈장) 속성과 class사이의 관계를 분석한 그래프
class = 0는 높은 혈장수치를 가지고
class = 1은 낮은 혈장수치를 가지고있음을 알 수 있다.
피마 인디언 당뇨병 예측 실행
# keras 함수 불러오기
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
# 라이브러리 불러오기
import numpy
import tensorflow as tf
tf.__version__
# seed=0 설정 -> 실행할 때마다 같은 결과 출력
seed=0
numpy.random.seed(seed)
tf.set_random_seed(seed)
seed 값을 설정해주는 이유
: random() 함수로 임의값을 설정하는 것처럼 보여도 컴퓨터안에 내장된 '내장테이블' 중 하나를 부럴내어 순서대로 숫자를 보여주는 것이다. seed 설정은 랜덤테이블 중 몇 번째 테이블을 불러와 쓸 것인지를 결정하는 것이다.
numpy 라이브러리를 사용한 tensorflow 딥러닝 구현 시 numpy.seed와 tensorflow.seed 설정 2개 모두 설정해야한다.
# 수술 환자 데이터 불러오기
# 분리, delimiter=","
data_set = numpy.loadtxt('C:/Users/kwonk/juno1412-1/juno1412/DL/모두의 딥러닝/dataset/pima-indians-diabetes.csv', delimiter=",")
# 사람의 속성, 당뇨병여부(클래스) 저장
x = data_set[:,0:8] # 속성
y = data_set[:,8] # 클래스
numpy.loadtxt로 numpy라이브러리를 이용한 csv파일을 불러온다. ","로 구분한다.
x 는 속성값 = 환자정보
y 는 클래스 = 당뇨병 여부
# 딥러닝 모델 설정
model = Sequential()
model.add(Dense(12, input_dim=8, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
Sequential() 함수로 입력층 만들어주기
model.add(Dense) 함수
- 노드 12개, 노드 8개의 은닉층 2개 만들어주기
- input_dim = 입력값 12개
- 활성화 함수 relu
model.add(Dense(1, activation='sigmoid'))
sigmoid 함수로 출력층 만들어주기
# 딥러닝 실행
# model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(x, y, epochs=100, batch_size=10)
# 출력
print("\n Accuracy: %.4f" % (model.evaluate(x, y)[1]))
model.compile로 오차, 최적화, 모델수행결과를 나타냄
loss 함수로 MSE(평균제곱오차)와 binary_crossentroy 2개 모두 사용해보았다.
epochs = 100으로 전체 샘플이 100번 반복해서 입력될 때까지 실험을 반복
batch_size = 한번에 입력되는 입력값 10개로 설정
MSE VS binary_crossentroy 성능 차이
오차함수 loss = mean_squared_error(평균제곱오차)로 돌릴 때,
오차함수 loss = binary_crossentropy(이항교차 앤트로피)로 돌릴 때,
전체코드
# 라이브러리 설정
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
import seaborn as sns
# 데이터 가져오기
# 데이터에 header가 없어 names로 각 속성별 이름 붙여줌
data = pd.read_csv('C:/Users/kwonk/juno1412-1/juno1412/DL/모두의 딥러닝/dataset/pima-indians-diabetes.csv', names = ["pregnant", "plasma", "pressure", "thickness", "insulin", "bmi", "pedigree", "age", "class"])
print(data.head(5))
print(data.info())
print(data.describe())
# 데이터 전처리
# 속성별 정보의 당뇨병 발병 상관관계 계산
# as_type = pregnant정보 옆 새로운 index 생성
# sort_values(by='pregnant', ascending=True -> pregnant 기준 오름차순 정렬
print(data[['pregnant','class']].groupby(['pregnant'], as_index=False).mean().sort_values(by='pregnant', ascending=True))
# 데이터 시각화
# vmax = 색상의 밝기, cmap = matplotlib의 색상 설정값 부여
plt.figure(figsize=(10,10))
sns.heatmap(data.corr(), linewidths=0.1, vmax=0.5, vmin=-0.5, cmap='RdYlBu_r', linecolor='white', annot=True )
plt.show()
grid = sns.FacetGrid(data, col='class')
grid.map(plt.hist, 'plasma', bins=10)
plt.show()
# 피마인디언 당뇨병 예측 실행
# keras 함수 불러오기
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
# 라이브러리 불러오기
import numpy
import tensorflow as tf
tf.__version__
# seed=0 설정 -> 실행할 때마다 같은 결과 출력
seed=0
numpy.random.seed(seed)
tf.set_random_seed(seed)
# 수술 환자 데이터 불러오기
# 분리, delimiter=","
data_set = numpy.loadtxt('C:/Users/kwonk/juno1412-1/juno1412/DL/모두의 딥러닝/dataset/pima-indians-diabetes.csv', delimiter=",")
# 사람의 속성, 당뇨병여부(클래스) 저장
x = data_set[:,0:8] # 속성
y = data_set[:,8] # 클래스
# 딥러닝 모델 설정
model = Sequential()
model.add(Dense(12, input_dim=8, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
# 딥러닝 실행
# model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(x, y, epochs=100, batch_size=10)
# 출력
print("\n Accuracy: %.4f" % (model.evaluate(x, y)[1]))
'머신러닝딥러닝 > 딥러닝' 카테고리의 다른 글
딥러닝(Deep Learning) #12 베스트 모델 구하기 (0) | 2022.04.14 |
---|---|
딥러닝(Deep learning) #10 다중 분류 (0) | 2022.04.13 |
딥러닝(Deep learning) #8 모델 설계 keras (0) | 2022.04.13 |
딥러닝(Deeping Learning) #7 - 오차 역전파/신경망 (0) | 2022.04.12 |
딥러닝(Deep Learning) #6 - 퍼셉트론 (0) | 2022.04.12 |
댓글