yag's blog

Twitter以上Zenn以下なことを書く場所

macOS環境構築メモ (2020/05)

久々にMacBookProを新調したので、環境構築のメモ。

なんと以前の記事がまだインターネット上に残っていたが、もう10年以上経ってしまった。使わなくなったアプリなどもあるが、基本はほぼ変わっていない……。

システム環境設定

  • デスクトップとスクリーンセーバー
  • Dock
    • Dockを自動的に表示/非表示: on
  • サウンド
    • メニューバーに音量を表示
  • キーボード
    • キーボード
      • キーのリピート: 速い
      • リピート入力認識までの時間: 短い
      • 修飾キー: Caps Lockを「アクションなし」
      • Control Stripをカスタマイズ: 「画面をロック」を追加
    • ユーザ辞書
      • 英字入力中にスペルを自動変換: off
      • 文頭を自動で大文字にする: off
      • スペースバーを2回押してピリオドを入力: off
    • ショートカット
      • Spotlight検索を表示: ⌃⇧スペース
      • 次のウィンドウを操作対象にする: ^⇧Z
    • 入力ソース
  • トラックパッド
    • ポイントとクリック
      • 調べる&データ検出: off
    • その他ジェスチャ
      • ページ間をスワイプ:3本指でスワイプ
      • アプリケーションExpose: on
  • 省エネルギー
    • バッテリー
      • ディスプレイをオフにするまでの時間: 15分
      • バッテリー電源使用時はディスプレイを少し暗くする: off
    • 電源アダプタ
      • ディスプレイがオフのときにコンピュータを自動でスリープさせない: on
  • 日付と時刻
    • 時計
      • 秒を表示: on
      • 日付を表示: on
  • 共有
    • コンピュータ名: 変更

メニューバー

  • バッテリー
    • 割合(%)を表示: on

Finder

  • 一般
    • デスクトップに表示する項目: すべてoff
    • 新規Finderウィンドウで次を表示: $HOME
    • フォルダを新規ウィンドウではなくタブで開く: off
  • サイドバー
    • $HOME: on
    • 最近の項目: off
  • 詳細

    • すべてのファイル名拡張子を表示: on
    • 拡張子を変更する前に警告を表示: off
    • 検索実行時: 現在のフォルダ内を検索
  • 表示

    • リスト
    • パスバーを表示

Dock

  • 起動していないアプリをすべてDockから削除

Google日本語入力

  • 一般
    • ¥キーで入力する文字: バックスラッシュ
  • 入力補助
    • アルファベット: 変換前文字列/変換中文字列: 半角
    • 数字: 変換前文字列/変換中文字列: 半角

フォント

アプリケーション

  • Chrome
  • Dropbox
  • Slack
  • Skitch
  • 1password
  • DaisyDisk
  • Authy Desktop
  • Karabiner-Elements
    • right_shift -> escape
  • Final Cut Pro X
  • Notion
  • Alfred

Terminal

スクリーンショットの保存先を変更

$ mkdir Documents/ss/
$ defaults write com.apple.screencapture location ~/Documents/ss/ ;killall SystemUIServer

「データ活用のための数理モデリング入門」で、アイデアを数式に落とし込む

データ活用のための数理モデリング入門

データ活用のための数理モデリング入門

「データ活用のための数理モデリング入門」をご恵贈いただきましたので、このブログで紹介したいと思います。私は著者の一人からお声がけいただき出版前に原稿をレビューさせていただく機会がありましたので、実はあとがきにこっそり名前が載っていたりします。

本書について

この本は、ビジネスにおける様々な課題を数理モデリングを通じて解決するための入門書です。ビッグデータから人工知能/AIへと言葉を変えつつも、世の中の流行として注目され続ける企業のデータ活用ですが、どういったデータに対して何をするかという活用の実態は多種多様です。ECサイトにおける商品のレコメンドに始まり、広告配信の配信の最適化や業務効率化、または社内に眠っている情報を素早くアクセスできるようにする検索技術であったり、データから新たな知見を生み出すデータマイニングといったものもあります。企業によって使えるデータが違えば課題も異なり、データ活用という言葉が意味するものも異なってきます。その活用へのアプローチとして用いられる技術が「数理モデリング」です。

そういったビジネスにおける数理モデリングを解説した入門書が「データ活用のための数理モデリング入門」です。

イデアを数式に落とし込む

私も機械学習エンジニアとして様々な案件に携わるなかでもっとも重要な技術だと感じるのが、本記事のタイトルにも示した「アイデアを数式に落とし込む」ことです。ECサイトの商品レコメンドを例に考えてみましょう。なにかユーザがもっと商品を買うようなレコメンドをしよう!と思ったとき、あなたは何を考えるでしょうか。

  • 売れている商品をおすすめしよう
  • ユーザが前に買った商品と似ている商品をおすすめしよう
  • 今後人気が出て売れそうな商品をおすすめしよう

レコメンドに詳しくない人でも、こういったアイデアはパッと出せると思います。では、このアイデアをどう具現化すれば良いでしょうか。売れている商品ならば集計すれば簡単に出せるかもしれないですが、ある商品に似ている商品ってなんだ?と考えた時に、どう「似ている」を表現しましょう?色が似ている、形が似ている、ブランドが似ている、といろいろな似ているがありますが、ユーザに次に購入してもらうための「似ている」というのは、意外と考えるのが難しいものです。とあるマンガの最新刊という商品を考えた時に、ある意味一番似てそうなのは同じマンガの一つ前の巻ですが、最新刊を買う人はその前の巻も持ってそうなのでレコメンドしても効果は薄そうです。また、今後人気が出て売れそうというのも、未来のことを予測しなければいけないので難しいですよね?人間が全部の商品の売上を毎日チェックして予想するのは大変ですし、予測を当てることは賭博のようなものです。

こうした時に強力なツールとなるのが「数理モデリング」です。数理/数学と聞くと拒否反応が出てしまう人もいるかもしれませんが(わたしもです!)、アイデアを形にするときにすべてを数字の上で表現することが、ビジネスにおける活用の第一歩です。似ている度合や売れ行きの予測を、自分なりの考えを数式に落とし込んで、ようやくビジネスやサービスに活用できる形になります。

この本は、数理モデリングを道具として使いこなす上で、その手助けとなる本と言えます。

イデアを形にしたい人におすすめ

本書は実務で数理モデリングをおこなう必要がある人はもちろんのこと、ビジネスサイドでデータ活用を推進する立場の人にもおすすめできます。数学的に難しいところは読み飛ばしてもらいつつ大雑把に全体感を掴むことができれば、数理モデル屋さんがどういった観点でデータを捉え、予測や最適化をしようと考えているかが理解できると思います。データ活用の具体事例も豊富に出てくるので、こういう分析をやりたいと思った時に逆引き的にも使えます。

データ活用に困った際は、ぜひ本書を手にとってみてはいかがでしょうか?

OpenAI Retro Contestの「Gym Retro Integration」でソニック・ザ・ヘッジホッグをプレイする

つい先日、OpenAIが主催するOpenAI Retro Contestが終了したようです。このコンテストでは"Sonic The Hedgehog"を題材に、ゲームをプレイするエージェントを作成しその性能を競うものでした。コンテストの結果は実際にプレイ動画とともにleaderboardから見ることができるのですが、上位陣のエージェントのプレイを眺めていると、深層強化学習の進歩をひしひしと感じます。中でも1位の"Dharmaraja"というアリババのチームは途中でオブジェクトの隙間に入り込むバグを発見して大きくスコアを伸ばしていたようです。この先機械がゲームをプレイする未来を考えると、実用的には機械がテストプレイをしたり、非実用的にはTASを自動で作成したりと、色々と夢が広がるものでした。

さて、私もちょっと強化学習を勉強してみようと思ってOpenAI Retro Contestのドキュメントを眺めていたのですが、その中で実際にゲーム画面を見ながら開発ができるよう、ゲームの状態を確認したり操作を行うGym Retro Integrationというユーザインターフェイスが開発されていたので、ちょっと試してみました。それほどハマるポイントがあるわけではないのですが、色々とやることがあって若干ややこしいので、利用するまでの手順を書いておきます。

環境

Gym Retro Integrationの準備

1. retoレポジトリをgit cloneする

2018/06/27現在はdevelopブランチからコンパイルする必要がありますので、ソースコードをcloneしてきてdevelopブランチをチェックアウトします。

$ git clone https://github.com/openai/retro/
$ git checkout develop

2. Gym Retro Integrationをコンパイルする

ここからはdevelopブランチのREADME.mdに記載されている通りにコマンドを実行します。

openai/retro at develop

$ brew install pkg-config capnp lua@5.1 qt5
$ cmake . -DCMAKE_PREFIX_PATH=/usr/local/opt/qt -DBUILD_UI=ON -UPYLIB_DIRECTORY
$ make -j$(sysctl hw.ncpu | cut -d: -f2)

なお、fish shellの場合は$()が利用できません。ここではマシンのCPUコア数を指定しているだけなので、make -j4といった形で実行します。

これが終われば、retroディレクトリにGym Retro Integration.appが作成されていますので、ダブルクリックまたはopen "Gym Retro Integration.app"で実行します。

プレイするROMの準備("Sonic The Hedgehog"の場合)

プレイする環境は準備ができたので、次にプレイするソフトウェアの準備をします。ここの部分はOpenAI Retro ContestのDetailにも記載されている内容と同様のものです。

OpenAI Retro Contest

1. Steamで購入する

Steamで今回のOpenAI Retro Contestで対象となっている下記のゲームを購入します。SteamではWindows用と表示されていますが、気にせず購入して問題ありません。

ちなみに、2018/06/27現在はサマーセール中ということで、通常は1本498円のところ、66%引きの168円で購入することができました。

2. gym-retroでsteamからROMをダウンロードする

Steamで購入したソフトをダウンロードします。ゲームを遊ぶときのようにSteam.appからダウンロードする方法もあるのですが、openai/retroでは直接ダウンロードするPythonスクリプトが用意されているので、そちらを利用します。

まず、openai/retroをインストールします。上記でソースコードをcloneしているので、そちらを利用しても問題ありません。

$ pip install gym-retro

次にretro.import.sega_classicsを実行します。ここではSteamにログインするときのUsernameとPasswordnほかに、Steam ガードコードと呼ばれるメールで届くワンタイムトークンの入力が求められます。ここでソニックのソフトを購入できていれば、下記のように3つのゲームが無事ダウンロードできます。

$ python -m retro.import.sega_classics
Steam Username: yag_ays
Steam Password (leave blank if cached):
Downloading games...
Installing games...
Importing SonicAndKnuckles3-Genesis
Importing SonicTheHedgehog2-Genesis
Importing SonicTheHedgehog-Genesis
Imported 3 games

さて、肝心のゲームのROMはというと、gym-retroのパッケージのdata/ディレクトリ以下に配置されます。"Sonic The Hedgehog"の場合はSonicTheHedgehog-Genesis/rom.mdがROMに当たります。これをGym Retro Integration.appで開くことになるので、参照しやすいディレクトリにコピーしておくと良いと思います。

なお、これは利用している環境によって場所が異なりますので注意してください。私の場合はpyenvを利用しているので$HOME/.pyenv/versions/3.6.3/envs/main/lib/python3.6/site-packages/retro/dataにありました。この場所を探すときはipythonでgym-retroをインポートしてどこから読み込んでるのかを確認するのが手っ取り早いと思います。

In [1]: import retro

In [2]: retro?
Type:        module
String form: <module 'retro' from '/Users/yag_ays/.pyenv/versions/3.6.3/envs/main/lib/python3.6/site-packages/retro/__init__.py'>
File:        ~/.pyenv/versions/3.6.3/envs/main/lib/python3.6/site-packages/retro/__init__.py
Docstring:   <no docstring>

Gym Retro Integrationを使ってみる

ようやく準備が終わりました。それではGym Retro Integrationを使ってゲームを実行してみます。

まずGym Retro Integration.appを開くと、以下のような画面が表示されます。まだ何も表示されていないサラの状態です。

f:id:yag_ays:20180627224620p:plain

次にゲームのROMを読み込む必要があります。メニューバーの"Game"→"Open"(または"Load Game...")からROMを選択します。ここではSonicTheHedgehog-Genesisrom.mdを指定しました。

f:id:yag_ays:20180627224712p:plain

ようやくゲームが実行できました!!!ゲームが進むにつれて画面右の"Senario Information"ではFrameやTimestepの値がインクリメントされており、状態がきちんと取得できているようでした。実際には各ステージのシナリオ等を読み込む必要があると思いますが、ここでは割愛します。

そしてゲームのプレイですが、矢印キーで操作したりzキーでジャンプできます。操作方法は、メニューバーの"Window"→"Controls.."で確認したり変更することができます。

f:id:yag_ays:20180627225205p:plain

さて、ここまで色々準備してきましたが、まだエージェントを作成する準備が整っただけです。ここからopenai gymを使って様々な強化学習などの手法を用いてエージェントを学習させていく必要があります。そちらはまだ勉強途中ということもありますので、別の機会にアウトプットできればと思います。

参考

XGBoostのScikit-Learn APIでearly stoppingを利用する

この記事では、XGBoostのScikit-Learn APIを使いながらもearly stoppingを利用する方法を紹介します。

一般的な方法

XGBoostのLearning APIとは違って、Scikit-Learn APIXGBClassifierクラス自体にはearly stoppingのパラメータがありません。その代わりにXGBClassifier.fit()の引数にearly_stopping_roundsがありますので、こちらを利用します。その際にはeval_setを同時に指定する必要があります。

xgb_model = XGBClassifier()
xgb_model.fit(X_train,
              y_train,
              early_stopping_rounds=100,
              eval_set=[[X_test, y_test]])

Python API Reference — xgboost 0.6 documentation

GridSearchCV/RandomizedSearchCVを併用する方法

実際にscikit-learnと組み合わせている場合には単体でのfitよりも、GridSearchCVやRandomizedSearchCVといったグリッドサーチと併用することが多いです。その際には、以下のようにfit_paramsを指定することによって、グリッドサーチ内でのearly stoppingが可能になります。

fit_params = {"early_stopping_rounds": 100,
              "eval_set": [[X_test, y_test]]}

xgb_model = xgb.XGBClassifier()
gs = GridSearchCV(xgb_model,
                  params,
                  fit_params=fit_params,
                  cv=10,
                  n_jobs=-1,
                  verbose=2)
gs.fit(X_train, y_train)

参考

転職しました

前職では様々な方に大変お世話になりました。ありがとうございました。

年明けから新たな職場でのスタートになります。引き続きどうぞよろしくお願いいたします。