TechTrain React.js 入門編 Railway 受講記録

はじめに

前回のHTML/CSS/JavaScript 初級編に引き続き、TechTrainのReact.js 入門編のRailwayを終えたので、その受講記録を残します。

TechTrainとは

エンジニアとしての「実力を一段上に」なってもらうためのエンジニアコミュニティです。

techtrain.dev

詳しくは上記のHPに飛んでいただくか、下記の紹介記事をお読みください。
bonomodel.hatenablog.com

モチベーション

フロントエンドシリーズの続きで、勢いで進めています。
目的はフロントエンド(バックエンド)開発の基礎的な経験と知識を獲得することです。

React.js 入門編

(※記事公開当初から一部内容を変更しております。)
とにかく最初は、ReactのコンポーネントとJSX記法に慣れることがほぼすべてでした。
ja.reactjs.org
ja.reactjs.org
全体的な雰囲気をつかむために、まずReactの初心者動画を視聴しました。
www.youtube.com
useState,useEffect,propsの使い方などはもちろん大事なのですが、それ以上に宣言的UIに慣れることが大事だと思いました。
qiita.com
また、named exportとdefault exportの使い方の違いとかも最初わからずに、default exportを使ってしまっていました。
engineering.linecorp.com
コンポーネントでどの部分を分割するか、propsでどの部分を渡すかなど基本的なことを習得しました。

  • selectタグ

ja.reactjs.org

  • mapやkey

ja.reactjs.org

  • 属性の扱い

qiita.com

  • onClick(onChange)の扱い

dev-k.hatenablog.com

  • useStateとuseEffect

www.wakuwakubank.com

  • useEffectで気をつけること

https://tyotto-good.com/blog/avoid-useeffect-mistakestyotto-good.com

  • props

dev-k.hatenablog.com

最後に

Reactはまだ学び始めたばかりですが、割りとふわふわしているのでじっくりやっていこうと思います。

TechTrain HTML/CSS/JavaScript 初級編 Railway 受講記録

はじめに

前回の入門編に引き続き、TechTrainのHTML/CSS/JavaScript 初級編のRailwayを終えたので、その受講記録を残します。

TechTrainとは

エンジニアとしての「実力を一段上に」なってもらうためのエンジニアコミュニティです。

techtrain.dev

詳しくは上記のHPに飛んでいただくか、前回の記事をお読みください。
bonomodel.hatenablog.com

モチベーション

前回の入門編に引き続き、初級編があったので勢いでやろうと思い進めました。

HTML/CSS/JavaScript初級編

(※記事公開当初から一部内容を変更しております。)
前回の入門編を、少し深掘りするような形のコンテンツだったと思います。
とにかくローカル上のhtmlファイルのpathをブラウザにはって、何度も確認しました。DevToolはとても頼りになるツールでした。

最後に

HTML/CSS/JavaScriptは歴史が長いせいか、様々な記事があってとても初学者が取り組みやすいジャンルだと感じました。
初級編は、入門編と違い検索ヒントが実装されていて調べるポイントがわかりやすいと思いました。

TechTrain HTML/CSS/JavaScript 入門編 Railway 受講記録

はじめに

今回は、TechBowlさんが展開していらっしゃるTechTrainのうち、HTML/CSS/JavaScript 入門編のRailwayを終えたので、その受講記録を残します。

TechTrainとは

エンジニアとしての「実力を一段上に」なってもらうためのエンジニアコミュニティです。

techtrain.dev

特徴としては以下のようなものがあります。
・プロのエンジニアとコミュニケーションを取ることができる(質問やメンター制度)
・教材が教科書というより開発チック
・必要な場合は、就職活動サービスとの連携もある
・無料

私が思うTechTrainのいいところを下に挙げます
・ゲーム感覚で小さい課題ずつクリアでき、勉強するというより開発をしながらスキルを上げるという感覚に近い
・公式のリポジトリからforkして使用するので、Githubを使うことが普通になる。VSCodeもよく使う
・自分で学習して調べてもわからないことはslackの質問チャンネルで検索することができ、それでもわからない場合は質問できる

モチベーション

昨年からアルバイトという形で、少しずつテスト作業や小さい開発をさせていただく機会を頂いています。
それまでAIのコンペを中心に、Pythonに夢中になっていた自分にとっては足りないものを実感することが多い1年でした。とりわけコミュニケーションスキルについてはまだまだ課題が多いと感じました。

足りないスキルとして、AIに関する技術スキル面では次のようなものが挙げられます。
・AIのモデルを具体的に小さいプロダクトとして実装したいが、フロントエンドやバックエンドの知識が全然足りない(FlaskやFastAPIでさえ)
・そのため、プロトタイピングができるだけの自走力がない
・適切なデータセットの作成やゴールに見合った実装など、AIモデリングだけではなく必要なことがたくさんある。

そこで以前GoのRailwayに挑戦させていただいていたTechTrainで、知識と実装力をちょっとずつ身に着けようと思い受講しました。

HTML/CSS/JavaScript入門編

(※記事公開当初から一部内容を変更しております。)
本課題はいわゆる入門編なので、いわゆる初歩の課題になります。そのため、私のようなフロントエンド初学者にはうってつけでした。
最初の環境構築がとても大変でした。
以前使用していたGoのファイルがとっちらかっていてしまっていて、中途半端に環境が残っていたりしたのでクリーンナップしたり、公式のリポジトリを読んでもうまくいかないところはslackの質問チャンネルを読んで、解決したりしていました。

全体的に小さい課題を一個ずつが進めることができるので、大きなハードルを感じることなく進めることができました。
そこそこサイトの設計ができても、きれいにサイトのスタイルを合わせるのは意外と難しいなという感想でした。

最後に

次回はTechTrainのHTML/CSS/JavaScript 初級編をやろうと思います。
読んでいただき、ありがとうございました。

Preparing for Google Cloud Certification: Cloud Architect(Coursera)の受講記録とこれからの試験準備

本記事はGCP(Google Cloud Platform) Advent Calendar 2022 25日目の記事です。

はじめに

Preparing for Google Cloud Certification: Cloud ArchitectのCoursera講座を受講したので、その記録を残そうと思います。
その後Google CloudのProfessional Cloud Architectの認定試験を受けるまでにやろうと思っていることを書きます。

cloud.google.com

モチベーション

developers-jp.googleblog.com
こちらのイベントに参加して、Google Cloud Skill Boostスキルバッジを獲得して Google Cloud Innovatorsに登録していたので、認定試験バウチャー(日本語)をいただけることになったのがきっかけです。

これまでGoogle Cloud Skill Boostの学習イベントには参加させていただいて、Google Cloudのラボにはよく触れていたのと、これから業務でGoogle Cloudに触れる機会がありそうだということで、前々から認定試験には興味がありました。

そこで認定試験の準備をしようと思い、下記2つを少しずつ進めていました。
blog.g-gen.co.jp
cloud.google.com

Google Cloudの公式ブログを読んでいたときに、CourseraのProfessional Cloud Architectの認定試験準備講座を人数限定で無料で受講できることがわかり、そのままCourseraで学習することにしました。
cloud.google.com

Coursera

CourseraはMOOCsの1つで、大学や企業のオンライン学習講座を受けることができる教育プラットフォームです
jp.coursera.org
こちらの講座を1ヶ月の無料学習期間で進めることになりました。
※私が受講したものは英語版なので、日本語版は別の講座になります。
www.coursera.org

Preparing for Google Cloud Certification: Cloud Architect

  • Google Cloud Fundamentals: Core Infrastructure
  • Essential Google Cloud Infrastructure: Foundation
  • Essential Google Cloud Infrastructure: Core Services
  • Elastic Google Cloud Infrastructure: Scaling and Automation
  • Reliable Google Cloud Infrastructure: Design and Process
  • Architecting with Google Kubernetes Engine: Foundations
  • Preparing for your Professional Cloud Architect Journey

Preparing for Google Cloud Certification: Cloud ArchitectはCourseraの専門講座です。
全部で7つのコースで構成されています。
動画視聴しながら、Google Cloud Skill Boostのラボや小テストで学習内容を確認するといった感じです。
基本的には上から順に進めたほうがいいと思います。
特にPreparing for your Professional Cloud Architect Journeyはケーススタディ形式になっていて、総まとめ的なコースなので最後に回したほうがいいと思います。
動画は英語ですが、字幕とは別に動画の下部分に文字起こしされていたので、Google翻訳Chrome拡張で翻訳しながら学習をすすめていました。
調べたことや講座で紹介されていたサイトなどを、Notionでざっくりまとめていました。
また、受講が終わったものはLinkedInに追加することができます。

これからの試験準備

一通りの学習が終わったので、先述したG-genのProfessional Cloud Architect試験対策マニュアルを参考にすすめていこうと思います。
blog.g-gen.co.jp
具体的には

cloud.google.com

  • Udemyの問題集をセール中に購入して2~3周する

https://www.udemy.com/course/google-cloud-professional-cloud-architect-i/www.udemy.com
認定試験はオンサイトとオンラインの両方あるみたいなので、追々決めようと思います。

さいごに

今回、Google Cloud Skill Boostのイベントや認定試験のバウチャー、Courseraの認定試験準備講座など、Google Cloudはビギナー開発者のチャレンジを積極的に後押ししてくれていると感じました。
こうしたサポートがあることは、本当に感謝に堪えません。
基本的なことは学ぶことができたので、あとは体調に気をつけて認定試験に向けてぼちぼちと進めていきたいと思います。

「Nishika:ボケ判定AIを作ろう! (ボケてコンペ #1)」9th 解法振り返り

Nishikaのコンペティション「ボケ判定AIを作ろう! (ボケてコンペ #1)」に参加し、9位の成績を残すことができました。
https://www.nishika.com/competitions/33/datawww.nishika.com
画像とテキストのマルチモーダルなコンペで、お題が面白かったので楽しんで参加していました。
なお、本記事で使用している画像等は特に断りがない限り、上記コンペのものを使用しております。

解法概要

画像とテキストからembeddingデータを抽出するモデルを2つ用意し、それぞれLightGBMで分類し、重み付けアンサンブルをしました。

PublicLB PrivateLB
アンサンブルモデル 0.638670 0.635366
シングルモデル 0.640098 0.636993
Data

テーマがボケなので、画像(概ねお題)とテキスト(ボケ)によるズレの演出が多かったように思いました。
テキストと画像、それぞれのみのモデルによる分類を試しましたが、概ねテキストのみでもそこそこ精度が出るケースがありました。画像だけで笑わせてくるものよりテキストでオチを用意するケースが多かったように思います。

CV

StratifiedKFold(5fold)を使用しました。
比較的LocalCVとPublicLBが比例していたように思います。
PrivateLBのこともあるので、特徴量を追加することで精度改善する方向で行きました。

Params

LightGBMのparam_tuneはOptunaを使用しました。
depth=9は固定でした。

Model

textのembeddingモデルはMegagonLabsのモデルが、試した中ではよかったように思います。
imageのembeddingモデルはSwinTransformerが、試した中ではよかったように思います。
DeBERTaのモデルはLightGBMのimportance上位に食い込んでくる感じだったのですが、後述の1stのモデルに追加しただけでは貢献しませんでした。

Ensemble

シングルモデルでimportance上位100に上がってくるもの、LocalCVやPublicLBに貢献するものを1stとし、直接PublicLBには貢献しないけれどimportanceやLocalCVに貢献するものを2ndとし、その中でもPublicLBに貢献するものを残しました。
その2つのモデルの予測値のうち0.2以上乖離が見られるものをピックアップし、分析に生かしました。

この図は、testデータのうち2つのモデルの予測値の乖離をグラフにしたものです。おおよそは似たりよったりなのですが、0.2以上乖離しているものが気になりました。
中身を見てみると、中には一瞬どういうボケかわからないものもあり、画像とテキストのattentionを単純に紐づけても分類できないケースもあるのかなと思っていました。
そのため、精度がそこそこいいけれど、embedするモデルの傾向が違う1stと2ndの予測値を重み付けアンサンブルして、意見が割れる笑いに対する予測を再現しようと試みました。

精度改善に反映しきれなかったもの
  • 画像テキストのコサイン類以度
    • 単純に追加するだけでは難しかったです。
  • テキストのポジネガ判定
    • 笑えるラインを再現したかったのですが単純に追加するだけでは難しかったです。

参考)配布資料「ボケのデザインパターン2022」フェーズ2 本能の六分類のポジネガ距離判定 ※仮説

  • GPT-2によるテキストでの面白さ分類
  • CatBoost
  • pseudo label
できなかったこと

CLIPによるラベル指定(人間、動物など)

感想

今回のコンペは、画像とテキストによるボケの笑いをAIで分類するという、簡単なようでとても難しいタスクでした。
特に先述した意見の分かれる笑いについて、予測するのが難しかったのかなと個人的に感じました。

  • 画像とテキストの因果関係が読み取りにくいもの(私は勝手に小梅路線と読んでいました)
  • センシティブな内容などがあり、受け手の一部が笑いとして受け取れないもの(笑えるライン)
  • 画像からはテキストの文脈を直接読み取ることがおそらく難しいと思われるもの

最後のものについて、例をとって見たいと思います。

「おいお前ら、おやつは300円までと言ったはずだが、お前らのおやつはいくら分なんだ?」『さ…300…$です…』

この場合、画像から読み取れるものとテキストから読み取れるものを直接結びつけるのは難しい気がします。
人間の私が読み取ると、文脈から「遠足の準備らしきもの」を結びつけて、その上で「300$」でボケるという構えだと思います。
ボケの本質を見つけたいと、コンペ中相席食堂を見たり小梅太夫の動画を見たりしていたのですが、上手に見つけることができず悔しいと思いました。

謝辞

最後になりましたが、コンペ参加者の皆様方、面白いコンペを運営企画してくださった株式会社オモロキ・Nishika株式会社の運営の皆様方、取り組みを暖かく見守ってくださった皆様方に心より感謝を申し上げます。

「SIGNATE : ソニーグループ合同 データ分析コンペティション(for Recruiting)」109th解法振り返り

今回のコンペは、世界各都市の大気観測データ(観測日時、位置情報、PM2.5以外の大気物質濃度)、気象情報(天気、湿度、風速等)、及び必要に応じて外部データを用いて、特定の日時・都市における「PM2.5濃度」を予測するというものでした。

結果としてはメダル圏外でしたが、久々のテーブルデータコンペ参加で、他の方の解法から学べることが多いと感じるコンペでした。

データ内容等については、コンペを参照してください。
https://signate.jp/competitions/624


考察
今回のコンペでは、日付や都市ごとの緯度経度が設けられていますが、都市によって観測日数が大きく異なったり、予測対象が新しい観測地点の「PM2.5濃度」だったりするので、単純に時系列問題として解くのも難しく、地理的なタスクとして解くのも少し工夫が必要だったように感じます。


以下は私の解法です。


モデル
3つの特徴量が違うモデルを、それぞれLabelEncodingとTargetEncodingで得た結果を単純平均して、
最後にその結果を重み付けアンサンブル。

1LightGBM(LabelEncoding('Country')、TargetEncoding('Country'))
2LightGBM(LabelEncoding('utm_zone')、TargetEncoding('utm_zone'))
3LightGBM(encodingは1同様、特徴量に外部データとしてco2、population、GDPを追加)


パラメータサーチはOptuna + 手動


使用した特徴量
モデル共通の特徴量
・配布データはそのまま使用
・日付データ('year','month',day''weekday'のsin,cos変換)
・特徴量間でのdiff,ratio


モデルで異なる特徴量
・緯度経度からUTMゾーンの計算
・'Country'・'month'をkeyとした集約統計量(pm25_mid以外、mean, max, min, std, var)(DIKNさんのノートをほぼ使用しています)
・'utm_zone'・'month'をkeyとした集約統計量(pm25_mid以外、mean, max, min, std, var)


試した特徴量
・階層型クラスタリングによる都市のグループ分け(Yasui Hashimotoさんのノートを参考にしました)
・温位、持ち上げ凝結高度の気温などの気象要素への変換
・LocalOutlierFactorを用いた外れ値の除去
・エネルギー供給量(外部データ)


Validation:KFold (n_splits=5)


最後に
数値データが主なテーブルデータコンペで、楽しく参加することができました。
一方、典型的な手法としては色々試してはいたのですが、集約やクラスタリング、kfoldの方法、target_encodingの方法など、データの特性に合わせて行うことができていないと感じました。

私の場合、target_encodingを単純にCountryごとに行っていたりしたので、時系列、地理的な情報を意識して行ったほうがよかったかもしれません。

また、お手軽さからLightGBMばかり使っていましたがデータの不均一性を補填するという意味でも、複数のモデルを使用して、実験することを覚えようと思います。blendingやstackingも使い慣れていきたいです。

一緒にコンペに取り組んでくださった皆様ありがとうございました。
最後に、主催者のSONY様、SIGNATEの運営担当者様、コンペ開催・運営ありがとうございました。

「Nishika:航空機ターボエンジンの残存耐用時間(RUL)予測コンペ」Public/Private:6th解法振り返り

今回のコンペはターボエンジンのシミュレーションデータを使って、RULとよばれるエンジンの残存耐用時間を予測するというものでした。

カテゴリ変数がなく、数値データのみによるものなので、データ(コンペそのもの)の理解に時間を割かれました。データ内容などについては、コンペを参照してください。

https://www.nishika.com/competitions/17/summary

 

 

1.解法

提出結果のうち、LightgbmとTabnetのアンサンブルモデルがPrivate:6thとなりました。Public:6thはその結果とNNのアンサンブルモデルです。

 

2.特徴量

・基本的に['○○_mean_prev3']の特徴量を使いました。

-lightgbmのfeature_importanceで['○○_mean_prev3']が上位に上がっていたため

・グラフ特徴が似ているものをまとめました。

-チュートリアル内にある、cycleごとの各データに関するグラフ

https://www.nishika.com/competitions/17/topics/120

・○○_eff,○○_flowをそれぞれ乗算して、その解を乗算し、cmapssとして特徴量作成

・ファン→低圧縮→高圧縮→燃焼(タービン)→排気のプロセスにおける、二者間の温度差の表現

・ファン→低圧縮→高圧縮→燃焼(タービン)→排気のプロセスにおける、二者間の圧力差の表現

・各データの移動平均

・各データの最大最小の差

その他

・ストールマージン(SmFan,SmLPC,SmHPC)T48,hs間の乗除

・hs,cycleの除算

・LPT_eff,LPT_flow,HPT_effの乗算

 

 

3.モデル

Lightgbm、Tabnet(MinMaxScaling)

※Tabnetのデータには移動平均のデータは入れていないです。

 

 

4.アンサンブル

予測結果に応じて加重平均

 

 

5.スコア改善にうまく働かなかったもの

○特徴量

・空気流入量と流出量の表現

W21=ファンからの流量(pps)、W22=LPCからの流出(lbm/s)と単位が違ったので、どうしても有機的な特徴量にできませんでした。

・EPR = P50/P24(タービン出口の圧力とコンプレッサー入り口の圧力の比が、推力と関係をもつ)

参考)航空実用事典

・ストールマージンの文脈から、ファンとコアの作動ラインをそれぞれ特徴量としてつくり、ストールマージンで除算。

・ジェットターボエンジンの推力の公式に無理やり当てはめて特徴量を作成(燃料流量(Wf)とかを使いたかったです)

・SmLPCのデータをもとに、k-mean法で分割。

・eigs@MATLABさんがディスカッション内で記載されていたことを参考に、tranデータのうちcycle1でのRULが100ではないもののみをモデルに入れ、他のモデルとアンサンブルしましたが、スコア改善にはなりませんでした。

参考)https://www.nishika.com/competitions/17/topics/129

○モデル

LightgbmとTabnetのアンサンブル結果とNNを加重平均したものが、Public6thでしたが、Privateではshakeしてしまいました。  

 

6.できなかったこと

W31(HPTクーラントブリード(lbm/s)),W32(LPTクーラントブリード(lbm/s))などクーラントブリードのデータがあったので、エキスパンダーサイクルの資料をもとに使ってみたかったのですが、できませんでした。

参考)https://www.mhi.co.jp/technology/review/pdf/484/484040.pdf

 

 

7.やらなかったこと

pseudo labeling

 

 

8.感想

今回のコンペはテーブルデータとはいいつつ、センサーなどの数値データによるもので、久しぶりのテーブルデータと飛びついたものの、ターボファンエンジンについてwikipediaや企業のサイト、論文をもとに勉強するなどドメイン知識の蓄積に力を注いだコンペでした。

参考)

エンジンの仕組み|航空エンジン|Honda

ジェットエンジン - Wikipedia

前提知識はありませんでしたが、ドメイン知識を蓄えながらセンサーデータの過去コンペを参照したりしながら、楽しみながらチャレンジすることができました。

最初は特徴量をガシガシ作りながら、途中からTabnetやNNのモデルを試したりなど、前々からやりたいと思っていたことを実装できる程度にはできたことが収穫だったと思います。ならべくRobustな予測をと思いましたが、結果的にはTabnet単独のsubmitがPrivateで私のsubmitの中では最良のスコアになったようです。

とにかく、コツコツ毎日submitし続けて、途中からは5位入賞を目標に頑張っていましたが、結果はPublic,Privateとも6位とshakeなしの結果となりました。これに懲りずに、また他のコンペもチャレンジしていきたいと思います。

最後に、コンペを開いてくださったNishikaの運営事務局の方、Twitterで毎日のsub結果をいいねしてくださった方、ひろしまQuestのコミュニティ「sunaba」slackで一人もくもく会を投稿していたのを見守ってくださっていた皆様に御礼を申し上げます。