あまり綺麗なプログラムではありませんが | python3Xのブログ

python3Xのブログ

ここでは40代、50代の方が日々の生活で役に立つ情報や私の趣味であるプログラム、Excelや科学に関する内容で投稿する予定です。

import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from keras.utils import np_utils
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
import pandas as pd
 
# The wine dataset を読み込む。
df = pd.read_csv('wine.csv')
# データをラベルとデータに分離 
y = df.loc[:,"quality"]
x = df.loc[:,["a","b","c","d","e", "f","g","f","g","h","i","l","m"]]
# データセットの8割を学習用、2割をテスト用に分割する。
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.1)
# 前処理
scaler = StandardScaler()
x_train = scaler.fit_transform(x_train)# 標準化
x_test = scaler.fit_transform(x_test)
y_train = np_utils.to_categorical(y_train)# One-Hot 表現にする。
y_test = np_utils.to_categorical(y_test)
 
# モデルを構築する。
model = Sequential()
model.add(Dense(30, activation='relu', input_dim=13))
model.add(Dense(30, activation='relu'))
model.add(Dense(3, activation='softmax'))
model.compile(
    optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
 
# 学習を実行する。
model.fit(x_train, y_train, batch_size=8, epochs=30, verbose=1)
 
loss, accuracy = model.evaluate(x_test, y_test)
print('test accuracy: {:.2%}'.format(accuracy))
18/18 [==============================] - 0s 2ms/step
test accuracy: 94.44%
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt
from mlxtend.plotting import plot_decision_regions
from sklearn.svm import SVC
import seaborn as sns
# 結果を図に表示
corr = df.corr()
sns.heatmap(corr, cmap="coolwarm", xticklabels=corr.columns.values,
            yticklabels=corr.columns.values)           
plt.show()
# 混同行列で確認してみる
probs = model.predict(x_test)
import numpy as np
conmat = np.zeros((3, 3))
for case in range(0, 18):
    max = probs[case, 0]
    loc = 0
    corloc = 0
    for i in range(0, 3):
        if(max<probs[case, i]):
            loc = i
            max = probs[case, i]
        if(y_test[case, i]==1):
            corloc = i
        conmat[corloc, loc] += 1
print(conmat)
[[28.  7.  0.]
[ 0. 12.  0.]
[ 0.  1.  6.]]