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