Keras에서 와인 분류

시작하기



(주의 저자는 이 분야를 확실히 전문으로 하고 있는 것은 아니기 때문에, 설명의 부족이나 잘못도 있을지도 모릅니다.)
scikit-learn에서 입수할 수 있는 와인의 종류(3종)와 각각 13개의 특징량이 정리된 데이터 세트를 기계 학습으로 분류하기 위한 프로그램입니다. Udemy의 다음 강좌에서는 Chainer 구현입니다만, 이 페이지에서는 Keras로 구현해 보았습니다.
【키카가쿠류】현장에서 사용할 수 있는 Chainer에 의한 딥 러닝 입문
htps //w w. 우데 my. 코 m / 이렇게 r세 / 키카가 쿠 짱 r / ぇ 아 rn / ぇ c 얽힌 / 11004080 # 오 ぇ r ゔ 아 w
프로그램을 제대로 검토한 것은 아니기 때문에 조금 이상한 부분이 있을지도 모릅니다. 이 경우 연락 주시면 감사하겠습니다.
이번에 하는 일의 개략도를 아래에 나타냅니다. 신경망은 숨겨진 층 하나입니다.



또, 이번에는 마지막에 최적화 함수를 바꾸어 보고 어떤 변화가 있을지도 정리했습니다.

손실 함수 및 최적화 함수



손실값은 신경망이 예측한 값과 정답의 오차이며, 그 오차를 구하는 함수가 손실 함수입니다. 프로그램의 loss='categorical_crossentropy'에서 손실 함수를 정의합니다. 이전 기사에서는 회귀였기 때문에 loss='mean_squared_error'라고 했습니다. 이와 같이 문제 설정에 의해 손실 함수를 변경합니다.

손실 함수의 값이 감소하도록 가중치를 변경하기 위해 최적화 함수를 사용합니다. 프로그램 중에는 opt = keras.optimizers.SGD(lr=0.08)로 정의하고 있습니다. 손실 함수와 마찬가지로 많은 종류가 있고 학습이 잘 되지 않는 경우에는 변경해 보면 됩니다.

신경망의 학습에서는 손실값이 작아지도록 가중치를 조정해 갑니다. 손실 함수·최적화 함수의 설명에 대해서는 「소개」에서 말한 강좌에서 자세하게 해설되고 있습니다.

프로그램



GitHub에 올립니다.
htps : // 기주 b. 코 m / 모리이 tkys / 케라스 ぃ 네 C ぁし fy

KerasWineClassify.ipynb
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_wine
import pandas as pd
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout
import matplotlib.pyplot as plt

wine = load_wine()
df = pd.DataFrame(wine.data, columns=wine.feature_names)
dataset_mean = df.mean()
#pd.DataFrame(wine.target)

# Centering
df_c = df-df.mean()
# Normalizing
df_norm = (df_c - df_c.mean()) / (df_c.max() - df_c.min())

s = 13
nb_classes = 3

# Split data
from keras.utils import np_utils
train_X, test_X, train_Y, test_Y = train_test_split(df_norm, wine.target[:], test_size = 0.25)

train_Y1 = np_utils.to_categorical(train_Y,nb_classes)
test_Y1 = np_utils.to_categorical(test_Y,nb_classes)

# Build model
from keras.optimizers import Adam, RMSprop, SGD
model = Sequential()
model.add(Dense(128, input_shape=(s, ), use_bias=False, activation='relu'))
#model.add(Dense(128, activation='relu'))
#model.add(Dense(128, activation='relu'))
#model.add(Dense(128, activation='relu'))
model.add(Dense(nb_classes, activation='softmax'))
#opt = keras.optimizers.Adam(lr=0.08)
#opt = keras.optimizers.RMSprop(lr=0.08)
opt = keras.optimizers.SGD(lr=0.08)

model.compile(optimizer=opt,
      loss='categorical_crossentropy',
      metrics=['mae', 'acc'])

# Start training
history = model.fit(train_X, train_Y1, epochs=50, batch_size=20, verbose=1, validation_data=(test_X,test_Y1))

print(model.summary())
open("model", "w").write(model.to_json())
model.save_weights('param.hdf5')

weights = model.get_weights()

# plot val_loss 損失値の推移をプロット
plt.plot(history.history['val_loss'])
plt.plot(history.history['val_acc'])
plt.show()

결과





위의 그래프와 같이, val_acc인 오렌지의 그래프가 1에 가까워졌기 때문에 학습은 성공했다고 생각합니다. 특히 SGD가 가장 안정적인 곡선으로 되어 있다고 생각합니다.

좋은 웹페이지 즐겨찾기