u++の備忘録

【書評】『前処理大全』はNot Awesomeな局所解に気付かせてくれる本

前処理大全[データ分析のためのSQL/R/Python実践テクニック]

  • 本橋智光 著,株式会社ホクソエム 監修
  • 定価(本体3,000円+税)
  • 技術評論社

gihyo.jp

どんな本?

データサイエンスの現場で遭遇する様々なトピック(抽出・集約・結合など)を題材に、R・PythonSQLを用いた実装方法を紹介。「Not Awesome」な不適切なコードを理由とともに提示した後、「Awesome」な可読性の高く処理量の少ないコードを掲載している。

所感

実例を通じて、「Not Awesome」なコードを書いてしまっていた自分に気付ける本。

例えばPython/Pandasでの条件付き抽出に関して、インターネットで調べると以下のようなコードが多く出てくる。

Not Awesome

import pandas as pd
df = pd.read_csv("data.csv")

df = df[df["id"]=="hogehoge"]

しかし、このコードは下記の点などでAwesomeとは言えない。

  • dfが入れ子になっていて可読性が低い
  • dfの名前が変わった際には3箇所も変更する必要がある

Awesomeなコードとしては、下記のようなものが提示されている。

Awesome

df.query('id=="hogehoge"', inplace=True)
  • .queryを使うことで、可読性を高めている
  • inplace=Trueを与えることで、dfの回数も1回のみにしている

このような実例を通じて「動いているから良いや」で済ましていた事案を知ることができ、局所解からの脱却を促してくれる本になっている。寝られない時にザッと読み通したが分量は多いので、サラッと読んでおいて辞書的に使うのも良いかもしれない。

【論文メモ】新聞記事における政治家の発言の引用記述と議会会議録との対応関係の調査 ―フェイクニュース検出に向けて―

論文名

新聞記事における政治家の発言の引用記述と議会会議録との対応関係の調査 ―フェイクニュース検出に向けて―

どんなもの?

フェイクニュースの検出に関して、例えば「○○議員が××と発言した」というニュースの真偽を判断するためには、一次情報である議会会議録などを用いて○○議員の実際の発言を調査すればよい。本研究では、新聞記事で引用されている箇所をどのように探せばよいか検討するため、地方議会会議録コーパスを利用し、会議録の発言がどのように新聞記事に記述されているかを明らかにする。具体的には、日経電子版の記事から「豊洲問題」に関する記事 67 点を収集し、そのうち発言文 (会議録要約文) が載る 32 点の記事から 150 の対応関係を抽出し、分析を行った。引用箇所の約95%はBoWなどの語句レベルの一致により推定できると示唆された。

先行研究と比べてどこがすごい?

我々は,従来から,全国の自治体の地方議会会議録を収集・整理する手法を確立し,「地方議会会議録コーパス」の構築を進めてきた

技術や手法のキモはどこ?

特になし。

どうやって有効だと検証した?

特になし。

議論はある?

対応箇所を自動的に推定する難しさの観点から、32記事における 150 文を以下のように分類した。

  1. 新聞記事の引用箇所と都議会会議録の発言箇所の表現が完全に一致する.
  2. 新聞記事の引用箇所と都議会会議録の発言箇所の表現がほぼ一致する.
    • (2a) 一致しない箇所は,敬語を常態語 (普通語)に直していたり,敬体を常体に直している.
    • (2b) 一致しない箇所は,助詞,接続詞,形式名詞などの実質的な意味を表さない語句を言い換えている.
    • (2c) (2a) と (2b) に当てはまらない,実質的な意味を表す語句を言い換えている.
  3. 新聞記事の引用箇所と都議会会議録の発言箇所の表現が大きく異なる.

(1) は語句が連続しているかどうかの問題はあるが、引用箇所に該当する表現が全て発言箇所に存在しており、exact match により推定できると考えられる。(1) は最も簡単に対応関係を推定できる場合であり、調査対象の 22.7%(34/150 文)を占めた。

(2) は、引用箇所をBag of Words(BoW)として表現することで対応関係が推定できそうなものである。

(3) は、対応関係にある箇所全体の意味を考慮しなくてはならず、語句レベルの対応関係を超えているため最も難しい推定となる。しかしながら(3) は調査対象の 5.3%(8/150文)と少なかった。

次に読むべき論文は?

特になし。検出に向けた続報が出たら読みたい。

【論文メモ】Embedding-based News Recommendation for Millions of Users

論文名

Embedding-based News Recommendation for Millions of Users

どんなもの?

end-to-endの方法で分散表現を使用する埋め込みベースのニュース推薦手法の提案

  • オートエンコーダのノイズ除去の変形に基づく分散表現から
  • ブラウジング履歴を入力としたRNNモデルでユーザ表現を生成し
  • システム性能を考慮した内積操作に基づいて、各ユーザの記事を照合して一覧表示する

先行研究と比べてどこがすごい?

  • コラボレーティブフィルタリングや低ランク分解などのIDベースの手法はよく知られているが、候補の記事は短期間で期限切れになり新しい記事に置き換えられるため、ニュースの推薦には適していない
  • 単語ベースのアプローチは、システム性能の面で優れた候補であるが、同義語・表記ゆれ・固有名詞といったユーザ固有の特徴をどう扱うかなど、いくつかの課題がある
  • 本論文では、埋め込みベースのアプローチで、従来より高い性能を示すモデルを作成した

技術や手法のキモはどこ?

RNNモデルを採用することで、ブラウジング履歴から各ユーザの特徴を表現し、高精度の推薦を可能にした

どうやって有効だと検証した?

  • 過去のアクセスデータを用いたオフライン評価において良好な性能を示した
  • CTRと合計期間は、単語ベースのアプローチと比較して個別に23%と10%向上
  • 提案された方法を組み込んだサービスは、すでにすべてのユーザーに公開されており、1日に1,000万人以上のUUに推薦され、毎月数十億のアクセスが行われている

議論はある?

ニュース以外の分野(広告)などにも推薦技術を応用していきたい

次に読むべき論文は?

NULL

Summary: Chapter 1 introduction | Introduction to Algorithmic Marketing

upura.hatenablog.com

1.1 Algorithmic Marketingの概要

Algorithmic Marketingとは、データに基づく手法や経済理論を用いて、「マーケティングの4P」モデルを自動化・効率化する考え方である。

マーケティングの4P」モデルは「マーケティング・ミックス」とも呼ばれ、ある特定の製品を販売するために使用される四つのマーケティング要素の組み合わせのことである。

  • Product
  • Promotion
  • Price
  • Place

1.2 Algorithmic Marketingの定義

f:id:upura:20180319130929p:plain

本書ではAlgorithmic Marketingを「ビジネス上の目標に基づいてマーケティング・プロセスが自動で定まる枠組み」と定義する。ビジネス上の目標を反映する形でマーケティング・システムが構築され、そのシステムから導かれた施策を展開する。その施策の結果はシステムにフィードバックされる。

1.3 歴史的背景

Algorithmic Marketingは、従来のマーケティング手法と明確に違うものではない。従来の数々の成功事例に共通して存在するパターンや特徴を取り出して、一般化されたシステムにまで落とし込むのがAlgorithmic Marketingの考え方である。伝統的な経済理論モデルやデータサイエンスなどは、Algorithmic Marketingの考え方におけるマーケティング・システムの構築に重要な要素となる。

1.4 Programmatic Servicesの構築

f:id:upura:20180319134521p:plain

マーケティングの4P」モデルは抽象的な概念であるが、Algorithmic Marketingの考え方では、より具体的にマーケティング・システムを設計することになる。上図では「Programmatic Services」と冠して、三つの目的とそれぞれ二つずつのServiceに分解している。本書ではこの後、これらのサービスについて具体的に取り上げていく。

1.5 本書の想定読者

本書の想定読者は、発展的なマーケティング・システムの構築方法を学びたいと考える全ての人々である。読者には、統計・微積分・プログラミングの初歩的な知識があると想定している。

1.6 まとめ

  • Algorithmic Marketingを「ビジネス上の目標に基づいてマーケティング・プロセスが自動で定まる枠組み」と定義する
  • Programmatic Servicesは、三つの目的とそれぞれ二つずつのServiceで構成される

東大・松尾研の社会人向けデータサイエンティスト育成講座を修了した

昨年11月から受講していた、東大の社会人向けデータサイエンティスト育成講座を修了しました。

東京大学グローバル消費インテリジェンス寄付講座:第2期 Data Science Online Course
http://gci.t.u-tokyo.ac.jp/dsonline/

講座の概要

講座のHPより抜粋。

・大量のデータを自由自在に解析・分析し、隠れた関係性を発見する。そんなスキルを身につけた「データサイエンティスト」に対する需要は、工学分野だけならず、医療・経済・経営・ライフサイエンスなど非常に多くの分野で高まる一方です。
・本コースでは、あらゆる分野で武器になるデータの解析・分析スキルのコアとなる機械学習およびビッグデータを扱う技術、分析結果を効果的に可視化する技術の基盤を網羅的に身につけ、一人前のデータサイエンティストとして活躍する入り口に立つことを目指します。

受講の仕組み

  • 全14回の講義+最終課題の構成
  • 毎週月曜日に講義資料が公開され、各自が講義資料を読んで各回の課題に取り組む
    • 締切:公開から1週間
    • 受講時間の目安:1回4時間(実際は最大でも1時間程度しかかかりませんでした)
  • 受講料無料、定員120人(エントリーシートGithub・ブログなどで選抜)
    • 今回は約800人の応募があったそうです
  • ブラウザ上からアクセス可能なフルスタックのLinux+Python開発環境が提供されました

カリキュラム

第1回(11/6):データサイエンティスト講座概要とPythonの基礎
第2回(11/13): Numpy、Scipy、Pandas、Matplotlibの基礎
第3回(11/20):記述統計学と単回帰分析
第4回(11/27):確率と統計の基礎
第5回(12/4): Pythonによる科学計算の基礎(NumpyとScipy)
第6回(12/11): Pandasを使ったデータ加工処理
第7回(12/18): Matplotlibを使ったデータ可視化
第8回(12/25):データベースとSQLの基礎
第9回(1/8): データベースの応用(高度なSQL処理と高速化)
第11回(1/15):機械学習の基礎(教師あり学習)
第12回(1/22): 機械学習の基礎(教師なし学習)
第13回(1/29): モデルの検証方法とチューニング方法
第10回(2/5):ドキュメント型DB(MongoDB)
第14回(2/12): データサイエンスティスト中級者への道
※ 都合により第10回が後ろ倒しに

感想

既にPythonを用いたデータ分析経験が多少あったので、学習内容自体はそこまで難易度は高くありませんでした。ただし独学で断片的な知識になってしまっている面もあったので、体系的な知見を蓄積できたという点で、学ぶべきことが多かったと思っています。講義内容が非公開なので、あまり具体的なことには言及できませんが、業務の合間を縫って無事に修了できて良かったです。

決定株分類器のPython実装

『イラストで学ぶ機械学習』のp.93-96を読み、p.96のMATLABサンプルコードを参考に、Pythonで実装した。

bookclub.kodansha.co.jp

f:id:upura:20180304161928p:plain

# -*- coding: utf-8 -*-

import numpy as np
import matplotlib.pyplot as plt

CLASS_NUM = 2
N = 50
np.random.seed(seed = 32)
x = np.random.randn(N, CLASS_NUM)
y = 2 * (x[:,0] > x[:,1]) - 1

if __name__ == "__main__":
    d = int(np.ceil(np.random.rand() * CLASS_NUM)) - 1
    xs = np.sort(x[:,d])
    xi = np.argsort(x[:,d])
    el = np.cumsum(y[xi])
    eu = np.cumsum(y[xi[::-1]])
    e = eu[(N-1):0:-1] - el[:(N-1)]
    ei = int(np.max(np.abs(e)))
    c = np.mean(xs[ei:(ei+1)])
    
    if d == 0:
        X0 = np.linspace(-3, 3, N)
        Y0 = X0*0 + c
    else:
        Y0 = np.linspace(-3, 3, N)
        X0 = X0*0 + c        

    plt.xlim(-3, 3)
    plt.ylim(-3, 3)
    plt.plot(x[y==1,0], x[y==1,1], 'bo')
    plt.plot(x[y==-1,0], x[y==-1,1], 'rx')
    plt.plot(X0, Y0, "k-") 
    plt.show()

「ぜん息の子どもと親の負担を減らす」クラウドファンディングに寄付した

先日、朝日新聞デジタルで下記の記事を見かけた。

www.asahi.com

小児ぜん息を持ち、アトピーにも苦しめられた幼少期を送っていた者として、何かの縁だと思い、ちょっとした寄付をした。

しょうもない額(3000円)だったのだが、個人単位で対応している丁寧な返信メールを頂き、今日領収書が届いた。クラウドファンディングも目標達成したらしい。

ほんの飲み会代くらいだが、僕が今健全に楽しくお酒を飲めるのも幼少期の医療のおかげなので、感謝しかない。なんか偽善っぽい投稿だけど、まあ良いか。

f:id:upura:20180303174941p:plain

f:id:upura:20180303175023j:plain