1

私はKaggle Rossmann datasetを使用して、幅広く深いモデルを訓練しています。コードはチュートリアルで与えられたものと非常に似ています。モデリングに使用するデータを変更するだけです。異なるデータセットでAttributeErrorを与えるTensorflowの幅広い深いモデル

私が使用しているコードは以下の通りです:

"""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' 

このエラーが発生する場所を教えてください。あなたのコードを実行しているとき、それは完全に動作しています。

ありがとうございます!

答えて

1

理由は、tf.feature_column.indicator_columnが列名( "DayOfWeek"、 "Open"など)ではなくカテゴリの列インスタンスを受け入れるためです。おそらくこのAPIは以前のtfバージョンでは異なって見えましたが、わかりませんが、今度はcategorical_column_*を作成してから、インジケータでラップする必要があります。

ところで、私はあなたがDataFrame.sortを使用しているのを見ています - このメソッドは廃止され、最新のpandasで動作しなくなりました。 sort_valuesを使用してください。

更新

私はそれが故意に可能なすべての機能タイプ、ハッシュ、埋め込む、クロス列を使用しています理由です、コードはtutorial exampleの適応であることに気づきませんでした。通常、一度にすべてを使用する必要はありません。特に、Rossmannのデータには必要ありません。 を追加します(例:交差列)。データに特徴の相関関係がありますが、開始するには、ほとんどのデータがnumeric_columnで、categorical_column_with_vocabulary_listです。あなたの答えのための

"""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) 
+0

ありがとう:

ここでは、このコードの私の完全バージョンです。しかし 'categorical_column_ * 'の使い方を教えてください。私は 'tf.feature_column.categorical_column_with_hash_bucket'を、店舗のために行ったように、すべてのカテゴリ変数について試しました。そして、 'tf.feature_column.indicator_column'を呼び出します。しかし、私は同じエラーが発生しています。ありがとう! – Beta

+0

'tf.feature_column.indicator_column'部分を削除するとコードを実行できます。だからあなたの答えは私の問題の一部を解決します。それはなぜ問題が起こったのか分かります。しかし、あなたが数値のカテゴリ変数を使うことができるように、 'tf.feature_column.indicator_column'をどのように修正できるかを私に示せば非常に役に立ちます。それ以外の場合、私はあなたの答えを答えとしてマークします。どうもありがとう! – Beta

+0

@Beta完全な実例で私の答えを更新しました。ほとんどの列を単純化しました。なぜなら、このデータセットには本当に複雑な問題があるように見えないからです。特に、 'categorical_column_with_vocabulary_list'で' indicator_column'を使用しています – Maxim

関連する問題