投稿

LightGBMにカテゴリ変数を入れる

イメージ
こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 LightGBMにカテゴリ変数を入力する際、 `category_feature`を * `lgb.Dataset`で指定する * `model.fit`や`lgb.train`で指定する * DataFrameのカラムをcategory型にする がありますが、三つ目のが良さげなんじゃないかと思いました。 `category_feature`を`lgb.Dataset`や`model.fit`や`lgb.train`で指定するといったやり方があるけど、[warningがでてしまう](https://qiita.com/junkoda/items/ddf35a240e9aa3f0d9f6)のもあるので、 dataframeのカラムの型をcategoryにするのが一番良さそう。 三つ目の方法について、どこかのブログ記事で、 「category_featureの対象にするカラムの型はint or categoryで、label encodingしてから渡すのが推奨」という情報を見かけてちょっと悩んでしまったのでまとめます。 結論category型じゃないとだめそうです。 ### 実験した タイタニックのデータセットで、`"Sex","Embarked","Cabin","Pclass"`の四つのカラムをlabel encodingしてそれぞれの処理をしてfit, predictしたときのaccuracyです。 ``` # dataframeのcolumnをcategory型にして、fitではcategorical featureを指定しない場合 0.8603351955307262 # dataframeのcolをcategory型にして、fitではcategorical featureを指定した場合 0.8603351955307262 # int型にして、fitではcategorical featureを指定する場合 0.8603351955307262 # int…

僕の好きな鶏白湯ラーメンのお店

イメージ
こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 みなさんは何ラーメンが好きですか。 醤油ですか、味噌ですか?豚骨ラーメンもいいですね。 どの種類が好きでも、ラーメン好きは皆兄弟なので、仲良くやってこうと思うわけですが、どうしても自分の好きなラーメンについては語りたくなってしまうものです。 今回は、僕の好きな鶏白湯ラーメンの都内のおすすめ店を紹介します。 都内でも人気店が増えてきており、また鶏白湯のおすすめお店まとめ!といった記事も多く存在する(参考文献を参照)ので、本稿では自分が実際に食べに行ったお店から、人気店とあまり記事でまとめられていないお店を織り交ぜて紹介して行こうと思います。 ### 紹介するお店一覧 他の記事でもよく取り上げられているお店 * 麺屋 藤しろ (目黒) * 濃厚鶏そば 麺屋武一 (新橋) * 鶏の穴 (池袋) * 銀座 篝 (銀座) 個人的に紹介したいお店 * 麺や 福十八 (本郷三丁目) * 麺や 美風 (戸越) * 赤坂麺処 友 (赤坂) * 麺屋 楽のすけ (大森) ### 麺屋 藤しろ (目黒) ラーメン激戦区の目黒駅からすぐ。 ビルの中にあるので、雨でも並びやすいです。またラーメン激戦区なので他のお店にチェンジしやすかったりします。 元フレンチのシェフが作っているとかで、おしゃれな味がします。美味しい。 目黒の他にも三軒茶屋などにお店を出しているそうです。 <div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/-aM7fbcWQ8Tg/XwBJjiXBXsI/AAAAAAAAEkU/RyaG6D5UB2MOgl4Ex07SwrjAofVbYIE0wCLcBGAsYHQ/s1600/%25E3%2581%25B5%25E3%2581%2597%25E3%2582%2599%25E3%2581%2597%25E3%2582%258D.JPG" ima…

Herokuで公開するFlaskアプリにステージング環境でのみBasic認証をかける

イメージ
こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 [趣味で開発しているアプリ](https://kanji-lyric.herokuapp.com/quiz)の検証のために、Heroku Pipelineを使って、ステージング環境を作ったのですが、ステージング環境は検索に出てきてほしくないので、ステージング環境のみBasic認証をかけました。 Railsでステージング環境のみBasic認証するという記事は多く見かけたのですが、今回はFlaskで書いており、少々調べて実装したため、知見をまとめておこうと思います。 [Heroku で既存の本番環境をコピーしてステージング環境を作る - Qiita](https://qiita.com/ken_c_lo/items/32998d9dd79a15b75c14)にはステージング環境に環境変数を設定すればできるって書いてあるけど、コメントにもあるようにさすがにアプリ側で処理を書かないとだめなはず。 今回アプリはFlaskを使って書いているので、 * [Flaskで Basic認証、Digest認証 - Qiita](https://qiita.com/msrks/items/7de68cde6c3ab9d5e177) * [FlaskでBasic認証 - Study03.net 対シンバシ専用](https://tell-k.hatenadiary.org/entry/20111005/1317781147) このあたりが検索するとでてきます。 最初、一つ目の記事に倣って`flask-httpauth`を使って、二つ目の記事に倣って`views.py`の全てのメソッドの前に実行するメソッドにデコレータをつけて認証を行うように書きました。 つまり、 ```python from flask_httpauth import HTTPBasicAuth app = Flask(__name__) auth = HTTPBasicAuth() users = { "user": "pass" } @auth.get_passwo…

【論文紹介】Relational Collaborative Filtering: Modeling Multiple Item Relations for Recommendation (SIGIR 2019)

イメージ
こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 論文紹介記事です。 SIGIR2020のaccepted papersが出てたので読もうかなと探していたのですが、その過程で見つけた2019の方の論文を読んだのでまとめます。 ### 概要 従来のCollaborative Filtering (CF)ではuserのinteractionの履歴からitem間の関係を学習して推薦を行っていたが、itemの著者やジャンルが共通しているといった直接的な関係を考慮できていなかった。 本研究ではitem間の複数種類の関係を考慮したRelational CFを提案した。RCFは二段階attention機構や知識グラフからのembedding学習とのマルチタスク学習の二点からなる。 ### リンク [Relational Collaborative Filtering: Modeling Multiple Item Relations for Recommendation](https://dl.acm.org/doi/10.1145/3331184.3331188) ### モチベーション 従来のCollaborative Filtering (CF)ではuserの購入履歴で共起したitemが類似している、という考えをベースに推薦を行います。 このitemを買った他の人はこれも買っているよ、といって推薦するわけです。 このようなitem同士の類似性を論文中ではcollaborative similarityと呼んでいます。 この類似性とは別に、他にも推薦に用いることができそうなitem同士の関係性はあるよね、というのが本論文のスタートになります。 論文中で挙げられている例では、映画を推薦するとしたときに、item Aとitem Bが同じ映画監督によって製作されているとか、同じジャンルであるなどの直接的な関係があります。 collaborative similarityではuserの購入履歴を経由した間接的な関係だけでしたが、映画推薦の例で出てきたような関係を考慮して推薦できると良さそうです。 購入履歴の他に、it…

漢字歌詞クイズのヒント機能をTFIDFで作った

イメージ
こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 今回は、コロナによる外出自粛で暇なので休日に開発が進んでいる漢字歌詞クイズアプリに追加した新機能について書いてみようと思います。 ここまではあまり工夫した点もなく実装できていたのですが、今回つけたヒント機能は少し凝った(データサイエンスっぽい?)ことをしたので、せっかくなので記事にします。 ### 漢字歌詞クイズって? 趣味で開発しているTwitter BotとWebアプリです。 漢字のみで書かれた歌詞からタイトルを当てる、というクイズです。 記事執筆時点では、Twitterは問題のみ掲載、Webアプリでは四択形式で答えあわせあり、といった形式になっています。 [Webアプリ版](https://kanji-lyric.herokuapp.com/quiz) [Twitter Bot](https://twitter.com/kanji_lyric) 最初はTwitter Botとして運用を始め、しばらく運用していましたが、せっかくHerokuを使っているのでWebアプリの方もプランを変えずに同時に公開できるじゃんと思い、Web版も作り、今に至ります。 ### 新機能開発の背景 Webアプリ版を公開して、友人などにお試しで使ってもらって、いくつかフィードバックをもらったのですが、方々から **そもそも問題が難しすぎる** という意見をいただきました。 そもそもTwitter Botの方はアーテイストのコアなファンが多いので、そのような意見があまり出てこなかったのですが、一般には難しいのだな、という認識に変わりました。 そこからは、今回の記事では書かないですが、難易度を選べる機能をつけたりなど「いかに解きやすくするか」に焦点を当てて改善してきています。 今回つけた新機能であるヒント機能も、問題の難易度を下げる工夫の一つです。 ### 新機能 : ヒント機能 百聞は一見にしかず、ということでこんなかんじです。 RADWIMPSのEasyモードで試してみましょう。RADWIMPSの曲を幾つか知ってる方はわかるかな? (そういえばRAD、サブスク解禁し…

【論文紹介】Learning a Deep ConvNet for Multi-label Classification with Partial Labels (CVPR 2019)

イメージ
こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 今回は、マルチラベル画像分類において、全ての画像に対し部分的にのみラベルが得られるという問題設定を扱う論文を読んだので、まとめていきたいと思います。 ### 論文リンク [[1902.09720] Learning a Deep ConvNet for Multi-label Classification with Partial Labels](https://arxiv.org/abs/1902.09720) ちなみに、本体は11ページなのに全体で30ページあるappendixもりもり論文で、自分は本体のみ読んだのでappendixは興味を持たれた方に読んでいただければと思います。 ### 3行まとめ Multi-label Classificationタスクにおいて、全ての画像に対し部分的にラベルが得られるという問題設定を扱う手法を提案した。得られているラベルの割合の情報を考慮した損失Partial BCEの提案、ラベルのクラス間の関係を扱うためにGNNを利用、未知のラベルを予測し学習に用いるカリキュラム学習の利用などを行っている。 ### 問題設定 Multi-label Classificationは、その名の通りラベルが複数ある分類問題です。 多くの研究では画像に対して考えており、画像に対して複数のタグがつくと想定していて、タグの個数も画像によって変わります。 今回は、このMulti-label Classificationの問題に対し、Partial labelな設定を追加しています。 通常のMulti-label Classificationではデータセットとしてラベルの情報は全て与えられる状況を想定しています。 例えば、画像に対して、tag猫 = 1, tag 車= -1といったものが全てのタグ分与えられる、という状況です。 一方Partial labelというのは、画像に与えられるラベルが+1と-1のほかに、0(unknown)もある、という状況です。 未知であるラベルの種類の個数は画像によって変わります。 このような部分的にラベル…

【論文紹介】Improving Pairwise Ranking for Multi-label Image Classification (CVPR 2017)

イメージ
こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 今回は画像に複数のラベルを予測するMulti label image classificationを扱った論文を読んだので、まとめます。 ### 3行まとめ Multi label image classificationを扱った論文。 損失関数log-sum-exp pairwise (LSEP) lossを提案し、 ランキングをだしてから、実際に上位のどこまで予測に入れるかを扱うlabel decision moduleを提案した。 論文リンクはこちら。 [[1704.03135] Improving Pairwise Ranking for Multi-label Image Classification](https://arxiv.org/abs/1704.03135) ### Multi label image classification ある画像に対して、対応するタグが複数あり、そのタグを予測するタスクを解きたい。 対応するタグは画像によって個数が異なる状況を考えている。 ランキング学習の手法を用いて解く研究では、まずタグのランキングを予測し、その後上位いくつかを最終的な予測に含める、といった手法が主流そう。 論文中ではこちらの図のようにまとめられている。 <div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-ATvxjWXRgsA/Xq4uYnW_NwI/AAAAAAAAEYk/d53WDBST1dwuC_PlpXaL9W1Ys-v891jLACLcBGAsYHQ/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%…

シェルスクリプトを実行する2種類の方法とその違い

イメージ
こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 ```bash ./シェルスクリプト名.sh ``` という方法と、 ```bash source ./シェルスクリプト名.sh ``` がある。 前者について、 `#!/bin/bash`がシェルスクリプトの先頭行についているけど、これは、ターミナルで ```bash ./シェルスクリプト名.sh ``` とすると、自動で ```bash /bin/bash シェルスクリプト名.sh ``` を実行してくれるということ。 なので、子プロセスとして新しくbashを起動してシェルスクリプトに書かれているコマンドを実行してくれる。 処理が終わると抜ける。 前者に関して言うと、シェル変数と環境変数の違いとして、 呼び出し元のシェルで使っていたシェル変数も、子プロセスのシェルでは参照できないが、 環境変数に指定すれば、子プロセスのシェルでも参照できるといった点が挙げられる。 シェルスクリプトを実行するもう一つの方法は、`source`コマンドを使ってシェルスクリプトを読み込む方法。 これは前者の方法と異なり、新しくシェルを起動するのではなく、現在のシェルでシェルスクリプトに書かれたコマンドを一つ一つ実行する。 なので、前者の方法で実行したシェルスクリプトが終わると、起動していたbashも終わるので、元のbashではシェルスクリプトで使っていたシェル変数は参照できないが、後者の方法であれば同じシェルにいるのでシェル変数はまだ残っている。 新しくシェルを起動する前者の方が、副作用を起こさないとか、呼び出し元のシェルのシェル変数が予期せぬ影響を与えたりといったことが起こらないため、基本的にはこちらの方が望ましい。 後者のようにシェルスクリプトの読み込みに`source`コマンドが使われている有名な例では、ログイン時に読み込まれる`.bash_profile`の中で`.bashrc`を読みこむ処理がある。 `.bashrc`もシェルスクリプトなわけだけど、これをログインシェルと異なる他のbashを起動して実行しては、ログインシェルに影響が残…

ワイルドカードと正規表現(初心者メモ)

イメージ
こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 適当に使ってきていたけど、間違えるケースがあったので違いをメモします。 分かっている人には当たり前だと思うけど、知らなかったので定着のためアウトプット。 気をつけないと間違える。 シェルのワイルドカードは、勝手にパス名展開されてコマンドが実行される。 例えば ```bash cat hoge* ``` とすると、 カレントディレクトリにある`hoge(0文字以上)`のファイル名に展開される。 hoge.txtとhoge2.txtがあると、 ```bash cat hoge.txt hoge2.txt ``` と展開され、実行される。catは引数が指定されると、引数のファイルの中身をconcatして出力するので、hoge.txtとhoge2.txtの中身が連結されて出力される。 これはワイルドカードによるパス名展開。 これと正規表現を間違えてはいけない。 grepコマンドを例に説明する。 grepは、検索してくれる。 `grep 検索条件 検索ファイル` で、検索ファイルが指定されていないと標準入力を検索する。 パイプラインでつないで利用されることが多い。 `ls | grep hoge` みたいな。 lsした結果、ファイルやディレクトリの列が表示されるけど、それをgrepの入力につないでいる。 ここで、検索条件には * 単に検索する文字を入れる方法 * 正規表現 の二種類が使える。 ```bash ls | grep hoge ``` とすると、hogeが入った名前のファイルやディレクトリの名前が表示される。 正規表現を渡す場合は、 ```bash ls | grep 'hoge*' ``` のように、シングルクオートで囲む。そうしないと、ワイルドカードによるパス名展開されて引数が渡されてしまう。 次のように ```bash ls | grep hoge* ``` とすると、展開されて ```bash ls | grep hoge.txt hoge2.txt ``` となり、引数が多すぎてエラー…

和音をベクトルにするChord2Vecを作った話  〜 "A7" - "A" + "C" = ? 〜

イメージ
こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 今回は、Word2VecならぬChord2Vecを作って遊んでみましたという記事です。 Word2Vecは文章中に登場する単語を、共起関係をもとにベクトルにする手法で、広く使われています。 単語の意味を考慮してベクトルに埋め込むことができます。 Word2Vecを使うと、単語どうしの足し算や引き算がある程度できるようになります。 「王様」 - 「男」 + 「女」 = 「女王」 のような感じです。 Word2Vecについての詳細な説明は他に譲ります。 * [絵で理解するWord2vecの仕組み -Qiita](https://qiita.com/Hironsan/items/11b388575a058dc8a46a) * [word2vec(Skip-Gram Model)の仕組みを恐らく日本一簡潔にまとめてみたつもり](https://www.randpy.tokyo/entry/word2vec_skip_gram_model) 今回は、これを単語ではなく音楽のコードのベクトル表現を得たいと思います。 最終的には、タイトルにもあるように、 ``` "A7" - "A" + "C" = "C7" ``` のような計算ができるようなコードのベクトル表現を得ることが目標です。 ### なぜやったのか この記事を執筆するに至った経緯ですが、 [前回](https://www.smartbowwow.com/2019/12/lightfm.html)、lightFMという協調フィルタリング系のライブラリを用いて、楽曲のコード進行から最適なカポの位置を推薦しました。 その際に、予測の副産物として各コードのベクトル表現が得られたので可視化してみたり、Word2Vecのように足し算や引き算ができるかどうかを試したのですが、うまくいきませんでした。 lightFMはあくまで副産物としてベクトルが得られ、そこでは良い表現を得るということに焦点を当てていなかったので、今回は、そのリベンジです。 …

スプラトゥーン2のブキをDCGANで生成してみる

イメージ
こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 春休み、PyTorch本を買ってPyTorchを久しぶりにまた触ったり、スプラトゥーンをやったりして過ごしていたらこのような記事ができてしまいました。 コロナの影響もあり、引きこもり生活が捗るので、必然的に勉強もスプラトゥーンも捗るわけです。 今回は、スプラのブキの画像をDCGANで生成してみよう、という記事です。 最初にお断りしておくと、うまくできませんでした。ここから続けて取り組むことはないと思ったので、供養のため記事にします。 あまりGANとか詳しくないので、勉強がてら実装、実験してみたという軽〜い気持ちで書いてみた記事なので、軽〜い気持ちで読んでください。 ### 何をやった(やろうとした)のか スプラトゥーンは4 vs 4でそれぞれが好きなブキ(武器)を持って、フィールドをインクで塗り合うゲームです。 ブキの種類によって塗りの性能や、必殺技みたいなものが異なっています。 [【スプラトゥーン2】全武器(ブキ)一覧とサブ・スペシャル|ゲームエイト](https://game8.jp/splatoon-2/158447) ブキごとの以下のようなビジュアルが設定されているのですが、これをGANで新しく作れないかな、というのが今回やろうとしたことです。 <div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/-8rWvL5673zc/Xn7AijCwBXI/AAAAAAAAETo/QIl-E8UXiw0XhEZqSI63r-6JiHLaFEYXwCLcBGAsYHQ/s1600/show.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="…

修士生活を振り返って

イメージ
こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 この春、東京大学大学院情報理工学研究科の修士課程を卒業しました。 <div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-TW0NiG8uzWs/XntMyWJnxKI/AAAAAAAAEQU/5i6voH2eJssE0kDXkPhK_hZBFXMgsdLIQCLcBGAsYHQ/s1600/iOS%2B%25E3%2581%25AE%25E7%2594%25BB%25E5%2583%258F.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://3.bp.blogspot.com/-TW0NiG8uzWs/XntMyWJnxKI/AAAAAAAAEQU/5i6voH2eJssE0kDXkPhK_hZBFXMgsdLIQCLcBGAsYHQ/s400/iOS%2B%25E3%2581%25AE%25E7%2594%25BB%25E5%2583%258F.jpg" width="300" height="400" data-original-width="1200" data-original-height="1600" /></a></div> 修士論文を提出した後に、WWWで開催されるFATES on the WEBというworkshopに投稿した論文が採択されたので、その準備などに慌ただしく追われていると、気づけばもう3月も下旬。(コロナウイルスのせいで、WWWはonlineでの開催になり、自分の発表はビデオ発表になった…

【論文紹介】Collaborative Denoising Auto-Encoders for Top-N Recommender Systems (WSDM2016)

イメージ
こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 今回は、Denoising Auto-Encoder (DAE)を推薦タスクに応用したCollaborative Denoising Auto-Encoders (CDAE)を提案した、 [Collaborative Denoising Auto-Encoders for Top-N Recommender Systems](https://alicezheng.org/papers/wsdm16-cdae.pdf) を読んだので、紹介記事を書きました。 ### 3行まとめ Denoising Auto-Encoder (DAE)をTop-N推薦に応用したCollaborative Denoising Auto-Encoders (CDAE)を提案。 単純にDAEを適用するのではなく、userごとのembeddingを中間層に加えることで良い性能を獲得している。 ### Denoising Auto-Encoder (DAE) DAEって、元の入力にノイズを混ぜて入力して、出力はオリジナルの(ノイズを混ぜる前の)データと比較するのだと思っているのだけど、 CFでは入力それ自体が欠損しているので、どうやってDAEで学習するのだろう? と最初思って読み始めたのですが、 すでに欠損しているのは置いておいて、入力からいくつかpreferred itemを欠損させて入力して、元のと比べることで欠損しているところを1として埋めようとするdecoderができる、ということだと思います。 そのままuserのinteraction historyを入力とするDAEではなく、userのembeddingも中間層に加えるのが特徴的。 工夫せずにつっこむやり方と比較して良い結果らしい。 interactionのみ扱う 追加の特徴はfuture work ### Collaborative Denoising Auto-Encoders (CDAE) モデルの構成はこちら。 <div class="separator" style="…