使用TensorFlow 2.0创建机器学习模型需要帮助

我是机器学习和Python的新手。我已经成功地使用TensorFlow 2训练了一个线性模型。我使用了sklearn下的preprocessing.scale()函数标准化了输入数据。

问题在于我的测试数据的预测输出与实际目标值相差很大。我使用的是单层模型,优化器使用sgd,损失函数使用mean_squared_error,度量指标使用accuracy

训练数据包含4个参数和一个目标值(273.39,420.12,91.84,57.41,1778.12)。最后一列是目标值。

我的模型预测输出与实际目标值的对比图完全不是线性的,如下图所示。

Output Vs Target Plot

import numpy as npimport tensorflow as tfimport matplotlib.pyplot as pltfrom sklearn import preprocessing# Extract Data from CSVtrain_csv_data = np.loadtxt('train_data.csv',delimiter=',')test_csv_data = np.loadtxt('test_data.csv',delimiter=',')train_unscaled_input_all = train_csv_data[:,0:-1]train_target_all = train_csv_data[:,-1]# Shuffling the inputshuffled_indices = np.arange(train_unscaled_input_all.shape[0])np.random.shuffle(shuffled_indices)shuffled_inputs = train_unscaled_input_all[shuffled_indices]shuffled_targets = train_target_all[shuffled_indices]# Split date into train , validation and testtotal_count = shuffled_inputs.shape[0]train_data_count = int (0.8*total_count)validation_data_count = int (0.1*total_count)test_data_count = total_count - train_data_count - validation_data_counttrain_inputs = shuffled_inputs[:train_data_count]train_targets = shuffled_targets[:train_data_count]validation_inputs = shuffled_inputs[train_data_count:train_data_count+validation_data_count]validation_targets =             shuffled_targets[train_data_count:train_data_count+validation_data_count]test_inputs = shuffled_inputs[train_data_count+validation_data_count:]test_targets = shuffled_targets[train_data_count+validation_data_count:]# Standardize the Inputstrain_inputs = preprocessing.scale(train_inputs)train_targets = preprocessing.scale(train_targets)validation_inputs = preprocessing.scale(validation_inputs)validation_targets = preprocessing.scale(validation_targets)# Save 3 Datasets in .npznp.savez('train',inputs = train_inputs, targets = train_targets)np.savez('validation',inputs = validation_inputs, targets = validation_targets)np.savez('test',inputs = test_inputs, targets = test_targets)train_npz = np.load('train.npz')train_inputs = train_npz['inputs']train_targets = train_npz['targets']validation_npz = np.load('validation.npz')validation_inputs = validation_npz['inputs']validation_targets = validation_npz['targets']test_npz = np.load('test.npz')test_inputs = test_npz['inputs']test_targets = test_npz['targets']# Model Creationoutput_size = 1model = tf.keras.Sequential([                                                      tf.keras.layers.Dense(output_size)                      ])model.compile(optimizer='sgd', loss='mean_squared_error',metrics=['accuracy'])max_epochs = 50model.fit(train_inputs,train_targets, epochs = max_epochs, validation_data= .    (validation_inputs,validation_targets), verbose=1 )predicted_outputs = (model.predict_on_batch(test_inputs))plt.plot(np.squeeze(predicted_outputs),np.squeeze(test_targets))plt.xlabel('Output')plt.ylabel('Target')plt.show()

我的训练和验证准确率在整个训练过程中都为零。显然我在这里遗漏了某些东西。如果你能指出我在训练这个线性模型时遗漏了什么,那将是非常好的。

更新:训练模型


回答:

感谢你附上数据。现在我已经了解了你的问题。

我能够用你的代码重现这个问题。

你现有代码存在以下问题:

  1. 你对训练和验证数据进行了preprocessing.scale处理,但没有对测试数据集进行处理。因此,测试数据的值与用于训练的值非常不同。这将无法有效工作。所以你也需要对测试数据集进行预处理。
  2. 你没有隐藏单元,正如@[隐藏人名]已经指出的那样,这就像一个感知器。你需要添加隐藏单元来显示一些改进。
  3. plt中你使用了plt.plot。我建议你使用plt.scatter,因为图片会更有意义且不那么混乱。
  4. 你使用了accuracy作为度量指标。由于你不是在做分类而是回归,我认为mae会是一个更好的度量指标。

当你加入这些更改后,你可以得到如下(最小的更改)的代码:

import numpy as npimport tensorflow as tfimport matplotlib.pyplot as pltfrom sklearn import preprocessing# Extract Data from CSVtrain_csv_data = np.loadtxt('train_data.csv',delimiter=',')test_csv_data = np.loadtxt('test_data.csv',delimiter=',')train_unscaled_input_all = train_csv_data[:,0:-1]train_target_all = train_csv_data[:,-1]# Shuffling the inputshuffled_indices = np.arange(train_unscaled_input_all.shape[0])np.random.shuffle(shuffled_indices)shuffled_inputs = train_unscaled_input_all[shuffled_indices]shuffled_targets = train_target_all[shuffled_indices]# Split date into train , validation and testtotal_count = shuffled_inputs.shape[0]train_data_count = int (0.8*total_count)validation_data_count = int (0.1*total_count)test_data_count = total_count - train_data_count - validation_data_counttrain_inputs = shuffled_inputs[:train_data_count]train_targets = shuffled_targets[:train_data_count]validation_inputs = shuffled_inputs[train_data_count:train_data_count+validation_data_count]validation_targets = shuffled_targets[train_data_count:train_data_count+validation_data_count]test_inputs = shuffled_inputs[train_data_count+validation_data_count:]test_targets = shuffled_targets[train_data_count+validation_data_count:]# Standardize the Inputstrain_inputs = preprocessing.scale(train_inputs)train_targets = preprocessing.scale(train_targets)validation_inputs = preprocessing.scale(validation_inputs)validation_targets = preprocessing.scale(validation_targets)test_inputs = preprocessing.scale(test_inputs)test_targets = preprocessing.scale(test_targets)# Save 3 Datasets in .npznp.savez('train',inputs = train_inputs, targets = train_targets)np.savez('validation',inputs = validation_inputs, targets = validation_targets)np.savez('test',inputs = test_inputs, targets = test_targets)train_npz = np.load('train.npz')train_inputs = train_npz['inputs']train_targets = train_npz['targets']validation_npz = np.load('validation.npz')validation_inputs = validation_npz['inputs']validation_targets = validation_npz['targets']test_npz = np.load('test.npz')test_inputs = test_npz['inputs']test_targets = test_npz['targets']# Model Creationoutput_size = 1model = tf.keras.Sequential()model.add(tf.keras.layers.Dense(1000, input_dim=4, activation='linear'))model.add(tf.keras.layers.Dense(1, activation='linear'))model.compile(optimizer='sgd', loss='mean_squared_error',metrics=['mae'])max_epochs = 50model.fit(train_inputs,train_targets, epochs = max_epochs, validation_data= (validation_inputs,validation_targets), verbose=1 )predicted_outputs = (model.predict_on_batch(test_inputs))plt.scatter(np.squeeze(predicted_outputs),np.squeeze(test_targets))plt.xlabel('Output')plt.ylabel('Target')plt.show()

这会生成以下图表,图表非常线性,预测值与实际预处理值之间有很好的相关性。你需要进行某种逆变换将它们转换回原始值。

enter image description here

在训练过程中,损失和mae在一定程度上有所减少

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注