Python 具有不同数据集属性错误的Tensorflow宽深模型
我正在用Kaggle训练一个宽而深的模型。该代码与教程中给出的代码非常相似。我只是在更改用于建模的数据 我使用的代码如下所示:Python 具有不同数据集属性错误的Tensorflow宽深模型,python,machine-learning,tensorflow,neural-network,deep-learning,Python,Machine Learning,Tensorflow,Neural Network,Deep Learning,我正在用Kaggle训练一个宽而深的模型。该代码与教程中给出的代码非常相似。我只是在更改用于建模的数据 我使用的代码如下所示: """Example code for TensorFlow Wide & Deep Tutorial using TF.Learn API.""" from __future__ import absolute_import from __future__ import division from __future__ import print_functio
"""Example code for TensorFlow Wide & Deep Tutorial using TF.Learn API."""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import argparse
import shutil
import sys
import tempfile
import pandas as pd
from six.moves import urllib
import tensorflow as tf
CSV_COLUMNS = [
'Store', 'DayOfWeek', 'Sales', 'Customers', 'Open', 'Promo',
'StateHoliday', 'SchoolHoliday', 'StoreType', 'Assortment',
'CompetitionDistance', 'trend', 'Max_TemperatureC', 'Mean_TemperatureC',
'Min_TemperatureC', 'Max_Humidity', 'Mean_Humidity', 'Min_Humidity'
]
StateHoliday = tf.feature_column.categorical_column_with_vocabulary_list(
"StateHoliday", ["True", "False"])
StoreType = tf.feature_column.categorical_column_with_vocabulary_list(
"StoreType", ['c', 'a', 'd', 'b'])
Assortment = tf.feature_column.categorical_column_with_vocabulary_list(
"Assortment", ['c', 'a', 'b'])
CompetitionDistance = tf.feature_column.categorical_column_with_hash_bucket(
"CompetitionDistance", hash_bucket_size=1000)
Customers = tf.feature_column.categorical_column_with_hash_bucket(
"Customers", hash_bucket_size=1000)
Store = tf.feature_column.categorical_column_with_hash_bucket(
"Store", hash_bucket_size=1000)
trend = tf.feature_column.numeric_column("trend")
Max_TemperatureC = tf.feature_column.numeric_column("Max_TemperatureC")
Mean_TemperatureC = tf.feature_column.numeric_column("Mean_TemperatureC")
Min_TemperatureC = tf.feature_column.numeric_column("Min_TemperatureC")
Max_Humidity = tf.feature_column.numeric_column("Max_Humidity")
Mean_Humidity = tf.feature_column.numeric_column("Mean_Humidity")
Min_Humidity = tf.feature_column.numeric_column("Min_Humidity")
crossed_columns = [
tf.feature_column.crossed_column(
["Assortment", "StoreType"], hash_bucket_size=1000)
]
deep_columns = [
tf.feature_column.indicator_column("DayOfWeek"),
tf.feature_column.indicator_column("Open"),
tf.feature_column.indicator_column("Promo"),
tf.feature_column.indicator_column("StateHoliday"),
tf.feature_column.indicator_column("SchoolHoliday"),
tf.feature_column.indicator_column("StoreType"),
tf.feature_column.indicator_column("Assortment"),
# To show an example of embedding
tf.feature_column.embedding_column("CompetitionDistance", dimension=8),
tf.feature_column.embedding_column("Customers", dimension=8),
tf.feature_column.embedding_column("Store", dimension=8),
trend,
Max_TemperatureC,
Mean_TemperatureC,
Min_TemperatureC,
Max_Humidity,
Mean_Humidity,
Min_Humidity
]
def build_estimator(model_dir):
"""Build an estimator."""
m = tf.estimator.DNNLinearCombinedClassifier(
model_dir=model_dir,
linear_feature_columns=crossed_columns,
dnn_feature_columns=deep_columns,
dnn_hidden_units=[100, 50])
return m
def input_fn(data_file, num_epochs, shuffle):
df_data = pd.read_csv(
"D:/Rossmann/Rossmann_Data/" + data_file + ".csv",
names=CSV_COLUMNS,
skipinitialspace=True,
engine="python",
skiprows=1)
# remove NaN elements
df_data = df_data.dropna(how="any", axis=0)
print(df_data.dtypes)
df_data = df_data.sort(['Sales'], ascending=[True])
labels = df_data["Sales"].apply(lambda x: 1 if x >= 20000 else 0)
return tf.estimator.inputs.pandas_input_fn(
x=df_data,
y=labels,
batch_size=100,
num_epochs=num_epochs,
shuffle=shuffle,
num_threads=5)
model_dir = "D:/Rossmann/Rossmann_Data"
m = build_estimator(model_dir)
m.train(
input_fn=input_fn("df1", num_epochs=None, shuffle=True),
steps=2000)
但不幸的是,我得到了以下错误
Traceback (most recent call last):
File "timeSeriesPredictionUsingEmbedding2.py", line 121, in <module>
steps=2000)
File "C:\Program Files\Anaconda3\lib\site-packages\tensorflow\python\estimator\estimator.py", line 241, in train
loss = self._train_model(input_fn=input_fn, hooks=hooks)
File "C:\Program Files\Anaconda3\lib\site-packages\tensorflow\python\estimator\estimator.py", line 630, in _train_model
model_fn_lib.ModeKeys.TRAIN)
File "C:\Program Files\Anaconda3\lib\site-packages\tensorflow\python\estimator\estimator.py", line 615, in _call_model_fn
model_fn_results = self._model_fn(features=features, **kwargs)
File "C:\Program Files\Anaconda3\lib\site-packages\tensorflow\python\estimator\canned\dnn_linear_combined.py", line 395, in _model_fn
config=config)
File "C:\Program Files\Anaconda3\lib\site-packages\tensorflow\python\estimator\canned\dnn_linear_combined.py", line 156, in _dnn_linear_combined_model_fn
feature_columns=dnn_feature_columns)
File "C:\Program Files\Anaconda3\lib\site-packages\tensorflow\python\feature_column\feature_column.py", line 207, in input_layer
_check_feature_columns(feature_columns)
File "C:\Program Files\Anaconda3\lib\site-packages\tensorflow\python\feature_column\feature_column.py", line 1662, in _check_feature_columns
if column.name in name_to_column:
File "C:\Program Files\Anaconda3\lib\site-packages\tensorflow\python\feature_column\feature_column.py", line 2453, in name
return '{}_indicator'.format(self.categorical_column.name)
AttributeError: 'str' object has no attribute 'name'
回溯(最近一次呼叫最后一次):
文件“timeSeriesPredictionUsingEmbedding2.py”,第121行,在
步骤=2000)
文件“C:\Program Files\Anaconda3\lib\site packages\tensorflow\python\estimator\estimator.py”,第241行,列车中
损耗=自身。\列车\模型(输入\ fn=输入\ fn,挂钩=挂钩)
文件“C:\Program Files\Anaconda3\lib\site packages\tensorflow\python\estimator\estimator.py”,第630行,列车模型
模型_fn_lib.ModeKeys.TRAIN)
文件“C:\Program Files\Anaconda3\lib\site packages\tensorflow\python\estimator\estimator.py”,第615行,在调用模型中
模型\结果=自身。\模型\结果(特征=特征,**kwargs)
文件“C:\Program Files\Anaconda3\lib\site packages\tensorflow\python\estimator\canted\dnn\u linear\u combined.py”,第395行,在模型中
config=config)
文件“C:\Program Files\Anaconda3\lib\site packages\tensorflow\python\estimator\canted\dnn\u linear\u combined.py”,第156行,在\u dnn\u linear\u combined\u model\u fn中
要素列=dnn要素列)
文件“C:\Program Files\Anaconda3\lib\site packages\tensorflow\python\feature\u column\feature\u column.py”,第207行,输入层
_检查功能列(功能列)
文件“C:\Program Files\Anaconda3\lib\site packages\tensorflow\python\feature\u column\feature\u column.py”,第1662行,在\u check\u feature\u columns中
如果名称\u至\u列中的column.name:
文件“C:\Program Files\Anaconda3\lib\site packages\tensorflow\python\feature\u column\feature\u column.py”,第2453行,名称为
返回“{}”指示符。格式(self.categorical\u column.name)
AttributeError:“str”对象没有属性“name”
你能告诉我这个错误在哪里吗?当我运行你的代码时,它工作得很好
谢谢 原因是接受分类列实例,而不是列名(“DayOfWeek”、“Open”等)。可能这个API在以前的tf版本中看起来有所不同,我不确定,但现在您必须创建一个分类列*
,然后用一个指示符包装
顺便说一句,我看到您正在使用DataFrame.sort
-此方法已被弃用,不再适用于最新的pandas
。使用对值进行排序
更新
我没有注意到代码是a的改编,这就是为什么它故意使用所有可能的特性类型,散列,嵌入,跨列。通常,人们不必同时使用所有这些数据,特别是对于Rossmann数据来说,这是不必要的。例如,如果您注意到数据中的特征相关性,您可以进一步添加交叉列,但首先,数据主要是数字列
s,很少是带有词汇表的分类列
s
以下是此代码的完整版本:
"""Example code for TensorFlow Wide & Deep Tutorial using TF.Learn API."""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import pandas as pd
import tensorflow as tf
CSV_COLUMNS = [
'Store', 'DayOfWeek', 'Sales', 'Customers', 'Open', 'Promo',
'StateHoliday', 'SchoolHoliday', 'StoreType', 'Assortment',
'CompetitionDistance', 'trend', 'Max_TemperatureC', 'Mean_TemperatureC',
'Min_TemperatureC', 'Max_Humidity', 'Mean_Humidity', 'Min_Humidity'
]
Store = tf.feature_column.numeric_column("Store")
DayOfWeek = tf.feature_column.numeric_column("DayOfWeek")
Customers = tf.feature_column.numeric_column("Customers")
Open = tf.feature_column.numeric_column("Open")
Promo = tf.feature_column.numeric_column("Promo")
StateHoliday = tf.feature_column.categorical_column_with_vocabulary_list("StateHoliday", ["True", "False"])
SchoolHoliday = tf.feature_column.numeric_column("SchoolHoliday")
StoreType = tf.feature_column.categorical_column_with_vocabulary_list("StoreType", ['a', 'b', 'c', 'd'])
Assortment = tf.feature_column.categorical_column_with_vocabulary_list("Assortment", ['a', 'b', 'c'])
CompetitionDistance = tf.feature_column.numeric_column("CompetitionDistance")
trend = tf.feature_column.numeric_column("trend")
Max_TemperatureC = tf.feature_column.numeric_column("Max_TemperatureC")
Mean_TemperatureC = tf.feature_column.numeric_column("Mean_TemperatureC")
Min_TemperatureC = tf.feature_column.numeric_column("Min_TemperatureC")
Max_Humidity = tf.feature_column.numeric_column("Max_Humidity")
Mean_Humidity = tf.feature_column.numeric_column("Mean_Humidity")
Min_Humidity = tf.feature_column.numeric_column("Min_Humidity")
deep_columns = [
Store,
DayOfWeek,
Customers,
Open,
Promo,
tf.feature_column.indicator_column(StateHoliday),
SchoolHoliday,
tf.feature_column.indicator_column(StoreType),
tf.feature_column.indicator_column(Assortment),
CompetitionDistance,
trend,
Max_TemperatureC,
Mean_TemperatureC,
Min_TemperatureC,
Max_Humidity,
Mean_Humidity,
Min_Humidity
]
def build_estimator(model_dir):
"""Build an estimator."""
return tf.estimator.DNNLinearCombinedClassifier(
model_dir=model_dir,
dnn_feature_columns=deep_columns,
dnn_hidden_units=[100, 50])
def input_fn(data_file, num_epochs, shuffle):
df_data = pd.read_csv(data_file + ".csv",
names=CSV_COLUMNS,
dtype={"StateHoliday": str},
skipinitialspace=True,
engine="python",
skiprows=1)
# remove NaN elements
df_data = df_data.dropna(how="any", axis=0)
df_data = df_data.sort_values(['Sales'], ascending=[True])
labels = df_data["Sales"].apply(lambda x: 1 if x >= 20000 else 0)
return tf.estimator.inputs.pandas_input_fn(
x=df_data,
y=labels,
batch_size=100,
num_epochs=num_epochs,
shuffle=shuffle,
num_threads=5)
m = build_estimator(model_dir="./model")
m.train(input_fn=input_fn("df1", num_epochs=None, shuffle=True),
steps=2000)
谢谢你的回答。但是你能告诉我如何使用分类列吗。我尝试了所有分类变量的
tf.feature\u column.categorical\u column\u和\u hash\u bucket
,就像我在store中做的那样。然后只需调用tf.feature\u column.indicator\u column
。但我还是犯了同样的错误。谢谢如果我删除tf.feature\u column.indicator\u column
部分,我可以运行我的代码。所以你的回答解决了我的部分问题,因为我知道问题的原因。但如果您能建议我如何修改tf.feature\u column.indicator\u column
,以便使用数字分类变量,这将非常有帮助。否则我会把你的答案记为已回答。非常感谢@Beta我用一个完整的工作示例更新了我的答案。我简化了大多数列,因为对于这个数据集来说,看起来并没有必要复杂化。特别是,indicator\u column
withcategorical\u column\u with\u词汇表\u list
非常感谢!你太棒了!!