PyLearn ML Ex 01 ニューラルネットワーク(答え)

下記の知識を確認します。

  • 分類問題を解くのニューラルネットワークが組める
  • 回帰問題を解くのニューラルネットワークが組める

準備

まずは、以下のコードをコピペしてください。

In [1]:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.neural_network import MLPClassifier
from sklearn.neural_network import MLPRegressor
from sklearn.metrics import mean_squared_error

dat = np.zeros([20, 3])

# 販売数
dat[:, 0] = [10, 20, 30, 40, 50, 
             60, 70, 80, 90, 100, 
             110, 120, 130, 140, 150, 
             160, 170, 180, 190, 200]

# ネガティブな口コミ数
dat[:, 1] = [24, 31, 19, 22, 33,
            17, 21, 16, 19, 18,
            11, 13, 32, 14, 12,
            9, 8, 14, 3, 1]

# ポジティブな口コミ数
dat[:, 2] = [3, 4, 8, 5, 2,
            12, 15, 17, 14, 9,
            19, 18, 14, 17, 20,
            22, 19, 18, 8, 23]

今の状況

Aさんは、卒業研究のため、商品のオンライン販売に興味を持ち、Webページ上で売れる商品にはどのような特徴があるのか調べようとしました。このため、まず、商品が売れる、売れないには、

  • ネガティブな口コミ数
  • ポジティブな口コミ数

この2つが影響を持つと考えました。このため、2020年に発売されたイヤホンを20製品調べ、その販売数とともに、口コミ数を集めました。これを、numpy配列に格納しています。データは以下のように格納されています。

  • dat[i, 0] -> 製品iの販売数
  • dat[i, 1] -> 製品iのネガティブな口コミ数
  • dat[i, 2] -> 製品iのポジティブな口コミ数

問題1.

  • 販売数の平均値を求めてください。
  • 平均値以上を「売れる」、平均値未満を「売れない」とするリストを作ってください。
  • 「ネガティブな口コミ数、ポジティブな口コミ数」から、「売れる・売れない」のラベルを予測するニューラルネットワークを構築してください。分類問題となります。
  • 集めたデータの正答率をだし、95%以上のモデルを作成してください。
  • ネガティブな口コミ数が10, ポジティブな口コミ数が15の製品の販売数を予測してください。

問題2.

  • 「ネガティブな口コミ数、ポジティブな口コミ数」から、「販売数」を実数として予測するニューラルネットワークを構築してください。回帰問題となります。

  • この際、Lossを表示するグラフも描画してください。

  • MSEが高いほうが良いか、低いほうが良いか、考えてください。

  • 集めたデータのMSEを算出し、これが1500未満のモデルを作成してください。

  • ネガティブな口コミ数が10, ポジティブな口コミ数が15の製品の販売数を予測してください。

答え

In [2]:
### 問題1の答え

# データの整理
X = dat[:, 1:]
Y = []
for i in range(len(dat[:, 0])):
    if dat[i, 0] >= np.mean(dat[:, 0]):
        Y.append("売れる")
    else: 
        Y.append("売れない")


# ニューラルの定義 & 学習
NNcr = MLPClassifier(
    hidden_layer_sizes=(3, ), #中間層の次元数
    max_iter=5000, # 学習回数
    learning_rate_init=0.01, # 学習係数
    random_state=0, # 乱数シード
    verbose=False # 学習過程の可視化 True: 可視化する、False: 可視化しない
)
NNcr.fit(X, Y)

# Loss可視化
loss = NNcr.loss_curve_
plt.plot(loss)
plt.ylabel("Loss")
plt.xlabel("Iteration")
plt.grid()

# 正答率算出
c = 0
for i in range(len(Y)):
    x1 = X[i, 0]
    x2 = X[i, 1]
    temp = NNcr.predict([[x1, x2]])
    if temp == Y[i]:
        c = c + 1
print("正答率: ", c/len(Y))

# 予測
a = NNcr.predict([[10, 15]])
print("予測結果: ", a)
正答率:  1.0
予測結果:  ['売れる']
In [3]:
### 問題2の答え

# データ整理
X = dat[:, 1:]
Y = dat[:, 0]

# ニューラルの定義 & 学習
NNreg = MLPRegressor(
    hidden_layer_sizes=(5, ), #中間層の次元数
    max_iter=15000, # 学習回数
    learning_rate_init=0.001, # 学習係数
    random_state=0, # 乱数シード
    verbose=False # 学習過程の可視化 True: 可視化する、False: 可視化しない
)
NNreg.fit(X, Y)

loss = NNreg.loss_curve_
plt.plot(loss)
plt.ylabel("Loss")
plt.xlabel("Iteration")
plt.grid()

# MSE算出
Ypred = []
for i in range(len(Y)):
    x1 = X[i, 0]
    x2 = X[i, 1]
    temp = NNreg.predict([[x1, x2]])
    Ypred.append(temp)

mse = mean_squared_error(Ypred, Y)
print("MSE: ", mse)
a = NNreg.predict([[10, 15]])
print("予測結果", a)
MSE:  1132.228969426022
予測結果 [132.15884226]