OCI データ統合エラー対処

Oracle Cloud Infrasatructureのデータ統合サービスを使い始めとあるエラーで苦戦したので備忘録として残そうと思います。

エラー{そんなバケットないよ~}

データ統合サービスのデータアセットでアセット元にオブジェクトストレージ内のCSVファイルを指定し、データ参照できるか確認したところ下記エラーに出会いました。
バケットが無いって言ってるわけですが、こちらからするとちゃんと用意したんで無いわけ無いんですよね(笑)
f:id:kyamisama:20220311095105j:plain

解決策

下記ポリシーを追加する事で解決しました。
結局権限が無いのでオブジェクトを参照できなかったんですよね。。。

Allow group <group_name> to use objects in compartment <compartment_name>
allow any-user to manage objects in compartment <compartment> where ALL {request.principal.type = 'disworkspace'}

もしかすると上記2つのポリシー設定しても参照できない場合もあります。
その場合は他のポリシーが無くて参照出来ない可能性が考えられます。
そんな時は公式ドキュメントをご確認ください。

シェルワンライナー ~シェル芸を極める道~ 3歩目

sortとuniqによる集計

問 14.前回のおさらい

出力される1~5の数字に対して奇数、偶数を判定する

[opc@linux ~]$ seq 5 | awk '{print $1%2 ? "奇数":"偶数"}'
奇数
偶数
奇数
偶数
奇数
[opc@linux ~]$ 

↓のように書いても良いが、【条件 ? 条件が正の場合:条件が偽の場合】と記述することができ、見た目ものスッキリすので覚えておいて損はない

seq 5 | awk '$1%2{print "奇数"}$1%2{print "偶数"}'

問 15.sortを使った並び替え

[opc@linux ~]$ seq 5 | awk '{print $1%2 ? "奇数":"偶数"}' | sort
偶数
偶数
奇数
奇数
奇数
[opc@linux ~]$

問 16.uniqを使ったカウント

uniqのオプション-cをつけることでカウントしている

[opc@linux ~]$ seq 5 | awk '{print $1%2 ? "奇数":"偶数"}' | sort | uniq -c
      2 偶数
      3 奇数
[opc@linux ~]$

豆知識

uniqは出力が連続した値同士で並んでいる必要がある。
↓のようにsortせずにバラバラの状態でuniqを使うとそれぞれでカウントされる

[opc@linux ~]$ seq 5 | awk '{print $1%2 ? "奇数":"偶数"}' | uniq -c
      1 奇数
      1 偶数
      1 奇数
      1 偶数
      1 奇数
[opc@linux ~]$ 

17.問14~16を工夫して奇数偶数をカウントする

[opc@linux ~]$ seq 5 | awk '{print $1%2 ? "奇数":"偶数"}' | sort | uniq -c | awk '{print $2,$1}'
偶数 2
奇数 3
[opc@linux ~]$ 

別解
a[$1]の連想配列を使った別解になります。

[opc@linux ~]$ seq 5 | awk '{print $1%2 ? "奇数":"偶数"}' | awk '{a[$1]++}END{for(k in a)print k,a[k]}'
奇数 3
偶数 2
[opc@linux ~]$ 

bashによるメタプログラミング

18.[even_2 , even_4 , odd_1 , odd_3]の4つのディレクトリを作成する

期待する結果
[opc@linux ~]$ ls -d odd* even*
even_2  even_4  odd_1  odd_3
[opc@linux ~]$ 
ヒント
seq 4 | awk 'コードを入れよ'| bash
答え
[opc@linux ~]$ seq 4 | awk '{print "mkdir " ($1%2 ? "odd_":"even_") $1}'| bash

Oracle Machine Learning AutoMLを使った機械学習

Autonomous Data Warehouse触ってみるの続きで今回は「Oracle Machine Learning AutoML」を使ってみたいと思います。
今回機械学習するデータはKaggleのチュートリアルで有名なタイタニックのデータを利用します。

前提条件

  • Autonomous Data Warehouseが構築されていること
  • タイタニックのデータを入手済みであること

タイタニックのデータをADWにアップロードする

SQL Developer Webの【データベースアクション】にアクセスし、【データ・ロード】をクリックします。
f:id:kyamisama:20220201150846j:plain

【データのロード】と【ローカル・ファイル】を選択し、【次】へ進みます

f:id:kyamisama:20220201151803j:plain

タイタニックのデータをドラッグ&ドロップでアップロードします

f:id:kyamisama:20220201151810j:plain

アップロード後、【鉛筆マーク】をクリックするとCSVデータを確認することができる

f:id:kyamisama:20220201152237j:plain

f:id:kyamisama:20220201153128p:plain

今回は【Servived】をVARCHAR2にデータ型を変更し、【閉じる】へ

f:id:kyamisama:20220201155743j:plain

その後データに問題なければ【開始ボタン】を押しデータを流し込む

f:id:kyamisama:20220201155827j:plain

【実行】をクリック

f:id:kyamisama:20220201160041j:plain

問題なくデータを取り込めたことを確認する

f:id:kyamisama:20220201160121j:plain

同じ要領でtest.csvもアップロードする

f:id:kyamisama:20220201160318j:plain

Oracle Machine Learning AutoML UIでモデル作成とデプロイ

OCI管理画面に戻り、【サービス・コンソール】をクリックする

f:id:kyamisama:20220201160643j:plain

左タブの【開発】から【Oracle Machine Learning ユーザー・インタフェース】へ

f:id:kyamisama:20220201160946j:plain

ログインユーザを求められた際は下記手順でユーザを作成する

すでにユーザを作成済みであればそのユーザでログインする
kyamisama.hatenablog.com

【AutoML】をクリック

f:id:kyamisama:20220201165025j:plain

【作成】をクリック

f:id:kyamisama:20220201165148j:plain

【名前】、【コメント】を入力後【データ・ソース】の虫眼鏡マークをクリックする

f:id:kyamisama:20220201165338j:plain

【TRAIN】を選択します

f:id:kyamisama:20220201170231j:plain

【学習】を[SURVIVED]、【ケースID】を[PASSENGERID]、【学習タイプ】を[分類]にします

f:id:kyamisama:20220202101603j:plain

画面右上の【開始】ボタンより【より速い結果】を選択します

f:id:kyamisama:20220202101916j:plain

学習中の画面

f:id:kyamisama:20220202102146j:plain

学習完了

f:id:kyamisama:20220202102907j:plain

【リーダー・ボード】を見ることでどのモデルの結果が良かったかが分かる

今回はSVMの精度が良かったとわかる
f:id:kyamisama:20220202103059j:plain

モデル名をクリックするこで詳細な結果が表示される

予測に最も影響したパラメータ
f:id:kyamisama:20220202103419j:plain
混同行列の結果
f:id:kyamisama:20220202103427j:plain

モデルのデプロイをします

対象のモデル名を選択し、【デプロイ】を実行します
f:id:kyamisama:20220202103657j:plain

デプロイの実行

【名前】、【URI】、【バージョン】、【ネームスペース】を記入し【共有】にチェックを入れる
f:id:kyamisama:20220202104028j:plain

デプロイの完了

f:id:kyamisama:20220202104258j:plain

モデル画面に移行

f:id:kyamisama:20220202104429j:plain

モデルのデプロイ

【デプロイメント】タブをクリックすると、先ほどデプロイしたモデルが表示されます
f:id:kyamisama:20220202104634j:plain

モデル名をクリックするとモデルのメタデータを見ることが出来る
{
  "miningFunction": "CLASSIFICATION",
  "algorithm": "SUPPORT_VECTOR_MACHINES",
  "attributes": [
    {
      "name": "AGE",
      "attributeType": "NUMERICAL"
    },
    {
      "name": "CABIN",
      "attributeType": "CATEGORICAL"
    },
    {
      "name": "EMBARKED",
      "attributeType": "CATEGORICAL"
    },
    {
      "name": "FARE",
      "attributeType": "NUMERICAL"
    },
    {
      "name": "NAME",
      "attributeType": "CATEGORICAL"
    },
    {
      "name": "PARCH",
      "attributeType": "NUMERICAL"
    },
    {
      "name": "PCLASS",
      "attributeType": "NUMERICAL"
    },
    {
      "name": "SEX",
      "attributeType": "CATEGORICAL"
    },
    {
      "name": "SIBSP",
      "attributeType": "NUMERICAL"
    },
    {
      "name": "TICKET",
      "attributeType": "CATEGORICAL"
    }
  ],
  "output": {
    "name": "SURVIVED",
    "attributeType": "CATEGORICAL"
  },
  "labels": [
    "0",
    "1"
  ],
  "modelName": "SVM_Titnic"
}
URIの確認

UTI名をクリックします
f:id:kyamisama:20220202105551j:plain
URI情報を見ることが出来ます。
"url"と"paths"はメモしておいてください。後ほど使います。
【***.***.***.***】はマスクしています。

{
  "openapi": "3.0.1",
  "info": {
    "title": "SVM_Titnic",
    "version": "1"
  },
  "servers": [
    {
      "url": "https://***.***.***.***/omlmod/v1/deployment"
    }
  ],
  "security": [
    {
      "BearerAuth": []
    }
  ],
  "paths": {
    "/SVM_Titnic/score": {
      "post": {
        "operationId": "scoreModel",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SVM_Titnic_INPUT_TYPE"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successfully scored model SVM_Titnic.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SVM_Titnic_OUTPUT_TYPE"
                }
              }
            }
          },
          "400": {
            "description": "Bad request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Resource not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Problem connecting to db, executing query or other unexpected error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "SVM_Titnic_INPUT_TYPE": {
        "properties": {
          "inputRecords": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Attributes"
            }
          },
          "topN": {
            "type": "integer",
            "format": "int32"
          },
          "topNdetails": {
            "type": "integer",
            "format": "int32"
          }
        }
      },
      "Attributes": {
        "properties": {
          "AGE": {
            "type": "number",
            "format": "double"
          },
          "CABIN": {
            "type": "string"
          },
          "EMBARKED": {
            "type": "string"
          },
          "FARE": {
            "type": "number",
            "format": "double"
          },
          "NAME": {
            "type": "string"
          },
          "PARCH": {
            "type": "number",
            "format": "double"
          },
          "PCLASS": {
            "type": "number",
            "format": "double"
          },
          "SEX": {
            "type": "string"
          },
          "SIBSP": {
            "type": "number",
            "format": "double"
          },
          "TICKET": {
            "type": "string"
          }
        }
      },
      "SVM_Titnic_OUTPUT_TYPE": {
        "properties": {
          "scoringResults": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ScoringResults"
            }
          }
        }
      },
      "ScoringResults": {
        "properties": {
          "classifications": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LabelProb"
            }
          },
          "details": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Detail"
            }
          }
        }
      },
      "LabelProb": {
        "properties": {
          "label": {
            "type": "string"
          },
          "probability": {
            "type": "number",
            "format": "double"
          }
        }
      },
      "Detail": {
        "properties": {
          "columnName": {
            "type": "string"
          },
          "weight": {
            "type": "number",
            "format": "double"
          }
        }
      },
      "Error": {
        "required": [
          "code",
          "message"
        ],
        "properties": {
          "code": {
            "type": "string"
          },
          "message": {
            "type": "string"
          }
        }
      }
    },
    "securitySchemes": {
      "BearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "JWT"
      }
    }
  }
}

ノートブックを使ってデータを予測してみる

AutoMLにアクセスする

f:id:kyamisama:20220202115618j:plain

作成したモデルをクリック

f:id:kyamisama:20220202115803j:plain

精度の高いアルゴリズムを選択しノートブックを起動します

f:id:kyamisama:20220202115957j:plain

ノートブック起動完了

f:id:kyamisama:20220202123759j:plain

【ノートブック】へアクセスします

f:id:kyamisama:20220202124045j:plain

生成したノートブックをクリックします

f:id:kyamisama:20220202124251j:plain

ノートブックが起動し実行していく

f:id:kyamisama:20220202125730j:plain

予測の評価指標をみる

f:id:kyamisama:20220202130307j:plain

シェルワンライナー ~シェル芸を極める道~ 2歩目

awkによる検索と計算の練習

問 10.正規表現を使って偶数を出力する

[opc@linux ~]$ seq 5 | awk '/[24]$/'
2
4

問 11.C言語のような条件式で偶数を出力する

'$1%2==0'の意味は$1が出力行の1つ目の要素を指す。
ここでは2とか4となる。
そして%2==0は2で割って余り0つまり偶数であることを判定している

[opc@linux ~]$ seq 5 | awk '$1%2==0'
2
4

問 12.出力した値(偶数)から半角スペースを置いて「偶数」と出力する

{printf("%s 偶数\n",$1)}の解説。
引数1個目の%sは引数2個目の$1の入れ場所を指している。

[opc@linux ~]$ seq 5 | awk '$1%2==0{printf("%s 偶数\n",$1)}'
2 偶数
4 偶数

別解

[opc@linux ~]$ seq 5 | awk '$1%2==0{print $1,"偶数"}'
2 偶数
4 偶数

問 13.条件式を使って全ての値の偶数or奇数を判定し出力する

[opc@linux ~]$ seq 5 | awk '$1%2==0{print $1,"偶数"}$1%2{print $1,"奇数"}'
1 奇数
2 偶数
3 奇数
4 偶数
5 奇数

==1を入れてOK

[opc@linux ~]$ seq 5 | awk '$1%2==0{print $1,"偶数"}$1%2==1{print $1,"奇数"}'
1 奇数
2 偶数
3 奇数
4 偶数
5 奇数

問 14.BEGIN構文を使って問13と同じ結果を出力し最後に1から5を合計する

BEGIN,ENDパターンとはawkが1行目の処理を始める前と最終行に処理する内容とそれぞれawkで実行させたい内容を書きます。
ここでのBEGINの{a=0}はaと言う変数を初期化しています。
ENDでは変数aを出力しています。
{a+=$1}は各行の$1の値を足し合わせています。

[opc@linux ~]$ seq 5 | awk 'BEGIN{a=0}$1%2==0{print $1,"偶数"}$1%2{print $1,"奇数"}{a+=$1}END{print "合計",a}'
1 奇数
2 偶数
3 奇数
4 偶数
5 奇数
合計 15

シェルワンライナー ~シェル芸を極める道~ 1歩目

1+1の計算

bcは計算するコマンドで | で左の1+1の結果をbcに渡している

[opc@linux ~]$ echo '1+1' | bc
2
[opc@linux ~]$ 

ファイルへの保存

>記号を使うことで計算された値をaに書き込む(リダイレクトする)

[opc@linux ~]$ echo '1+1' | bc > a
[opc@linux ~]$ cat a
2
[opc@linux ~]$ 

ファイルのパーミッション

chmod -r [ファイル名]とすることで読み込み出来なくしています。
読み込めるようにするにはchmod +r [ファイル名]とすることで読み込めます。

[opc@linux ~]$ chmod -r a
[opc@linux ~]$ cat a
cat: a: Permission denied
[opc@linux ~]$ chmod +r a
[opc@linux ~]$ cat a
2
[opc@linux ~]$ 

sedによる置換の練習

問1.最初の「エチル」を「メチル」に置換する。
期待する出力結果:クロロメチルエチルエーテル
[opc@linux ~]$ echo クロロエチルエチルエーテル |sed 's/エ/メ/'
クロロメチルエチルエーテル
[opc@linux ~]$ 
問2.「エチルエ」を「エチルメ」に置換する。
期待する出力結果:クロロエチルメチルエーテル
[opc@linux ~]$ echo クロロエチルエチルエーテル |sed 's/エチルエ/エチルメ/'
クロロエチルメチルエーテル
[opc@linux ~]$ 
問3.全ての「メ」を「エ」に置換する。

その場合「g」を付ける。

期待する出力結果:クロロエチルエチルエーテル
[opc@linux ~]$ echo クロロメチルメチルエーテル |sed 's/メ/エ/g'
クロロエチルエチルエーテル
[opc@linux ~]$ 
問4.「エチル」を「エチルエチル」にする

sed 's/エチル/エチルエチル/' でも良いが、&&でも同じ意味になる。
&は「エチル」を指すので「エチルエチル」にするには「&&」となる。

期待する出力結果:クロロエチルエチルエーテル
[opc@linux ~]$ echo クロロエチルエーテル | sed 's/エチル/&&/'
クロロエチルエチルエーテル
[opc@linux ~]$ 
問5.「メチル」と「エチル」を入れ替える。

オプション-Eを利用し、置換対象部分に()で文字を入れると順番に番号を与えられるのでその番号を使って入れ替える。

[opc@linux ~]$ echo クロロメチルエチルエーテル | sed -E 's/(メチル)(エチル)/\2\1/'
クロロエチルメチルエーテル
[opc@linux ~]$ 

grepによる検索の練習

問1.0が1文字でもある場合の検索方法
[opc@linux ~]$ seq 100 | grep 0 | xargs
10 20 30 40 50 60 70 80 90 100
問2.行の先頭が8で始まる場合の検索方法
[opc@linux ~]$ seq 100 | grep '^8' | xargs
8 80 81 82 83 84 85 86 87 88 89
問3.行末が8で終わる場合の検索方法
[opc@linux ~]$ seq 100 | grep '8$' | xargs
8 18 28 38 48 58 68 78 88 98
問4.8が付く2桁以上の場合の検索方法
[opc@linux ~]$ seq 100 | grep '8.' | xargs
80 81 82 83 84 85 86 87 88 89
問5.1で始まり0が0個以上続く場合の検索方法
[opc@linux ~]$ seq 100 | grep '^10*$' | xargs
1 10 100
問6.偶数のみ検索する方法

[02468]$はの中に書いた時のどれか1文字を表します。
そして$で行末が
の中の書いた文字という意味になります。

[opc@linux ~]$ seq 100 | grep '[02468]$' | xargs
2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 100
問 7.基数のみ検索する方法

問6に^を付けることでことで奇数のみとできます。^は中に書いた文字以外となります。

[opc@linux ~]$ seq 100 | grep '[^02468]' | xargs
1 3 5 7 9 10 11 12 13 14 15 16 17 18 19 21 23 25 27 29 30 31 32 33 34 35 36 37 38 39 41 43 45 47 49 50 51 52 53 54 55 56 57 58 59 61 63 65 67 69 70 71 72 73 74 75 76 77 78 79 81 83 85 87 89 90 91 92 93 94 95 96 97 98 99 100
問 8.ゾロ目を検索する方法

^(.)は先頭の文字に番号を付けます。\1で再度^(.)で取得した値を繰り返します。
最後に$をつけることで行末指定をします。

[opc@linux ~]$ seq 100 | grep -E '^(.)\1$' | xargs
11 22 33 44 55 66 77 88 99
問 9.田で終わる文字を検索する方法

grep -o "[^ ]田"でスペースではない1文字の後ろに田が付くものを検索している

[opc@linux ~]$ echo 中村 山田 田代 上田 | grep -o "[^ ]田"
山田
上田

Oracle Machine Learning AutoMLのユーザ作成

Oracle Machine Learning AutoMLを利用するユーザの作成方法を紹介します。

OCIコンソールのADWの管理画面から【サービス・コンソール】へアクセスします

f:id:kyamisama:20220201160643j:plain

【管理】から【Oracle MLユーザの管理】へアクセスします

f:id:kyamisama:20220201162824j:plain

【作成】からユーザを作成します

f:id:kyamisama:20220201163033j:plain

↓ [*]印が付いている必須事項を記入する

f:id:kyamisama:20220201163421j:plain

以上でユーザ作成完了です

Autonomous Data Warehouseをにサンプルデータを入れ込む

前回の続きです。
ブラウザからSQLをクリックすると下記のようなページに遷移します。
そして赤枠の中にサンプルデータをドラッグ&ドロップすることでデータを入れ込むことが出来ます。
f:id:kyamisama:20220128132355j:plain

それでは実際にデータを入れ込んでみる

ステップ①データ・レビュー

ドラッグ&ドロップすると下記イメージのようにデータのレビューをすることが出来ます。
アップロードするファイルに間違いが無いことを確認します。
f:id:kyamisama:20220128132916j:plain

表定義を行う

表の内部データを修正することが出来る
f:id:kyamisama:20220128133049j:plain

プレビューを行い問題なければ【終了】する

f:id:kyamisama:20220128150703j:plain

入れ込んだデータの確認を行う

  • 画面左にデータのファイル名が表示されている
  • 画面中央上部にSELECT分を実行している
  • 画面下部にその結果が表示されている

f:id:kyamisama:20220128151107j:plain

今回はここまで。次回からはOracle Analytics Desktopのチュートリアルをやってみたいと思います。