-
TensorFlow 기초 21 - diabetes 데이터로 이항분류(sigmoid)와 다항분류(softmax) 처리TensorFlow 2022. 12. 6. 10:47
# diabetes 데이터로 이항분류(sigmoid)와 다항분류(softmax) 처리 from keras.models import Sequential from keras.layers import Dense import numpy as np dataset = np.loadtxt('https://raw.githubusercontent.com/pykwon/python/master/testdata_utf8/diabetes.csv', delimiter=',') print(dataset[:1]) print(dataset.shape) # (759, 9) # print(dataset[:, -1]) # 이항분류 from sklearn.model_selection import train_test_split x_train, x_test, y_train, y_test = train_test_split(dataset[:, 0:8], dataset[:, -1], test_size=0.3, random_state=123) print(x_train.shape, x_test.shape, y_train.shape, y_test.shape) # (531, 8) (228, 8) (531,) (228,) model = Sequential() model.add(Dense(units=64, input_dim=8, activation='relu')) model.add(Dense(units=32, activation='relu')) model.add(Dense(units=1, activation='sigmoid')) model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) model.fit(x_train, y_train, epochs=100, batch_size=32, validation_split=0.2, verbose=0) scores = model.evaluate(x_test, y_test) print('%s : %.2f'%(model.metrics_names[0], scores[0])) print('%s : %.2f'%(model.metrics_names[1], scores[1])) # 예측값 구하기 # print(x_train[0]) new_data = [[-0.0588235, 0.20603, 0., 0., 0., -0.105812, -0.910333, -0.433333 ]] pred = model.predict(new_data, batch_size=32, verbose=0) print('예측결과 :', pred) print('예측결과 :', np.where(pred > 0.5, 1, 0)) print('------') # 다항 분류는 label을 원핫인코딩 후 학습에 참여해야 된다. # print(y_train[:3]) from keras.utils import to_categorical y_train = to_categorical(y_train) y_test = to_categorical(y_test) print(y_train[:3]) # 0 : [1. 0.], 1 : [0. 1.] model2 = Sequential() model2.add(Dense(units=64, input_dim=8, activation='relu')) model2.add(Dense(units=32, activation='relu')) model2.add(Dense(units=2, activation='softmax')) # label의 카테고리 수 만큼 결과는 확률값으로 출력(0 : [1. 0.], 1 : [0. 1.]) model2.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) model2.fit(x_train, y_train, epochs=100, batch_size=32, validation_split=0.2, verbose=0) scores = model2.evaluate(x_test, y_test) print('%s : %.2f'%(model2.metrics_names[0], scores[0])) print('%s : %.2f'%(model2.metrics_names[1], scores[1])) new_data2 = [[-0.0588235, 0.20603, 0., 0., 0., -0.105812, -0.910333, -0.433333 ]] pred2 = model2.predict(new_data2, batch_size=32, verbose=0) print('예측 결과2 :', pred2) # [[0.52067256 0.47932744]] <== 예측 결과2의 경우는 확률값이 가장 큰 지점의 인덱스를 분류 결과로 취함 print('예측 결과2 : ', np.argmax(pred2)) <console> [[-0.294118 0.487437 0.180328 -0.292929 0. 0.00149028 -0.53117 -0.0333333 0. ]] (759, 9) (531, 8) (228, 8) (531,) (228,) 1/8 [==>...........................] - ETA: 0s - loss: 0.3872 - accuracy: 0.7500 8/8 [==============================] - 0s 501us/step - loss: 0.5000 - accuracy: 0.7851 loss : 0.50 accuracy : 0.79 예측결과 : [[0.48872915]] 예측결과 : [[0]] ------ [[1. 0.] [0. 1.] [0. 1.]] 1/8 [==>...........................] - ETA: 0s - loss: 0.4509 - accuracy: 0.7500 8/8 [==============================] - 0s 499us/step - loss: 0.5848 - accuracy: 0.7500 loss : 0.58 accuracy : 0.75 예측 결과2 : [[0.5384541 0.4615459]] 예측 결과2 : 0
이항분류를 다항분류로 진행할 수 있다.
다항 분류는 label을 원핫인코딩 후 학습에 참여해야 된다.
출력(0 : [1. 0.], 1 : [0. 1.])값이 2개가 들어가므로 최종적으로 units의 값은 2가 되어야 된다.
'TensorFlow' 카테고리의 다른 글
TensorFlow 기초 23 - iris dataset 분류 모델 여러개 생성 후 성능 비교. 최종 모델 ROC curve 표현(모델 = 함수 사용) (0) 2022.12.06 TensorFlow 기초 22 - zoo animal dataset으로 동물의 type을 7가지로 분류(다항분) (0) 2022.12.06 TensorFlow 기초 20 - classification(이항분류 wine dataset), 학습 조기 종료, 모델 학습 시 모니터링 결과를 파일로 저장 (0) 2022.12.02 TensorFlow 기초 19 - classification (0) 2022.12.02 TensorFlow 기초 18 - 다항회귀(Polynomial Regression) (0) 2022.12.02