機械学習を使ってデータを理解 (2022/01/29)

機械学習を使ってデータを理解 (2022/01/29)

https://blogs.oracle.com/connect/post/using-machine-learning-understand-data

投稿者:Yuli Vasiliev


Oracle Machine Learning for SQL(OML4SQL)を使用した、SQLによる高性能な機械学習モデルの構築


Oracle Database内のOracle Machine Learning for SQL(OML4SQL)(旧称:Oracle Data Mining)コンポーネントを使用すると、SQL文を使用してデータベース内で機械学習(ML)モデルをトレーニング、評価、およびデプロイすることができます。OML4SQLでは、データベース内のアルゴリズムを利用して、分類、回帰、クラスタリングなどのさまざまなMLタスクを実行できます。


この記事では、OML4SQLを使用して、不動産データから住宅価格を推定する回帰問題を解決する方法を学びます。データソースの例として、カリフォルニア大学アーバイン校の550以上のデータセットからなる公開コレクション「機械学習リポジトリ」から利用できる不動産評価の市場履歴データセットを使用しています。


ところで、SQLはデータ処理や分析のための最も一般的で強力なツールの1つになっていることをご存知でしょうか?StackOverflowの2020年調査によると、SQLは全開発者の間で3番目に人気のある言語です。



不動産評価データセット


この記事で使用するサンプルデータセットは、大都市の過去の不動産データの数百レコードを含んでいます。OML4SQLはデータベースに統合されているので、非常に大きなデータセットの分析に適していますが、ここで使われている小さなサンプルは、Oracle DatabaseでSQLを使ってMLモデルを作成し評価する方法を示すには全く問題ありません。


この記事の例を準備するために、サンプルデータセットであるReal_estate_valuation_data_set.csvをダウンロードします。このカンマ区切り値のファイルは、Machine Learning Repositoryから取得したReal estate valuation data set.xlsxから変換したものです。変換には、XLSX Converterというツールを使いました。


データを理解する この記事で使用したサンプルデータセットを調べるのに時間をかける価値があります。手始めに、MLモデルで使われる入力変数と出力変数を調べてみるとよいでしょう。そのためには、データセットのページにある「属性情報」のセクションをチェックしてみてください。このセクションには、データセットに含まれる入力変数と出力変数の簡単な説明が書かれています。入力変数の名前はXで始まり序数を含む(X1〜X6)、出力変数の名前はYで、以下のようになります。


X1 は取引日(例:2013.250 は 2013 年 3 月、2013.500 は 2013 年 6 月、など)

X2 は築年数(単位:年)

X3 は最寄りの MRT(高速鉄道)駅までの距離(単位:メートル)

X4 は徒歩で生活圏内にあるコンビニエンスストアの数(整数)

X5 は地理座標の緯度(単位: 度)

X6 は地理座標の経度(単位: 度)


Yは単位面積当たりの住宅価格



最初の入力変数X1(取引日)の例は、このフィールドのデータが、月の名前が3桁の数字に変換されるように前処理されていることを示しています(例えば、2013.500は2013 Juneを意味します)。実は、テキストを数字に変換することは、ML用のデータを準備する際に最もよく使われるテクニックの1つです。多くのMLアルゴリズムは、テキストではなく数値を扱うように設計されています。


データセットの後続の入力変数を調べると、それらのいくつかは、非常に生々しい形でデータを提供していることがわかります。例えば、X3変数は、最寄りのMRTの駅までの距離をメートル単位で含みます。しかし、MLアルゴリズムの観点からは、徒歩や公共交通機関、おそらく駅までの道のりに費やされる分数に基づいたいくつかのサブカテゴリなど、代わりに距離のタイプを持っていれば、より便利でしょう。


X5 と X6 変数には、不動産オブジェクトの地理座標が格納されています。しかしやはり、代わりに地域の名前(または数値コード)があれば、もっと便利でしょう。地理座標から地域名を抽出するには、特定のジオコーディングAPIやデータベースにアクセスする必要があります。しかし、そのような技術の使用に関する議論は、この記事の範囲をはるかに超えています。


また、.csv ファイルにある実際のデータを見てみるのもいいかもしれません。


X1..      X2..  X3..      X4.. X5..      X6..       Y..
1,   2012.917, 32,   84.87882, 10,  24.98298, 121.54024, 37.9
2,   2012.917, 19.5, 306.5947, 9,   24.98034, 121.53951, 42.2
3,   2013.583, 13.3, 561.9845, 5,   24.98746, 121.54391, 47.3
...
414, 2013.500, 6.5,  90.45606, 9,   24.97433, 121.5431,  63.9


X5とX6の地座標値がそれぞれ非常に狭い範囲に収まっていることにお気づきでしょうか。これは、もう一つの一般的な前処理問題である、各値を所定の範囲にスケーリングすることによる値の変換を解決する必要性を示しています。この場合、MLアルゴリズムの学習に適したデータにするために、0から1までのスケールで値を並べることができます。


Oracle Databaseに格納されているデータに対してこの変換を行うには、Oracle Machine Learningで使用されているDBMS_DATA_MINING_TRANSFORM PL/SQLパッケージを利用し、特にこのパッケージからINSERT_NORM_LIN_MINMAXプロシージャを使用することが可能です。ただし、今回はシンプルにするために、その詳細には触れません。



データベースのテーブルにデータをロードする .csv ファイルでデータを入手したら、それをデータベースに読み込む簡単な方法の 1 つとして、外部テーブル機能を使用する方法があります。この機能により、外部ファイルからデータベース・テーブル(外部テーブルと呼ばれる)に多数のレコードをロードし、各レコードがテーブルの独自の行に表示されるようにすることができます。


外部テーブルを作成する前に、データベース内にディレクトリオブジェクトを作成し、対象のファイルが置かれているファイルシステムのディレクトリのエイリアスを指定します。次に、このディレクトリオブジェクトに対して、データベーススキーマへの読み取り権限と書き込み権限を付与します。その後、外部テーブルを作成することができるようになります。この記事に添付されているreal_estate.sqlファイルには、これらの操作をすべて行い、サンプルデータの外部テーブルを作成するために必要なSQLステートメントが含まれています。また、以下を使用して読み込むこともできます。


CONN sys AS sysdba

--you'll be prompted to enter the password

CREATE DIRECTORY dataset_dir AS '/home/oracle/Downloads';
GRANT read,write ON DIRECTORY dataset_dir TO usr;
GRANT create table TO usr;

CONN usr/pswd

DROP TABLE real_estate;
CREATE TABLE real_estate
      (No NUMBER(3),
       X1  NUMBER(8, 3),
       X2  NUMBER(4, 1),
       X3  NUMBER(12, 5),
       X4  NUMBER(3),
        X5 NUMBER(10, 5),
        X6 NUMBER(10, 5),
       Y   NUMBER(4, 1))
    ORGANIZATION EXTERNAL
      (TYPE ORACLE_LOADER
      DEFAULT DIRECTORY dataset_dir
      ACCESS PARAMETERS
      (
        RECORDS DELIMITED BY NEWLINE
        FIELDS TERMINATED BY ','
      )
      LOCATION ('Real estate valuation data set.csv')
     )
REJECT LIMIT UNLIMITED
/


これで、サンプルデータセットの行を含む外部テーブルができあがり、次のように通常のデータベーステーブルとして問い合わせができるようになりました。


SELECT No,X1,X2,X3,X4,X5,X6,Y FROM real_estate;


生成された出力は以下のようになるはずです。


        NO        X1       X2         X3       X4          X5         X6        Y
---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
        1   2012.917        32   84.87882      10       24.98298   121.54024       37.9
        2   2012.917      19.5   306.5947       9       24.98034   121.53951       42.2
        3   2013.583      13.3   561.9845       5       24.98746   121.54391       47.3
       ...
       414    2013.5       6.5   90.45606       9       24.97433   121.5431        63.9
414 rows selected.


ご覧のように、データセットの構造とデータの両方がテーブルに正しく読み込まれました。



MLモデルの実装


データベースのテーブルの中にデータがあるので、MLを実行するためのデータベース内のアルゴリズムを使って分析することができます。しかし、まずはデータを2つのセットに分割したいでしょう。1つはアルゴリズムを学習するためのもの、もう1つはテストするためのものです。


データを分割する 教師あり学習(回帰や分類など)において、データをトレーニング用とテスト用に分けることは、最も重要な前処理ステップのひとつです。学習用サンプルは予測モデルの学習に使用され、テスト用サンプルは学習時に見たことのないデータに対してモデルの精度をテストするために使用されます。以下の PL/SQL ブロックでは、サンプルデータセットを 80% のトレーニングデータと 20% のテストデータに分割しています。


BEGIN
    EXECUTE IMMEDIATE 'CREATE OR REPLACE VIEW training_set AS SELECT * FROM real_estate SAMPLE (80) SEED (1)';
    EXECUTE IMMEDIATE 'CREATE OR REPLACE VIEW test_set AS SELECT * FROM real_estate MINUS SELECT * FROM training_set';
END;
/


次のリストには、80/20パターンに従って正しく分割が行われたことを示すステートメントとその出力が含まれています。


-- the number of rows before splitting
SQL> SELECT count(*) FROM real_estate;
  COUNT(*)
----------
       414
-- the number of rows in the training set
SQL> SELECT count(*) FROM training_set;
  COUNT(*)
----------
       332
-- the number of rows in the test set
SQL> SELECT count(*) FROM test_set;
  COUNT(*)
----------
      82
-- making sure that any rows are not sampled in both sets
SQL> SELECT COUNT(*) FROM training_set train
JOIN test_set test
ON train.No = test.No;
  COUNT(*)
----------
       0


上のリストによると、training_setビューには約80%のデータサンプルがあり、残りはtest_setにあります。さらに、両方のビューでサンプリングされた行はありません。いよいよ、モデルを学習し、そしてテストする時が来ました。


モデルの構築 このセクションでは、一般化線形モデル(GLM)アルゴリズムを使用して、training_setに回帰モデルを構築します。データベースでデータマイニングモデルを作成する前に、データベーススキーマにCREATE MINING MODEL権限を付与しておく必要があります。また、CREATE TABLE および CREATE VIEW 特権も必要です。


以下のPL/SQLブロックは、DBMS_DATA_MINING.CREATE_MODEL2()プロシージャを使用してモデル設定を指定し、モデルを構築しています。


DECLARE
    v_settings DBMS_DATA_MINING.SETTING_LIST;
    BEGIN
    v_settings('PREP_AUTO') := 'OFF';
    v_settings('ALGO_NAME') := 'ALGO_GENERALIZED_LINEAR_MODEL';
    v_settings('GLMS_FTR_SELECTION') := 'GLMS_FTR_SELECTION_ENABLE';
    v_settings('GLMS_FTR_GENERATION') := 'GLMS_FTR_GENERATION_ENABLE';
   
    DBMS_DATA_MINING.CREATE_MODEL2(
      MODEL_NAME          =>  'real_estate_model',
      MINING_FUNCTION     =>  'REGRESSION',
      DATA_QUERY          =>  'SELECT * FROM training_set',
      SET_LIST            =>  v_settings,
      CASE_ID_COLUMN_NAME =>  'No',
      TARGET_COLUMN_NAME  =>  'Y');
END;
/


変数v_settingsにSETTING_LISTを格納して、作成中のモデルの設定を指定します。この例では、PREP_AUTO設定をOFFに設定し、データベースの自動データ準備機能を無効にして、モデル構築プロセス中の自動データ変換を回避します。一般的には、この機能を試してみて、どのモード(ONまたはOFF)がデータモデルに最も適しているかを確認する必要があります。


ALGO_NAMEをALGO_GENERALIZED_LINEAR_MODELに設定することにより、OML4SQLに対して、作成されるモデルにGLMアルゴリズムを使用するように指示することができます。このモデルは、分類と回帰の問題に使用される高度な統計的モデリングアルゴリズムです。OML4SQL がサポートするアルゴリズムのリストは非常に広範囲です。


特徴選択オプションを有効にすると、出力(ターゲット属性)を予測する上で最も重要な特徴(入力)だけを選択して分析することができます。また、特徴生成を有効にすると、既存の特徴から新しい特徴を生成して分析に役立てることができます。


次に、CREATE_MODEL2()プロシージャを起動し、作成するモデルの固有名、使用するML関数、モデルの学習データを取得するSQLクエリ、モデルの設定リスト、学習データセットの固有キー列、出力列(予測する列)をパラメータに渡してください。モデルが正常に作成された場合、PL/SQLプロシージャが正常に完了したというメッセージが表示されるはずです。


モデルをテストする さて、モデルができたので、それが予測に適しているかどうかを確認する必要があります。次のクエリは、テストデータ上で入力変数の値を予測し、対応する実際の値と視覚的に比較できるようにします。


SELECT No, ROUND(PREDICTION(real_estate_model USING *), 1) AS
predicted_value, Y AS actual_value FROM test_set;


出力はこんな感じです。


        NO PREDICTED_VALUE ACTUAL_VALUE
---------- --------------- ------------
        2          43.1       42.2
        4          41.9       54.8
       11          34.5       41.4
       15          35.5       34.3
      ...
      414          57.9       63.9
82 rows selected.


また、一般的な回帰統計量である平均絶対誤差(MAE)を次のように計算することで、回帰モデルの品質を評価することができます。


SELECT ROUND(AVG(ABS(P.PREDICTED_Y - R.Y)),2) MAE
  FROM (SELECT No, PREDICTION(real_estate_model using *) PREDICTED_Y
          FROM test_set) P, test_set R
  WHERE P.No = R.No;


出力は次のようになります。


   MAE
----------
  6.37


モデルのデータと設定の実験


モデルが完成したら、モデルの精度を向上させるために、モデルのパラメータを実験することは常に良いことです。例えば、モデルの精度を低下させると思われる入力変数のいくつかを除外することができます。例えば、このモデルでは、X5 (緯度)とX6 (経度)の入力変数を除外することをテストします。なぜなら、むき出しの地理座標は、不動産オブジェクトの価値を正確に予測するのに役立たないかもしれないからです。


選択された入力変数をモデルから除外するタスクを実行するには、まず、元のデータセットを含むテーブルから別のテーブルを作成します。これは、CREATE TABLE ...ステートメントを使用して行います。SELECT ステートメントを使用して、以下のように必要なカラムだけを選択します。


CREATE TABLE real_estate2 AS SELECT No,X1,X2,X3,X4,Y FROM real_estate;


そして、先に説明したように、新しく作成したテーブルのデータを分割する必要があります。新しいデータセットでモデルを再作成する前に、まず既存のデータセットを削除する必要があります。


BEGIN
  DBMS_DATA_MINING.DROP_MODEL(model_name => 'real_estate_model');
END;
/


その後、モデルを再作成し、再度テストすることができます。


同様に、モデルの設定を変更して(例えば、PREP_AUTOの設定をオンにする)、モデルの精度が向上するかどうか試してみることも可能です。新しい設定でモデルを再作成する前に、まず既存のモデルを削除する必要があることを忘れないでください。



まとめ


Oracle SQLは、Oracle Databaseに組み込まれた最先端の機能へのアクセスを提供し、データベース内で高度なデータ分析を行うことを可能にします。この記事では、Oracle Machine Learning for SQL(OML4SQL)の使用例を紹介しました。これは、PL/SQLおよびSQL言語演算子を介して利用できる、データベース内のMLアルゴリズムの包括的なセットです。特に、住宅価格を推定するための回帰タスクの実装方法について見てきました。


もっと詳しく

コメント

このブログの人気の投稿

Oracle RACによるメンテナンスのためのドレインとアプリケーション・コンティニュイティの仕組み (2023/11/01)

Oracle Cloud Infrastructure Secure Desktopsを発表: デスクトップ仮想化のためのOracleのクラウドネイティブ・サービス (2023/06/28)

Oracle Cloudのデータベースをオブジェクト・ストレージにバックアップする3つの方法 (2021/12/13)