【问题标题】:How can i feed multiple arrays to a keras machine learning algorithm?如何将多个数组提供给 keras 机器学习算法?
【发布时间】:2020-12-31 23:19:28
【问题描述】:

我正计划制作一个保费费用预测器,它根据包括性别、性别、BMI 等在内的多个因素来预测您的保险费。(总共 6 个)我有数据,但我不知道如何向它提供多个数组。 这是代码-

import tensorflow as tf
import numpy as np
from tensorflow import keras
import pandas as pd
a=0
file=pd.read_csv(r"""C:\Users\lavni\OneDrive\Desktop\proj.csv""",sep=',')
Age=pd.DataFrame(file,columns=['age']).to_numpy()
Sex=pd.DataFrame(file,columns=['sex']).to_numpy()
BMI=pd.DataFrame(file,columns=['bmi']).to_numpy()
Children=pd.DataFrame(file,columns=['children']).to_numpy()
Smoker=pd.DataFrame(file,columns=['smoker']).to_numpy()
Region=pd.DataFrame(file,columns=['region']).to_numpy()
Charges=pd.DataFrame(file,columns=['charges']).to_numpy()

Data=[Age,Sex,BMI,Children,Smoker,Region]

model=keras.Sequential([keras.layers.Dense(units=6,input_shape=[6])])
model.compile(optimizer='sgd',loss='mean_squared_error')

model.fit(Data,Charges)

运行时,它给了我以下错误:

    ValueError: Layer sequential expects 1 inputs, but it received 6 input tensors. Inputs received: [<tf.Tensor 'IteratorGetNext:0' shape=(None, 1) dtype=int64>, <tf.Tensor 'IteratorGetNext:1' shape=(None, 1) dtype=string>, <tf.Tensor 'IteratorGetNext:2' shape=(None, 1) dtype=float32>, <tf.Tensor 'IteratorGetNext:3' shape=(None, 1) dtype=int64>, <tf.Tensor 'IteratorGetNext:4' shape=(None, 1) dtype=string>, <tf.Tensor 'IteratorGetNext:5' shape=(None, 1) dtype=string>]

我理解这个错误,对它进行了一些研究,我知道它需要是一个元组,但尽管改变了它,它仍然给出了同样的错误。

提前致谢。

【问题讨论】:

    标签: python pandas dataframe tensorflow keras


    【解决方案1】:

    这里有几个问题, 首先,不要使用pd.DataFrame 从文件中加载单列数据(一维数据)。如果您只需要读取单个列,请使用pd.read_csv,可以选择使用squeeze 参数。

    接下来,您不能使用 python 列表对多个输入进行分组,您必须使用元组,如下所示:

    Data = (a,b,c,d) # Not [a,b,c,d]
    

    否则,keras 模型将尝试输入您的数据集 a 然后 b 等等,而不是 [a[0], b[0], ...]。这似乎是您的目标。

    接下来,在您的特定情况下,您似乎不需要多输入 keras 模型。您所需要的只是第一层上的有效input_shape。这就是模特抱怨的原因。它需要一个输入,而您正试图插入其中的 6 个。将输入转换为单个数组,如

    data = dataframe.to_numpy() #dataframe must have 6 columns!
    targets = targets.to_numpy() #single column
    ...
    model.fit(data,targets)
    
    

    使用此信息更新您的代码,并在出现其他问题时询问我。
    干杯!

    【讨论】:

    • 非常感谢,我已将代码更改为您的要求,但我现在得到的错误是ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type int). 模型结构代码为model.add(keras.layers.Dense(units=6, input_shape=(6,))),数组列表之一为@987654333 @
    【解决方案2】:

    这样写:

    model = keras.Sequential()
    model.add(keras.layers.Dense(units=6, input_shape=(6,)))
    model.add(keras.layers.Dense(units=?))
    

    最后一层是输出层(因为我不知道你的输出是什么样子我无法定义单位。)

    还有一个快速提示,您可以通过编写如下代码来减少代码大小:

    import tensorflow as tf
    import numpy as np
    from tensorflow import keras
    import pandas as pd
    a=0
    file = pd.read_csv(r"""C:\Users\lavni\OneDrive\Desktop\proj.csv""",sep=',')
    Charges = file['charges'].to_numpy()
    
    features = ['age', 'sex', 'bmi', 'children', 'smoker', 'region']
    Data = file[features].to_numpy()
    # it will convert all of your features into a numpy array
    
    model = keras.Sequential()
    model.add(keras.layers.Dense(units=6, input_shape=(6,)))
    model.compile(optimizer='sgd',loss='mean_squared_error')
    
    model.fit(Data,Charges)
    

    【讨论】:

    • 如果不查看您的数据集,很难说更多。我不知道你的输出数据是什么样的,所以如果你能发布数据集的链接会更好。
    • 当然可以,我找不到完全相同的链接,但这是一个涉及使用它的项目。 link
    猜你喜欢
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 2019-05-25
    • 2017-12-31
    • 2019-05-02
    • 2012-03-14
    • 2015-10-06
    相关资源
    最近更新 更多