EnsekiTT Blog

EnsekiTTが書くブログです。

「おっぱい」とつぶやいていたら本当にエンジニアなのか決定木に確かめてもらった話(準備編)

つまりなにしたの?

Twitterのリストを2種類突っ込むと直近のツイートを引っ張ってきて、形態素解析から名詞を抽出して、2種類のリストを分類できる決定木を作ってみた。
f:id:ensekitt:20171006233030j:plain
*1

ことの始まり


これを読んでこう思った
ので、実際にやってみた。

ざっくりとした解説

決定木とCART法について

決定木自体は気のような構造で意思決定だったり決断する事そのものを指すので、どんな方法で実現するかは様々。
Scikit-learnでは最適化されたCART法を使っているみたい。
最近はなにかと高度な分類があるけど、やはりメリットはなんでこんな分析結果になったのか人が理解できる形で提示できること。
(分析結果に至る過程が理解できるだけで直感に反した分析結果に対して理論的裏付けを与えるものではない。
逆に画像解析だと、このピクセルが〜〜だからみたいな話になって直感的に理解しにくい。向き不向きですね。

目的変数と説明変数

目的変数は予測したい変数。
たとえば「このツイッタラーはエンジニアかどうか」として
説明変数は目的変数を説明する変数。
たとえば「RT・リプライを除く直近N件のツイートに『何らかの技術用語』が何件あるか」
みたいな感じ。

ジニ多様性指標

目的変数を最もうまく分類しているかどうかの基準として今回はジニ多様性指標を使った。
目的変数がエンジニアと非エンジニアの2値を取るとする。
説明変数A,B,Cがそれぞれ1,2の2つの値を取るとする。
目的変数がエンジニアのグループと非エンジニアのグループのそれぞれについて、生起確率をP(A1)、P(A2)とする。
上記に基づいて、
ジニ多様性指標=1-( P(A1)2+ P(A2)2)
って式になる。

構文解析

文字列を形態素に切り分けて、さらにその間の関連(修飾-被修飾など)とか、統語論的(構文論的)な関係を解析すること。
今回はツイートから特定の品詞を切り抜くのに使った。

問題設定

f:id:ensekitt:20171006233448j:plain*2
今回は
普通に決定木を作ったときのジニ多様性係数が最も大きいものが本当に「おっぱい」なのか
もしくは最も大きくなくても「おっぱい」によるエンジニア、非エンジニアの識別は可能なのか。
を検証した。

今回の目的変数

このツイッタラーはエンジニアかどうか。

データセット

僕がフォローしてる方から鍵ではないアクティブなツイッタラーを選ぶ。
アクティブの定義は5000ツイート以上していて、半年以内に1000ツイート以上してる方とする。
アクティブなツイッタラーからエンジニアと非エンジニアをnアカウント*3ずつ選ぶ。
(せめてn=50のつもり)
真にエンジニアかは知らない人もいるけど、プロフィールやツイートから僕が判断する。*4
100アカウントのリプライ以外のツイートを過去500ツイートを抽出する。
いらん文字とか、表記ゆれが起きがちな表現を多少マシにする
構文解析器にかけて名詞を抽出し、ベクトルにする。
ここで、ベクトルは、Wordに対応する結構次元数の多いスパースなベクトルになって、
発言していたらそのWordに対応するところが1インクリメントされる。ってことにしてみた。
これをデータセットとする。
(自然言語処理とかに明るくないのでこの辺正しいのか怪しいです。コメントいただけるとうれしいです。)

評価

今回の評価は識別能力の良し悪しではなく、何がこの2つの集団を分かつのかを知ること。
今回のやり方だと識別能力は多分低い。

作業

エンジニアリストと非エンジニアリストをいま必死こいて作ってる。
僕がフォローしてる方々エンジニア多いわ。

次回に続く

見切り発車しちゃったけどちゃんとできるか不安。

*1:unsplash.com

*2:unsplash.com

*3:作成中

*4:これが可視化されてる可能性もある