Deep Learning Tutorial

chainer and python

5章  クラス分類:悪い回答を判別する

本書では37GBのデータをダウンロードするなどと言っていますが、サイズデカすぎです。
なので、今回は"unix.stackexchange.com"のデータだけを使用することにします。

データダウンロード

ダウンロードしたデータを回答するとPost.xmlというファイルが出てくる。
これしか使わないので他のファイルは捨てる。
付属のコードを少し変える。
so_xml_to_tsv.py
Post.xmlをpost.xmlに名前を変更して、so_xml_to_tsv.pyのファイルがある同じディレクトリの中で実行する。

処理が終わると、"filtered.tsv"、"filtered-meta.json"というファイルが生成される。

>>> cat filtered.tsv | wc -l
206384

これだけでも20万個ほどのデータがある。


特徴量をtsvデータから読み取る。
"filtered.tsv"ファイルは
Id, ParentId, IsAccepted, TimeToAnswer, Score, Text, NumTextTokens, NumCodeLines, LinkCount, NumImages
という順でデータが入っている。(区切り文字は”¥t”)


特徴量には、テキストトークンの数・行数・写真の数・"("の数・クオーテーションの数・"!"の数を使用する。
正解ラベルでは、スコアが0以上ならば良い回答、0より下なら悪い回答とする。

f = open("BMLS/ch05/filtered.tsv", "r")

CSV_LINES = 252953
array = []
y = []

for i in range(CSV_LINES):
    try:
        Id, ParentId, IsAccepted, TimeToAnswer, Score, Text, NumTextTokens, NumCodeLines, LinkCount, NumImages  = f.readline().split('\t')
        num_parentheses = Text.count("(")
        num_quotation = Text.count('"')
        num_exclaim = Text.count("!")
        array.append([int(NumTextTokens), int(NumCodeLines), int(NumImages), num_parentheses, num_quotation, num_exclaim])
        if int(Score) >= 0:
            y.append(0)
        else:
            y.append(1)
    except:
        continue


scikit-learnに入れる値はnumpy配列でなければならないので、以下のコードを入れる。

X = np.array(array)
y = np.array(y)

あとは、いつも通りに便利なモジュールを使用し、データを分けてロジスティック回帰!

from sklearn.cross_validation import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.6, random_state=0)

model = linear_model.LogisticRegression(C=0.1)
model.fit(X_train, y_train)


ここで正解率とAUCを見てみましょう。

正解率 :  0.979916176079
AUC   :  0.667390169039

おそらくほぼ全てを良い回答と分類しているのでしょう笑
今回のデータセットは不均衡データでしたのでもう少し考えなければいけません...
いつかやることにしましょう笑