u++の備忘録

【Mac, 2018】Go実行環境の構築 (goenv, vscode)

環境

Go実行環境の構築

goenv

brew install goenv

.zshrc の設定

# goenv
export PATH="$HOME/.goenv/bin:$PATH"
eval "$(goenv init -)"

# go
export GOPATH=$HOME/.go
PATH=$PATH:$GOPATH/bin

設定反映

source ~/.zshrc

Goのインストール

インストール可能なバージョン確認

goenv install -l

インストールと設定

goenv install 1.10.0
goenv global 1.10.0

設定確認

goenv versions

Visual Studio Code の設定

拡張機能「Go」を設定

Hello Worldをするべく、hello.go を作成して以下をコピペ。

package main

import "fmt"

func main() {
  fmt.Printf("Hello world\n")
}

以下が推奨されたので、インストールしておく。

Installing 10 tools at /Users/xxxxxxxxxxxxxx/go/bin
  gocode
  gopkgs
  go-outline
  go-symbols
  guru
  gorename
  dlv
  godef
  goreturns
  golint

Installing github.com/mdempsky/gocode SUCCEEDED
Installing github.com/uudashr/gopkgs/cmd/gopkgs SUCCEEDED
Installing github.com/ramya-rao-a/go-outline SUCCEEDED
Installing github.com/acroca/go-symbols SUCCEEDED
Installing golang.org/x/tools/cmd/guru SUCCEEDED
Installing golang.org/x/tools/cmd/gorename SUCCEEDED
Installing github.com/derekparker/delve/cmd/dlv SUCCEEDED
Installing github.com/rogpeppe/godef SUCCEEDED
Installing github.com/sqs/goreturns SUCCEEDED
Installing golang.org/x/lint/golint SUCCEEDED

All tools successfully installed. You're ready to Go :).

実行

go run hello.go
Hello world

f:id:upura:20181118175458p:plain

【論文メモ】不均衡データの「頑健な」クラスタリングによる教師なしの異常検知

RDEC: Integrating Regularization into Deep Embedded Clustering for Imbalanced Datasets

f:id:upura:20181118153018p:plain

論文リンク

proceedings.mlr.press

プレスリリース

東芝:ニュースリリース (2018-11-14):教師なしで少量の不良品データを高精度に分類する深層学習技術を開発

著者/所属機関

Yaling Tao, Kentaro Takagi, Kouta Nakata / TOSHIBA

媒体

Proceedings of The 10th Asian Conference on Machine Learning, PMLR 95:49-64, 2018.

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

  • 実アプリケーションで一般的に発生する不均衡なデータの問題に焦点を絞った研究はほとんどなかった

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

  • ネットワーク正則化手法「virtual adversarial training (VAT)」と、クラスタリング手法「deep embedding clustering (DEC)」を統合

virtual adversarial training (VAT)

musyoku.github.io

提案手法(以下VAT)は、予測分布p(y∣x)を最も狂わすノイズr{v−adv}を計算により求め、p(y∣x+r{v−adv})をp(y∣x)に近づけることでモデルの頑健性を高める手法です。

データxから求まる予測分布p(y∣x,θ)と、ノイズrを加えたデータx+rから求まる予測分布p(y∣x+r,θ)に対し、両者のKL距離を最小化します。

qiita.com

各学習データ周辺における事後確率の分布を滑らかにすることでネットワークの汎化性能を向上させる手法です。Virtual Adversarial TrainingはAdversarial Trainingから派生した手法で、学習データの正解ラベルから計算した損失の代わりに事後確率同士の距離から計算した損失を用いることでラベルなしのデータも学習に活用する事ができます。

deep embedding clustering (DEC)

shunk031.me

高次元で規模の大きいデータセットに対しても効率的にクラスタリングできるよう特徴量を学習する

論文内での指摘

but it is sometimes sensitive to the initial location of centroids, especially in the case of imbalanced data, where the minor class has less chance to be assigned a good centroid.

  • RDECは、VATによる正規化を導入して、データの局所性に対するモデルの堅牢性を保証
  • VATは元の空間上で似ているデータを潜在空間上で近づけ、少数クラスのデータをまとめて分類を容易にする

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

  • 均衡データ・不均衡データの両方でState-of-the-artのパフォーマンスを達成

議論はある?

VATや各ハイパーパラメータの効果を検証している

次に読むべき論文は?

virtual adversarial training (VAT)

[1507.00677] Distributional Smoothing with Virtual Adversarial Training

deep embedding clustering (DEC)

[1511.06335] Unsupervised Deep Embedding for Clustering Analysis

GitHub

github.com

【論文メモ】非専門家向けの調査に基づく、インタラクティブな機械学習ツールの設計

Grounding Interactive Machine Learning Tool Design in How Non-Experts Actually Build Models

  • Machine Learning (ML)の「非専門家」が実際にMLソリューションを構築する方法を調査
  • 非専門家特有の可能性と、陥りやすい落とし穴が明らかになった
    • 例えば、accuracyがパフォーマンスの単一の尺度として認識され、問題あるモデルがデプロイされた
  • 調査結果から、初心者向けのMLツールを設計する上では簡便性だけでなくロバスト性も同様に重要な目標だと示唆された
  • 非専門家がロバスト性のあるソリューションを容易に構築できるよう促すための設計理論を作成した

f:id:upura:20181117231650p:plain

論文リンク

https://www.microsoft.com/en-us/research/publication/grounding-interactive-machine-learning-tool-design-non-experts-actually-build-models/

著者/所属機関

Qian Yang, Jina Suh, Nan-Chen Chen, Gonzalo Ramos

媒体

Proceeding of the 2018 Designing of Interactive Systems Conference

投稿日付

June 2018

所感

Twitterでおすすめされていたのを見かけて読んでみました。

機械学習の非専門家に対する調査を実施し、陥りやすいミスを特定
→ そのミスに対応するための設計理論を提唱

という流れで、プロジェクトを進める上でのお手本のような論文でした。

論文の前半では調査から得られた知見として「非専門家あるある」がまとめられています。

例えばFigure 2では、非専門家が機械学習を過度にブラックボックスだと捉え「入力Xがあれば、機械学習が出力Yを返す」以上の理解をしていない場合があると指摘しています。

f:id:upura:20181117232946p:plain

ノイズや欠損値の処理や特徴量エンジニアリング、アルゴリズム選定などの試行錯誤を疎かにし、またaccuracyを単一のパフォーマンス評価指標と捉えてしまう点などに言及があります。(Figure 3)

f:id:upura:20181117233753p:plain

確かに、既存の機械学習ツールは利便性が上昇している一方で「裏側で何が起きているか意識しない」という弊害を生んでいるようにも思います。本研究では「初心者向けのMLツールを設計する上では簡便性だけでなくロバスト性も同様に大切」とし、ロバスト性のあるソリューションを容易に構築できるような、インタラクティブな設計理論が提唱されました。

ここでいう「ロバスト性」というのは、Figure 4(b)に示すように

専門家が(ある程度当然に)実施している機械学習のモデル構築の流れを補助してあげることで、偶然の結果ではなく再現性ある結果として評価しよう

という意味だと捉えています。

如何にして機械学習を世に広めていくか考えられており、非常にMicrosoftらしい論文だと思いました。

GitHub

github.com

Rを用いて般若心経を感情分析してみた

はじめに

本記事は、hiro.is(@youjo_DS)さんの以下のブログを読んで着想を得ました。

loveshome.hatenablog.jp

感情分析とは

感情分析とは、その名の通り単語や文章内の「感情」を分析する手法です。事前に単語ごとに[-1, 1]で感情に値を付けた辞書を用意しておきます。値が正に大きいほどポジティブ、負に大きいほどネガティブな感情を意味します。文章の場合は単純に足し合わせで「文章としての値」を算出しているようです。

 head(dic)
#        V1       V2     V3       V4
#1   優れる すぐれる   動詞 1.000000
#2     良い     よい 形容詞 0.999995
#3     喜ぶ よろこぶ   動詞 0.999979
#4   褒める   ほめる   動詞 0.999979
#5 めでたい めでたい 形容詞 0.999645
#6     賢い かしこい 形容詞 0.999486

上記の例は、下記の記事から引用しました。

qiita.com

Rのパッケージ

下記のスライドを読んで SentimentAnalysis パッケージで、英語ならば文単位の感情分析が可能だと知りました。

www.slideshare.net

パッケージの詳細は下記の記事が詳しかったです。

https://cran.r-project.org/web/packages/SentimentAnalysis/vignettes/SentimentAnalysis.html

般若心経を感情分析

いくつかの題材で感情分析を実施した結果、「般若心経」で興味深い結果が得られました。

般若心経 - Wikipedia

データの準備

SentimentAnalysis パッケージでは日本語を扱えないため、英語訳を利用します。「heart sutra japanese」でグーグル検索して一番上に来たサイトから英語訳を利用しました。文章が長い場合には、適宜2文以上に分割しています。

www.holymtn.com

documents <- c(
  "When Avalokitesvara Bodhisattva is practising the profound Prajna-paramita.", 
  "He sees and illuminates to the emptiness of the five skandhas", 
  "Thus attains deliverance from all suffering.", 
  "Sariputra, matter is not different from emptiness",
  "Emptiness is not different from matter.",
  "Matter is emptiness and emptiness is matter.",
  "So too are sensation, recognition, volition and consciousness.",
  "Sariputra, the emptiness character of all dharmas, neither arises nor ceases, is neither pure nor impure, and neither increases nor decreases.",
  "Therefore, in emptiness: there is no matter, no sensation, recognition, volition or consciousness, no eye, ear, nose, tongue, body, or mind, no sight, sound, scent, taste, tangibles, or dharma, no field of the eye up to no field of mental consciousness, no suffering, no cause of suffering, no ending of suffering, and no path, no wisdom and also no attainment.",
  "Because there is nothing obtainable.",
  "Bodhisattvas through the reliance on Prajna-paramita have no attachment and hindrance in their minds.",
  "Because there is no more attachment and hindrance.",
  "There is no more fear.",
  "Far away from erroneous views and wishful-thinking, Ultimately : The Final Nirvana.",
  "Therefore, realize that Prajna-paramita is the great wondrous mantra, the great radiant mantra, the unsurpassed mantra, and the unequalled mantra.",
  "It can eradicate all suffering, and It is genuine and not false.",
  "Therefore, utter the Prajna-paramita mantra.",
  "Chant: Gate Gate Paragate Parasamgate Bodhisvaha!"
)

分析結果

以下のように、感情分析を実行できます。

library("SentimentAnalysis")

# Analyze sentiment
sentiment <- analyzeSentiment(documents)

# Extract dictionary-based sentiment according to the QDAP dictionary
sentiment$SentimentQDAP
 [1]  0.20000000  0.00000000 -0.25000000 -0.25000000 -0.33333333 -0.50000000  0.25000000
 [8] -0.07692308 -0.03030303  0.50000000 -0.16666667 -0.50000000 -1.00000000 -0.12500000
[15]  0.38461538 -0.20000000 -0.25000000  0.00000000

ネガティブな文、ニュートラルな文、ポジティブな文がそれぞれ8、5、5個ありました。

table(convertToDirection(sentiment$SentimentGI))
negative  neutral positive 
       8        5        5 

文を時系列順に並び替えた結果をプロットしてみます。

plot(sentiment$SentimentQDAP, type="l")

f:id:upura:20181024062842p:plain

感情の起伏が起承転結に対応していることが読み取れます。お経と言うと一般に「単調」「つまらない」みたいな印象がありますが、感情分析を実行してみると振れが激しい文章だと分かりました。

おわりに

今回は、Rを用いて般若心経を感情分析してみた結果を共有しました。般若心経は感情の起伏が起承転結に対応しており、じっくり読んでみると意外と趣深い文章です。分量も少ないですし、本記事で少しでも興味を持った方は、ぜひご一読してみてください。検索すると現代語訳もたくさん出てきます。

Rスクリプトは下記で公開しています。

github.com

また般若心経はじめ仏教については、下記の本がおすすめです。

http://amzn.asia/d/1ccc1Xmamzn.asia

第74回R勉強会@東京 (#TokyoR) にて「Soccer × Attribution Analysis」の題目で発表しました

本日開催された「第74回R勉強会@東京 (#TokyoR) 」にて「Soccer × Attribution Analysis」の題目でLTをしました。

tokyor.connpass.com


発表内容

概要

マーケティング分析の手法である「アトリビューション分析」を、趣味のサッカーに適用する話です。

課題と目的

f:id:upura:20181105204021p:plain

サッカーでは一般にゴールを取る人が目立つ傾向にありますが、ゴールに至る過程も同様に大切です。いわゆる「いぶし銀」の活躍をする選手も合わせて評価する仕組みを作りたいと考えました。

f:id:upura:20181105204041p:plain
f:id:upura:20181105204100p:plain

手法

そこで、全過程を考慮し評価するマーケティングの手法「アトリビューション分析」を用います。詳細は下記リンクなどをご参照ください。

アトリビューション分析 | リンクル【公式】 | 優秀賞受賞リスティング代理店

ケーススタディ

f:id:upura:20181105204109p:plain

DAZNで再生して、浦和レッズのゴールシーン4試合8ゴール分についてデータセットを作成しました。以下のような形式でデータを保持しています。

"森脇 > 興梠 > 興梠 > 宇賀神 > 槙野 > 柏木 > 宇賀神 > 青木 > 武藤"

「興梠 > 興梠」となっている箇所は、「興梠選手がパスを受け取ってドリブルをした」という意味です。

library(ChannelAttribution)

# ヒューリスティックモデルを推定
H = heuristic_models(Data, 'path', 'total_conversions')

# マルコフ連鎖モデルを推定
M = markov_model(Data, 'path', 'total_conversions', out_more = TRUE)

data.frameを作成し、Rの ChannelAttribution パッケージに突っ込みました。
CRAN - Package ChannelAttribution

結果と考察

f:id:upura:20181105204133p:plain
f:id:upura:20181105204137p:plain
f:id:upura:20181110123314p:plain
f:id:upura:20181105204143p:plain

全過程を考慮し評価する「線形モデル」や「マルコフ連鎖モデル」において、「終点モデル」や「起点モデル」であまり目立たなかった宇賀神選手、長澤選手、青木選手の貢献度が高くなっていると分かります。彼らは「点に直接は関与しなくても中盤で奮闘している選手」であり、ある程度定性的に妥当性ある結果が得られていると思います。

f:id:upura:20181105204158p:plain

マルコフ連鎖モデルでは、数式に基づいた応用的な議論の可能性も秘めています。例えば特定の選手が欠場した場合に「代わりに誰を入れることでゴール数を極力減らさないようにできるか」など、数字に基づいた検討が可能です。

f:id:upura:20181105204210p:plain

ちなみに、ChannelAttribution パッケージでは手軽に推移確率行列を出力できます。

結論

f:id:upura:20181105204208p:plain

今回の内容に利用したRスクリプトは下記です。

github.com

所感

TokyoRは初めて参加しましたが、よい塩梅で新規参加者も多く、過度に内輪になっていない非常に良いコミュニティだと感じました。

Rの日本コミュニティについては、特に下記スライドを気に入ってよく読んでいました。この発表をした Yutaniさん とも懇親会でお話できて、有意義な時間を過ごすことができました。

自分のLTについても、Twitterや懇親会でお褒めの言葉を預かり光栄でした。また機会があれば、積極的に外部発表をしていきたいと思います。

AtCoderのレートが1000になりました

昨日のABC113に参加し、A〜Cの3完でレートが1018になりました。

f:id:upura:20181105124332p:plain
https://beta.atcoder.jp/users/upura

競技プログラミングを始めた当初、記事では明示していませんでしたがレート1000が一つの目標だったので、ひとまず嬉しいです。

upura.hatenablog.com

本記事では、上の記事〜現在までにやったことを簡単にまとめておきます。

やったこと

AtCoderのコンテストに参加

  • やはり定期的にコンテストに参加して、実践で学んでいくのが自分の性に合っている気がします。
  • コンテストに出て、分からなかった問題を復習することで少しずつ勉強しています。

言語をC++からPython3に変更

  • 最初の数回のコンテストはC++で出ていましたが、業務やKaggleで使い慣れたPython3の方が思考をコードに落としやすいと考えました。
  • とはいえ、ある程度のレベルまで行ったらC++の方が使いやすいタイミングが来る気もしています。

蟻本

book.mynavi.jp

  • 一時期kindle版が約1500円になっていた(定価の半額)ので購入しました。
  • 隙間時間にチマチマ読んでいます。

過去問

f:id:upura:20181105154704p:plain

おわりに

  • 昨日のABCのC問題など、思考停止で実装するとTLE(実行時間超過)になりかねない問題について、計算量を考慮して設計できるようになったのは大きな成長だと思います。
  • 競プロは単純に頭の体操としても面白いですし、思考力・実装力の面でタメになることも多いのでボチボチ続けていきたいです。
  • まずは水色を目指して、今後も精進していく所存です。

はてなブログの読者が100人になりました

本日、はてなブログの読者が100人になりました。

2016年9月24日に雑記帳として始めた弊ブログですが、最近はありがたいことに勉強会などでお会いした方に「ブログ見てます」とお声がけいただく機会も増えてきました。約2年をかけて、読者100人に到達した計算になります。

f:id:upura:20181025213456p:plain

実際に読者数の推移を10人単位で計測し、可視化した結果を上に示しました。

開設1年以上経過した2017年11月末に読者10人に到達し、20人になったのは2018年5月です。そこから徐々に加速度を高めて、このたび100人を超える結果となりました。

f:id:upura:20181025214036p:plain

ブログを書いていて良かったこと

文章力の研鑽

まず挙げられるのは、定期的な記事執筆による文章力の研鑽です。

弊ブログは約2年続けており、本記事で222記事目となるので、単純計算で3、4日に一度記事を書いていることになります。大学の研究室にいる時はあまり認知していませんでしたが「自分の頭で考えて分かりやすい文章を書く」という能力は思った以上に重要な能力だと感じています。

この能力は明確な到達点があるわけではないので、これからも継続的に記事を執筆して、文章力の研鑽を図っていきたいです。

自分の「ポートフォリオ」に

私は有名なIT企業に勤めているわけではありませんし、大学院で博士号を取得しているわけでもありません。だからこそ特に、記事執筆を通じて「自分の興味・関心がどこにあるのか」「自分が何をできるのか」を発信していることに価値があると感じています。

少しイキリツイートになってしまいますが、次の気持ちを忘れずに日々邁進していきたいです。


おわりに|Googleで「u++」と検索してみると・・・

思えば1年以上前、次のようなツイートをしていました。

さて、シークレットモードで先ほど「u++」と検索してみた結果は以下の通りです。「だから何」という話ですが、Googleにコンテンツとして評価されるのは嬉しいですね。(特にSEO対策の類いのことはしていません)

今後とも、よろしくお願いいたします。

f:id:upura:20181025220058p:plain