トレーニング データセットの作成

まず、教師あり機械学習方法であるランダム フォレストを使用して、ある場所の海洋計測値と海草の存在の間のデータ駆動型リレーションシップを確立します。この解析を実行するために、データをクリーニングし、必要な Python ライブラリをダウンロードします。まず、ArcGIS Pro の Python パッケージ マネージャーを使用して、scikit-learn ライブラリをインストールします。Python パッケージ マネージャーを使用すると、Python ライブラリを簡単にインストールして、インストールしたライブラリを確実に利用できます。そのため、ライブラリの機能を ArcGIS Pro から直接使用できます。次に、予測解析で使用するデータを準備します。内挿サーフェスを作成し、米国周辺にランダムに作成された 10,000 個の沿岸の場所における海洋計測値を推定します。

Python パッケージの追加

まず、後で機械学習とデータ解析に使用する Python ライブラリをインストールします。ArcGIS Pro には、デフォルトの conda 環境である arcgispro-py3 が用意されています。デフォルトの conda 環境には、ArcPy、SciPy、NumPy、Pandas などのいくつかの一般的なパッケージが含まれています。必要に応じて、この環境に対してパッケージを追加または削除することができます。このレッスンでは、scikit-learn (一般的な機械学習ライブラリ) と seaborn (統計データ可視化ライブラリ) という 2 つのライブラリを追加します。

  1. SeagrassPrediction 圧縮フォルダーをダウンロードします。
  2. コンピューター上でダウンロードしたファイルを見つけ、[ドキュメント] フォルダーに解凍します。
    備考:

    Python スクリプトでこのファイル パスを使用する必要があるため、このファイルを [ドキュメント] フォルダーに保存することが重要となります。ファイルが正しいパスを持たない場合は、スクリプトが失敗します。

    このファイルには ArcGIS Pro パッケージが含まれています。

  3. [SeagrassPrediction.aprx] ファイルをダブルクリックして、ArcGIS Pro でプロジェクトを開きます。サイン インを求められたら、ライセンスが割り当てられた ArcGIS アカウントを使用してサイン インします。
    備考:

    ArcGIS Pro または ArcGIS アカウントがない場合、ArcGIS の無料トライアルにサイン アップできます。

  4. リボンの [プロジェクト] をクリックします。左側のウィンドウで、[Python] をクリックします。

    Python パッケージ マネージャーを開く

  5. インストール済みのパッケージのリストを下にスクロールします。すでに scikit-learn および seaborn をインストール済みの方は、次のセクションに進んでください。

    scikit-learn と seaborn をインストールしていない場合は、デフォルト環境のクローンを使用して、それらをダウンロードする必要があります。デフォルト環境は変更できません。

  6. [プロジェクト環境] の下で、[環境の管理] をクリックします。

    [環境の管理] ウィンドウが開きます。

  7. [環境の管理] ウィンドウで、[デフォルトのクローン] をクリックします。

    通常、クローンの名前は arcgispro-py3-clone になります。環境のクローンが作成されるまでに数分かかることがあります。

  8. クローン化された環境を選択し、[OK] をクリックします。

    新しい環境が認識されるように、プログラムを再起動する必要があります。

  9. ArcGIS Pro を再起動します。
  10. [パッケージ マネージャー][パッケージの追加] をクリックし、検索ボックスに「scikit」と入力します。

    scikit-learn パッケージの追加

  11. [scikit-learn] をクリックし、[インストール] をクリックします。[インストール] ウィザードで、ライセンス契約に同意して、[インストール] をクリックします。
    備考:

    この画像は例です。新しいバージョンのパッケージが利用できる場合があります。最新バージョンのパッケージをインストールします。scikit-learn をインストールできない場合は、ソフトウェアに以前のバージョンのパッケージが固定されている可能性があります。[バージョン] で、メニューをクリックして [0.18.0] を選択してから、記載されているインストール手順に従ってください。

  12. 必要に応じて、[Conda_uac.exe] ウィンドウで [実行] をクリックします。
  13. ライブラリのインストールが完了したら、検索ボックスに「seaborn」と入力して、[インストール] をクリックします。指示に従って、ライブラリをインストールします。
  14. [インストール済みパッケージ] をクリックし、下にスクロールして、両方のライブラリがリストに追加されていることを確認します。

    インストール済みパッケージ

  15. 左上隅で、戻る矢印をクリックしてマップ ビューに戻ります。

入力データの準備

解析では、海草の成長に対する場所の適合性を予測するために、海洋温度、塩分濃度、栄養素濃度などの変数を知る必要があります。海洋生態学者として、フィールド計測値を使用して予測モデルを構築します。フィールド データは完全ではなく、多くの場合、欠損値があるため、解析でそのデータを使用する前に、値を入力して未加工データを完成させる必要があります。

[コンテンツ] ウィンドウには、次の 4 つのフィーチャクラスが用意されています。

  • EMU_Global_90m: 水深 90 メートルまでの海洋計測値を含む、Ecological Marine Unit ポイント データ。
  • Seagrass_USA: 海草の発生を表すポリゴン データ。[Seagrass_USA] 内の各ポリゴンは、識別されている海草生息地です。
  • US_coastline_shallow: [Seagrass_USA] で海草生息地が観測される深さまでの海底地形をカバーする米国沿岸のポリゴン データ。
  • bathymetry_shallow: 全世界の海草の予測に使用される全世界の浅瀬の海底地形ポリゴン。
  1. [EMU_Global_90m] を右クリックして、[属性テーブル] を選択します。

    属性テーブルを開く

    属性テーブルが開きます。このフィーチャクラスには、Ecological Marine Unit データセットのデータが含まれており、その属性はランダム フォレストに使用される予測変数です。たとえば、塩分濃度、海洋温度、硝酸濃度などの変数があります。ただし、このデータには多くの欠損値が含まれていることがわかります。

    欠損値

    [欠損値の補完 (Fill Missing Values)] ツールを使用して、Null データを置換できます。このツールは、空間近傍、時空間近傍、または時間近傍を使用して、データの欠損値に推定値を提供します。この場合は、値を持つ 100 個の最近隣ポイントの平均値を使用して、欠損値を推定します。

  2. リボンの [解析] タブの [ジオプロセシング] グループで、[ツール] をクリックします。

    ツール

    [ジオプロセシング] ウィンドウが開きます。

  3. [ジオプロセシング] ウィンドウで、[欠損値の補完 (Fill Missing Values)] ツールを検索します。最初の結果を選択します。

    [欠損値の補完 (Fill Missing Values)] ツール

  4. [入力フィーチャ] で、リストを展開して [EMU_Global_90m] を選択します。
  5. [出力フィーチャ] の名前を「EMU_Global_90m_Filled」に変更します。
  6. [補完するフィールド] で、ドロップダウン矢印をクリックして、次の変数をオンにします。
    • dissO2
    • nitrate
    • phosphate
    • salinity
    • silicate
    • srtm30
    • temp

    フィールドの追加

  7. [追加] をクリックしてから、[補完方法][平均値] を選択します。
  8. [空間リレーションシップのコンセプト][K 近傍] を選択し、[空間近傍数] を「100」に設定します。

    [欠損値の補完 (Fill Missing Values)] ツールのパラメーター

  9. [実行] をクリックします。

    このツールの実行が終了すると、[Salinity]、[SRTM30]、および [Temp] 属性に欠損値が入力されていないことを示す警告メッセージが [ジオプロセシング] ウィンドウの下部に表示されます。これらの属性は、欠損値が入力されていませんが、今後の解析で必要となるので、新しい出力属性テーブルで引き続き使用するために存在しています。

  10. ツールの実行が完了したら、[EMU_Global_90m_Filled] を右クリックして属性テーブルを開きます。

    補完された値

    [欠損値の補完 (Fill Missing Values)] ツールは、出力フィールドの名前に FILLED または UNFILLED という文字列を付加します。FILLED のマークが付けられた列にはツールによって作成されたデータが含まれており、UNFILLED というマークは元のデータを示します。値を補完したフィールドには、_STD および _ESTIMATED という接尾辞を持つ 2 つの列もさらに作成されます。_STD のフィールドには、欠損値の推定に使用された近傍データ ポイントの標準偏差が表示されます。_ESTIMATED のフィールドには、ツールを使用して属性が補完された場合は 1、データがすでに存在していた場合は 0 が表示されます。これで、必要な海洋変数に対する空間的に完全なデータを用意できました。

  11. 属性テーブルを閉じます。

    補完されたデータのシンボル

    新しいデータがマップに追加されました。現在、マップは 2 つのポイントでシンボル表示されています。1 つは新しいデータ値が追加された青い丸で、もう 1 つは元のデータだけが存在する空の丸です。データが追加されたことは重要ではなく、データが使用できることだけが重要であるため、シンボルを変更します。

  12. [コンテンツ] ウィンドウで、[EMU_Global_90m_Filled] を右クリックし、[シンボル] を選択します。
  13. [シンボル] ウィンドウの [シンボル] で、メニューを展開して [単一シンボル] を選択します。

    単一シンボル

    レイヤーが再描画され、新しいシンボルが表示されます。このシンボルはランダムに選択されているため、統一性があって見やすいものに変更します。

  14. [シンボル] の横にあるサンプルをクリックします。

    シンボルのサンプル

    ギャラリーが開きます。

  15. シンボル ギャラリーで、[円 1] を選択します。

    [円 1] のシンボル

  16. [プロパティ] タブをクリックし、[サイズ] を「6 pt」に設定します。[適用] をクリックします。
  17. [シンボル] ウィンドウを閉じます。

トレーニング データの作成

次に、トレーニング データセットを作成します。これは、ランダム フォレスト予測モデルが海草の存在と海洋条件の間のリレーションシップを築くうえで必要となります。トレーニング データセットは、7 つの予測変数 (海洋計測属性) と 1 つの結果変数 (場所が適切な海草生息地であるかどうか) で構成されます。これらの予測変数は、後で使用する Python スクリプトから簡単にアクセスできるように、1 つのフィーチャクラスに存在する必要があります。ランダム ポイントの新しいフィーチャクラスを作成してから、各ポイントに海洋計測データを追加します。

  1. 必要に応じて、[EMU_Global_90m_Filled][Seagrass_USA] のボックスをオンにして、これらのレイヤーを有効にします。
  2. リボンの [マップ] タブをクリックします。[ナビゲーション] グループで、[ブックマーク] をクリックして [Florida] を選択します。

    フロリダの沿岸

    [EMU_Global_90m_Filled] のほとんどのデータは、海草観測レイヤーの外側にあります。海草ポリゴン内にある [EMU_Global_90m_Filled] のサブサンプルだけを使用すると、観測データがかなり少なくなります。米国の海岸線周辺に模擬の場所を作成し、[EMU_Global_90m_Filled] を使用して、これらの場所の関連海洋計測値を計算することで、この問題を解決します。[ランダム ポイントの作成 (Create Random Points)] ツールを使用して、米国沿岸に一連のランダム ポイントを作成します。

  3. [ジオプロセシング] ウィンドウで、[ランダム ポイントの作成 (Create Random Points) (データ管理ツール)] を検索します。

    [ランダム ポイントの作成 (Create Random Points)] ツール

  4. [出力ポイント フィーチャクラス] に「USA_Train」と入力します。
  5. [制限フィーチャクラス] で、メニューを展開して [US_coastline_shallow] を選択します。
  6. [ポイント数] を「10000」に変更して、[実行] をクリックします。

    [ランダム ポイントの作成 (Create Random Points)] のパラメーター

    これで、10,000 個のポイントを含む新しいフィーチャクラスが作成されました。これは、ランダム フォレスト モデルをすばやくトレーニングする際に役立ちます。問題は、これらのポイントが属性を持たないことです。これらのポイントにデータを提供するために、[Empirical Bayesian Kriging] (EBK) を使用して [EMU_Global_90m] のデータの連続内挿サーフェスを作成し、[USA_Train] の各ポイントでこれらのレイヤーからデータを抽出できるようにします。このクエリでは、各ポイントの場所の、内挿された海洋計測値を保存できます。

  7. [ジオプロセシング] ウィンドウで、戻る矢印をクリックして、[Empirical Bayesian Kriging] を検索します。最初の結果をクリックします。

    Empirical Bayesian Kriging

  8. [Input features][EMU_Global_90m_Filled] を選択します。
  9. [Z value field][TEMP_UNFILLED] を選択し、[出力ラスター][temp] に設定します。
    備考:

    温度属性もそのエイリアスである [TEMP] の下にリストされる場合があります。[TEMP_UNFILLED] がリストされない場合、[EMU_Global_90m_Filled] 属性テーブルを再確認します。

  10. [実行] をクリックします。
  11. 残りの各海洋計測属性に対して、このツールを再実行します。

    Z value filedOutput raster

    DISSO2 (エイリアス: DISSO2_FILLED)

    dissO2

    NITRATE (エイリアス: NITRATE_FILLED)

    nitrate

    PHOSPHATE (エリア: PHOSPHATE_FILLED)

    phosphate

    SILICATE (エイリアス: SILICATE_FILLED)

    silicate

    SRTM30 (エイリアス: SRTM30_UNFILLED)

    srtm30

    SALINITY (エイリアス: SALINITY_UNFILLED)

    salinity

    備考:

    出力には必ず、ここに示している名前を使用してください。後で使用するコードが、これらの特定の名前を検索します。O と 0 を間違えないようにしてください。

    7 つすべての海洋計測属性に対して [Empirical Bayesian Kriging] ツールを実行したら、次に、[USA_Train] の各場所でこれらの計測属性の値を抽出します。すべてのサーフェスが以下の図のように表示されます。以下の図は、硝酸濃度の EBK モデルを示しています。

    硝酸に関する内挿ラスター

  12. [ジオプロセシング] ウィンドウで、戻る矢印をクリックして、[複数の抽出値 → ポイント (Extract Multi Values to Points) (Spatial Analyst ツール)] を検索します。
  13. [入力ポイント フィーチャ] で、[USA_Train] を選択します。
  14. [入力ラスター] の横で、ドロップダウン矢印をクリックしてメニューを展開し、作成した 7 つの内挿ラスターをすべて追加します。

    [複数の抽出値 → ポイント (Extract Multi Values to Points)] のパラメーター

  15. [実行] をクリックします。

    このツールは、内挿ラスターを使用して、[USA_Train] の各場所でこれらのサーフェスの値を抽出します。

トレーニング ラベルの作成

トレーニング データセット作成の最後の手順は、海草の成長をすでに認識している場所を特定することです。トレーニング データ内のすべてのポイントは [US_Coastline_Shallow] のポリゴン内にあり、このポリゴンは [Seagrass_USA] のポリゴンとオーバーラップしています。新しいフィールド名「Present」を作成し、単純なクエリを実行して、各ポイントが [Seagrass_USA] のポリゴンとオーバーラップしているかどうかを確認します。オーバーラップしている場合は、ポイントにカテゴリ変数 1 を割り当て、その場所で海草の成長がすでに認識されていることを示すことができます。その他のポイントにはすべて値 0 を割り当て、それらのポイントが海草生息地として適切でないことを示します。この属性を使用することで、機械学習モデルは海草の成長に適した海洋条件の組み合わせを学習できます。

  1. [ジオプロセシング] ウィンドウで、[フィールドの追加 (Add Field) (データ管理ツール)] を検索します。
  2. [入力テーブル][USA_Train] を選択して、[フィールド名] に「Present」と入力します。
  3. [フィールド タイプ][Double] に設定して、[実行] をクリックします。

    フィールドの追加

    このツールによって、[USA_Train] フィーチャクラスに「Present」という名前の空のフィールドが作成されました。

  4. [コンテンツ] ウィンドウで、[USA_Train] を右クリックして、[属性テーブル] を選択します。テーブルに [Present] が追加されていることを確認します。

    [Present] 列のすべての行には、Null データ値が含まれています。海草ポリゴン内にある、[USA_Train] のポイントに値 1 を割り当て、海草ポリゴン内にないポイントには値 0 を割り当てたいと思います。まず、すべてのエントリを Null から 0 に変更します。

  5. 属性テーブルで [Present] を右クリックし、[フィールド演算] を選択します。

    フィールド演算 (Calculate Field)

    [ジオプロセシング] ウィンドウで [フィールド演算 (Calculate Field)] メニューが開きます。

  6. [入力テーブル][USA_Train] を選択し、[フィールド名][Present] に設定します。
  7. [式][Present =] で、「0」と入力して、[実行] をクリックします。

    [フィールド演算 (Calculate Field)] のパラメーター

    これでフィールド全体が 0 に設定されたので、海草レイヤーと交差するポイントの場所を見つけることができます。

  8. リボンの [マップ] タブの [選択] グループで、[空間条件で検索] をクリックします。
  9. [ジオプロセシング] ウィンドウの [入力フィーチャ レイヤー] で、[USA_Train] を選択します。
  10. [リレーションシップ][交差する] に設定されていることを確認し、[選択フィーチャ][Seagrass_USA] を選択して、[実行] をクリックします。

    [空間検索 (Select Layer By Location)] のパラメーター

    このツールは、[Seagrass_USA] のポリゴンと交差する、[USA_Train] の行を選択します。これらは、値 1 を割り当てるポイントです。

  11. 属性テーブルで [Present] を右クリックし、[フィールド演算] を選択します。以下に示すようにパラメーターを設定します。
    • 入力テーブル: USA_Train
    • フィールド名: Present
    • : Present = 1

    [Present] フィールドの計算

  12. [実行] をクリックします。
  13. ツールの実行が完了したら、リボンの [マップ] タブで [選択] グループをクリックし、[選択解除] をクリックします。

    選択解除

  14. 属性テーブルを閉じてマップを保存します。

次に、トレーニング データを使用して、ランダム フォレスト分類器でモデルを作成します。


ランダム フォレスト分類の実行

これまでは、海草生息地の適合性判断に役立つ 8 つの変数を含むトレーニング データセットを作成しました。データの準備が整ったので、ダウンロードした機械学習ライブラリを使用して、予測モデルを作成します。まず、変数の相関関係を確認して、ランダム フォレスト分類が最適な選択肢であることを確認します。ランダム フォレストは、トレーニングを必要とする教師あり機械学習方法です。つまり、正解がわかっているデータセットを使用して、予測モデルを適合させる (教育する) 必要があります。次に、データを 2 つのセクションに分類します。1 つはランダム フォレスト分類器をトレーニングするセクションで、もう 1 つは分類器が作成した結果をテストするセクションです。結果の精度に基づいて、所有する全世界のデータにモデルを適用し、フィーチャクラスとして保存できます。

Python への空間データの取り込み

ArcGIS Pro の Python コンソールを使用して、前回のレッスンで作成した空間トレーニング データを操作します。まず、予測モデルの構築と機械学習に使用する Python ライブラリをインポートします。次に、データを、ライブラリが操作できる構造に変換することで、Python に取り込みます。データを ArcGIS が読み取ることができる適切な形式 (シェープファイルなど) にしておく必要があるのと同様に、データを Python が読み取ることができる配列またはデータ フレームにしておく必要があります。

  1. 必要に応じて、[SeagrassPrediction] プロジェクトを開きます。
  2. リボンの [解析] タブの [ジオプロセシング] グループで、[Python] をクリックします。

    Python コンソールを開く

    ArcGIS Pro 内に Python コンソールが開きます。

  3. Python コンソールで次のコードを貼り付け、Enter キーを 2 回押してコードを実行します。

    各ステップの後に Enter キーを 2 回押すと、コードが小さなピースで実行されます。

    from sklearn.ensemble import RandomForestClassifier
    import numpy as NUM
    import arcpy as ARCPY
    import arcpy.da as DA
    import pandas as PD
    import seaborn as SEA
    import matplotlib.pyplot as PLOT
    import arcgisscripting as ARC
    import SSUtilities as UTILS
    import os as OS

    このコードは、解析に必要なすべての Python ライブラリをインポートします。

    コンソールでのライブラリの読み込み

  4. 解析用の属性を含むフィーチャクラスに名前を付けます。USA_Train と EMU_Global_90m_Filled は入力しにくいため、それぞれ「inputFC」と「globalFC」という名前にします。
    inputFC = r'USA_Train'
    globalFC = r'EMU_Global_90m_Filled'
  5. 予測変数 (海洋計測属性) および予測と分類の変数 (海草の存在) の名前を定義します。変数ごとに、変数に含める属性の名前を入力します。最後に、使用するすべての属性を含む変数を作成します。8 つの変数をすべて再入力するのではなく、前の 2 つの変数を連結 (結合) します。
    備考:

    必要に応じて、O と 0 の入力間違いがないかを確認してください。

    predictVars = ['DISSO2', 'NITRATE', 'PHOSPHATE', 'SALINITY', 'SILICATE', 'SRTM30', 'TEMP']
    classVar = ['PRESENT']
    allVars = predictVars + classVar

    フィーチャクラスが Python フレームワークに読み込まれると、これらの変数が NumPy 配列のデータ構造に追加されます。NumPy (Numerical Python) は、科学計算用のパッケージです。このライブラリには、特に、トレーニング データをトレーニング セットとテスト セットに分類するために使用する関数が含まれています。

  6. ArcPy 関数 FeatureClassToNumPyArray を使用します。その引数として、入力テーブルと、入力テーブル内の使用するフィールド名を入力します。次に、ArcPy.Describe 関数を使用して、トレーニング データ フィーチャクラスの空間参照を読み込みます。

    この関数は、ArcGIS Pro 内のフィーチャクラスを配列として Python に取り込みます。

    trainFC = DA.FeatureClassToNumPyArray(inputFC, ["SHAPE@XY"] + allVars)
    spatRef = ARCPY.Describe(inputFC).spatialReference

    フィールド引数 ["SHAPE@XY"] は、USA_Train のデータ (trainFC) 内の各ポイントの位置座標を呼び出し、リスト allVars と連結します。これで、トレーニング データ内のすべてのポイントの座標と、それらに個別に関連付けられているすべての属性が配列に含まれるようになりました。空間参照は元のデータの投影法をメタデータに保存するため、データをフィーチャクラスにエクスポートするとフィーチャクラスとして視覚化できます。

  7. これでデータが Python 配列になったので、データを pandas データ フレームに変換します。最初の引数で、変換対象の配列を指定し、2 つ目の引数で、含める属性を定義します。
    data = PD.DataFrame(trainFC, columns = allVars)

    データ フレームはデータ構造であり、pandas はその構造の作成と参照に使用される標準ライブラリです。これですべての変数が Python で適切に書式設定されたので、それらの変数を解析に使用できます。

分類方式の選択とデータの分類

分類方式は、正確な予測モデルを作成するうえで最も重要な要素の 1 つです。統計では、偶発的なバイアスの可能性が最も低い数値処理方法を選択する必要があります。使用する方法、つまりランダム フォレスト分類が最適な選択肢であることを確認するために、使用する 7 つの変数の相関図を作成します。次に、以前に作成したデータ ポイントをトレーニング セットとテスト セットに分類します。スクリプトは、テスト データセットを使用して、海草の存在を予測します。その後、テスト データセットを使用して、予測の精度を判定します。

  1. 計算を容易にするために、pandas の .astype 関数を使用してデータ タイプを変更します。次に、.corr() 関数を使用して、変数間の相関関係を計算します。

    直前のセクションで、すべての属性データを含む pandas データ フレームに名前を付けたことを思い出してください。

    corr = data.astype('float64').corr()

    この関数は、予測属性間の Pearson の相関係数を計算します。相関係数は、変数の間の関係を計測する方法です。すべての係数は -1 ~ 1 の値を持ちます。-1 は完全な負の相関関係 (変数 A が大きくなると、変数 B が小さくなる傾向にある) を表し、1 は完全な相関関係 (変数 A が大きくなると、変数 B も大きくなる傾向にある) を表します。相関係数 0 は、関係がまったくないことを示します。

  2. 次のコードを使用して、相関係数を変数間の相関行列として描画します。

    seaborn ライブラリの .heatmap 関数は、使用する図のタイプを定義します。次の引数は、図の外観を指定します。

    ax = SEA.heatmap(corr, cmap=SEA.diverging_palette(220, 10, as_cmap=True),
    square=True, annot = True, linecolor = 'k', linewidths = 1)
    PLOT.show()

    相関図

    この図は、変数間の相関関係を示しています。高い正の相関関係は明るい赤で示されているため、中心を通る対角線があります。各変数はそれ自身と高く相関しています。濃い青は、高い負の相関関係を示します。

    複数の予測因子が正または負で高く相関しているため、ランダム フォレストが使用に適した方法となります。ランダム フォレストは、バイアスを最小限に抑えるような形で、互いに依存する予測変数を処理できます。

    これで、ランダム フォレストが、使用できる最適なモデルであることを確認したので、ランダム サンプリングを使用して、トレーニング データを 2 つの部分に分割します。

  3. ウィンドウを閉じて、ワークフローを続行します。
  4. fracNum (取得するサンプルのサイズ) を定義してから、.sample 関数を使用して、トレーニング データセットからランダム サンプルを取得します。サンプル サイズのパラメーターとして、fracNum を使用します。
    fracNum = 0.1
    train_set = data.sample(frac = fracNum)

    これで、トレーニング データの 10% のランダム サンプルができました。残りはテスト セットになります。

  5. test_set 引数を使用して、すでにトレーニング データセットに割り当てられたデータのすべてのポイントを削除することで、データセット .drop を作成します。
    test_set = data.drop(train_set.index)

    米国の海草データは、トレーニング データセットとテスト データセットに分割されました。使用可能なデータの 10% が、ランダム フォレスト予測モデルを構築するためのトレーニング データセットに分類されるように指定しました。データセットの残りの 90% は、モデルが海草の存在をどれだけ正確に予測するかのテストとして使用されます。

  6. 変数 Indicator を作成し、.factorize コマンドを使用して、train_set のデータがカテゴリ変数として読み取られるようにします。
    indicator, _ = PD.factorize(train_set[classVar[0]])

    そうしないと、Python がこのデータを連続データとして読み取るため、モデルが 0 ~ 1 のあらゆる値を返す可能性があります。他の場合にはこれが標準ですが、0.5 や 0.32 などの値が返されても、海草の存在について何もわかりません。

  7. print コマンドを使用して、トレーニング データセットとテスト データセットの値を表示します。両方のラベルを入力し、それらを変数の文字列バージョンと連結します。
    print('Training Data Size = ' + str(train_set.shape[0]))
    print('Test Data Size = ' + str(test_set.shape[0]))

    2 つのデータセットのサイズの出力

    備考:

    データから取得した別のランダム サンプルを使用しているため、結果が少し異なります。

    次の手順として、ランダム フォレスト分類器をトレーニングして、予測因子と海草の存在の関係を構築します。

ランダム フォレスト分類器のトレーニング

データを分割したので、作成したトレーニング データを使用してランダム フォレスト分類器をトレーニングします。

  1. 変数 rfco を作成して、500 本のツリーを作成する RandomForestClassifier コマンドの実行結果を示します。次に、.fit 引数を使用して、フォレストの結果をトレーニング データに適用します。
    rfco = RandomForestClassifier(n_estimators = 500, oob_score = True)
    rfco.fit(train_set[predictVars], indicator)
  2. テスト データセットを使用して、分類を再び実行します。属性 seagrassPred を作成して、存在する場合は 1、しない場合は 0 でこのデータを格納します。

    テスト データは、モデルのトレーニングに使用されなかった、米国の沿岸データの 90% であり、予測の精度を示します。

    seagrassPred = rfco.predict(test_set[predictVars])
  3. 分類結果を使用して、予測の精度と推定誤差を計算することで、モデルの性能を確認します。
    test_seagrass = test_set[classVar].as_matrix()
    test_seagrass = test_seagrass.flatten()
    error = NUM.sum(NUM.abs(test_seagrass - seagrassPred))/len(seagrassPred) * 100
  4. データの精度メトリクスを出力し、モデルの予測が正しく機能していることを確認します。
    print('Accuracy = ' + str(100 - NUM.abs(error)) + ' % ')
    print('Locations with Seagrass = ' + str(len(NUM.where(test_seagrass==1)[0])) )
    print('Predicted Locations with Seagrass = ' + str(len(NUM.where(seagrassPred==1)[0])))

    精度メトリクスの出力

    このスクリプトは、トレーニング データとテスト データに使用されたポイントの数、および精度を出力します。予測モデルは、100 回のうち約 95 回、海草が存在すると認識されている場所で海草の存在を正しく予測しました。このように正解率が高いため、米国全体のデータでこのモデルをトレーニングして、全世界の海草の場所を予測できます。

  5. .factorize 関数を使用して、変数 indicatorUSA を作成します。
    indicatorUSA, _ = PD.factorize(data[classVar[0]])

    indicator を作成したときと同様に、.factorize 関数はデータをカテゴリとしてエンコードします。

  6. 米国沿岸の全データを使用してトレーニングするランダム フォレスト モデルとして、変数 rfco を定義します。引数 n_estimators で、500 本のツリーを作成することを指定します。
    rfco = RandomForestClassifier(n_estimators = 500)
    rfco.fit(data[predictVars], indicatorUSA)

    これでランダム フォレスト モデル rfco がトレーニングされたので、このモデルを世界の沿岸の EMU データに適用します。そのためのプロセスは、トレーニング データを正しくフォーマットするために使用したプロセスと同様です。

  7. 全世界の EMU データを配列として Python に読み込み、pandas フレームワークに変換してから、.describe 関数を使用して、フィーチャクラスの空間参照を保存します。
    globalData = DA.FeatureClassToNumPyArray(globalFC, ["SHAPE@XY"] + predictVars)
    spatRefGlobal = ARCPY.Describe(globalFC).spatialReference
  8. rfco モデルで全世界のデータを実行し、全世界の予測を取得します。
    globalTrain = PD.DataFrame(globalData, columns = predictVars)
    seagrassPredGlobal = rfco.predict(globalTrain)
  9. NumPyArrayToFeatureClass 関数を使用して、予測配列をフィーチャクラスとして格納します。フィーチャクラスに名前を付け、ジオデータベースを指定します。出力テーブルの入力データと形式を指定します。
    備考:

    必ず、outputDir の場所を編集して、プロジェクトを解凍した [ドキュメント] フォルダーにします。このコード部分を実行する前に、your_username を置き換えてください。正しいファイル パスを簡単に見つけるには、ファイル エクスプローラー ウィンドウでジオデータベースを開き、パス全体をコピーします。

    nameFC = 'GlobalPrediction'
    outputDir = r'C:\Users\your_username\Documents\SeagrassPrediction\SeagrassPrediction.gdb'
    grassExists = globalData[["SHAPE@XY"]][globalTrain.index[NUM.where(seagrassPredGlobal==1)]]
    ARCPY.da.NumPyArrayToFeatureClass(grassExists, OS.path.join(outputDir, nameFC), ['SHAPE@XY'], spatRefGlobal)
  10. Python コンソールを閉じます。
  11. マップを保存します。

全世界の沿岸の所定の場所に海草が存在するかどうかを示す予測モデルを作成しました。属性 seagrassPred には、各ポイントの予測が 1 または 0 として含まれます。値 1 は海草生息地として適していることを示し、0 は海草の成長に適さない場所であることを示します。海草生息地のモデリングに向けて、1 の値 (海草が成長する場所) に関心があります。さらに、1 の値が高密度で連続している場所に興味があります。


予測結果の評価

これまでは、ランダム フォレスト分類器を使用して、全世界の海草の存在を予測しました。生態学者として、最も費用効果が高いのは、海草が存在するという予測が密集している場所を保護することであると認識しています。そのようなエリアを見つけるために、予測結果をマップに追加し、[カーネル密度 (Kernel Density)] ツールを使用して、海草が存在するという予測が広範囲に集中している全世界の場所を見つけます。最後に、レイアウトを挿入してマップを追加し、グラフィックスとして簡単にエクスポートして共有できるようにします。

カーネル密度サーフェスの作成

まず、予測の結果をフィーチャクラスとして保存してから、マップに追加します。

  1. 必要に応じて、プロジェクトを開きます。
  2. 必要に応じて、リボンの [表示] タブの [ウィンドウ] グループで、[カタログ ウィンドウ] をクリックします。
  3. [カタログ] ウィンドウで、[プロジェクト] をクリックして [フォルダー] を展開し、ジオデータベースを見つけます。

    海草のジオデータベース

  4. [SeagrassPrediction.gdb] を右クリックして、[更新] をクリックします。
  5. 更新が完了したら、[SeagrassPrediction.gdb] を展開し、[GlobalPrediction] をマップにドラッグします。

    海草が存在するポイントを示す [GlobalPrediction] レイヤーの結果

  6. [ジオプロセシング] ウィンドウで、[カーネル密度 (Kernel Density)] ツールを検索し、[カーネル密度 (Kernel Density) (Spatial Analyst ツール)] を選択します。
  7. [入力ポイント、またはライン フィーチャ] で、[GlobalPrediction] を選択します。[出力ラスター] に「SeagrassHabitats」と入力し、[出力セル サイズ] を「0.2」に変更します。

    [Kernel Density] ツール

    密度の結果に陸地が含まれないようにするため、[bathymetry_shallow] レイヤーをマスクとして使用します。

  8. [環境] タブの [マスク] で、[bathymetry_shallow] を選択します。[実行] をクリックします。

    生成される密度サーフェスは、全世界のさまざまな沿岸域で予測された海草の密度を含む新しいラスターです。デフォルトのシンボルは、紫のカラー ランプで海草の成長を示しています。海草が存在するという予測がかなり集中していることを示す濃い紫のエリアは見ることができますが、薄い紫のエリアは見えにくくなっています。[コンテンツ] ウィンドウで、それらの値も、分類を使用してシンボル表示されていることを確認できます。値の範囲は、個別のボックスで表示されるカテゴリ (クラス) に分類されています。この場合、クラスは意味がないため、ストレッチを使用してデータを再分類します。

  9. 必要に応じて、[SeagrassHabitats] を除くすべてのレイヤーをオフにします。
  10. [SeagrassHabitats] レイヤーを右クリックし、[シンボル] をクリックします。
  11. [シンボル] ウィンドウで [シンボル] メニューを展開し、分類タイプとして [ストレッチ] を選択します。

    [ストレッチ] は、データを厳密なカテゴリに分類するのではなく、データのすべての値を取得して、範囲内の相対的な場所として表示します。

  12. [シンボル] ウィンドウで [配色] メニューを展開し、[すべて表示] をクリックします。[ヒート マップ 1] を選択します。

    [ヒート マップ 1] のカラー ランプ

    マップが再描画され、新しいヒート マップのカラー ランプを使用して、予測される海草の場所が表示されます。

    予測の配色

    浅瀬の沿岸エリアのほとんどで海草の成長が見られる一方、赤と黄色のエリアは、大規模な海草成長クラスターの生成に適した海洋条件を持つ場所です。現在のベースマップでは、これらのクラスターがあまり目立ちません。

  13. リボンの [マップ] タブをクリックし、ベースマップを [キャンバス (ライト グレー)] に変更します。

    [キャンバス (ライト グレー)] ベースマップ

    シンプルなグレーの大陸により、海草レイヤーが目立つようになります。このマップで強調しようとしているのは、海草に関する解析結果であるため、これで希望通りになりました。見つかったホット スポットは、マップの東端と西端にもあります。ビューを変更して、これらのクラスターを中央に配置します。

  14. [コンテンツ] ウィンドウで、[Seagrass] を右クリックし、[プロパティ] を選択します。

    マップ プロパティ

  15. [マップ プロパティ: Seagrass] ウィンドウで、[座標系] をクリックし、[日付変更線周辺の折り返しの有効化] ボックスをオンにします。[OK] をクリックします。

    日付変更線周辺の折り返しの有効化

  16. アラスカ - シベリアのクラスターが中央になるように、マップを画面移動します。

    アラスカとシベリアが中央に配置されたマップ

レイアウトの挿入

保護すべき最も重要なエリアが見つかったので、作業内容を簡単にエクスポートして紙やプレゼンテーションで共有できるように、マップをレイアウト形式にします。

  1. リボンの [挿入] タブをクリックして、[新しいレイアウト] を展開します。[ANSI - Landscape] の最初のオプション [Letter] を選択します。

    [Letter] のレイアウト

    新しいレイアウトが開きます。このレイアウトは、追加したいマップを選択できるように空白になっています。

  2. リボンの [挿入] タブで、[マップ フレーム] ボタンをクリックします。[Seagrass] マップを選択します。

    マップ フレームの追加

  3. マップの左上隅をクリックして、レイアウトのサイズの四角形を描画します。

    マップ フレームがレイアウトに追加されます。マップ上でオンにしたレイヤーがすべて表示されます。

  4. 次に、レイアウト内のマップ フレームを右クリックして、[アクティブ化] を選択します。

    マップ フレームのアクティブ化

    マップ フレームがアクティブになると、マップを必要な場所にズームしたり画面移動したりできます。

  5. マップがほぼ中央に配置されるまで、マップを画面移動します。
  6. リボンの [アクティブ化されたマップ フレーム] で、[挿入] タブをクリックします。[マップ] グループで、[閉じる] をクリックします。

    マップ フレームが非アクティブになり、タイトルや縮尺記号などの残りのエレメントを追加するときに固定されたままとなります。

  7. リボンの [挿入] タブをクリックします。[テキスト] グループで [テキスト] (または [四角形]) をクリックし、マップをクリックして、テキスト ボックスを挿入します。
  8. [コンテンツ] ウィンドウで、[テキスト] アイテムをダブルクリックし、[テキストの書式設定] ウィンドウを開きます。
  9. [テキストの書式設定] ウィンドウで、[テキスト] に「GLOBAL SEAGRASS HABITATS」と入力し、テキストの外側をクリックして適用します。

    タイトル テキストの書式設定

  10. [テキスト シンボル] タブをクリックし、[プロパティ] をクリックしてから、[表示設定] を展開します。[フォント名][Constantia] に、[フォント スタイル][太字] に、[サイズ][24 pt] に変更します。

    タイトル テキストの書式設定

  11. [適用] をクリックして、タイトルをマップ上部の中央に配置します。
  12. リボンの [挿入] タブで、[縮尺記号] をクリックして、マップの左下隅に四角形を描画します。

    縮尺記号がマップに追加されます。

  13. 縮尺記号をレイアウトの右下隅にドラッグします。

    縮尺記号を含むマップ

    最後に、凡例を追加して、予測レイヤーにさらに多くのコンテキストを提供します。

  14. リボンの [挿入] タブで、[凡例] をクリックします。マップの左下に四角形を描画します。

    デフォルトでは、凡例に、マップ上で現在シンボル表示されているレイヤーが表示されます。この凡例テキストでは有用な情報が得られないため、テキストを削除します。

  15. [凡例の書式設定] ウィンドウで、[凡例項目] グループを展開して、[プロパティの表示] をクリックします。[表示] の下で、すべてのボックスをオフにします。

    凡例に表示されるのは、カラー ランプだけです。表示するよう選択するのはこれだけであるため、これを大きくします。

  16. 必要に応じて、[サイズ設定] グループを展開します。[パッチの幅][30 pt] に、[パッチの高さ][20 pt] に変更します。

    パッチ サイズの変更

  17. [書式設定] ウィンドウの左上隅で、戻る矢印をクリックします。

    次に、凡例に独自のラベルを追加します。

  18. リボンの [挿入] タブで、[テキスト] をクリックします。凡例の上側にテキスト ボックスを描画します。
  19. [テキストの書式設定] ウィンドウの [テキスト] で、「High Density」と入力します。
  20. [テキスト シンボル] タブをクリックし、[表示設定] を展開します。[フォント名][Constantia] に、[フォント スタイル][太字] に変更します。[適用] をクリックします。
  21. Low Density」という名前の別のテキスト ボックスを作成し、同様に書式設定します。
  22. ラベルをそれぞれカラー ランプの上部と下部に並べます。

    最終的なマップ レイアウト

    これですべてのレイアウト エレメントが配置されたので、マップを共有します。

  23. リボンの [共有] タブをクリックします。[エクスポート] グループで、[レイアウト] をクリックします。
  24. マップを保存します。

後でプレゼンテーションや紙で使用できる任意の形式とサイズで、グラフィックスを保存できます。このレイアウトには、全世界の潜在的な海草成長を示す重要なクラスターがいくつか表示されています。ランダム フォレスト分類を使用して海草に適した海洋条件を見つけることで、これらを識別しました。これらのクラスターは、さらに調査して、最終的には保護する必要があります。

その他のレッスンについては、「Learn ArcGIS Lesson ギャラリー」をご参照ください。