最小限の労力でMacBookにDockerデータサイエンス環境を構築する

データサイエンティストの間でもDockerの人気が高まっているが、エンジニアのように使いこなすことは容易ではない。マーケター寄りのデータサイエンティストならインフラ技術を学んだことがなくても不思議ではないし、そんなところに時間をかけたくないと考える人も多いだろう。

最近、Dockerで機械学習や統計解析がひと通りできる環境を構築する必要に迫られ、AnacondaのDockerイメージを使うと手っ取り早いと知った。データサイエンス定番のPythonディストリビューションLinux環境がセットのイメージが公式に提供されているのだ。ローカル環境にAnacondaをインストールした結果、デフォルトのPythonと競合が生じる事態も避けられる。pyenvなどローカルでのPythonバージョン管理方法も存在するが、ここでまとめた方法ならもっと簡単である。

構築手順

以下の5つの手順でDockerのインストールからAnaconda環境の構築、そしてJupyter Notebookの起動までが完了する。なおMacBookでHomebrewが使える状態を前提とする。

手順1(ターミナルで実行)

brew install --cask docker

これだけでDockerのインストールは完了する。ブラウザでDockerのページへアクセスする必要もユーザ情報を登録する必要もない。

手順2

LaunchpadからDockerを起動する。ただ起動し、画面の指示に従って進むだけでよい。

手順3(ターミナルで実行)

docker pull continuumio/anaconda3:2021.05-amazonlinux

Docker HubからAnacondaのDockerイメージをダウンロードする。anaconda3:2021.05-amazonlinuxはバージョン名である。以下のページからダウンロードしたいバージョン名を確認して指定する。ページを開いてすぐに出てくるコマンドをコピーすると「anaconda3」がダウンロードされるが、これはその時点での最新バージョンがダウンロードされるという意味である。実行環境の管理の観点からは、バージョン名を指定したほうがよい。
hub.docker.com

手順4(ターミナルで実行)

docker run --name anaconda -v /local_dir:/docker_dir -p 8888:8888 --rm -it continuumio/anaconda3:2021.05-amazonlinux

Dockerコンテナを作成し起動する。実行と同時にコンテナ内にログインした状態になる。-vオプションではローカル環境のディレクトリをマウントしている。これによりローカル環境に置いてあるファイルがコンテナ内で使えるし、コンテナを停止してもマウントしたディレクトリ内の作業内容が失われることはない。

手順5(ターミナルで実行)

jupyter notebook --ip=0.0.0.0 --allow-root

最後にJupyter Notebookを起動する。コンテナ内で実行したノートブックをローカル環境のブラウザで開くため、外部接続を許可する--ip=0.0.0.0を指定している。

新型コロナウイルスPCR検査から性能指標の使い分けを考える

新型コロナウイルスPCR検査の説明を読んでいると、業務(広告関係)であまり聞かない感度や特異度といった指標が出てきた。そこで、再現率や精度といった機械学習の教科書でよく出てくる性能指標と比較しながら、そもそもどのような場合にどのような指標を使って性能を評価すべきかを考えてみた。

用語の定義

データがあるカテゴリに属するかどうかの二値分類について、分類されたカテゴリと実際のカテゴリの組み合わせは混同行列と呼ばれる表に整理される。PCR検査の判定を例にとると次のようになる。

f:id:wubaijin:20210515144745p:plain

分類モデルの一般的な性能指標

機械学習の教科書では再現率と精度が代表的な評価指標として紹介されることが多い。各々次のように定義される。

再現率 = 真陽性 / (真陽性 + 偽陰性)

精度 = 真陽性 / (真陽性 + 偽陽性)

医療分野における性能指標

一方、新型コロナウイルスPCR検査など医療分野では、検査の性能指標に感度と特異度が使われることが多いようだ。

感度= 真陽性/(真陽性+偽陰性)

特異度 = 真陰性/(真陰性+偽陽性)

定義を見ればわかるように、感度と再現率は同じ指標である。医療分野では精度を使わず、代わりに特異度を使っているということになる。

なぜ医療分野で感度と特異度が使われるのか

ここで、新型コロナウイルスPCR検査を例にとって、医療分野で感度と特異度が使われる理由を考えてみたい。

自治体は毎日PCR検査の陽性者数を発表しているが、同時に日ごとの陽性率も公表している。陽性率とは検査を受けた人のうち陽性と判定された人の割合である。流行状況によって陽性率は高くなったり低くなったりするが、陽性率が高いほど真の感染者が検査対象者に占める割合も高くなる傾向がある。下の2つの表は同じ検査を異なる検査対象者グループへ実施した結果だが、右のほうが左より陽性率も感染者の割合も高い。

f:id:wubaijin:20210515145821p:plain

PCR検査の対象者のように、カテゴリ構成比が変動するデータに対しては精度を性能指標に用いることが難しい。あるカテゴリの比率が上がると、閾値を変えなくてもそのカテゴリに対する精度が上がってしまうからだ。先の表では右のほうが左より精度が高いが、右のほうが性能がよいとはいえない。どちらも同じ検査だから、性能は同じである。

一方で閾値が一定である限り、カテゴリ構成比にかかわらず感度と特異度は一定である。偽陽性偽陰性のバランスを見ながら閾値は設定される。偽陽性は少ないが偽陰性は多い閾値では、感染していないのに感染していると判定されている人は少ないが、感染しているのに感染していないと判定される人は多い。逆に偽陽性は多いが偽陰性は少ない閾値では、感染していないのに感染していると判定されている人は多いが、感染しているのに感染していないと判定される人は少ない。

性能指標をどのように使い分けるべきか

以上から、医療分野でなくても、データのカテゴリ構成比が時間とともに変化する可能性がある場合には、精度の変化を額面通り受け止めてはならないと言える。カテゴリ構成比が異なると、同じ精度でも同等の性能を示しているわけではないからだ。また、モデルの精度が低下している場合、データに対するモデルの当てはまりが悪くなっていることやそもそもモデルの汎化性能が低かったことが一般に考えられるが、カテゴリ構成比の変化から精度の低下が生じているならいずれも起きていないことになる。

感度と特異度はカテゴリ構成比の影響を受けないので、精度を性能指標に入れたい場合でも感度と特異度を合わせて確認すれば、精度の変化がカテゴリ構成比によるかどうかを切り分けやすくなる。

データに対するモデルの当てはまりが悪くなる可能性がある分野なら、精度のモニタリングは重要である。医療分野においては、当てはまりが悪くなるとはある検査に対する人体の反応の仕方が変わることを意味する。このようなことは数日どころか数年経ってもまず起きない。

参考

はじめてのパターン認識

はじめてのパターン認識

  • 作者:平井 有三
  • 発売日: 2012/07/31
  • メディア: 単行本(ソフトカバー)
 

 

jeaweb.jp

 

転職活動に役立つデータサイエンティストのアウトプット・称号

最近、データサイエンティストとして転職活動をして内定をいただきました。

内定を得るのに実務経験が大事であることは言うまでもないですが、ここでは転職活動で役立つと筆者が考えている次のアウトプットや称号を整理してみました。

筆者が転職活動の時点で何らかの実績を持っていた項目(各項目の冒頭に括弧書きで記しています)に関しては、求人や面接での言及の有無を書きました。あくまで個人の経験に基づくものであり、かつ定性的な話であることに注意してください。また筆者に何の実績もない項目に関しては一般論あるいは想像の域を出ない内容だと断っておきます。

解析コンペ(Kaggle)

(Competitions Expert、ソロSilver1枚、ソロBronze2枚)

面接でKaggleに関する話題をふられることがありました。またLinkedInやビズリーチに届いた求人で「Kaggle Expertの●●様」「Kaggle経験のある●●様」といった文言を少なからず見ました。「Kaggle銀メダル獲得者が在籍!」とアピールしている求人票もありました。

Twitterなどを見るとMaster以上やGold獲得者が転職市場で評価されることは自明ですが、Bronzeレベルでも一定の評価はされるようです。また、実績の「質」を確認するために以下の点が見られるかもしれません。

  • ソロでの実績があるか
  • 比較的新しい実績はあるか
  • どのコンペでの実績か(shakeの大きいコンペか)

Kaggleが評価される理由として、データ解析に関するコンペであること以外に、レベルに関する共通認識が業界内でできあがっていることが考えられます。GrandmasterやMasterといった称号やメダルの数・色でデータサイエンティストとしての能力(の少なくとも一部)がある程度伝わるということです。ほかに共通認識ができていそうな解析コンペは日本だとSIGNATEあたりでしょうか。

論文

論文を書くことが業務に含まれるポジションならば、(査読ありの)論文があることは選考に有利でしょう。場合によっては論文なしだと相手にされないかもしれません。論文を書くことが業務に含まれなくても、専門性をアピールするのに論文は強力な実績だと思われます。

特許

(2件、うち1件は筆頭発明者)

面接のなかで特許を取得した実績を評価していると言われたことがあります。ほかにも企業から届いた求人で「特許取得の実績もあり求人を送らせていただきました」のようなメッセージを何度か見ました。

このように特許は一定の評価をされるようですが、取得するには法務や弁理士との連携が不可欠です。論文に比べると実績を出せるかどうかが所属する会社の協力体制に依存するといえます。また出願してから審査結果が返ってくるまでに1年くらいはかかり、思い立ってからすぐに結果を出すには向きません。

書籍

著書があるデータサイエンティストの数は少ないはずなので、差別化しやすい実績ではないでしょうか。また、通常は論文や特許より読むハードルが低いので、データサイエンティスト以外の人にもアピールしやすい実績である気がします。

書籍を出版するには出版社と関係を構築しなければならず、そのための体系だった方法はありません。Kaggleや論文のように、実力があれば実績を作れる性質のものではないことに注意が必要です。

ブログ

当たり前ですが、とりあえずアウトプットを出すだけなら論文や特許や書籍よりもはるかに簡単です。誰でもできる分、転職市場で評価してもらうには中身が重要になるでしょう。職務経歴書にリンクを貼っておけば読んでもらえるかもしれません。また、ブログが出版社の目にとまって書籍の出版が持ちかけられた事例を聞いたことがあります。

ソースコード

ブログと同じく、プログラムをGitHubなどにアップロードしておくことは有用でしょう。データサイエンティストの場合、ブログで取り上げた内容の実装をGitHubで管理している例も見られます。AIエンジニアという職種名で募集しているような開発職の強いポジションならば、データサイエンスの領域にとどまらない開発スキルをアピールするのにソースコード資産が役立つでしょう。

資格

(統計検定準1級・応用情報技術者

Kaggleや特許と異なり、筆者宛ての求人メッセージで保有資格に触れられた経験はありませんでした。求人情報のスキル要件で「統計検定2級程度の知識」と書いてあるのは見たことがあるので、統計検定はある程度認知されていると思われます。

そのほか、情報処理技術者試験GoogleAWSクラウドに関する試験はエンジニアリング寄りのスキルをアピールしたりそのような職種に応募したりするには有効かもしれません。

学位

 (データサイエンス関連の修士課程に在籍)

まだ学位を取得していないからかもしれませんが、大学院に在籍していることについても特に触れられたことはありません。とはいえ、求人によってはデータサイエンス関連の学位が応募要件になっています。

外資系は修士号以上が必要などと言われることがありますが、学士で応募できる求人も多く見かけましたし、実際に学士で入社した例も知っているので、会社とポジションによるでしょう。逆に日系でも研究色が強いポジションを中心に修士や博士を求める求人はざらにあります。

交絡に対処するための因果推論の手法

因果推論の各手法について、どれをどのような場合に用いるべきなのかがわからなくなるので、交絡への対処方針という観点から自分なりに整理してみた。

交絡と因果推論

2つの変数間に因果関係を想定するとき、原因と結果の両方に影響を与える別の変数が存在する状態を交絡といい、そのような変数を交絡因子と呼ぶ。

交絡を取り除く最も有効な方法はセレクションバイアスのないランダム化比較試験(Randomized Controlled Trial、RCT、あるいはABテスト)を実施することであるが、現実にはセレクションバイアスのないデータを得ることが難しい場合がある。

因果推論と呼ばれる分野では、RCTが実施できない場合やありあわせのデータを分析する場合に交絡に対処して因果関係を見出すためのさまざまな手法が考案されてきた。

手法の種別とフローチャート

手法は大きく3パターンに分類できる。各手法の概要は後述する。

  1. 介入を実施したかのような状況のデータを活用する(回帰不連続デザイン・中断時系列デザイン)
  2. 交絡因子を特定してその効果を取り除く(層別解析・マッチング・傾向スコア・回帰分析)
  3. 介入前後で生じた交絡を取り除く(差分の差分・Causal Impact)

手法を選択する方針は次のようなフローチャートで表現できる。

 

f:id:wubaijin:20210406140503p:plain

1. 介入を実施したかのような状況のデータを活用する

セレクションバイアスのない介入を実施したかのような特殊な状況のデータが得られる場合にのみ使える手法である。2、3が想定する因果関係から交絡を取り除くのに対し、そもそも交絡が存在しないような因果関係を見つけて利用する。ただし、介入変数の変化に伴うトレンドは考慮しなければならない。

1.1 回帰不連続デザイン

ある値を境に介入の割り付けが変化しているとみなせる変数が存在する場合、その値の前後のデータを使って介入効果を推定できる。

たとえば1,000円以上購入したユーザに対して割引クーポンを発行するキャンペーンの効果を検証する場合、950-999円購入したユーザと1,000-1,499円購入したユーザを比較することが考えられる。

1.2 中断時系列デザイン

回帰不連続デザインの特殊な場合と考えてよい。ある時点を境に介入の割り付けが変化しているとみなせる変数が存在する場合、その前後のデータを使って介入効果を推定できる。通常の回帰不連続デザインにはない留意点として、時系列データには自己相関が存在しうることが挙げられる。

たとえば英会話教室の学費値上げが生徒数に及ぼした影響を検証したいなら、月による生徒数増減の傾向を考慮したうえで値上げ前後の生徒数を比較すればよい。

 2.交絡因子を特定してその効果を取り除く

データにセレクションバイアスが存在しても、どの変数が交絡因子であるかがわかれば、以下の手法が交絡を取り除くのに有効である。

2.1 層別解析

交絡因子の値ごとにデータを分ける。交絡因子が連続変数の場合は、適当な範囲でカテゴリ変数にしておく。分けられた層ごとに相関係数の算出や回帰分析など各種解析を行う。

たとえば化粧品のインターネット広告の配信効果を検証したいとき、女性を中心に配信していれば、広告を配信された人のほうが化粧品を多く購入したとしても、女性の比率が高いことが理由かもしれない。そこで性別でデータを分けてから広告を配信された人のほうが多く購入したのかを検証する。

2.2 マッチング

介入群と対照群から交絡因子の値が近いデータを1つずつ選んでペアにすることを繰り返す。ペアリングが終了したら、ペアのうち介入群から選ばれたデータと対照群から選ばれたデータを比較して介入効果を検証する。

たとえば広告を配信された人とされなかった人で年齢構成が異なり、年齢によって広告への反応が異なると考えられるとき、年齢を5歳ごとの区分に分け、区分ごとに広告を配信された人とされなかった人が同数になるようにする。

2.3 傾向スコア

傾向スコアとは簡単にいうと介入が行われる確率である。交絡因子の存在が想定されるならば、交絡因子を説明変数として傾向スコアを算出できる。言い換えると、複数の交絡因子を1次元に圧縮した変数が傾向スコアである。

たとえば大学へ進学することによる収入の増加を検証したいとき、性別と住んでいる都道府県で大学へ進学するかどうかが十分に予測できるとする。このとき、性別と住んでいる都道府県から大学へ進学する確率である傾向スコアが求められる。

傾向スコアはマッチングと合わせて使われることが多い。交絡因子の代わりに傾向スコアでマッチングする。

2.4 回帰分析

介入変数および交絡因子を説明変数にした回帰モデルを作成する。モデルの係数から交絡因子の効果を取り除いた介入効果がわかる。

3. 介入前後で生じた交絡を取り除く

介入効果を検証したいグループすべてに対して介入が実施されている場合、2の手法は使えない。そこで介入前後での結果の変化で効果を測定することが考えられるが、たとえ変化が生じていたとしても、それだけでは介入以外の要因によって結果が変化した可能性を否定できない。このような介入前後で生じた交絡を取り除くために次の手法が考案されている。

3.1 差分の差分

介入効果を検証したいグループ(介入群)と別のグループを対照群とする。介入前後での介入群の結果の差から対照群の結果の差を引いて介入効果を求める。介入前後で生じた交絡が介入群でも対照群でも同じであることが前提になっている。これは平行トレンド仮定と呼ばれる。

関東地方全域で放送したアイスのテレビCMが売上に与えた効果を測定したいとする。関西地方ではテレビCMを放送しておらず、関西地方に対して平行トレンド仮定が成り立つならば、関西地方を対照群として差分の差分を適用できる。

3.2 Causal Impact

3.1において対照群のデータが準備できない場合にも使える手法である。介入前のデータだけで介入前の結果を予測するモデルを構築する。このモデルを介入後の対照群データに適用することで、対照群に介入が行われなかった場合の結果が推定できる。

3.1の例で関東と関西でアイスに対する嗜好が異なるとする。1日の平均気温からアイスの売上を予測できるならば、テレビCM放送前の関東地方における1日の平均気温とアイスの売上のデータを使ってCausal Impactを測定できる。

参考

岩波データサイエンス Vol.3

岩波データサイエンス Vol.3

  • 発売日: 2016/06/10
  • メディア: 単行本(ソフトカバー)
 

 

統計・機械学習モデリングで対数変換をする3つの目的

統計・機械学習モデリングの過程で説明変数を対数変換することがある。同じ対数変換でも目的や意味がいろいろあるのだが、計量経済学機械学習といった各分野で別個に説明されているので、違いがわかりやすいように整理してみた。

対数変換の目的は大きく3つに分かれる。

  1. 変化率を表現する
  2. 分散不均一性に対応する
  3. 予測性能を高める

1は解釈、2はモデルの信頼性、3は予測の問題に関わる。

1. 変化率を表現する

関数ln\ x\overline{x}の十分近くで以下のように近似できる。

\displaystyle ln\ x \approx ln\ \overline{x}+\frac{1}{x}(x-\overline{x})

この式を以下のように変形すると、対数の差はxの変化率を近似的に表すことがわかる。

\displaystyle\frac{x-\overline{x}}{\overline{x}} \approx ln\ x-ln\ \overline{x}

ここで次の3つの線形回帰モデルを考える。

  1. ln\ y= \alpha_1+\beta_1 ln\ x
  2. ln\ y= \alpha_2+\beta_2 x
  3. y= \alpha_3+\beta_3 ln\ x

\beta_1xが1%変化したときのyの変化率を、\beta_2xが1単位変化したときのyの変化率を、\beta_3xが1%変化したときのyの変化量を表す。なお、ある変数の1%変化に対するほかの変数の変化率を弾力性という。

2. 分散不均一性に対応する

線形回帰モデルでは誤差の分散が均一であることが仮定される。もし分散が不均一ならば、係数の仮説検定に信頼が置けなくなる。

たとえば説明変数の値が大きくなるにつれて誤差が大きい場合、説明変数を対数変換することで不均一を是正できることがある。

3. 予測性能を高める

対数変換が特徴量エンジニアリングの一種としてなされることもある。特徴量エンジニアリングとは、特徴量を変換したり組み合わせたり集約したりすることで新しい特徴量を作成することであり、モデルの予測性能を高めるために使われる。

対数変換は対数正規分布のように裾が延びた分布の偏りを弱める働きをする。分布を正規分布へ近づける変換にBox-Cox変換があり、対数変換はBox-Cox変換の特殊な場合である。

なお、対数変換は決定木系(ランダムフォレスト、勾配ブースティングなど)のモデルでは使う意味がない。決定木のルールは説明変数の大小関係から作成され、対数変換は大小関係に影響を与えないからだ。

参考

人文・社会科学の統計学 (基礎統計学)

人文・社会科学の統計学 (基礎統計学)

  • 発売日: 1994/07/01
  • メディア: 単行本
 
Kaggleで勝つデータ分析の技術

Kaggleで勝つデータ分析の技術