首页 > 解决方案 > 使用机器学习预测数字的平方根

问题描述

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

  1. 创建了一个带有数字及其正方形的 csv 文件
  2. 将 csv 中的数据提取到合适的变量中(X 存储正方形,y 存储数字)
  3. 使用 sklearn 的 StandardScaler 缩放数据
  4. 构建了具有两个隐藏层的人工神经网络,每个隐藏层有 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

标签: pythontensorflowmachine-learningkerasneural-network

解决方案


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

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


推荐阅读