少しはマシになったかも | python3Xのブログ

python3Xのブログ

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

データを例えば医療関係のものに帰れば、
健康な人、病気手前の人、病人
とかにも分類できるかも知れません
今回分類でランク付けしましたが
それぞれのランクのデータサンプル数に大きな開きがありました
これは、例えばテレビや新聞などが何とか調査とか行った際に
10代~80代までを対象とした場合に
各年代を同じ数にするのも良いですが
人口統計に基づいて、その比率で数を決めてしまう
とかの参考になるかも知れません
 
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from keras.utils import np_utils
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from mlxtend.plotting import plot_decision_regions
from sklearn.preprocessing import StandardScaler
# データを読み込む
wine = pd.read_csv("winequality-white2.csv", encoding="utf-8")
# データをラベルとデータに分離
y = wine["品質"]
x = wine.drop("品質", axis=1)
# yのラベルをつけ直す
newlist = []
for v in list(y):
    if v <= 4:
        newlist += [0]
    elif v <= 7:
        newlist += [1]
    else:
        newlist += [2]
y = newlist
# データセットの9割を学習用、1割をテスト用に分割する。
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)
x_test.shape
(490, 11) # モデルを構築する。
model = Sequential()
model.add(Dense(32, activation='relu', input_dim=11))
model.add(Dense(64, activation='relu'))
model.add(Dense(128, activation='relu'))
model.add(Dense(64, activation='relu'))
model.add(Dense(32, activation='relu'))
model.add(Dense(3, activation='softmax'))
model.compile(
    optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
# 学習を実行する。
mEpoch 50/50
4408/4408 [==] - 1s 122us/sample - loss: 0.0282 - acc: 0.9907
# 結果を図に表示
corr = wine.corr()
#sns.heatmap(corr*20,
sns.heatmap(corr, cmap="coolwarm", xticklabels=corr.columns.values,
            yticklabels=corr.columns.values)           
plt.show()
 
probs = model.predict(x_test)
probs.shape
(490, 3)
import numpy as np
conmat = np.zeros((3, 3))
for case in range(0, 490):
    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)
[[498.  44.   0.]
[ 32. 872.   8.]
[  0.  10.   6.]]
import numpy as np
conmat = np.zeros((3, 3))
for case in range(0, 490):
    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('case#', case, '正解 / 推定', corloc, '/', loc, '確率', max)
case# 0 正解 / 推定 1 / 1 確率 0.99999964
case# 1 正解 / 推定 1 / 1 確率 1.0
case# 2 正解 / 推定 1 / 1 確率 0.99891794
case# 3 正解 / 推定 1 /
2 確率 0.9882017
case# 4 正解 / 推定 1 / 1 確率 0.99999976
case# 5 正解 / 推定 1 / 1 確率 0.9996736
case# 6 正解 / 推定 1 / 1 確率 1.0
case# 7 正解 / 推定 0 /
1 確率 0.99999845
import csv
import numpy as np
conmat = np.zeros((3, 3))
file = open("wine_predict.csv", "a", newline='')
writer = csv.writer(file)
writer.writerow(["ID", "正解", "推定", "確率"])
for case in range(0, 490):
    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
    writer.writerow([case, corloc, loc, max])
df = pd.read_csv("wine_predict.csv")
df.head()
  ID 正解 推定 確率
0 0 1 1 1
1 1 1 1 0.999894
2 2 1 1 1
3 3 0 0 0.999574
4 4 1 1 1