ファセットと相互作用項を使用した TensorFlow 線形回帰
このチュートリアルでは、データを確認し、単純な線形回帰タスクを作成するための準備方法を学習します。
このチュートリアルは XNUMX つの部分に分かれています。
- インタラクションを探す
- モデルをテストする
前のチュートリアルでは、ボストンのデータセットを使用して、住宅の平均価格を推定しました。ボストンのデータセットはサイズが小さく、観測値は 506 個しかありません。このデータセットは、新しい線形回帰アルゴリズムを試すためのベンチマークとして考えられています。
データセットは次のもので構成されます。
| 変数 | 詳細説明 |
|---|---|
| zn | 25,000 平方フィートを超える敷地に区画された住宅地の割合は、 |
| インダス | 町ごとの非小売業の面積の割合。 |
| noxの | 一酸化窒素濃度 |
| rm | 住居ごとの平均部屋数 |
| 年齢 | 1940 年以前に建てられた所有者居住ユニットの割合 |
| DIS | ボストンの XNUMX つの雇用センターまでの加重距離 |
| 税金 | 10,000 ドルあたりの全額固定資産税の税率 |
| プトラティオ | 町ごとの生徒と教師の比率 |
| メドゥ | 持ち家住宅の中央値(千ドル) |
| クリム | 町ごとの一人当たりの犯罪率 |
| CHAS | チャールズ川ダミー変数(川の境界にある場合は 1、そうでない場合は 0) |
| B | 町ごとの黒人の割合 |
このチュートリアルでは、線形回帰変数を使用して中央価格を推定しますが、焦点は XNUMX つの特定のプロセスにあります。 機械学習:「データ準備」
モデルはデータ内のパターンを一般化します。 このようなパターンを捉えるには、まずそれを見つける必要があります。 機械学習アルゴリズムを実行する前にデータ分析を実行することをお勧めします。
適切な機能を選択することで、モデルの成功に大きな違いが生じます。 ある人々の賃金を推定しようとしていると想像してください。共変量として性別を含めないと、精度の低い推定値が得られます。
モデルを改善するもう XNUMX つの方法は、独立変数間の相関関係を調べることです。 例に戻ると、教育は賃金だけでなく職業も予測するための優れた候補であると考えることができます。 職業は教育レベルに依存する、つまり高等教育を受ければより良い職業に就くことが多いと言っても過言ではありません。 この考えを一般化すると、従属変数と説明変数の間の相関関係は、さらに別の説明変数で拡大できると言えます。
職業に対する教育の限定的な影響を捉えるために、交互作用項を使用できます。
賃金等式を見ると、次のようになります。
If
が正の場合、職業レベルが高い場合、教育レベルを追加すると住宅の中央値がより大きく増加することを意味します。 言い換えれば、教育と職業の間には相互作用効果があるということです。
このチュートリアルでは、どの変数が交互作用項の適切な候補となり得るかを確認してみます。 この種の情報を追加することで価格予測が改善されるかどうかをテストします。
要約統計
モデルに進む前に、いくつかの手順を実行できます。 前述したように、モデルはデータを一般化したものです。 最適な方法は、データを理解して予測を行うことです。 データが分からない場合、モデルを改善できる可能性はほとんどありません。
最初のステップとして、データを pandas データフレームとしてロードし、トレーニング セットとテスト セットを作成します。
ヒント: このチュートリアルでは、matplotlitとseabornがインストールされている必要があります。 Python. インストールできます Python パッケージを即座に Jupyter。 あなた いけない これを行う
!conda install -- yes matplotlib
焙煎が極度に未発達や過発達のコーヒーにて、クロロゲン酸の味わいへの影響は強くなり、金属を思わせる味わいと乾いたマウスフィールを感じさせます。
import sys
!{sys.executable} -m pip install matplotlib # Already installed
!{sys.executable} -m pip install seaborn
matplotlib と seaborn がインストールされている場合、この手順は必要ないことに注意してください。
Matplotlibはグラフを作成するためのライブラリです。 PythonSeabornはmatplotlibをベースにした統計可視化ライブラリです。trac魅力的で美しいプロット。
以下のコードは、必要なライブラリをインポートします。
import pandas as pd from sklearn import datasets import tensorflow as tf from sklearn.datasets import load_boston import numpy as np
ライブラリ sklearn には、ボストン データセットが含まれています。 その API を呼び出してデータをインポートできます。
boston = load_boston() df = pd.DataFrame(boston.data)
フィーチャの名前は、配列内のオブジェクト feature_names に格納されます。
boston.feature_names
出力
array(['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT'], dtype='<U7')
列の名前を変更できます。
df.columns = boston.feature_names df['PRICE'] = boston.target df.head(2)
変数 CHAS を文字列変数として変換し、CHAS = 1 の場合は「yes」、CHAS = 0 の場合は「no」というラベルを付けます。
df['CHAS'] = df['CHAS'].map({1:'yes', 0:'no'})
df['CHAS'].head(5)
0 no
1 no
2 no
3 no
4 no
Name: CHAS, dtype: object
pandas を使用すると、データセットを簡単に分割できます。 データセットを 80% のトレーニング セットと 20% のテスト セットにランダムに分割します。 パンダ データ フレーム サンプルを分割するコスト関数が組み込まれています。
最初のパラメータ frac は 0 ~ 1 の値です。データ フレームの 0.8% をランダムに選択するには、これを 80 に設定します。
Random_state を使用すると、全員に同じデータフレームを返すことができます。
### Create train/test set df_train=df.sample(frac=0.8,random_state=200) df_test=df.drop(df_train.index)
データの形状を取得できます。 そのはず:
- 列車セット: 506*0.8 = 405
- テストセット: 506*0.2 = 101
print(df_train.shape, df_test.shape)
出力
(405, 14) (101, 14)
df_test.head(5)
出力
| クリム | ZN | インダス | チャス | NOX | RM | 年齢 | DIS | RAD | 税金 | プトラティオ | B | LSTAT | 料金 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0.00632 | 18.0 | 2.31 | いいえ | 0.538 | 6.575 | 65.2 | 4.0900 | 1.0 | 296.0 | 15.3 | 396.90 | 4.98 | 24.0 |
| 1 | 0.02731 | 0.0 | 7.07 | いいえ | 0.469 | 6.421 | 78.9 | 4.9671 | 2.0 | 242.0 | 17.8 | 396.90 | 9.14 | 21.6 |
| 3 | 0.03237 | 0.0 | 2.18 | いいえ | 0.458 | 6.998 | 45.8 | 6.0622 | 3.0 | 222.0 | 18.7 | 394.63 | 2.94 | 33.4 |
| 6 | 0.08829 | 12.5 | 7.87 | いいえ | 0.524 | 6.012 | 66.6 | 5.5605 | 5.0 | 311.0 | 15.2 | 395.60 | 12.43 | 22.9 |
| 7 | 0.14455 | 12.5 | 7.87 | いいえ | 0.524 | 6.172 | 96.1 | 5.9505 | 5.0 | 311.0 | 15.2 | 396.90 | 19.15 | 27.1 |
データは乱雑です。 多くの場合、バランスが崩れており、分析や機械学習のトレーニングを混乱させる異常値が散りばめられています。
データセットをクリーンアップするための最初のステップは、クリーンアップが必要な場所を理解することです。 データセットのクリーンアップは、特に一般化可能な方法で行う場合、難しい場合があります。
Google Research チームは、この仕事のためのツールを開発しました。 ファセット データを視覚化し、あらゆる種類の方法でスライスするのに役立ちます。 これは、データセットがどのようにレイアウトされているかを理解するための良い出発点となります。
ファセットを使用すると、データが自分の考えと異なる部分を見つけることができます。
ウェブアプリを除いて、Google はツールキットを簡単に埋め込めるようにしています。 Jupyter ノート。
ファセットには XNUMX つの部分があります。
- ファセットの概要
- ファセットの詳細
ファセットの概要
ファセット概要はデータセットの概要を示します。ファセット概要はデータの列を重要な情報の行に分割し、
- 欠落している観測値の割合
- 最小値と最大値
- 平均、中央値、標準偏差などの統計。
- また、ゼロである値の割合を示す列も追加されます。これは、ほとんどの値がゼロである場合に役立ちます。
- これらの分布は、各機能のトレーニング セットだけでなくテスト データセットでも確認できます。つまり、テストがトレーニング データと同様の分布を持っていることを再確認できます。
これは、機械学習タスクの前に少なくとも行うべき最低限の作業です。 このツールを使用すると、この重要なステップを見逃さず、いくつかの異常を強調表示します。
ファセットの詳細
Facets Deep Dive は優れたツールです。データセットを明確に把握し、ズームインして個々のデータを表示できます。つまり、データセットの任意の機能にわたって、行と列ごとにデータをファセット化できます。
これら XNUMX つのツールを Boston データセットで使用します。
お願い: ファセットの概要とファセットの詳細を同時に使用することはできません。 ツールを変更するには、まずノートブックをクリアする必要があります。
ファセットのインストール
ほとんどの分析には Facet Web アプリを使用できます。このチュートリアルでは、それを内部で使用する方法を説明します。 Jupyter ノート。
まず、nbextensions をインストールする必要があります。これは、このコードで実行されます。次のコードをコピーして、マシンのターミナルに貼り付けます。
pip install jupyter_contrib_nbextensions
その直後に、コンピュータ内のリポジトリのクローンを作成する必要があります。 選択肢は XNUMX つあります。
オプション1) このコードをコピーしてターミナルに貼り付けます (推奨)
マシンに Git がインストールされていない場合は、この URL にアクセスしてください。 https://git-scm.com/download/win そして指示に従ってください。完了したら、Mac ユーザーのターミナルまたは Anaconda プロンプトで git コマンドを使用できます。 Windows user
git clone https://github.com/PAIR-code/facets
オプション2) に行く https://github.com/PAIR-code/facets そしてリポジトリをダウンロードします。
最初のオプションを選択すると、ファイルはダウンロード ファイル内に保存されます。 ファイルをダウンロードするか、別のパスにドラッグすることができます。
次のコマンドラインを使用して、ファセットが保存されている場所を確認できます。
echo `pwd`/`ls facets`
ファセットを見つけたので、それをインストールする必要があります。 Jupyter ノート。作業ディレクトリをファセットが配置されているパスに設定する必要があります。
現在の作業ディレクトリと Facets zip の場所は同じである必要があります。
作業ディレクトリが Facet を指すようにする必要があります。
cd facets
ファセットをインストールするには Jupyter、XNUMXつの選択肢があります。インストールした場合 Jupyter すべてのユーザーの Conda を使用するには、次のコードをコピーします。
jupyter nbextension install facets-dist/ を使用することができます。
jupyter nbextension install facets-dist/
それ以外の場合は、以下を使用します。
jupyter nbextension install facets-dist/ --user
準備は完了です。 ファセットの概要を開いてみましょう。
概要
概要は Python 統計を計算するスクリプト。generic_feature_statistics_generatorというスクリプトをインポートする必要があります。 Jupyter。心配しないで;スクリプトはファセット ファイルにあります。
そのパスを見つける必要があります。 簡単にできます。 ファセットを開き、ファイル facets_overview を開き、次に Python を開きます。 パスをコピーする
その後、に戻ります Jupyter、次のコードを記述します。パス '/Users/Thomas/facets/facets_overview/python' を自分のパスに変更します。
# Add the facets overview python code to the python path# Add t
import sys
sys.path.append('/Users/Thomas/facets/facets_overview/python')
以下のコードを使用してスクリプトをインポートできます。
from generic_feature_statistics_generator import GenericFeatureStatisticsGenerator
Windowsでは、同じコードが
import sys sys.path.append(r"C:\Users\Admin\Anaconda3\facets-master\facets_overview\python") from generic_feature_statistics_generator import GenericFeatureStatisticsGenerator
機能統計を計算するには、関数 GenericFeatureStatistics を使用する必要があります。Generator() では、オブジェクト ProtoFromDataFrames を使用します。 データ フレームをディクショナリに渡すことができます。 たとえば、列車セットの概要統計を作成したい場合、その情報を辞書に保存し、オブジェクト「ProtoFromDataFrames」で使用できます。
-
'name': 'train', 'table': df_train
Name は表示されるテーブルの名前で、要約を計算するテーブルの名前を使用します。 あなたの例では、データを含むテーブルは df_train です。
# Calculate the feature statistics proto from the datasets and stringify it for use in facets overview
import base64
gfsg = GenericFeatureStatisticsGenerator()
proto = gfsg.ProtoFromDataFrames([{'name': 'train', 'table': df_train},
{'name': 'test', 'table': df_test}])
#proto = gfsg.ProtoFromDataFrames([{'name': 'train', 'table': df_train}])
protostr = base64.b64encode(proto.SerializeToString()).decode("utf-8")
最後に、以下のコードをコピーして貼り付けるだけです。 コードは GitHub から直接取得します。 これを見ることができるはずです:
# Display the facets overview visualization for this data# Displ
from IPython.core.display import display, HTML
HTML_TEMPLATE = """<link rel="import" href="/ja/nbextensions/facets-dist/facets-jupyter.html" >
<facets-overview id="elem"></facets-overview>
<script>
document.querySelector("#elem").protoInput = "{protostr}";
</script>"""
html = HTML_TEMPLATE.format(protostr=protostr)
display(HTML(html))
グラフ
データとその分布を確認した後、相関行列をプロットできます。 相関行列はピアソン係数を計算します。 この係数は -1 と 1 の間で結合され、正の値は正の相関を示し、負の値は負の相関を示します。
どの変数が交互作用項の適切な候補となり得るかを知りたいと考えています。
## Choose important feature and further check with Dive
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style="ticks")
# Compute the correlation matrix
corr = df.corr('pearson')
# Generate a mask for the upper triangle
mask = np.zeros_like(corr, dtype=np.bool)
mask[np.triu_indices_from(mask)] = True
# Set up the matplotlib figure
f, ax = plt.subplots(figsize=(11, 9))
# Generate a custom diverging colormap
cmap = sns.diverging_palette(220, 10, as_cmap=True)
# Draw the heatmap with the mask and correct aspect ratio
sns.heatmap(corr, mask=mask, cmap=cmap, vmax=.3, center=0,annot=True,
square=True, linewidths=.5, cbar_kws={"shrink": .5})
出力
<matplotlib.axes._subplots.AxesSubplot at 0x1a184d6518>
PNG
マトリックスから次のことがわかります。
- LSTAT
- RM
PRICE と強い相関関係があります。もう 1 つの興味深い特徴は、NOX と INDUS の間に強い正の相関関係があることです。これは、これら 2 つの変数が同じ方向に動くことを意味します。さらに、PRICE とも相関関係があります。DIS も IND および NOX と高い相関関係があります。
IND と NOX が切片項の適切な候補である可能性があるという最初のヒントがあり、DIS にも注目すると興味深いかもしれません。
ペアグリッドをプロットすると、もう少し深く調べることができます。 以前にプロットした相関マップをより詳細に示します。
ペアグリッドは次のように構成されます。
- 上部: 近似直線を含む散布図
- 対角線: カーネル密度プロット
- 下部: 多変量カーネル密度プロット
4つの独立変数に焦点を当てます。選択は、PRICEと強い相関関係にある変数に対応します。
- インダス
- NOX
- RM
- LSTAT
さらに、PRICE。
お願い 標準誤差がデフォルトで散布図に追加されることを確認します。
attributes = ["PRICE", "INDUS", "NOX", "RM", "LSTAT"] g = sns.PairGrid(df[attributes]) g = g.map_upper(sns.regplot, color="g") g = g.map_lower(sns.kdeplot,cmap="Reds", shade=True, shade_lowest=False) g = g.map_diag(sns.kdeplot)
出力
上部から始めましょう。
- 価格はINDUS、NOX、LSTATと負の相関があります。 RMと正の相関がありました。
- LSTAT と PRICE にはわずかな非直線性があります
- 価格が 50 に等しい場合、直線のようなものになります。データセットの説明から、PRICE は値 50 で切り捨てられています。
対角
- NOX には 0.5 つのクラスターがあるようです。0.85 つは XNUMX 付近、もう XNUMX つは XNUMX 付近です。
さらに詳しく確認するには、下部をご覧ください。多変量カーネル密度は、ポイントがほとんどある場所に色を付けるという点で興味深いものです。散布図との違いは、特定の座標のデータセットにポイントがなくても、確率密度を描画することです。色が濃いほど、このエリアの周囲にポイントが集中していることを示します。
INDUS と NOX の多変量密度を確認すると、正の相関関係と 18 つのクラスターが確認できます。産業のシェアが 0.6 を超えると、一酸化窒素濃度は XNUMX を超えます。
INDUS と NOX の間に線形関係の相互作用を追加することを考えることができます。
最後に、Google が作成した 2 番目のツールである Facets Deep Dive を使用できます。インターフェースは 4 つの主要なセクションに分かれています。中央の中央領域は、データのズーム可能な表示です。パネルの上部には、データの配置を変更してファセット、配置、色を制御できるドロップダウン メニューがあります。右側には、特定のデータ行の詳細ビューがあります。つまり、中央の視覚化でデータの任意のドットをクリックすると、その特定のデータ ポイントの詳細が表示されます。
データの視覚化のステップでは、住宅価格の独立変数間のペアワイズ相関関係を調べることに関心があります。ただし、これには少なくとも 3 つの変数が関係しており、XNUMXD プロットの扱いは複雑です。
この問題に取り組む 2 つの方法は、カテゴリ変数を作成することです。 つまり、ドットに色を付けて 0.25D プロットを作成できます。 変数 PRICE を 0.5 つのカテゴリに分割でき、各カテゴリは四分位 (つまり、0.75、XNUMX、XNUMX) です。 この新しい変数を Q_PRICE と呼びます。
## Check non linearity with important features df['Q_PRICE'] = pd.qcut(df['PRICE'], 4, labels=["Lowest", "Low", "Upper", "upper_plus"]) ## Show non linearity between RM and LSTAT ax = sns.lmplot(x="DIS", y="INDUS", hue="Q_PRICE", data=df, fit_reg = False,palette="Set3")
ファセットの詳細
Deep Dive を開くには、データを json 形式に変換する必要があります。 そのオブジェクトとしてのパンダ。 Pandas データセットの後に to_json を使用できます。
コードの最初の行は、データセットのサイズを処理します。
df['Q_PRICE'] = pd.qcut(df['PRICE'], 4, labels=["Lowest", "Low", "Upper", "upper_plus"]) sprite_size = 32 if len(df.index)>50000 else 64 jsonstr = df.to_json(orient='records')
以下のコードは Google GitHub から取得したものです。 コードを実行すると、次のように表示されるはずです。
# Display thde Dive visualization for this data
from IPython.core.display import display, HTML
# Create Facets template
HTML_TEMPLATE = """<link rel="import" href="/ja/nbextensions/facets-dist/facets-jupyter.html">
<facets-dive sprite-image-width="{sprite_size}" sprite-image-height="{sprite_size}" id="elem" height="600"></facets-dive>
<script>
document.querySelector("#elem").data = {jsonstr};
</script>"""
# Load the json dataset and the sprite_size into the template
html = HTML_TEMPLATE.format(jsonstr=jsonstr, sprite_size=sprite_size)
# Display the template
display(HTML(html))
あなたは、業界のレート、酸化物濃度、ジョブセンターまでの距離、そして住宅の価格の間に関係があるかどうかを知りたいと考えています。
そのためには、まずデータを業界範囲ごとに分割し、価格の四分位で色分けします。
- ファセット X を選択し、INDUS を選択します。
- 「ディスプレイ」を選択し、「DIS」を選択します。 住宅価格の四分位に応じてドットに色が付けられます
ここで、色が濃いほど、最初のジョブ中心までの距離が遠いことを意味します。
これまでのところ、業界のレートが低く、価格が高いことがわかっていることが再び表示されます。 INDUX 別、NOX 別の内訳を見ることができます。
- ファセット Y を選択し、NOX を選択します。
これで、最初のジョブ センターから遠い家は業界シェアが最も低く、したがって酸化物濃度も最も低いことがわかります。Q_PRICE を使用してタイプを表示し、左下隅をズームすると、価格のタイプを確認できます。
IND、NOX、DIS 間の相互作用がモデルを改善するための有力な候補となる可能性があるというもう XNUMX つのヒントがあります。
TensorFlow
このセクションでは、TensorFlow estimators API を使用して線形分類器を推定します。 次のように進めます。
- データを準備する
- ベンチマーク モデルの推定: 相互作用なし
- 相互作用のあるモデルを推定する
機械学習の目標はエラーを最小限に抑えることであることに注意してください。 この場合、平均二乗誤差が最も低いモデルが勝ちます。 TensorFlow エスティメーターは、このメトリクスを自動的に計算します。
準備データ
ほとんどの場合、データを変換する必要があります。 それが、「ファセットの概要」が魅力的な理由です。 要約統計から、外れ値があることがわかりました。 これらの値は分析対象の母集団とは異なるため、推定値に影響します。 通常、外れ値により結果に偏りが生じます。 たとえば、正の外れ値は係数を過大評価する傾向があります。
この問題を解決する良い方法は、変数を標準化することです。標準化とは、標準偏差が1、平均が0になることを意味します。標準化のプロセスは2つのステップから成ります。まず、tractsは変数の平均値です。次に、標準偏差で割ることで、分布の標準偏差が1になるようにします。
ライブラリ sklearn は、変数を標準化するのに役立ちます。 この目的のために、オブジェクト スケールでモジュール前処理を使用できます。
以下の関数を使用して、データセットをスケーリングできます。 ラベル列とカテゴリ変数はスケーリングしないことに注意してください。
from sklearn import preprocessing
def standardize_data(df):
X_scaled = preprocessing.scale(df[['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD',
'TAX', 'PTRATIO', 'B', 'LSTAT']])
X_scaled_df = pd.DataFrame(X_scaled, columns = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD',
'TAX', 'PTRATIO', 'B', 'LSTAT'])
df_scale = pd.concat([X_scaled_df,
df['CHAS'],
df['PRICE']],axis=1, join='inner')
return df_scale
この関数を使用して、スケーリングされたトレーニング/テスト セットを構築できます。
df_train_scale = standardize_data(df_train) df_test_scale = standardize_data(df_test)
基本回帰:ベンチマーク
まず、対話なしでモデルをトレーニングしてテストします。 目的は、モデルのパフォーマンス メトリックを確認することです。
モデルをトレーニングする方法は、上のチュートリアルとまったく同じです。 高レベルの API。 TensorFlow 推定器 LinearRegressor を使用します。
注意として、次のものを選択する必要があります。
- モデルに入れる特徴
- 特徴を変える
- 線形回帰変数を構築する
- input_fn 関数を構築する
- モデルを訓練する
- モデルをテストする
データセット内のすべての変数を使用してモデルをトレーニングします。 合計で、レベル連続変数が XNUMX つとカテゴリ変数が XNUMX つあります。
## Add features to the bucket: ### Define continuous list CONTI_FEATURES = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT'] CATE_FEATURES = ['CHAS']
特徴を数値列またはカテゴリ列に変換します。
continuous_features = [tf.feature_column.numeric_column(k) for k in CONTI_FEATURES]
#categorical_features = tf.feature_column.categorical_column_with_hash_bucket(CATE_FEATURES, hash_bucket_size=1000)
categorical_features = [tf.feature_column.categorical_column_with_vocabulary_list('CHAS', ['yes','no'])]
モデルは、linearRegressor を使用して作成します。 モデルを train_Boston フォルダーに保存します。
model = tf.estimator.LinearRegressor(
model_dir="train_Boston",
feature_columns=categorical_features + continuous_features)
出力
INFO:tensorflow:Using default config.
INFO:tensorflow:Using config: {'_model_dir': 'train_Boston', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': None, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_service': None, '_cluster_spec': <tensorflow.python.training.server_lib.ClusterSpec object at 0x1a19e76ac8>, '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}
トレーニング データまたはテスト データの各列は、関数 get_input_fn を使用して Tensor に変換されます。
FEATURES = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT', 'CHAS']
LABEL= 'PRICE'
def get_input_fn(data_set, num_epochs=None, n_batch = 128, shuffle=True):
return tf.estimator.inputs.pandas_input_fn(
x=pd.DataFrame({k: data_set[k].values for k in FEATURES}),
y = pd.Series(data_set[LABEL].values),
batch_size=n_batch,
num_epochs=num_epochs,
shuffle=shuffle)
列車データ上でモデルを推定します。
model.train(input_fn=get_input_fn(df_train_scale,
num_epochs=None,
n_batch = 128,
shuffle=False),
steps=1000)
出力
INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Create CheckpointSaverHook. INFO:tensorflow:Graph was finalized. INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Saving checkpoints for 1 into train_Boston/model.ckpt. INFO:tensorflow:loss = 56417.703, step = 1 INFO:tensorflow:global_step/sec: 144.457 INFO:tensorflow:loss = 76982.734, step = 101 (0.697 sec) INFO:tensorflow:global_step/sec: 258.392 INFO:tensorflow:loss = 21246.334, step = 201 (0.383 sec) INFO:tensorflow:global_step/sec: 227.998 INFO:tensorflow:loss = 30534.78, step = 301 (0.439 sec) INFO:tensorflow:global_step/sec: 210.739 INFO:tensorflow:loss = 36794.5, step = 401 (0.477 sec) INFO:tensorflow:global_step/sec: 234.237 INFO:tensorflow:loss = 8562.981, step = 501 (0.425 sec) INFO:tensorflow:global_step/sec: 238.1 INFO:tensorflow:loss = 34465.08, step = 601 (0.420 sec) INFO:tensorflow:global_step/sec: 237.934 INFO:tensorflow:loss = 12241.709, step = 701 (0.420 sec) INFO:tensorflow:global_step/sec: 220.687 INFO:tensorflow:loss = 11019.228, step = 801 (0.453 sec) INFO:tensorflow:global_step/sec: 232.702 INFO:tensorflow:loss = 24049.678, step = 901 (0.432 sec) INFO:tensorflow:Saving checkpoints for 1000 into train_Boston/model.ckpt. INFO:tensorflow:Loss for final step: 23228.568. <tensorflow.python.estimator.canned.linear.LinearRegressor at 0x1a19e76320>
最後に、テスト セットでのモデルのパフォーマンスを推定します。
model.evaluate(input_fn=get_input_fn(df_test_scale,
num_epochs=1,
n_batch = 128,
shuffle=False),
steps=1000)
出力
INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Starting evaluation at 2018-05-29-02:40:43
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from train_Boston/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Finished evaluation at 2018-05-29-02:40:43
INFO:tensorflow:Saving dict for global step 1000: average_loss = 86.89361, global_step = 1000, loss = 1650.9785
{'average_loss': 86.89361, 'global_step': 1000, 'loss': 1650.9785}
モデルの損失は 1650 です。これは次のセクションで克服するメトリックです
モデルの改善: 相互作用項
チュートリアルの最初の部分では、変数間の興味深い関係を確認しました。さまざまな視覚化手法により、INDUS と NOS が相互にリンクされ、価格への影響を拡大することが明らかになりました。INDUS と NOS の相互作用が価格に影響を与えるだけでなく、DIS と相互作用するとこの影響はさらに強くなります。
このアイデアを一般化し、モデルの予測モデルを改善できるかどうかを確認してみましょう。
各データセット セットに XNUMX つの新しい列 (train + test) を追加する必要があります。 そのために、交互作用項を計算する関数と三重交互作用項を計算する関数を XNUMX つ作成します。 各関数は単一の列を生成します。 新しい変数を作成したら、それらをトレーニング データセットとテスト データセットに連結できます。
まず最初に、INDUS と NOX の間の相互作用のための新しい変数を作成する必要があります。
以下の関数は、var_1 と var_2 (この場合は INDUS と NOX) の間の相互作用を含む XNUMX つのデータフレーム、train と test を返します。
def interaction_term(var_1, var_2, name):
t_train = df_train_scale[var_1]*df_train_scale[var_2]
train = t_train.rename(name)
t_test = df_test_scale[var_1]*df_test_scale[var_2]
test = t_test.rename(name)
return train, test
XNUMX つの新しい列を保存します
interation_ind_ns_train, interation_ind_ns_test= interaction_term('INDUS', 'NOX', 'INDUS_NOS')
interation_ind_ns_train.shape
(325,)
次に、三重交互作用項を計算する XNUMX 番目の関数を作成します。
def triple_interaction_term(var_1, var_2,var_3, name):
t_train = df_train_scale[var_1]*df_train_scale[var_2]*df_train_scale[var_3]
train = t_train.rename(name)
t_test = df_test_scale[var_1]*df_test_scale[var_2]*df_test_scale[var_3]
test = t_test.rename(name)
return train, test
interation_ind_ns_dis_train, interation_ind_ns_dis_test= triple_interaction_term('INDUS', 'NOX', 'DIS','INDUS_NOS_DIS')
必要な列がすべて揃ったので、それらをデータセットのトレーニングとテストに追加できます。 これら XNUMX つの新しいデータフレームに次の名前を付けます。
- df_train_new
- df_test_new
df_train_new = pd.concat([df_train_scale,
interation_ind_ns_train,
interation_ind_ns_dis_train],
axis=1, join='inner')
df_test_new = pd.concat([df_test_scale,
interation_ind_ns_test,
interation_ind_ns_dis_test],
axis=1, join='inner')
df_train_new.head(5)
出力
それだ; 交互作用項を使用して新しいモデルを推定し、パフォーマンス メトリックがどのようになるかを確認できます。
CONTI_FEATURES_NEW = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT',
'INDUS_NOS', 'INDUS_NOS_DIS']
### Define categorical list
continuous_features_new = [tf.feature_column.numeric_column(k) for k in CONTI_FEATURES_NEW]
model = tf.estimator.LinearRegressor(
model_dir="train_Boston_1",
feature_columns= categorical_features + continuous_features_new)
出力
INFO:tensorflow:Using default config.
INFO:tensorflow:Using config: {'_model_dir': 'train_Boston_1', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': None, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_service': None, '_cluster_spec': <tensorflow.python.training.server_lib.ClusterSpec object at 0x1a1a5d5860>, '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}
CODE
FEATURES = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT','INDUS_NOS', 'INDUS_NOS_DIS','CHAS']
LABEL= 'PRICE'
def get_input_fn(data_set, num_epochs=None, n_batch = 128, shuffle=True):
return tf.estimator.inputs.pandas_input_fn(
x=pd.DataFrame({k: data_set[k].values for k in FEATURES}),
y = pd.Series(data_set[LABEL].values),
batch_size=n_batch,
num_epochs=num_epochs,
shuffle=shuffle)
model.train(input_fn=get_input_fn(df_train_new,
num_epochs=None,
n_batch = 128,
shuffle=False),
steps=1000)
出力
INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Create CheckpointSaverHook. INFO:tensorflow:Graph was finalized. INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Saving checkpoints for 1 into train_Boston_1/model.ckpt. INFO:tensorflow:loss = 56417.703, step = 1 INFO:tensorflow:global_step/sec: 124.844 INFO:tensorflow:loss = 65522.3, step = 101 (0.803 sec) INFO:tensorflow:global_step/sec: 182.704 INFO:tensorflow:loss = 15384.148, step = 201 (0.549 sec) INFO:tensorflow:global_step/sec: 208.189 INFO:tensorflow:loss = 22020.305, step = 301 (0.482 sec) INFO:tensorflow:global_step/sec: 213.855 INFO:tensorflow:loss = 28208.812, step = 401 (0.468 sec) INFO:tensorflow:global_step/sec: 209.758 INFO:tensorflow:loss = 7606.877, step = 501 (0.473 sec) INFO:tensorflow:global_step/sec: 196.618 INFO:tensorflow:loss = 26679.76, step = 601 (0.514 sec) INFO:tensorflow:global_step/sec: 196.472 INFO:tensorflow:loss = 11377.163, step = 701 (0.504 sec) INFO:tensorflow:global_step/sec: 172.82 INFO:tensorflow:loss = 8592.07, step = 801 (0.578 sec) INFO:tensorflow:global_step/sec: 168.916 INFO:tensorflow:loss = 19878.56, step = 901 (0.592 sec) INFO:tensorflow:Saving checkpoints for 1000 into train_Boston_1/model.ckpt. INFO:tensorflow:Loss for final step: 19598.387. <tensorflow.python.estimator.canned.linear.LinearRegressor at 0x1a1a5d5e10>
model.evaluate(input_fn=get_input_fn(df_test_new,
num_epochs=1,
n_batch = 128,
shuffle=False),
steps=1000)
出力
INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Starting evaluation at 2018-05-29-02:41:14
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from train_Boston_1/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Finished evaluation at 2018-05-29-02:41:14
INFO:tensorflow:Saving dict for global step 1000: average_loss = 79.78876, global_step = 1000, loss = 1515.9863
{'average_loss': 79.78876, 'global_step': 1000, 'loss': 1515.9863}
新しい損失は 1515 です。XNUMX つの新しい変数を追加するだけで、損失を減らすことができました。 これは、ベンチマーク モデルよりも優れた予測を行うことができることを意味します。











