[[211918]] この記事では、TF.Learn API を使用して、ワイド線形モデルとディープ フィードフォワード ニューラル ネットワークを同時にトレーニングする方法を説明します。このアプローチは、記憶と一般化の利点を組み合わせたものです。これは、スパースな入力特徴 (つまり、カテゴリ特徴には可能な値の大きなドメインがある) を持つ一般的な大規模回帰および分類の問題に適しています。ワイド ラーニングとディープ ラーニングの仕組みについて詳しく知りたい場合は、研究論文「Wide & Deep Spectrum of Models」を参照してください。では、簡単な例を見てみましょう。 上の図は、ワイド モデル (スパースな特徴と変換プロパティを持つロジスティック回帰モデル)、ディープ モデル (1 つの埋め込み層と複数の隠し層を持つフィードフォワード ニューラル ネットワーク)、ワイドおよびディープ モデル (2 つのモデルの共同トレーニング) の違いを示しています。大まかに言えば、TF.Learn API を使用してワイド、ディープ、またはワイドとディープのモデルを構成する手順は 3 つだけです。 幅部分の特徴を選択: 使用するスパース ベース列とクロス列を選択します。 深度部分の機能を選択します。連続列、各カテゴリ列の埋め込み次元、および隠し層のサイズを選択します。 これらを組み合わせて、幅広く深いモデル (DNNLinearCombinedClassifier) を作成します。
インストール このチュートリアルのコードを試してみたい場合は、次の手順に従ってください。 1. TensorFlow をインストールします。こちらにアクセスしてください。 2. チュートリアル コードをダウンロードします。 3. pandas データ分析ライブラリをインストールします。このチュートリアルでは pandas データを使用する必要があるためです。 tf.learn は pandas を必要としませんが、pandas をサポートしています。 pandasをインストールします: a. pip を取得します。 - # Ubuntu/Linux 64ビット
- $ sudo apt-get install python-pip python-dev
-
- # Mac OS X
- $ sudo easy_install pip
- $ sudo easy_install します
b. pipを使用してpandasをインストールする - $ sudo pip パンダをインストール
インストールに問題がある場合は、pandas の Web サイトの指示に従ってください。 4. チュートリアルで説明されている線形モデルをトレーニングするには、次のコマンドを実行します。 - $ python wide_n_deep_tutorial.py
このコードがどのように線形モデルを構築するかを確認してください。 基本的な機能列を定義する まず、使用する基本的なカテゴリ機能と連続機能の列を定義します。これらの列は、モデルの幅と深さの両方の部分の構成要素として機能します。 - テンソルフローをtfとしてインポートする
-
- 性別 = tf.feature_column.categorical_column_with_vocabulary_list(
- 「性別」 , [ 「女性」 , 「男性」 ])
- 教育 = tf.feature_column.categorical_column_with_vocabulary_list(
- "教育" 、 [
- 「学士」 、 「高校卒業」 、 「11年生」 、 「修士」 、 「9年生」 、
- 「大学中級」 、 「准学士号」 、 「准職業学位」 、 「7~8年生」 、
- 「博士号」 、 「専門学校」 、 「5-6年生」 、 「10年生」 、 「1-4年生」 、
- 「幼稚園」 、 「12年生」
- ])
- 婚姻状況 = tf.feature_column.categorical_column_with_vocabulary_list(
- "配偶者の有無" 、 [
- 「既婚配偶者」 、 「離婚」 、 「既婚配偶者不在」 、
- 「未婚」 、 「別居」 、 「既婚配偶者」 、 「死別」
- ])
- 関係 = tf.feature_column.categorical_column_with_vocabulary_list(
- "関係" 、 [
- 「夫」 、 「家族外」 、 「妻」 、 「自分の子」 、 「未婚」 、
- 「その他の親戚」
- ])
- ワーククラス = tf.feature_column.categorical_column_with_vocabulary_list(
- 「労働者階級」 、[
- 「自営業者(非株式会社)」 、 「民間」 、 「州政府」 、 「連邦政府」 、
- 「地方自治体」 、 「?」 、 「自営業」 、 「無給」 、 「働いたことがない」
- ])
-
- # ハッシュの例を示す:
- 職業 = tf.feature_column.categorical_column_with_hash_bucket(
- 「職業」 、hash_bucket_size=1000)
- ネイティブ国 = tf.feature_column.categorical_column_with_hash_bucket(
- "native_country" 、hash_bucket_size=1000)
-
- # 継続的なギレアデ
- 年齢 = tf.feature_column.numeric_column( "年齢" )
- 教育番号 = tf.feature_column.numeric_column( "教育番号" )
- 資本ゲイン = tf.feature_column.numeric_column( "資本ゲイン" )
- 資本損失 = tf.feature_column.numeric_column( "資本損失" )
- 週あたりの時間 = tf.feature_column.numeric_column( "週あたりの時間" )
-
- # 変換
- age_buckets = tf.feature_column.bucketized_column(
- 年齢、境界=[18、25、30、35、40、45、50、55、60、65])
ワイドモデル: 交差した特徴列を持つ線形モデル ワイド モデルは、スパースで交差した特徴列を持つ線形モデルです。 - ベース列 = [
- 性別、出身国、教育、職業、労働者階級、関係、
- age_buckets、
- ]
-
- 交差列 = [
- tf.feature_column.crossed_column(
- [ "教育" 、 "職業" ]、hash_bucket_size=1000)、
- tf.feature_column.crossed_column(
- [age_buckets、 "学歴" 、 "職業" ]、hash_bucket_size=1000)、
- tf.feature_column.crossed_column(
- [ "出身国" 、 "職業" ]、ハッシュバケットサイズ=1000)
- ]
交差した特徴列を持つワイドモデルは、特徴間のスパースな相互作用を効果的に記憶できます。つまり、交差した特徴列は、トレーニング データに出現しなかった特徴の組み合わせに一般化することはできません。埋め込みを使用してディープモデルを追加してこれを修正しましょう。 ディープモデル: 組み込みニューラルネットワーク ディープモデルは、前の図に示すように、フィードフォワード ニューラル ネットワークです。それぞれのスパースな高次元カテゴリ特徴は、まず、埋め込みベクトルと呼ばれることが多い低次元の密な実数値ベクトルに変換されます。これらの低次元の密な埋め込みベクトルは連続的な特徴と連結され、フォワードパスでニューラル ネットワークの隠し層に送られます。埋め込み値はランダムに初期化され、他のモデルパラメータと一緒にトレーニングされ、トレーニング損失を最小限に抑えます。埋め込みについてさらに詳しく知りたい場合は、チュートリアル「単語のベクトル表現」を参照するか、Wikipedia の「単語の埋め込み」をお読みください。 embedding_column を使用してカテゴリ埋め込み列を設定し、連続列と連結します。 - 深い列 = [
- tf.feature_column.indicator_column(ワーククラス)、
- tf.feature_column.indicator_column(教育)、
- tf.feature_column.indicator_column(性別)、
- tf.feature_column.indicator_column(関係)、
- # 埋め込みの例を示す
- tf.feature_column.embedding_column(ネイティブ国、次元=8)、
- tf.feature_column.embedding_column(職業、次元=8)、
- 年、
- 教育番号、
- キャピタルゲイン、
- 資本損失、
- 週あたりの時間、
- ]
埋め込みの次元が高くなるほど、モデルがこれらの特徴の表現を学習するために必要な自由度が高くなります。簡単にするために、すべての特徴列の次元を 8 に設定します。経験則として、次元から始める最良の方法は、\log_{2}(n) または k\sqrt[4]{n} の値から始めることです。ここで、n は特徴列内の一意の特徴の数、k は小さな定数 (通常は 10 未満) です。 高密度埋め込みにより、ディープモデルはより適切に一般化され、トレーニング データで以前に遭遇しなかった特徴についてより適切な予測を行うことができます。しかし、2 つの特徴列間の基になる相互作用行列がスパースかつ高ランクである場合、特徴列の効果的な低次元表現を学習することは困難です。この場合、いくつかの例外を除いて、ほとんどの特徴ペア間の相互作用はゼロになるはずですが、密な埋め込みにより、すべての特徴ペアの予測がゼロ以外になるため、過度に一般化される可能性があります。一方、交差特徴を持つ線形モデルは、より少ないモデルパラメータでこれらの「異常なルール」を効果的に記憶できます。 それでは、ワイドモデルとディープモデルを共同でトレーニングして、それぞれの長所と短所を活用する方法を見てみましょう。 ワイドモデルとディープモデルの組み合わせ ワイド モデルとディープ モデルは、最終出力のログ オッズを予測として組み込むことによって結合され、その後、ロジスティック損失関数に入力されます。グラフの定義と変数の割り当てはすべて完了しているので、DNNLinearCombinedClassifier を作成するだけです。 - 一時ファイルをインポートする
- model_dir = tempfile.mkdtemp()
- m = tf.contrib.learn.DNNLinearCombinedClassifier(
- model_dir=モデル_dir、
- linear_feature_columns=ワイド列、
- dnn_feature_columns=ディープ列、
- dnn_hidden_units=[100, 50])
モデルのトレーニングと評価 モデルをトレーニングする前に、TensorFlow 線形モデル チュートリアルで行ったように、国勢調査データセットを読んでください。 入力データ処理のコードも便宜上提供されています。 - pandasをpdとしてインポートする
- urllibをインポートする
-
- # データセットの列名を定義する
- CSV_COLUMNS = [
- 「年齢」 、 「労働階級」 、 「職位」 、 「教育」 、 「教育番号」 、
- 「婚姻状況」 、 「職業」 、 「関係」 、 「人種」 、 「性別」 、
- 「資本増加」 、 「資本損失」 、 「週あたりの時間」 、 「母国」 、
- 「所得区分」
- ]
-
- def maybe_download(train_data, test_data):
- "" "トレーニング データをダウンロードし、トレーニング ファイルとテスト ファイルの名前を返します。" ""
- train_dataの場合:
- トレーニングファイル名 = トレーニングデータ
- それ以外:
- train_file = tempfile.NamedTemporaryFile(削除= False )
- urllib.request.urlretrieve() は、
- 「https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data」 、
- train_file. name ) # pylint:disable=line-too-long
- 列車ファイル名 =列車ファイル名
- トレーニングファイルを閉じる( )
- print( "トレーニングデータは%sにダウンロードされました" % train_file_name)
-
- test_dataの場合:
- テストファイル名 = テストデータ
- それ以外:
- test_file = tempfile.NamedTemporaryFile(削除= False )
- urllib.request.urlretrieve() は、
- 「https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.test」 、
- test_file. name ) # pylint: 無効 = 行が長すぎる
- テストファイル名 =テストファイル名
- test_file.close ( )関数
- print( "テストデータは%sにダウンロードされました" % test_file_name)
-
- train_file_name、test_file_nameを返す
-
- def input_fn(データファイル、エポック数、シャッフル):
- 「入力ビルダー関数」
- df_data = pd.read_csv(
- tf.gfile.Open (データファイル)、
- 名前=CSV_COLUMNS、
- skipinitialspace= True 、
- エンジン = "python" 、
- スキップ行数=1)
- # NaN要素を削除する
- df_data = df_data.dropna(how= "any" 、 axis=0)
- ラベル = df_data[ "income_bracket" ].apply(lambda x: ">50K" x ).astype( int )内
- tf.estimator.inputs.pandas_input_fn(を返す
- x=df_data、
- y=ラベル、
- バッチサイズ=100、
- num_epochs=num_epochs、
- シャッフル=シャッフル、
- スレッド数=5)
データを読み取った後、モデルをトレーニングして評価できます。 - # エポックを最大化するにはnum_epochsをNoneに設定します
- m.train(
- input_fn=input_fn(train_file_name, num_epochs=None, shuffle= True ),
- ステップ=train_steps)
- # すべてのデータが消費される前に評価を実行するには、ステップをなしに設定します
- 結果 = m.evaluate(
- input_fn=input_fn(テストファイル名、num_epochs=1、シャッフル= False )、
- ステップ=なし)
- print( "モデルディレクトリ = %s" % model_dir)
- のために 鍵 ソート済み(結果):
- print( "%s: %s" % (キー, 結果[キー]))
出力の最初の行は、accuracy: 0.84429705 のようになります。ワイド&ディープ モデルを使用すると、ワイド線形モデルの精度が約 83.6% から約 84.4% に向上することがわかります。エンドツーエンドの実際の例を確認したい場合は、サンプル コードをダウンロードできます。 このチュートリアルは、API にすぐに慣れるための、小さなデータベースを使用した単純な例であることに注意してください。まばらな特徴列と多数の可能な特徴値を持つ大規模なデータセットがある場合、ワイド ラーニングとディープ ラーニングはさらに強力になります。また、ワイドラーニングとディープラーニングが実際に大規模な機械学習にどのように適用されているかについて詳しく知るには、当社の研究論文にご注目ください。 |