신경망으로 회귀를 하고 신장 +3 사이즈로 섹시 여배우의 컵수를 추정

소개



마지막 htps : // 이 m / 루테시 _ 해 _ 하고있다 /
계속됩니다.
전회는 NN로 분류를 실시해 추정시키고 있었습니다만, 정밀도가 나빴기 때문에, 이번은 회귀로 추정을 실시했습니다.

환경



전회와 같습니다.

사용 데이터



전회 및 선행 연구와 같습니다.
※ 선행 연구 ... htps : // m / kd mgs 110 / ms / 593b9 A2A 270734d06070

덧붙여서, cup에서 cup num을 낳는 가공을 실시해, 이하와 같은 데이터로 하고 있습니다. (실은 전회도입니다만)


코드 전체 이미지



code
import pandas as pd

df = pd.read_csv('dataset.csv')

# 確認
df.head(3)

# 教師データ(cupnum列)
t = df.iloc[:, 6]

# 入力変数(3~6番目)
x = df.iloc[:, 2:6]

# 確認
t.head(3)

# 確認
x.head(3)

# Numpyにデータ型を変換
# 回帰バージョン
tn = (t.values - 1).reshape(t.size,1).astype('float32')
xn = x.values.astype('float32')

# 確認
tn.dtype

# 確認
tn

# 確認
xn.dtype

# 確認
xn

import chainer
import chainer.links as L
import chainer.functions as F

class NN(chainer.Chain):

    # モデルの構造を明示
    def __init__(self):
        super().__init__()
        with self.init_scope():
            self.l1 = L.Linear(4, 4)
            self.l2 = L.Linear(4, 4)
            self.l3 = L.Linear(4, 1)

    # 順伝播
    def __call__(self, x):
        u1 = self.l1(x)
        z1 = F.relu(u1)
        u2 = self.l2(z1)
        z2 = F.relu(u2)
        u3 = self.l3(z2)
        return u3

import numpy as np

# 再現性確保のためシードを固定
np.random.seed(1)

# NNモデルをインスタンス化
model = NN()

from chainer import optimizers

# 最適化にはAdamを使用
optimizer = optimizers.Adam()
optimizer.setup(model) # modelと紐付ける

# 損失関数の計算
#   損失関数には自乗誤差(MSE)を使用
def forward(x, y, model):
    t = model.__call__(x)
    loss = F.mean_squared_error(t, y)
    return loss


# パラメータの学習を繰り返す
results = []
for i in range(0,30000):
    loss = forward(xn, tn, model)
    print(loss.data)  # 現状のMSEを表示
    results.append(loss.data)
    optimizer.update(forward, xn, tn, model)

# 学習完了

# 誤差の推移をプロットしインライン表示
import matplotlib.pyplot as plt
%matplotlib inline
plt.yscale("log")
plt.xscale("log")
plt.plot(results)
plt.show()

# 予測 数値の見方:1 = Aカップ、2 = Bカップ… 5 = Eカップ… 
# Rioさん(C cup)
xq = np.array([[154,84,58,83]], 'f')
t1 = model.__call__(xq)+1
print(t1)
# variable([[ 4.11120224]])

# 蒼井そらさん(G cup)
xq = np.array([[155,90,58,83]], 'f')
t1 = model.__call__(xq)+1
print(t1)
# variable([[ 5.91459274]])

# 石原莉奈さん(C cup)
xq = np.array([[155,85,56,84]], 'f')
t1 = model.__call__(xq)+1
print(t1)
# variable([[ 4.56367683]])

# 野中あんりさん(A cup)
xq = np.array([[154,74,56,84]], 'f')
t1 = model.__call__(xq)+1
print(t1)
# variable([[ 2.42423582]])

# さくら柚木さん(K cup)
xq = np.array([[157,115,68,94]], 'f')
t1 = model.__call__(xq)+1
print(t1)
# variable([[ 12.39152241]])

기법



학습은 4층 신경망에서 실시합니다. 복잡한 모델이 더 적합한가… 라고 생각해, 전회의 3층으로부터 1층 늘려 보았습니다.

결과



정밀도



오류의 변화를 아래에 플롯합니다. 10000회를 지났을 무렵부터 안정되어 있는 것을 볼 수 있습니다. 덧붙여 이번은 모든 데이터를 학습 대상으로 했습니다.


예측 정보



예측 결과는 코드 내에 나타내고 있으므로, 여기에서의 재게재는 생략하겠습니다.

고찰



전회, 「학습에 회귀가 아니라 분류를 이용한 것이 정밀도 저하의 주인인가」라고 접했습니다만, 대체로 그대로라고 생각됩니다.

소감



예측치가 의외로 가까운 값을 나타냈습니다. 과연, 완벽하게 예측하는 것은 불가능하기 때문에, 이 정도가 세키의 산일지도 모릅니다.

끝까지 교제해 주셔서 감사합니다.

좋은 웹페이지 즐겨찾기