EPG's BLOG

某金融会社の社内SE。気になったことをちょいちょい書いていきます

データ分析のコンペ/コンテスト一覧

データサイエンティストとして活躍する人たちの一部は、
データサイエンスやデータ分析のコンペで成績を残しているらしい。

そもそもどういったコンペやコンテストがあるのか自分も知らなかったので、まとめてみた。
※まだ記載のないコンペがあれば、ご連絡いただければと思います。

1.Kaggle

【サイト】
Kaggle: The Home of Data Science

【内容】
様々な企業・団体とコラボして、実世界のデータに基づいた分析コンテストを実施。
分析コンペといえば、まずはココが話に挙がるぐらい、有名。
日本語での紹介ページも多い。
ビッグデータを世界の天才たちが紐解くKaggle | Kazuyo Nakatani's Blog
Kaggle - making data science a sport - - TopCoderの学習のお時間 - TopCoder部

2.CrowdAnalytix

【サイト】
CrowdANALYTIX:Cloud-based, crowd-sourced analytics service for professional services firms

【内容】
企業から依頼を受け、分析コンテストを実施。
現在は、2つのコンペが開催中。
日本語でのブログ紹介はなさそう。。。

3.TunedIT

【サイト】
TunedIT - Data mining & machine learning data sets, algorithms, challenges

【内容】
こちらも企業等から依頼を受けて、分析コンテストを実施している模様。
ただし、2012年を最後にコンペの更新がなく、現在はコンペゼロ。。。

4.TopCoder

【サイト】
topcoder

【内容】
世界中のプログラマが参加するプログラミングコンテストを主催。
現在は、データ分析のコンペも開催。

5.InnoCentive

【サイト】
Innovation Management | Crowdsourcing | Challenges | Competitions

【内容】
研究開発テーマを提示し、一般ユーザにアイデアや方法を募集。
その一部として、分析テーマが存在。
「Challenge Center」にて、テーマを確認可能。
※左側の「All Challenge Disciplines」にて、「Math/Statistics」を選択すれば、良いかも。。。

6.OPT DataScienceLab

【サイト】
サイエンティスト ビッグデータ活用ならオプトDSL

【内容】
株式会社オプトが運営するクラウドソーシングサービス。
まだサービスが開始して間もない(?)のか、コンペ数は少ない。
コンペ一覧検索 ビッグデータ活用ならオプトDSL

7.経営化学系研究部会連合協議会 -データ解析コンペティション-

【サイト】
ホーム - 経営科学系研究部会連合協議会―データ解析コンペティション事務局

【内容】
POSデータのような取引データや、生活者の意識を調査したアンケートデータを対象とした分析コンペ。
平成6年から毎年実施されている。

8.データサイエンス・アドベンチャー

【サイト】
データサイエンス・アドベンチャー杯

【内容】
JST(科学技術振興機構)が主催するコンペ。
国のデータサイエンティスト養成の一環のように思える。
2013年からこのコンペ開始されており、JST科学技術データが分析対象。

9.INSIGHT SIGNAL マーケティング分析コンテスト

【サイト】
INSIGHT SIGNAL(インサイトシグナル) | マーケティング分析コンテスト2013 | 概要

【内容】
NRI(野村総合研究所)が主催するマーケティング分析コンテストで、2007年より開始。
シングルソースデータ(※)が対象。
(※)企業の広告や販売促進などの「マーケティング活動」と、消費者が購入に至るまでのステップである「消費行動のプロセス」とを、同一の被験者で調査したデータ。

データサイエンス講義 4章「スパムフィルタ、単純ベイズ、データランプリング」 その2

前回に引き続き、ベイズについて。

データサイエンス講義

データサイエンス講義

4.2.3 複数の単語を組み合わせたスパムフィルタ

メールに対応するベクトルをxとし、スパムであることをcとした場合、以下の様に示すことができる。
{
p(x|c) = \prod_{j}({\theta_{jc}}^{x_j} \times (1-{\theta_{jc}}^{(1-x_j)}))
}

θ(jc):単語jのスパムメールにおける算出割合
{x_j}:ベクトルxのj番目の単語が存在する場合に「1」、存在しない場合に「0」

確率の積を扱う際、対数にて表示するのが一般的であるため、両辺の対数をとる。

{
log(p(x|c)) = \sum_{j}(x_j \times w_j) + w_0
}

{w_j = log(\theta_j/(1-\theta_j))}
{w_0 = \sum_{j}log(1-\theta_j)}


ここから、ベイズの法則を利用。以下、再掲。
{p(c|x) = p(x|c) \times p(c)/p(x)}

p(x|c)は事前確率分布、p(c|x)は事後確率分布。

p(c)やp(x)は、容易に算出可能。
また、p(x|c)については、算出するθjは事前に算出できることから、比較的容易に計算可能。

4.3 ラプラススムージング

ラプラススムージング:事前分布を仮定し、最尤推定を行っているのと同じ。

ラプラススムージングに入る前に。
スパムメール中の単語θjの値のベクトルは、どのようなθでデータDが最尤になるか、以下の式で求める。
{\theta_{ML} = argmax_{\theta}p(D|\theta)}

単語の独立性を仮定した際、以下の式が最大となるθjを算出する。
{log(\theta_j^{n_{js}}(1-\theta_j)^{n_{jc}-n_{js}})}

{n_{js}}:ある単語がスパムメールに出てくる回数
{n_{jc}}:ある単語が全メールに出てくる回数

最大を求める際、上式を微分し、0となるθjを算出すると、以下。
{\hat{\theta_j} = n_{js}/n_{jc}}

次に、最大事後確率(Maximum a posteriori)を求める。
事前分布を用いて、以下のように表すことができる。
{\theta_{MAP} = argmaxp(\theta|D)}

ここでの事前分布p(θ)は、{\theta^{\alpha}(1-\theta)^{\beta}}と仮定する。
そうすると、以下の式が算出される。

{\hat{\theta_{jc}} = (n_{js} + \alpha)/(n_{jc} + \beta)}


■参考になるページ(学術的)
単純ベイズ(ナイーブベイズ)をより簡単に(?)説明した資料。
ラプラススムージングについて、少し分かりやすいかも。
http://mtml.info/post/28232319862/naivebayes

データサイエンス講義 4章「スパムフィルタ、単純ベイズ、データランプリング」

前回までは、「見たままモード」により作成しておりましたが、今回から「はてな記法モード」に変更いたしました。
理由は、細かい数式をプレーンテキストで書くと、訳が分からなくなってしまったため(笑)

さて、今回はスパムフィルタを対象とし、ベイズについて。

データサイエンス講義

データサイエンス講義

4.1.1 なぜ線形回帰でスパムフィルタを構築できないのか

■前提環境
データセット、行列の各行:各電子メールに対応
特徴(feature):各単語
(e.g.) [バイアグラ, ミーティング] = [0, 1]
トレーニングデータ:スパムかどうかのラベル付けされたデータ

■線形回帰にて構築できない2つの理由
1.判定結果は、「0(スパムでない)」か「1(スパムである)」の2値。
⇒線形回帰は、連続型が対象。
⇒これが一番大きな理由。
2.説明変数が多すぎる。
⇒特徴となる単語は数十万と存在。
⇒頻度の高い単語を抽出し、特徴となる単語を減らすことは可能(可逆計算可能)。
⇒しかし、1の理由により不可。


4.1.2 k近傍法でスパムフィルタを構築できるのか

k近傍法については、過去のブログを参照。
データサイエンス講義 3章「アルゴリズム」 その2 - EPG's BLOG


結果は、構築は非常に難しい。
※前提環境は、4.1.1に記載した環境と同じ。

■なぜk近傍法にて構築は難しいのか
1.計算量が膨大
⇒先ほどと同様、特徴空間が高次元すぎる(単語量の問題)。
2.最近傍な点の距離が非常に遠い(「次元の呪い(The curse of dimensionality)」)
⇒こちらも高次元すぎるため。

4.2 ベイズの法則

ベイズの法則は、以下。
p(y|x)p(x) = p(x,y) = p(x|y)p(y)

p(x):イベントxが発生する確率
p(x,y):イベントx,yが発生する確率
p(x|y):イベントyが発生した条件下で、イベントxが発生する確率

説明するための例は、以下。
■例
人口の1%が感染している疾患の検査。
検査では、以下の特徴がある。
・感染している患者の99%が陰性を示す。
・健康な患者の99%が検査で陰性を示す。

人口が10,000人とした場合、以下の様な樹形図が作成できる。
f:id:EPG:20141113223928p:plain

この例の場合、陽性と判断された場合に感染している確率は、
P(感染|陽性)
= P(陽性|感染)P(感染)/P(陽性)
= 0.99*0.01/(0.99*0.01+0.01*0.99)
= 0.50
である。つまり、陽性と判断された場合、50%の確率で感染している。

4.2.2 1つの単語に対するスパムフィルタ

1つの単語(word)に対して、スパムフィルタを作成する際にベイズの法則を使う場合、以下のように算出。

P(スパム|word) = P(word|スパム)P(スパム)/P(word)
P(スパム|word):wordが出現した場合、そのメールがスパムメールである確率

P(word|スパム), P(スパム), P(word)については、サンプルとして抽出したデータ群から算出可能。


■参考になるページ(学術的)
ベイズの定理については、以下のスライドが良いかと。
具体例も有。
http://www.fml.t.u-tokyo.ac.jp/~izumi/WS/Bays_basic.pdf


■参考になるページ(コーディング)
はてなブログにおいて、texを用いて数式表現。
はてなブログで数式を表示する方法。または、tex記法でLaTexを記述する方法。 - Pythonで学ぶ金融工学

データサイエンス講義 3章「アルゴリズム」 その5

今回は、k平均法のコーディングについて。

データサイエンス講義

データサイエンス講義

 

 

■演習
【対象】
2次元正規分布に従う3つのデータセットを用意し、k平均法により、正しく分類されるか確認。
※k=3とする。

 

【コーディング】

# # # # # # # # # # # # # # # # # # # #

#k平均法によるクラスタリング
library("MASS")

#ラベル1(RED)のデータ作成
mu1 <- c(1.5,0)
Sigma1 <- matrix(c(0.5,0,0,0.5),2,2)
datanum1 <- 200
dat1 <- mvrnorm(datanum1,mu1,Sigma1)

#ラベル2(BLUE)のデータ作成
mu2 <- c(0,1.5)
Sigma2 <- matrix(c(0.5,0,0,0.5),2,2)
datanum2 <- datanum1
dat2 <- mvrnorm(datanum2,mu2,Sigma2)

#ラベル3(GREEN)のデータ作成
mu3 <- c(1.5,1.5)
Sigma3 <- matrix(c(0.5,0,0,0.5),2,2)
datanum3 <- datanum1
dat3 <- mvrnorm(datanum3,mu3,Sigma3)

#データ結合
datatest <- rbind(dat1,dat2,dat3)
#正解ラベルを付加
label <- factor(c(rep("RED",200),rep("BLUE",200),rep("GREEN",200)))
datatest <- cbind(datatest,label)

#3つのラベルがあると知った上で、k平均法を実行
(datakluster <- kmeans(x=datatest,centers=3))
#正解ラベルとクラスタリング結果の比較
table(datakluster$cluster,label)

plot(x=datatest, col=datakluster$cluster,pch=datakluster$cluster)

# # # # # # # # # # # # # # # # # # # #

 

k平均法でクラスタリングした結果は以下。
横が正しいラベル、縦がクラスタリング結果。

label
BLUE GREEN RED
1 1 9 186
2 15 176 13
3 184 15 1

 

この結果から、(184+176+188)/600 * 100 = 91.3%の精度があることを確認。
また、各データをプロットすると、以下のようになる。

f:id:EPG:20141111180006p:plain

■参考になるページ(コーディング)
k平均法のRでの方法が記載。

【#R言語】k-means(K平均法)を使った非階層型クラスタリングの実行 #統計学 #機械学習 - Qiita

データサイエンス講義 3章「アルゴリズム」 その4

今回は、k平均法。
※次回、Rでのコードを掲載し、3章を終了予定。 

データサイエンス講義

データサイエンス講義

 

3.2.2 k平均法

■概要
データをあるまとまり毎にクラスタリングすること。

 

■教師なし学習
線形回帰やk-nn法では、XとYの関係、及びデータとそのラベリングに基づき、Yの推定やラベル推定を実施(いわゆる教師あり学習)。
k平均法は、そのような正解データは存在しない(教師なし学習)。

 

アルゴリズム
1.d次元空間にて、k個の任意の点を重心として選択。ただし、互いに異なる点であること。
※ここでのkは、まとまりをいくつ作成するか。

2.各データに、どの重心が最も近いか割り当て。

3.割り当てたデータ群の平均位置を重心として更新する。

4.割り当ての変更がなくなる、もしくはほとんどなくなるまで、2-3を繰り返す。

 

■問題点
・収束の問題。2つの解を行き来する状態が発生する可能性有。
クラスタリング結果の解釈はあくまでも人間。解釈に窮する結果も存在。


■参考になるページ(学術的)
以下のページは、ビジュアル的にアルゴリズムが理解できる。オススメ。

クラスタリングの定番アルゴリズム「K-means法」をビジュアライズしてみた - てっく煮ブログ

k平均法以外のクラスタリングについて、説明。

クラスタリング (クラスター分析)

データサイエンス講義 3章「アルゴリズム」 その3

今回はk近傍法のコーディングについて。

データサイエンス講義

データサイエンス講義

 

 

3.2.2 k近傍法

■演習
こちらと全く同じことをする。

レベル1のR、その2 – RでK-NNパッケージを使ってみる - | OKEREKE-RL

 

【対象】
2次元正規分布を2種類作成し、トレーニングデータとテストデータに分類。
テストデータが正しく分類されるか測定。

 

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 

#2種類のラベルが付与されたトレーニングデータを用意。
#k-nn法により、テストデータ分類
#対象:2次元正規乱数
# # ラベル1:平均(1,0)、分散は0.5(共分散は0)
# # ラベル2:平均(0,1)、分散は0.5(共分散は0)

#knn法を利用するために読み込む
library(class)
#多次元正規乱数作成に利用するために読み込む
library(MASS)

#ラベル1のデータ作成
mu1 <- c(1,0)
Sigma1 <- matrix(c(0.5,0,0,0.5),2,2)
datanum1 <- 200
dat1 <- mvrnorm(datanum1,mu1,Sigma1)

#ラベル2のデータ作成
mu2 <- c(0,1)
Sigma2 <- matrix(c(0.5,0,0,0.5),2,2)
datanum2 <- datanum1
dat2 <- mvrnorm(datanum2,mu2,Sigma2)

#作成したデータのプロット
#xlim,ylimにて、表示スケールを調整
plot(dat1,col="red",xlim=c(-2,3),ylim=c(-2,3))
#作成したグラフに上書きするおまじない
par(new = TRUE)
points(dat2,col="blue")

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 

以下のようなデータプロットが出力。

f:id:EPG:20141107220100p:plain

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 

#トレーニングデータ(データ数は100)
trainnum <- 100
train <- rbind(dat1[1:trainnum,],dat2[1:trainnum,])
#テストデータ
test <- rbind(dat1[(trainnum+1):datanum1,],dat2[(trainnum+1):datanum2,])

#ラベル付け
label <- factor(c(rep("red",100),rep("blue",100)))

#kの値を設定
k <- 1

#knn法
train_result <- knn(train,test,label,k,prob=TRUE)
#結果集計
(cross<-table(train_result,label))
#評価指標は、再現率を利用
(rate<-(cross[1,1]+cross[2,2])/( (datanum1-100)*2) )

#最適な評価指標となるkを算出
for(i in 2:50){
train_resulttmp <- knn(train,test,label,i,prob=TRUE)
crosstmp<-table(train_resulttmp,label)
ratetmp<-(crosstmp[1,1]+crosstmp[2,2])/((datanum1-100)*2)

#最適のkが更新された場合にkの値と評価指標を算出。
if(rate<ratetmp){
k<-i
cross<-crosstmp
rate<-ratetmp
cat("i:", i, " \trate:",ratetmp,"\n")
}
}

#最適化したkについて、分類結果を出力

cross

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 

今回は、k=14の場合が最適。結果更新の過程は以下。

i: 3 rate: 0.82
i: 5 rate: 0.83
i: 6 rate: 0.835
i: 8 rate: 0.84
i: 13 rate: 0.85
i: 14 rate: 0.855

 

k=14の時の分類結果は以下。

label
train_resulttmp blue red
blue 83 12
red 17 88

 

■参考にしたページ(コーディング)
knn法を実行するknn関数の引数等について。

さいごの碧: k-近傍法のRコード

http://cran.r-project.org/web/packages/class/class.pdf

 

plot関数、軸スケールの変更方法。

http://cse.naro.affrc.go.jp/takezawa/r-tips/r/48.html

 

多次元正規乱数を作成するmvrnorm関数について。

R: Simulate from a Multivariate Normal Distribution

 

クロス集計表の作成。

F.1.11. クロス集計表 | R Financial & Marketing Library

 

変数と文字を混合して表示させるcat関数。

http://cse.naro.affrc.go.jp/takezawa/r-tips/r/35.html

データサイエンス講義 3章「アルゴリズム」 その2

前回は線形回帰の話でしたが、今回はk近傍法について。

データサイエンス講義

データサイエンス講義

 

 

3.2.2 k近傍法

通称k-NN(k-Nearest Neighbors)。
あらかじめ分類/ラベル付けされたオブジェクト群から、分類/ラベル付けされていないオブジェクトを自動的に分類/ラベル付けするためのアルゴリズム

 

■線形回帰ではできないのか
閾値」を利用すれば可能。
しかし、以下の問題が存在。
閾値をどう決めるか。
(e.g.) 従属変数の値が500以上ならラベル「高」を付与。
・元々のデータに定性ラベルが付与されている場合(離散データの場合)にどうするか。具体的にはどう定性ラベルを定量化し、閾値を定めるか。
(e.g.) 好きな政党として、ラベル「自民党」、「民主党」、「公明党」etc.の離散データ


■k-NNの直感的説明
属性が最も似ている他の項目を考慮し、そのラベルを見て多数決で付与するラベルを決定。
kとは、多数決に利用するデータ数と考えて良い。


■k-NNの自動化のために
1.類似度の定義が必要。
2.いくつの近傍を取り出せば良いか。kの設定。


■k-NNのアルゴリズム
1. 類似度/距離指標を決定
- 変数は、同じスケールにする必要有。要正規化。
(e.g.) 変数1はおおよそ1-10の範囲であるが、変数2はおおよそ1,000-10,000の範囲である場合は、変数1,2共に0-1の範囲に正規化する。
- 類似度としては、以下がよく利用される。
ユークリッド距離
・コサイン類似度
・Jaccard距離
・マハラノビス距離
・ハミング距離
・マンハッタン距離

 

2. ラベル付けされたデータを用意し、トレーニングデータとテストデータに分類

 

3. 評価指標を選択
- 誤分類率を利用することが多い
- 再現率(全テストデータの中で、どれだけ正しく分類できたか)
- 適合率(分類できたデータの中で、どれだけ正しく分類できたか)

 

4. kを変更して評価指標を確認

 

5. 評価指標が最高になるkを選択

 

6. 同じトレーニングデータを使い、ラベルを予測したい新テストデータを作成。


■k-NNの前提
・kをヒューリスティックに定める必要がある。
・特定の「距離」を定義する必要がある。
・トレーニングデータは2カテゴリ以上に分類されている必要がある。

 

■演習(コーディング)
次回掲載予定。


■参考にできそうなページ(学術的)
上手くまとめられたスライド。

はじめてのパターン認識 第5章 k最近傍法(k_nn法)