【问题标题】:Linear Regression Neural Network Tensorflow Keras Python program线性回归神经网络 Tensorflow Keras Python 程序
【发布时间】:2021-01-31 11:12:21
【问题描述】:

我写了一个小 《线性回归神经网络Tensorflow Keras Python程序》

输入数据集是 y = mx + c 直线数据。

预测的 y 值不正确,并且给出了水平线类型 值,而不是带有一些斜率的线。

我在带有 tensorflow、Keras 和 Jupyter 笔记本。

请问如何修复这个程序?

感谢和最好的问候, SSJ

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
n2 = 50
count = 20
n4 = n2 + count
p = 100
m = 10
c  = 5
x = np.linspace(n2, n4, p)
y = m * x + c
x
y
plt.scatter(x,y)
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.layers.experimental import preprocessing
x_normalizer = preprocessing.Normalization(input_shape=[1,])
x_normalizer.adapt(x)
x_normalized = x_normalizer(x)
y_normalizer = preprocessing.Normalization(input_shape=[1,])
y_normalizer.adapt(y)
y_normalized = x_normalizer(y)
y_model = tf.keras.Sequential([
    y_normalizer,
    layers.Dense(1)
])
y_model.compile(optimizer='rmsprop', loss='mse', metrics = ['mae'])
y_hist = y_model.fit(x, y, epochs=100, verbose=0, validation_split = 0.2)
hist = pd.DataFrame(y_hist.history)
hist['epoch'] = y_hist.epoch
hist.head()
hist.tail()
xin = [51,53,59,64]
ypred = y_model.predict(xin)
ypred
plt.scatter(x, y)
plt.scatter(xin, ypred, color = 'r')
plt.grid(linestyle = '--')

【问题讨论】:

    标签: python tensorflow keras


    【解决方案1】:

    使用 StandardScaler 代替 Normalization

    Normalizer 按行执行,StandardScaler 按列执行。 归一化器不会通过偏差去除均值和比例,而是比例 整行到单位范数。

    在这里找到:Difference between StandardScaler and Normalizer

    这是处理数据的方式:

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    from tensorflow.keras import Sequential
    from tensorflow.keras.layers import Dense
    from sklearn.preprocessing import StandardScaler
    x = np.linspace(50, 70, 100).reshape(-1, 1)
    y = 10 * x + 5
    x_standard_scaler = StandardScaler().fit(x)
    y_standard_scaler = StandardScaler().fit(y)
    x_scaled = x_standard_scaler.transform(x)
    y_scaled = y_standard_scaler.transform(y)
    

    请记住,对于 x 和 y,您需要两个单独的缩放器,因此不要为此使用相同的对象。此外,如果您想使用该缩放器来处理新数据以进行测试,请将缩放器保存在某个变量中。一个好的做法是不要在测试数据上重新调整缩放器。

    model = Sequential([
        Dense(1, input_dim=1, activation='linear'),
    ])
    model.compile(optimizer='rmsprop', loss='mse')
    history = model.fit(x_scaled, y_scaled, epochs=1000, verbose=0, validation_split = 0.2).history
    pd.DataFrame(history).plot()
    plt.show()
    

    如您所见,模型正在收敛。绘制损失历史是值得的,这有助于判断您的模型是否正在学习。

    x_test = np.linspace(20, 100, 10).reshape(-1, 1)
    y_test = 10 * x_test + 5
    x_test_scaled = x_standard_scaler.transform(x_test)
    y_test_scaled = y_standard_scaler.transform(y_test)
    

    如果您有要用于验证或只是预测的测试数据,请记住再次使用标准缩放器,但不要拟合。它应该只在大多数情况下适合训练数据。

    y_test_pred_scaled = model.predict(x_test_scaled)
    y_test_pred = y_standard_scaler.inverse_transform(y_test_pred_scaled)
    plt.scatter(x_test, y_test, s=30, label='true')
    plt.scatter(x_test, y_test_pred, s=15, label='pred')
    plt.legend()
    plt.show()
    

    如果您想将预测重新调整到其原始范围,请使用inverse_transform。请注意,重新缩放后对x_test 的预测非常接近y_test

    【讨论】: