Python 线性模型中不支持将字符串强制转换为浮点

Python 线性模型中不支持将字符串强制转换为浮点,python,tensorflow,model,linearmodels,Python,Tensorflow,Model,Linearmodels,在我的线性模型中,我一直遇到这样的错误: 不支持将字符串强制转换为浮点 具体而言,错误在这一行: results = m.evaluate(input_fn=lambda: input_fn(df_test), steps=1) 如果有帮助,下面是堆栈跟踪: File "tensorflowtest.py", line 164, in <module> m.fit(input_fn=lambda: input_fn(df_train), steps=int(100))

在我的线性模型中,我一直遇到这样的错误:

不支持将字符串强制转换为浮点

具体而言,错误在这一行:

results = m.evaluate(input_fn=lambda: input_fn(df_test), steps=1)
如果有帮助,下面是堆栈跟踪:

 File "tensorflowtest.py", line 164, in <module>
    m.fit(input_fn=lambda: input_fn(df_train), steps=int(100))
  File "/home/computer/.local/lib/python2.7/site-packages/tensorflow/contrib/learn/python/learn/estimators/linear.py", line 475, in fit
    max_steps=max_steps)
  File "/home/computer/.local/lib/python2.7/site-packages/tensorflow/contrib/learn/python/learn/estimators/estimator.py", line 333, in fit
    max_steps=max_steps)
  File "/home/computer/.local/lib/python2.7/site-packages/tensorflow/contrib/learn/python/learn/estimators/estimator.py", line 662, in _train_model
    train_op, loss_op = self._get_train_ops(features, targets)
  File "/home/computer/.local/lib/python2.7/site-packages/tensorflow/contrib/learn/python/learn/estimators/estimator.py", line 963, in _get_train_ops
    _, loss, train_op = self._call_model_fn(features, targets, ModeKeys.TRAIN)
  File "/home/computer/.local/lib/python2.7/site-packages/tensorflow/contrib/learn/python/learn/estimators/estimator.py", line 944, in _call_model_fn
    return self._model_fn(features, targets, mode=mode, params=self.params)
  File "/home/computer/.local/lib/python2.7/site-packages/tensorflow/contrib/learn/python/learn/estimators/linear.py", line 220, in _linear_classifier_model_fn
    loss = loss_fn(logits, targets)
  File "/home/computer/.local/lib/python2.7/site-packages/tensorflow/contrib/learn/python/learn/estimators/linear.py", line 141, in _log_loss_with_two_classes
    logits, math_ops.to_float(target))
  File "/home/computer/.local/lib/python2.7/site-packages/tensorflow/python/ops/math_ops.py", line 661, in to_float
    return cast(x, dtypes.float32, name=name)
  File "/home/computer/.local/lib/python2.7/site-packages/tensorflow/python/ops/math_ops.py", line 616, in cast
    return gen_math_ops.cast(x, base_type, name=name)
  File "/home/computer/.local/lib/python2.7/site-packages/tensorflow/python/ops/gen_math_ops.py", line 419, in cast
    result = _op_def_lib.apply_op("Cast", x=x, DstT=DstT, name=name)
  File "/home/computer/.local/lib/python2.7/site-packages/tensorflow/python/framework/op_def_library.py", line 749, in apply_op
    op_def=op_def)
  File "/home/computer/.local/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 2380, in create_op
    original_op=self._default_original_op, op_def=op_def)
  File "/home/computer/.local/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 1298, in __init__
    self._traceback = _extract_stack()

UnimplementedError (see above for traceback): Cast string to float is not supported
         [[Node: ToFloat = Cast[DstT=DT_FLOAT, SrcT=DT_STRING, _device="/job:localhost/replica:0/task:0/cpu:0"](Reshape_1)]]
文件“tensorflowtest.py”,第164行,在
m、 配合(输入值=lambda:输入值=int(100))
文件“/home/computer/.local/lib/python2.7/site packages/tensorflow/contrib/learn/python/learn/estimators/linear.py”,第475行
最大步数=最大步数)
文件“/home/computer/.local/lib/python2.7/site packages/tensorflow/contrib/learn/python/learn/estimators/estimator.py”,第333行
最大步数=最大步数)
文件“/home/computer/.local/lib/python2.7/site packages/tensorflow/contrib/learn/python/learn/estimators/estimator.py”,第662行,列车模型
训练,损失=自我。获得训练(特征,目标)
文件“/home/computer/.local/lib/python2.7/site packages/tensorflow/contrib/learn/python/learn/estimators/estimator.py”,第963行,在“获取培训”操作中
_,丢失,列车运行=自。\呼叫\型号\ fn(功能、目标、模式键.列车)
文件“/home/computer/.local/lib/python2.7/site packages/tensorflow/contrib/learn/python/learn/estimators/estimator.py”,第944行,在调用模型fn中
返回self.\u model\u fn(特征、目标、模式=模式、参数=self.params)
文件“/home/computer/.local/lib/python2.7/site packages/tensorflow/contrib/learn/python/learn/estimators/linear.py”,第220行,在线性分类器模型中
损失=损失\u fn(后勤、目标)
文件“/home/computer/.local/lib/python2.7/site packages/tensorflow/contrib/learn/python/learn/estimators/linear.py”,第141行,包含两个类
逻辑、数学运算到浮动(目标))
文件“/home/computer/.local/lib/python2.7/site packages/tensorflow/python/ops/math_ops.py”,第661行,在to_float中
返回强制转换(x,dtypes.float32,name=name)
文件“/home/computer/.local/lib/python2.7/site packages/tensorflow/python/ops/math_ops.py”,第616行,在cast中
返回gen_math_ops.cast(x,base_type,name=name)
文件“/home/computer/.local/lib/python2.7/site packages/tensorflow/python/ops/gen_math_ops.py”,第419行,在cast中
结果=_op_def_lib.apply_op(“Cast”,x=x,DstT=DstT,name=name)
文件“/home/computer/.local/lib/python2.7/site packages/tensorflow/python/framework/op_def_library.py”,第749行,在apply_op
op_def=op_def)
文件“/home/computer/.local/lib/python2.7/site packages/tensorflow/python/framework/ops.py”,第2380行,在create_op中
初始值=自身值。\默认值\初始值,初始值=初始值)
文件“/home/computer/.local/lib/python2.7/site packages/tensorflow/python/framework/ops.py”,第1298行,在__
self.\u traceback=\u extract\u stack()
UnimplementedError(回溯见上文):不支持将字符串强制转换为float
[[Node:ToFloat=Cast[DstT=DT_FLOAT,SrcT=DT_STRING,_device=“/job:localhost/replica:0/task:0/cpu:0”](重塑_1)]]
该模型是对和教程的改编。教程代码确实在运行,因此我的TensorFlow安装没有问题

输入CSV是许多二进制分类列形式的数据(
yes
/
no
)。最初,我将每列中的数据表示为0和1,但当我将其更改为
y
s和
n
s时,会得到相同的错误


如何修复此问题?

您不能直接将字符串转换为数字,尤其是“y”、“n”转换为1.0/0.0


如果您有数字字符串(例如“0”),您可以尝试

您的类可能是字符串形式,并且它们需要是数字的(1和0仅适用于本特定教程)

我遇到了完全相同的问题,您需要确保输入模型的输入数据的格式正确。(不仅是特征,还有标签列)

我的问题是我没有跳过数据文件中的第一行,所以我尝试将标题转换为浮点格式

skiprows=1
读取csv时:

df_test = pd.read_csv(test_file, names=COLUMNS_TEST, skipinitialspace=True, skiprows=1, engine="python")
我建议您检查:

df_test.dtypes
你应该得到像这样的东西

Feature1      int64
Feature2      int64
Feature3      int64
Feature4      object
Feature5      object
Feature6      float64
dtype: object

如果您没有获得正确的数据类型,那么model.fit将失败

通常,此错误是因为
m.evaluate
以某种方式为空


由于您是从csv文件加载数据的,所以很可能您的数据在数组中存储为字符串而不是浮点或int。我建议您手动检查以确保。

问题在于,您可能已将该功能指示为真实类型,但在数据框中仍然是字符串,或者在tf.constant中设置时,您没有转换为正确的类型

确认列的类型。您可以只检查类型(df是您的数据帧):

您可以看到所有列和类型,其中一些类似:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 178932 entries, 0 to 178931
Data columns (total 64 columns):
d_prcp                      178932 non-null float64
d_stn                       178932 non-null int64
ws_lat                      178932 non-null float64
ws_lon                      178932 non-null float64
d_year                      178932 non-null int64
d_temp                      178932 non-null float64
...

我正在使用W10、Python3和Tensorflow 1.9

我的代码中的错误源在功能定义中。我有一个布尔特性,默认值为-1,如下所示:

tf.feature_column.categorical_column_with_vocabulary_list( 
    key='partial_funding_indicator', vocabulary_list=['True', 'False'],
    dtype=tf.string, **default_value=-1**, num_oov_buckets=None)
默认值
更改为
0
时,问题没有出现:

tf.feature_column.categorical_column_with_vocabulary_list(
    key='partial_funding_indicator', vocabulary_list=['True', 'False'],
    dtype=tf.string, **default_value=0**, num_oov_buckets=None)

default_value
是要为词汇表外的要素值返回的整数ID值。例如,在值为
['True','False']
的列表/文件中,要使
默认值==True
,它将是
默认值=0
;列表索引。

在代码中的某个地方,您正在使用
tf.cast()
将字符串转换为数字,但您不能这样做。替换为:


当我尝试在不同的数据集上复制这些步骤进行练习时,我遇到了同样的问题

修复起来很简单,只需使用以下代码将目标列的数据类型更改为int

df[“target\u column\u name”]=df[“target\u column\u name”].astype(str).astype(int)


此外,当目标列最初位于数据文件中时,您需要在开始时执行此操作。

问题在于您要创建的文件上有一个标头
tf.feature_column.categorical_column_with_vocabulary_list( 
    key='partial_funding_indicator', vocabulary_list=['True', 'False'],
    dtype=tf.string, **default_value=-1**, num_oov_buckets=None)
tf.feature_column.categorical_column_with_vocabulary_list(
    key='partial_funding_indicator', vocabulary_list=['True', 'False'],
    dtype=tf.string, **default_value=0**, num_oov_buckets=None)
tf.strings.to_number(x, out_type=tf.float32)
df_test.dtypes
,0
' or x = 1 , 1, 0,1
SELECT * FROM USERS WHERE(1 = 1, 1, 0 = 0,0),1