u++の備忘録

ブログを始めて3年経った

本ブログを2016年9月24日に始めて、先日で丸3年が経ちました*1

f:id:upura:20190929135126p:plain

主にデータ分析に関する話題や個人の随筆など、広く世間一般に需要があるわけではない内容を書き連ねているブログですが、多くの方々にご覧いただけて非常に嬉しく感じています。

f:id:upura:20190929140237p:plain

最近は本ブログなどのアウトプットがきっかけで、登壇のお声掛けを頂く機会もありました。「白金鉱業 Meetup Vol.6」*2と「なんでデータサイエンティストやってるの? 〜 思い描いていた自分を思い出すために。 vol.4」*3というイベントでは、本ブログを始めた契機も絡めた発表をさせていただき、大変印象に残っています。

今日は9月の最終日です。私が2017年10月に現職に入社して、ちょうど2年が経過することになります。

幸運なことに現職では十分に面白い案件に関われていると感じています。本ブログ執筆、イベント登壇・運営、Kaggleなどの社外活動に取り組む時間もある程度確保できている点も喜ばしいです。

とはいえ組織に属している以上、個人の力量ではどうしようもない事案も発生し得ます。これは企業勤めを選択した際から常に意識し続けていた考えでもあるのですが、今後も自分自身が発揮できる力を着実に蓄えながら、柔軟かつ機敏な動きを選択肢に入れながら活動していく所存です。

ブログ執筆は、社外に向けて自分を表現できる優れた手段の一つです。今後とも継続して取り組んでいきたいと考えています。

脚注

技術書典7で入手した書籍まとめ

2019年9月22日に開催された「技術書典7」に参加してきました。本記事では、入手した書籍の一覧をまとめます。各書籍は読了後に必要ならば別途感想を投稿したいと思っています。

techbookfest.org

『とらラボ vol.3』

入場時に無料配布された緑色のバッグの中に入っていました。AWSGCPGolangなど広範にわたる話題を取り上げています。1ページ2段組で比較的小さいフォントで書かれているので、全74ページですがページ数から想像される以上の情報量が掲載されている印象です。

techbookfest.org

『Tech Do Book #2』

技術書典7に協賛している株式会社メディアドゥのエンジニアによる技術書で、無料配布されていました。「取りあえず受け取った」というのが正直なところですが、目次を眺めると「AWS Personalaize」や「AWS Lambda + API Gateway」「暗号の基礎 #2」など個人的な関心のある内容もありました。

techbookfest.org

『ぼくのCtrl+Alt+Z Vol1』

こちらも無料配布で頂きました。「技術書を選ぶコツ」を題材に、なかなか言語化が簡単ではない話題を議論している印象です。

techbookfest.org

『図で見る 線形システム制御』

線形システム制御理論(現代制御理論)を図を駆使して説明する書籍です。立ち読みしたところ、状態方程式固有ベクトルなど大学で学んだ分野を丁寧に取り上げており、購入を決めました。単なる理論を列挙するだけでなく、著者の解釈なども付与されている点も魅力的でした。電子版の販売も検討中とのことです。

techbookfest.org

『YOMOYAMA Book Vol.2』

Google Cloud プレミアパートナー」として顧客ビジネスのサポートしている株式会社トップコードのエンジニアによる技術書です。第2章で「BigQuery ML」を用いて日経平均株価の変動の上下を機械学習で予測する話題があり購入を決めました。

techbookfest.org

JavaScriptでいきなり機械学習を遊び倒す本』

JavaScriptを用いて、機械学習を活用したWebアプリを作るチュートリアル本です。立ち読みしたところ、開発環境構築や機械学習の概説から始め、独自の機械学習モデルを学習しWebアプリを実装する部分まで丁寧に解説しているのが印象的でした。

techbookfest.org

『わかりみSQL

500ページを超えのSQL解説書です。Qiitaで話題になっていたのを見かけ、購入を決めました。中間テーブルを省略せず示したり、意図的に技術用語を使わなかったり、入門者向けの工夫が凝らされている書籍になっていました。

techbookfest.org

Cookpad Tech Book』

知人が執筆した「無理をしない機械学習プロジェクト」の章が面白そうだったので買いました。機械学習に限らず環境構築や実験フローの話は流行り廃りも激しく、商用出版ではない同人誌だからこそ扱える部分もあります。その他にgitのアルゴリズムを解説している章も興味深いです。

techbookfest.org

『Data a la carte vol2』

自然言語処理や画像解析・データ分析一般についての合同誌です。1年前の技術書典5で頒布されていたvol1が良書だったので、今回も購入しました。先日のPyConJPでも素晴らしい発表をしていた池田さんの「nagisa ではじめる自然言語処理~系列ラベリングモデル実装編~」が面白そうです。

techbookfest.org

『Housing Layout with Houdini and Machine Learning 〜Houdini と機械学習を利用した 住居の自動平面図生成手法〜』

モデリングツール「Houdini」とTensorflowベースの機械学習を用いて、住居の自動平面図生成手法を解説しています。一般の技術書には珍しく第1章を丸々使って先行研究のサーベイが提示されており、丁寧に「住居レイアウト×機械学習」という難しめな話題を取り扱っていました。

techbookfest.org

『自宅PCではじめる自然言語処理

長文要約ソフトウェア「IMAKITA」開発者による「家庭用PCでも挑戦できる自然言語処理」が題材の自然言語処理の解説書です。自然言語処理の概説や形態素解析・分散表現の獲得から始め、文書分類・要約・生成など高度な応用も展開しています。IMAKITAの内部アルゴリズムやBERTなどにも話が及んでおり、広範な内容を扱っている良書だと感じました。

techbookfest.org

『ハマって覚えるデータ分析・機械学習の罠』

Kaggle Masterのえじさんによるデータ分析・機械学習で陥りがちなアンチパターンと対処法をまとめた書籍です。有名な「過学習」の話題から、乱雑なJupyter Notebookが転がりがちな機械学習プロジェクト管理の話まで、広範に実例を取り上げて説明しています。

techbookfest.org

f:id:upura:20190923041633j:plain

「ML@Loft #6」参加メモ

「ML@Loft #6」に参加しました。

ML@Loft は AWS 上で機械学習ワークロードを運用しているデベロッパー/データサイエンティストのための、お悩み相談会です。 第6回は MLPP #4 との共催で、これまでも人気だった "自然言語処理 (NLP) / レコメンド" や "時系列解析" をテーマに、サービス導入する際のポイントや悩みについて議論します。

mlloft6.splashthat.com

machine-learning-pitch.connpass.com

発表

LT1 - 富士通研の時系列データ解析技術

梅田 裕平さん(株式会社富士通研究所

drive.google.com

LT2 - ゼロベースからの論文レコメンドシステムの構築

河合 俊典さん(エムスリー株式会社)

  • 医者向けの論文のレコメンドシステムの構築
  • 製薬企業が医療情報を勉強するためにも使われる
  • 要件
    • 基本的にはML業界と同じ
    • 分野の重なりの大小が激しい
      • 糖尿病などの合併症の範囲絵が広い病気
      • 希少疾患
      • ワードの揺れ(MRという略語が複数の意味を持つ)
    • 年間数万件です最新の論文に対応したい(コールドスタート問題)
    • ある程度ユーザ行動に応じて動的に動く
    • 医療関係者に納得感のある評価
  • 手法
    • 医師と論文の名寄せ
      • 決定木でユニークIDを振る
    • お医者さんの興味ワードの生成
      • Label Propagation
    • Elasticsearchに投げる
    • レコメンドエンジンの作成
      • content-based citation recommendation
    • コールドスタート問題に対処すべく、ユーザが興味のある単語の情報だけではなく、citation情報や過去に医師が書いた論文の情報も複合的に利用して推薦する
  • 評価
    • 最初はM3の編集部にアドバイスを貰いつつモデル化
    • 実データを用いて、CTR、MRR、MAPを算出
      • データ数、カテゴリ数に課題はある

LT3 - 社内の XX に詳しい人を知りたい

押条 祐哉さん(ストックマーク株式会社)

  • Anews
    • ビジネスニュースの配信
    • チームの人が読んだ記事も読める
    • 記事にコメントも付けられる
    • チームの共通知のアップデート
  • Anewsの刷新にあたり、特定のキーワードやニュースで検索した時に詳しい社内人物1人を推薦するシステムの構築
    • 「Who knows what?」
  • 記事データとユーザ行動ログが使える
  • 推薦アルゴリズム
    • 協調フィルタリングではなく、コンテンツベーツ
    • ユーザベクトルと記事ベクトルのcos類似度ベースのスコアを利用
    • 記事ベクトルの閲覧数が最も多いクラスタの中心をユーザベクトルにして、dynamodbへ格納
      • 記事のタイトルと最初の名詞数単語の入力として、fastText
  • 課題
    • ユーザベクトルの定義方法
      • コールドスタート問題
      • 他にも取れるデータで有用なものがあるかも
    • 評価指標
      • A/Bテストやオンラインテストなど検討中

LT4 - ESG評価を支える自然言語処理基盤の構築

久保 隆宏さん(TIS株式会社)

  • ESG投資、持続可能な発展の可能性を考慮
  • 7つの手法があるが、何らかの「ESG評価」をしている
    • さまざまな評価機関が存在
    • 各機関の評価に相関がなさすぎる
  • 人力での評価には限界がある→NLPの利用
  • 支援レベル
    • 文書データの収集(CSR報告書・結合報告書)
      • AWS上に仕組みを構築、Lambdaを起動
      • StepFunctionで構築してGlue Crawlerを呼ぶ方式を採用
      • ビューはAthena
      • 作成したデータ5年分を近日公開予定
    • 評価対象となる文・段落の絞り込み
      • プロトタイプ検証予定
    • 自動評価
  • 課題
  • 所感
    • 「見た目ではESG評価はレポートの見た目では変わらない」
    • 書きっぷりを頑張ってほしい
    • その辺に転がっているデータで価値が出ることはほぼ無い
    • 地道なアノテーションが大切

パネルディスカッション

Slidoで寄せられた質問に答える形式でした。具体的な議論内容については、twitterハッシュタグ #mlpp #mlloft である程度確認できるかと思います。

togetter.com

AI×愛知の「AIchi勉強会」でKaggleの魅力について発表しました

愛知県名古屋市で開催された「AIchi勉強会」で、Kaggleの魅力について発表しました。愛知県出身という縁でお声がけいただいた形です。

愛知県の製造業の異なる会社で働く、AI・機械学習に興味を持つメンバー3人中心に「愛知県で会社を越えてAIに興味ある人、AIを使っている人と繋がれるイベントを開催してみたい!」という思いから始まったイベントです。今回が初回となります。

connpass.com

自分の発表

主に初心者〜中級者の方向けを想定したイベントとのことで、Kaggleを紹介しつつ魅力を少しでもお伝えできる内容を心がけました。

具体的には次の三本立てで、Kaggleを知らない方も対象に、ある程度体系立てたお話をしたつもりです。発表の冒頭でお尋ねしたところ、Kaggleに一度でも提出した経験のある方は2割弱、聞いたことある方は約7割でした。

発表の中では教師あり学習の例として、以前に作成した「名古屋/東京」を判定する画像分類アプリもご紹介しました。

upura.hatenablog.com

懇親会

懇親会では、何人の方に「Kaggle始めます!」と言っていただいたり、twitterで存じ上げていた方にお会いできたりと、有意義な時間を過ごすことができました。

おわりに

大学入学の上京とともに離れた地元・名古屋にて、このような形で帰省し少しでもコミュニティに貢献できたことは非常に感慨深いです。お声がけいただき、本当にありがとうございました。

参加者・登壇者・運営の方々、会場をご提供くださったヤフーさんにお礼申し上げます。

f:id:upura:20190907222452j:plain

f:id:upura:20190907222656p:plain

f:id:upura:20190907222708p:plain

「なんでデータサイエンティストやってるの?」に登壇しました&全発表メモ

「なんでデータサイエンティストやってるの? 〜 思い描いていた自分を思い出すために。 vol.4」というイベントに登壇しました。

イベントの概要

企業で働くデータサイエンティストが、各々の内的動機を語るイベントでした。

nan-d-vol4.peatix.com

発表

自分の発表


小副川 健さん(ユーザベース)

数学が専門の博士課程→富士通→ユーザベースと、黎明期からデータサイエンティストの経験を積んできた小副川さんの発表でした。事業会社の中の人として分析する価値や面白さについて語ってくださり、自分としても同意できる部分が多いお話でした。

吉田 勇太さん(ブレインパッド)

受託分析会社で5年間データサイエンティストとして働いている吉田さんの発表でした。受託分析では分析部分に専念するように見えますが、実は本当に喜ばれるのはビジネス課題設計や意思決定という点が興味深かったです。「分析はただの道具」「単なるお金をもらっている業務ではなく、自分の生き方そのものにしたい」というメッセージが印象的でした。

マスクドアナライズさん(フリーランス

大学卒業以来IT業界で働き、現在フリーランスとしてマスクドアナライズさんの発表でした。「IT業界はヤクザと同じくらいエキサイティング」と話す中で、データサイエンティストのキャリア論について、笑いをはさみながら議論してくださいました。聴衆の期待通り、プロレス業界の獣神サンダー・ライガーさんの生涯を紹介しつつ「自分の道は自分で作るしか無い」という(思いのほか?)至極まっとうな話が展開されていました。

樫田 光さん(メルカリ / メルペイ)

メルカリ/メルペイでデータアナリストとして働く樫田さんの発表でした。企業に務めてからの遍歴を語りながら「英語はできなくても、データ・数字は世界共通言語だと知った」「自分の武器となるものを求めた」「自分の測りで物事を見ていても、周りは待ってくれない」「Yes, Noはほぼ決まっていて、実は今やるか先延ばしするかという問いが多いかもしれない」など、含蓄に富むメッセージが多かったです。現在35歳の樫田さんがプログラミング未経験だった10年前のご自身を振り返って「何かを始めるのに遅すぎることはない」とお話されていたのは非常に力強く心強いなあと感じました。

おわりに

改めて自分のキャリアを見つめ直す良い機会となりました。皆さんのお話がそれぞれ興味深く、1人の聴衆としても満足度が高かったです。

個人的に、自分が今の会社を選んだ理由はどこかで語ってみたいと常々思っていたので、このような登壇の機会を頂けて非常に光栄でした*1

参加者・発表者・運営の方々や、素敵な会場をご提供いただいたユーザベースさんにお礼申し上げます。

f:id:upura:20190906193550p:plain

*1:以前にキャリア論について登壇した際には社外活動の話が主でしたupura.hatenablog.com

csv化で文字列になったlistやdictを元に戻す

csv化すると文字列になってしまう仕様があるのでpickle形式などで保存するのが良いですが、諸般の事情でcsvで読み込む想定の場合の一つの解決策として、ast.literal_eval() *1*2 を使う方法を紹介します。

具体例

冒頭でastとpandasをimportします。astは標準ライブラリに含まれているので、pip installなどは不要です。

import ast
import pandas as pd

今回は次のような単純なDataFrameを題材にします。

df = pd.DataFrame({
    'sample': [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
})
df

f:id:upura:20190903190136p:plain

要素を確認すると、list型になっています。

df['sample'][0], type(df['sample'][0])
([1, 2, 3], list)

このDataFrameを一旦csvに吐き出した後に改めて読み込むと、要素は文字列型に変換されています。

df.to_csv('sample.csv', index=False)
df2 = pd.read_csv('sample.csv')
df2['sample'][0], type(df2['sample'][0])
('[1, 2, 3]', str)

文字列を split() して分割する方法もありますが、ここでは ast.literal_eval() を使うことで list 型から文字列型に変換しました。ast.literal_eval() はdict型への変換にも対応しています。

df2['sample_list'] = [ast.literal_eval(d) for d in df2['sample']]
df2

f:id:upura:20190903190804p:plain

df2['sample_list'][0], type(df2['sample_list'][0])
([1, 2, 3], list)

おわりに

本記事では、ast.literal_eval() を用いて csv 化で文字列になった list や dict を元に戻す方法を紹介しました。実装はNotebook形式でGitHubでも公開しています*3

Poincaré Embeddings でJ1リーグのチーム・選手を可視化

ふと「Poincaré Embeddings」*1で遊んでみたいと思い立ち、サッカーJ1リーグのデータで試してみました。

Poincaré Embeddings

Poincaré Embeddingsに関する説明は、ABEJA*2やscouty*3のブログに譲ります。

Poincaré Embeddings は端的に言うと word2vec の埋め込み先をユークリッド空間ではなく双曲空間にするという手法で、階層構造やべき分布をもつデータを埋め込むという問題設定において、低次元でもよい表現を与えられるという特徴があります。

Poincaré Embeddings による職種の類似度計算とその利用 - LAPRAS AI LAB

gensimでの実装とデータセット

Poincaré Embeddingsを手軽に試すに当たって、gensimでの実装*4が存在します。

この実装に渡すデータセットの形式は次の通りです。データセットはタプルを要素に持つリスト形式で、各タプルは('選手名', 'チーム名')のような関係性を持っています。

[('アウグスト ペドロ デ ソウザ', '鹿島アントラーズ'),
 ('アウグスト ペドロ デ ソウザ', '川崎フロンターレ'),
 ('アジエル アモリム', '湘南ベルマーレ'),
 ('アジエル アモリム', '浦和レッズ'),
 ('アデミウソン', '横浜F・マリノス'),
 ('アデミウソン', 'ガンバ大阪'),
 ('アドリアーノ フェヘイラ', 'セレッソ大阪'),
 ('アドリアーノ フェヘイラ', 'ガンバ大阪'),
 ('アマラオ', 'FC東京'),
 ('アマラオ', '湘南ベルマーレ')]

一般にこのような形式で存在しているデータセットはさほど多くなく、今回も全工程の中で特にデータセットを作る部分に苦心しました。

今回は「J1リーグの各チームの歴代所属選手の可視化」という題材に落とし込むことで、Poincaré Embeddingsに適した階層構造を持つデータセットを準備できました。収集には「FootballGEIST」*5を利用しています。具体的には、J1リーグ全18チームそれぞれの歴代所属選手のページからデータを収集し、gensimの実装に渡せる形式にpandasで加工しました。

Poincaré Embeddingsの学習

パッケージのインポートをします。ここでplotlyのバージョンが3以上だと可視化の際にエラーが出ます*6

from gensim.models.poincare import PoincareModel
from gensim.viz.poincare import poincare_2d_visualization
from IPython import display
from plotly.offline import init_notebook_mode, iplot
import pandas as pd
 
init_notebook_mode(connected=True)

環境に入っているバージョンを確認し、必要ならば2.7.0辺りのバージョンを入れておきます。

# import plotly
# plotly.__version__
# '2.7.0'

!pip install plotly==2.7.0

先の節で用意したデータセットを用いて、Poincaré Embeddingsの学習を実行します。今回の場合、epochsは2000回程度で十分なようでした。

model = PoincareModel(train_data, size=2, negative=8)
model.train(epochs=5000)

次のコードでplotlyでの可視化を実行できます。show_node_labelsにはラベルを付ける項目を指定します。

relations_set = set(train_data)
figure_title = ''
iplot(poincare_2d_visualization(
    model,
    relations_set,
    figure_title,
    num_nodes=0,
    show_node_labels=['浦和レッズ'] + urawa
))

可視化の結果は次の通りです。チーム名が中心に来て、円周側に選手が配置されています。 gensimの実装では正則化の影響で周囲にノードが集結しすぎないような工夫がなされているため、ある程度の数のノードが中心付近に残っている模様です*7

f:id:upura:20190901021328p:plain

浦和レッズ所属経験のある選手にラベルを付与したところ、大半は右下に固まりました。興味深いのは、チーム名としての「浦和レッズ」の近くに「サンフレッチェ広島」が配置されている点です。森脇・柏木・槙野・西川・闘莉王など、サンフレッチェ広島から浦和レッズに移籍した選手の影響ではないかと推察しています。

次の図では、インタラクティブにデータを閲覧できます。

ちなみに、次のtwitterの投稿の際は学習が不十分だった模様です。


活用方法

個々のベクトルの値は、次のような形で参照できます。

model.kv['浦和レッズ']
array([ 0.64337554, -0.49962734])

得られたベクトルの活用方法としては、例えば一定の括りで少数派に当たるデータをまとめ上げる、類似するデータを検索するなどの方法が考えられます。Kaggleなど教師あり学習の文脈では、カテゴリ変数の粒度が粗い場合などに、活用の余地があり得るかなと思いました。

おわりに

本記事では、Poincaré Embeddings でJ1リーグのチーム・選手を可視化しました。実装はNotebook形式でGitHubにて公開しています*8