【问题标题】:Predicting the square root of a number using Machine Learning使用机器学习预测数字的平方根
【发布时间】:2021-06-24 07:18:55
【问题描述】:

我正在尝试在 python 中创建一个程序,该程序使用机器学习来预测数字的平方根。我列出了我在程序中所做的一切:-

  1. 创建了一个包含数字及其正方形的 csv 文件
  2. 从 csv 中提取数据到合适的变量中(X 存储正方形,y 存储数字)
  3. 使用 sklearn 的 StandardScaler 缩放数据
  4. 构建了具有两个隐藏层的 ANN,每个隐藏层 6 个单元(无激活函数)
  5. 使用 SGD 作为优化器和均方误差作为损失函数来编译 ANN
  6. 训练了模型。损失约为 0.063
  7. 尝试过预测,但结果却是另一回事。

我的实际代码:-

import numpy as np
import tensorflow as tf
import pandas as pd

df = pd.read_csv('CSV/SQUARE-ROOT.csv')

X = df.iloc[:, 1].values
X = X.reshape(-1, 1)
y = df.iloc[:, 0].values
y = y.reshape(-1, 1)

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0, test_size=0.2)

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_test_sc = sc.fit_transform(X_test)
X_train_sc = sc.fit_transform(X_train)
sc1 = StandardScaler()
y_test_sc1 = sc1.fit_transform(y_test)
y_train_sc1 = sc1.fit_transform(y_train)

ann = tf.keras.models.Sequential()
ann.add(tf.keras.layers.Dense(units=6))
ann.add(tf.keras.layers.Dense(units=6))
ann.add(tf.keras.layers.Dense(units=1))

ann.compile(optimizer='SGD', loss=tf.keras.losses.MeanSquaredError())

ann.fit(x = X_train_sc, y = y_train_sc1, batch_size=5, epochs = 100)

print(sc.inverse_transform(ann.predict(sc.fit_transform([[144]]))))

输出:- array([[143.99747]], dtype=float32)

输出不应该是 12 吗?为什么它给我错误的结果?

我还附上了我用来训练我的模型的 csv 文件:SQUARE-ROOT.csv

【问题讨论】:

  • 如果你使用机器学习,它不是预测。它正在计算(假设你的训练是正确的)。因为机器学习算法包括“预测”的数学指标,使其本质上是计算。
  • 我还是这个领域的初学者。如果我搞砸了条款,我真的很抱歉:(我认为我的训练是适当的,因为产生的损失很低。我不知道我在这方面是否正确。如果我错了,请纠正我。
  • 不,您使用的术语是准确的。我的意思是机器学习如何在后端工作。对于数学的东西,它计算而不是预测。但是,是的,用于触发它的函数称为“预测”,所以你是对的。

标签: python tensorflow machine-learning keras neural-network


【解决方案1】:

TL;DR:你真的需要那些非线性。

其无法正常工作的原因可能是多种原因之一(或组合),例如输入数据范围错误、数据存在缺陷、过度/欠拟合等。

但是,在这种特定情况下,您构建的模型实际上无法学习您尝试逼近的函数,因为没有非线性使其成为纯线性模型,无法准确近似非线性函数。

一个Dense层实现如下:

x_res = activ_func(w*x + b)

其中x 是层输入,w 是权重,b 是偏置向量,activ_func 是激活函数(如果已定义)。

然后,您的模型在数学上变为(我对三个 Dense 层使用索引 1 到 3):

pred = w3 * (w2 * ( w1 * x + b1 ) + b2 ) + b3
     = w3*w2*w1*x + w3*w2*b1 + w3*b2 + b3

如您所见,生成的模型仍然是线性的。 添加激活函数,您的模式也可以学习非线性函数。从那里,对超参数进行试验,看看模型的性能如何变化。

【讨论】:

    【解决方案2】:

    您的代码不起作用的原因是因为您将fit_transform 应用于您的测试集,这是错误的。您可以通过将fit_transform(test) 替换为transform(test) 来修复它。虽然我不认为StandardScaler是必要的,但请试试这个:

    import numpy as np
    import tensorflow as tf
    import pandas as pd
    from sklearn.preprocessing import StandardScaler
    from sklearn.model_selection import train_test_split
    
    N = 10000
    X = np.arange(1, N).reshape(-1, 1)
    y = np.sqrt(X)
    
    X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0, test_size=0.2)
    
    
    sc = StandardScaler()
    X_train_sc = sc.fit_transform(X_train)    
    #X_test_sc = sc.fit_transform(X_test)      # wrong!!!
    X_test_sc = sc.transform(X_test)
    
    sc1 = StandardScaler()       
    y_train_sc1 = sc1.fit_transform(y_train)    
    #y_test_sc1 = sc1.fit_transform(y_test)   # wrong!!!
    y_test_sc1 = sc1.transform(y_test)
    
    ann = tf.keras.models.Sequential()
    ann.add(tf.keras.layers.Dense(units=32, activation='relu'))    # you have 10000 data, maybe you need a little deeper network
    ann.add(tf.keras.layers.Dense(units=32, activation='relu'))
    ann.add(tf.keras.layers.Dense(units=32, activation='relu'))
    ann.add(tf.keras.layers.Dense(units=1))
    
    ann.compile(optimizer='SGD', loss='MSE')
    ann.fit(x=X_train_sc, y=y_train_sc1, batch_size=32, epochs=100, validation_data=(X_test_sc, y_test_sc1))
    
    #print(sc.inverse_transform(ann.predict(sc.fit_transform([[144]]))))  # wrong!!!
    print(sc1.inverse_transform(ann.predict(sc.transform([[144]]))))
    

    【讨论】:

    • 天啊!你的代码就像魅力一样!我有个疑问。希望你能清除它们。为什么需要引入更深层次的网络?是因为输入的数据少吗?我增加时代而不是增加单位就足够了吗?谢谢你:)
    • 因为你的模型似乎有点欠拟合,所以我建议使用更深的网络。当模型尚未收敛时,增加 epochs 也有效。您可以通过绘制图表来确认它。我的模型也不完美。您需要对其进行微调并尝试不同的参数。
    • 如果发生这种情况,请尝试使用更小的学习率。
    猜你喜欢
    • 2017-06-05
    • 2018-10-08
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    • 2017-05-03
    • 2012-05-30
    • 2019-09-23
    • 2011-10-04
    相关资源
    最近更新 更多