Kerasでモデルを構築し、これを行いたいと思います
データを少し変更しています
元データはアヤメの種類をその名前で分類していたのですが
当然のことながら、これを 0、1、2 の数値に変更しました
①ゴールの決定:がく片や花びらの長さと幅から、アヤメの品種を分類する
②必要なデータを収集用意する
③不要な特徴量を削除し、かつ正規化を行う
④-1 機械学習の手法を選択する(scikit-learnのSVM(サポートベクターマシン)を選択)
④-2 データに応じたパラメータ(がく片や花びらの長さや幅)を指定する
④-3 データを学習し、モデルを構築する
⑤モデルを評価する
⑥十分な精度でなければ、④に戻る
⑦業務などで活用する
コード
import numpy as np
import pandas as pd
from sklearn import datasets
from sklearn.model_selection import train_test_split
import pandas as pd
from sklearn import datasets
from sklearn.model_selection import train_test_split
from keras.models import Sequential
from keras.layers.core import Dense, Activation
from keras.utils import np_utils
from sklearn import preprocessing
from keras.layers.core import Dense, Activation
from keras.utils import np_utils
from sklearn import preprocessing
model = Sequential()
model.add(Dense(16, activation='relu', input_shape=(4, )))
model.add(Dense(32, activation='relu'))
model.add(Dense(16, activation='relu'))
model.add(Dense(3, activation='softmax'))
model.add(Dense(16, activation='relu', input_shape=(4, )))
model.add(Dense(32, activation='relu'))
model.add(Dense(16, activation='relu'))
model.add(Dense(3, activation='softmax'))
model.compile(loss = 'sparse_categorical_crossentropy', optimizer = 'adam', metrics = ['accuracy'])
iris_data = pd.read_csv("./data/iris.csv", encoding="utf-8")
# ラベルと入力データに分離する
y = iris_data.loc[:,"Name"]
x = iris_data.loc[:,["SepalLength","SepalWidth","PetalLength","PetalWidth"]]
y = iris_data.loc[:,"Name"]
x = iris_data.loc[:,["SepalLength","SepalWidth","PetalLength","PetalWidth"]]
# データの標準化
x = preprocessing.scale(x)
#y = np_utils.to_categorical(y)
#y = np_utils.to_categorical(y)
# 学習用とテスト用に分離する
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.2, train_size = 0.8, shuffle = True)
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.2, train_size = 0.8, shuffle = True)
model.save('model.hdf5')
# モデル訓練
model.fit(x_train, y_train, nb_epoch=50, batch_size=1, verbose=1)
Epoch 50/50
120/120 [====] - 0s 3ms/step - loss: 0.0324 - accuracy: 0.9917 # モデル評価
model.fit(x_train, y_train, nb_epoch=50, batch_size=1, verbose=1)
Epoch 50/50
120/120 [====] - 0s 3ms/step - loss: 0.0324 - accuracy: 0.9917 # モデル評価
# モデル評価
from keras.models import load_model
from keras.models import load_model
model = load_model('model.hdf5')
loss, accuracy = model.evaluate(x_test, y_test, verbose=0)
print("Accuracy = {:.2f}".format(accuracy))
loss, accuracy = model.evaluate(x_test, y_test, verbose=0)
print("Accuracy = {:.2f}".format(accuracy))
Accuracy = 1.00 # 混同行列で確認する from sklearn.metrics import confusion_matrix
predict_classes = model.predict_classes(x_test, batch_size=1)
print(confusion_matrix(predict_classes, y_test))
predict_classes = model.predict_classes(x_test, batch_size=1)
print(confusion_matrix(predict_classes, y_test))
[[11 0 0]
[ 0 11 0]
[ 0 0 8]]
[ 0 11 0]
[ 0 0 8]]