⚡️今更ながらkaggleに初挑戦する
機械学習関連の知識に手を出そう出そうと思っていたが他の技術のキャッチアップに忙しく手を出せないでいた。
しかしちょうどkaggleの社内コンペが開催されたので参加してみた。
SESでも参加できるのはありがたいと思う。
⚡️とりあえずデータ可視化目的(EDAというらしい?)の自分用汎用ダッシュボードを作成。
PowerBIやStreamlitを使用するとスピードに難があるので、wasm-duckdb?を使用してみたい。
honoやlookerとも比較したい。(もしかしたらgrafanaの方が良い?)
ダッシュボードより速い、lightning board
duckdb rust looker でできないかどうか試してみる。
wasmはその後試してみたい。
wasm-duckdbを使用する前提でとりあえずjavascript上でduckdbを初期化するコードが公式にある。
viteの方が多分reactでやるのであれば正攻法なんだと思うけどエラーが出たのでとりあえずjavascriptコードで試した。
なんとかduckdbでjsonlファイルを読み込んだがエラー...
RuntimeError: memory access out of bounds」
WebAssemblyで動作するDuckDB-Wasmがメモリを不正にアクセスしようとしたということらしい。
どうも読み込むファイルサイズが大きすぎる。
だからみんなparquetへ変換するのか...
localstorage永続化は多分容量が足りなさすぎる。
明日はadd opfs?
reactとwasm-duckdbを使用
datagridにはapexgrid でUIはshadcnを今回は使用。(他アプリではMUIを使っていたので他のを使いたくなった)
apexgridは多機能テーブルなのでそこも期待したい。
ダッシュボード部分は多分shadcnでなんとかなるはず。
表はtanstack query tableの方使ってみかと思ったが長いので結局mui datagridに戻りそう。あとは素直にmui x charts使う方が良いかも。
やっぱりshacn-ui使うか。(一生決まらない)
The griddata have been shown.
I shold decide the way to extract data.
It'll be csv on S3 and lambda at first.
On second opfs...
NBA csv data is on the web url.
At this time,I shoud import handy.
Making csv is not difficult.Trim space and put ",".But you should insert a line break when you want to switch other row.
Actevated OPFS explorer...
This is for unvisible folder system on browser...
Making a checkbox for columns and avg line chart and height.
関西kaggleの会に参加!
物理系コンペ 物理現象に関連している。
恒星の前を惑星が通り過ぎる現象:transit
FGS1
AIRS
で観測する。
283種類の波長の光で観測
面積比:膨張で待機の構成によって光の屈折率が変わる
AIRS:センサーmask:センサーの精度がいろいろ
シミュレーションデータ:問題設定物理現象の把握が難しい
データがノイジー...惑星が通り過ぎたかどうかわからない...
trainデータに大気組成はないがtestにはある状態
transit中のlight_curveを特徴量として 多項式フィッティング sigma
波長方向にsliding windowで平均化:デノイズ
各波長ごとにlight curveを使用
random forestにすべて入れて予測
NNでのスタッキング
ベイズ系手法による予測:
Hot pixel process :極端な情報を除去してしまう対策
foreground light 除去:恒星がなくてもセンサーが光を検出してしまう影響の除去
wl_i に定数をかけるとなぜか改善する現象が原因
周りのピクセルを用いて壊れたセンサーのデータ補正
ガウス 負の対数 ニューラルネットワーク 低波長 高波長
ランダムフォレストでシグマを予測:多項式
Indoorコンペ:ヒューリスティック最適化
GBDT YOLO
Benetech:散布図のデータ 全て同じ見た目→検出されたデータ点からパターンを作り再検出する。
睡眠コンペ:Child Mind Institute
BirdCLEF2024:昔の解法があると前回からやっている人に遅れをとる。
takoi
ris
取り組み
シェイクしやすい
自分一人でアンサンブルする
時系列 transformer lstm
gbdt
ニューラルネットワーク→特徴量エンジニアリング
LightGBM:特徴量エンジニアリング
post processを入れたやつを選びにくい?
publicが低いと選びづらいが 選べる
gpu 業務
データ分析
Deepfake Detection
Real か Fake
face voice
ライセンス:著作権 データセット
YOLO コピーレフト 商用では使えない
Foursuare Location Matching:
学習データと 評価時の学習データがてれこ
sennet hoa
シェイクしやすい:医療コンペ
LEAP 3Dは厳禁
仕事用 商用
pao
クラウドのgpuを使用
パイプライン
atmacup
スマホEDAの需要
plotly
autify:ING fukuchan
ソフトウェアテスト自動化
blloming camp
yokono
さくらインターネット:本社梅田 あいあーす
udemy
panta rhei
AIコア
/VCから資金調達?
google for starts ups
インターン生
leadknock
turning atmacap
自動運転AI
vision langage
terra
e2e
自動運転
エクサウィーズ
サプライチェーン予測
MLOPs パイプライン
elith
kaggleのデータセットでパイプラインの構築、データ基盤の構築をやるのは面白そうだと思い、スクラップをこちらに移行。
Athena
Avro
OpenMetadata
Glue
DataCatalog
Cometa
Snowflake:データリネージ機能追加
OpenMetadata って何?
メタデータを管理する。さまざまなデータソースからメタデータで自動的に収集。
データカタログ作るのとデータリネージとは、データの生成から使用までの流れを追跡するツール
包括的な感じを受ける
S3にCSVを保存
AWS Glue Crawlerを使ってデータカタログを作成
Athenaを使ってクエリを実行
OpenMetadataとの接続
あえてawsですべてやってから他の方法も試す
機械学習部分のコードはLLMなどを使用せずにシンプルにすればLambdaやGlueでも動くのだろうか?
Lambdaもメモリサイズが合った気がする。
MLOPsの自動化...パイプラインの各処理の可視化、自動化等等がっつりやるということ。
Dockerが一時的に立ち上がり、終了時に消えるようにする。
推論は並列化できる。とりあえずS3に各csvを保存
sagemaker用の記述なのでglue用にする。
glueのIAM設定でポリシーを作成できる。
とりあえずread&write
次はテーブルを作る?いやetlジョブの作成
とりあえずs3からデータを取得してglueで変換、s3にデータを返すというところまで...
titanicのgender test trainのデータを取得
shellのジョブの作成 add nodeにはない
scripteditor?
visual etlジョブにglueのshell scriptをつなげたい
visual etlはrun job monitor に表示される
消えたかと思った
visual etlとshellをworkflowでオーケストレーションするのか...なるほど
とりあえずtriggerの追加
triggerの前後にjobを置くと石化する
余談だが製造業と機械学習の相性は意外にもあまり良くないかもしれない。
機能として100%を求められる場面が多く取りこぼしや見落としが合ってはならない...という要件が多いからかな(絶対にあってはならないという前提がありがち)
おそらく間違う可能性のあっても良い例えば「予測」という分野では使用できるが異常検知をコアの部分で使用するのは無理なのではないか...自分の知見が足りないだけか...
ターゲットの設定ミスか
というぼやき
あくまで、基本となるべき部分は物理式などに頼り、その範囲外の予測をAIで調節という方法が一般的には良いのだと思う。(ミスが許されない分野では特に)
データのリネージの可視化...awsだとglue datacatalog?
もしローカルのデータで行う場合はない?
duckdbで簡易ウェアハウスを作成する場合に使用できるものがあれば面白い
あるなあ
これdbtにopenmetadata とか cometaとか繋げたら勝ちでは
kaggle apiを使用してローカルでtitanicのデータセットを使用できるようにしている。
mkdir -p ~/.kaggle
mv ~/Downloads/kaggle.json ~/.kaggle/
ホームディレクトリに隠しフォルダ
ローカルに一回フォルダを作ってcsvをダウンロードした後にそのデータを読み取ってparquetに変換して元のcsvを消すという方法をとっている。
もっと方法はあるはず。
for file_name in file_names:
# ファイルをローカルにダウンロード
api.competition_download_file(competition, file_name, path='.')
# ダウンロードしたファイルのパス
csv_path = os.path.join('.', file_name)
# Parquetファイルの保存先パス
parquet_path = os.path.join(output_dir, file_name.replace('.csv', '.parquet'))
# DuckDBのCOPYコマンドを使ってCSVからParquetに変換して保存
con.sql(f"COPY (SELECT * FROM read_csv_auto('{csv_path}')) TO '{parquet_path}' (FORMAT 'parquet');")
# ダウンロードしたCSVファイルを削除
os.remove(csv_path)
なんもわからんのでとりあえずdbt initする
Happy modeling!
Which database would you like to use?
[1] duckdb
Enter a number:
と出る。
複数dbtを入れてたら複数出るのかな?
1を入れる
my_duckdb_project:
target: dev
outputs:
dev:
type: duckdb
path: "my_duckdb_project.db" # DuckDBデータベースファイルの保存場所を追加?
モデル作成する。train.sqlなど
とりあえずdbt runを使用してモデルは動かしたが、あとは可視化機能など?
次はこれ
それぞれのディレクトリの役割は、About dbt projects | dbt Developer Hubに記載されています。
Resource Description
models 基本的なSQLを置く場所。ここのディレクトリ以下のSQLはdbt runを実行した際に実行される。
snapshots 状態があるようなデータのSQLを置いておく場所。例は、Snapshots | dbt Developer Hubがわかりやすい。
seeds csvなどの静的ファイルを置いておく場所。 dbt seedコマンドでdbtにロードできる。基本的にはマスターデータなどのlookup tableを置いておく場所。(The rest of the project | dbt Developer Hub)
tests SQLのテストクエリを置いておく場所。
macros macroを置いておく場所。
analysis より分析っぽいアドホックなSQLを置く場所。ここに配置されたSQLは、dbt run時、変数置換は行われるが実行はされない。
brew install duckdbで一度cliをインストールする必要あり
.tables でテーブル内を確認できる。
SELECT * FROM で中身確認
profile を作成する必要
profile が隠しファイルでパス指定に戸惑う。
毎回profileファイルに移動しているが何か方法はありそう。
schema.ymlを以下のように設定する必要あり
version: 2
sources:
- name: main
tables:-
name: train
description: "The training data table"
columns:- name: id
description: "The primary key for the train table"
tests:- unique
- not_null
- name: id
-
name: test
description: "The test data table"
columns:- name: id
description: "The primary key for the test table"
tests:- unique
- not_null
- name: id
-
name: gender_submission
description: "The gender submission data table"
columns:- name: id
description: "The primary key for the gender submission table"
tests:- unique
- not_null
- name: id
-
train.sqlのsqlのパスを修正したら大丈夫
dbt docs generate でカタログが描かれる!
dbt docs serve で遂にdbtが可視化!
dbt docs generate でメタデータ作成
target/catalog.jsonができる
dbt追加は設定サービスから行う必要がある。
がない。
dbtはcometa,openmetadataはawsと連携か
cometaは有料!
なのでdbtをopenmetadataと連携したいが一旦設定が簡単そうなdbt-cloudを使用
dbt-core dbt-duckdbはデータの流れを見るにとどめる
openmetadataサンドボックス上のを使用していたが、Installすることにする。
前回は失敗したが...
openmetadata-ingestion[docker]
OpenMetadata のインジェストツールであり、データベースやデータツールからメタデータを取得するためのライブラリです。
の部分
いろんなデータベースにつなぐ...たぶん
metadata docker --help で以下エラー
UserWarning: Field "model_name" in NLPEngineModel has conflict with protected namespace "model_".
metadata --help でとりあえずコマンドのヘルプらしきものはでた
metadata docker --start ではだめ
とりあえず以下の公式のチュートリアルを試す
curl -sL -o docker-compose.yml https://github.com/open-metadata/OpenMetadata/releases/download/1.5.10-release/docker-compose.yml
curl -sL -o docker-compose-postgres.yml https://github.com/open-metadata/OpenMetadata/releases/download/1.5.10-release/docker-compose-postgres.yml
openmetadataとpostqres用のdockerをインストール
今回はpostgresを使用しないが、チュートリアルに倣う
docker-compose up -dを行う。チュートリアルで記載なし
...
でログインできるようになった🙌
立ち上げている状態ではairflowにアクセスできる
airflowにもアクセス!
次はdbtと繋げる
openmetadata 最初は何も入っていないのでdbtに連携したデータベースを入れたいが...
とりあえずこのスライドを参考
dbt cloud に現状のデータを上げるには...
yaml か airflowか...か
metadataコマンドというコマンドがある...
どこに打つのか
ローカルで行うのは結構ハードル高いかもしれない。
airflow でなんとかなりそう
yamlはなし
glue catalogはメタデータを保存する場所
なぜメタデータを必要とするか
データの検索のため?
関連付けして一貫したデータ処理を行いたい
たぶん普通ならopenmetadataなどでやらなければいけないものをaws上でマネージドにできる。
redshiftは予算的に無理なので必然的にクローラー。
ここ一ヶ月くらい理解できなかったことを理解できるようになりつつある。
とりあえずクローラー作成?
データソース指定
クローラーは同じリージョン内で作成する必要あり
クローラーを作成したら、IAMロールを作成する必要あり
出力先のデータベースを作成する必要あり。
クローラーの頻度を決定できる。
とりあえずオンデマンドにする。手動実行にしないと料金が...
クローラーの料金:
料金の詳細:
DPU時間あたりの料金: 1 DPU時間あたり0.44 USDです。
AWS
課金単位: 1秒単位で課金され、最も近い秒に切り上げられます。ただし、各クローラーの実行には最低10分の課金期間が設定されています。
AWS
料金計算の例:
クローラーの実行時間: 30分間
使用DPU数: 2 DPU
計算方法:
実行時間を時間単位に変換: 30分 ÷ 60分 = 0.5時間
DPU時間の合計: 2 DPU × 0.5時間 = 1 DPU時間
料金: 1 DPU時間 × 0.44 USD = 0.44 USD
とりあえずrun crawlerする。
簡単なcsvみっつで55秒か
結果が格納されているデータベースを見る。
無事スキーマが格納されている。
ミスでcsv一個か?
と思ったが、すべてのcsvの情報を一括でまとめている...?
条件はカラムが一致して同じバケットに入っていることのよう
このテーブルをathenaのsqlで処理する。
これで簡単なデータ基盤ができたのか
athena にログインすると勝手にdatacatalogをソースにしてくれている。
大元のs3の場所も選択する必要あり。
SELECT * FROM table ;
で実行時間113ms!
今でこそ色々な代替手段があるとはいえ、これは革命的だったと思う。
こんどはminioでローカルにs3と同期できるストレージを持つ
上記 githubのdockercompose.yamlをダウンロードして、試す。
「CTAS」(Create Table As Select):SQLで新しいテーブルを作成し、その中に選択したデータを格納する操作
ステージング層(STG層):データを加工・整形する前に一時的に格納する場所。
データのソースから取得した生データ(Rawデータ)を格納し、クレンジングや統一フォーマットへの変換
生データを加工しやすい形に変換(データクレンジング、フォーマット調整)
再利用可能な中間結果を作成する。
TO_DATE(sales_date, 'YYYY-MM-DD') AS sales_date, -- 日付フォーマットを統一など
STG層とMART層でのCTAS実行について
「CTAS」(Create Table As Select)は、SQLで新しいテーブルを作成し、その中に選択したデータを格納する操作です。これをSTG層(ステージング層)やMART層(データマート層)で実行する目的やプロセスをわかりやすく解説します。
-
STG層のCTAS実行
STG層とは?
**ステージング層(STG層)**は、データを加工・整形する前に一時的に格納する場所。
データのソースから取得した生データ(Rawデータ)を格納し、クレンジングや統一フォーマットへの変換を行います。
STG層でCTASを実行する目的
ソースデータを簡単に参照・加工できるようにする。
生データを加工しやすい形に変換(データクレンジング、フォーマット調整)。
再利用可能な中間結果を作成する。
CTASの例(STG層で実行)
sql
コードをコピーする
CREATE TABLE stg_sales AS
SELECT
sales_id,
product_id,
customer_id,
TO_DATE(sales_date, 'YYYY-MM-DD') AS sales_date, -- 日付フォーマットを統一
CAST(sales_amount AS DECIMAL(10, 2)) AS sales_amount -- 型変換
FROM raw_sales;
この操作の意味: -
MART層のCTAS実行
MART層とは?
**データマート層(MART層)**は、STG層で整形したデータを集計・統計処理し、分析や可視化に最適な形で格納する場所。
とりあえずminioをダウンロードするところから
ダウンロードではなく公式からpullしてコンテナ立ち上げ
yamlファイルがある状態でpullしてくる。
docker compose pull
docker-compose up
WARN[0000] The "AIRFLOW_UID" variable is not set. Defaulting to a blank string.
WARN[0000] The "AIRFLOW_UID" variable is not set. Defaulting to a blank string.
open /Users/nk/.docker/buildx/current: permission denied
airflow のuidがない
ひとまずdbt init する
dbtフォルダを作りstg,mart層を作る。
stgにparquetからSELECT * FROMするだけのsqlをおく
dataフォルダを作る。dataフォルダにcsvかparquetファイルなどをおく。
とりあえずそのソースからduckdb コマンドを走らせて最初のdbを作る。
相対パスで作る必要あり
~. ファイルを編集 パスを書く
schema.yamlにsourceを書く
dbt runが通る。
dbt docs serve --port 8081 でしていしないとairflowで起動しているポートとかぶっていた
右下をクリックするとリネージグラフが出る。
transformを行うとグラフが出る。
duckdb & dbt部分はひとまず終わり。
db変化がある部分はdbtに都度書くことになる。
titanicの前処理をつらつら書くことになると思う。
glueバージョンと比較したい。
とりあえずminioとairflow部分を構築する
とりあえずminioのバケットにサンプルデータを入れる方法
docker compose up -d をすると
WARN[0000] The "AIRFLOW_UID" variable is not set. Defaulting to a blank string.
WARN[0000] The "AIRFLOW_UID" variable is not set. Defaulting to a blank string.
open /Users/nk/.docker/buildx/current: permission denied
UIDが必要なので確認
id -u
docker yaml内に環境変数を描きたいときにどうするか
.envを同じフォルダ内に
docker-compose up -d
open /Users/nk/.docker/buildx/current: permission denied
sudo chmod -R 0755 /Users/##/.docker
sudo chown -R
が必要?
ここまでいるのかな
minio/workflow: no such file
docker内設定ミスか
airflow内で指定しているディレクトリを追加作成しているけど何か違う気もする。
そもそもairflow抜きの設定にしても良い
とりあえずairflowなしで使用
docker-compose up -d でminioファイルにも必要ファイルが格納
dockercompose.yamlも修正
この後手動でデータロード?
brew install minio/stable/mc
とりあえずminioだけdockerで用意したら良い気がしてきた
minioのみ設定 minioにデータを入れる もしくはs3から引っ張ってくるようにしないといけない
duckdb-localというフォルダが必要?
ちゃんとdocker yamlにキーを設定
duckdb-localという保存先を作成できない
そもそも元コードだと必要ないがとりあえず権限をつくる
secretmanagerで管理するモノ
minioにローカルサーバー上でログインはできた
duckdb-localもある
gptの方法ではダメでsecretmanagerで行う
あとはdbtとopenmetadata / glueとopenmetadataの接続
openmetadataとglueの接続
コネクタ?
openmetadataとdbtの接続
yamlファイルのよみこみ(ingest?)
openmetadata cliを使用する必要ある
pip install openmetadata-ingestion
mkdir -p ~/.metadata.....
vimで編集
ingest error
metadata ingest -c yourpath
エラー
mapping values are not allowed here というエラーは、YAML のインデントが不適切
manifestとかはtargetに
jwttokenはopenmetadata.yamlに記載されている
...doko?
localフォルダに移動
dockder psでopenmetadataのコンテナに入る
execで
findで検索
viでファイル編集
該当部分不明
そもそもopenmetadataのインストールが大丈夫か