tsurutanのつぶやき

備忘録としてつぶやきます

ランダムフォレスト(機械学習)による文章分類

前置き

今回はランダムフォレストという手法で機械学習を行い文章の分類を行おうと思います。

例えばこのような生物医療に使われるデータベースがあったとします。

name of enzyme

alkaline phosphatases

comment

Comparison with alkaline phosphatases and 5-nucleotidase

name of enzyme酵素の名前で comment はその酵素についてのコメントです。 このようなデータベースを普通使うことはないと思うのですが、とりあえずこちらを使います。

想像してみてください。

あなたは生物学者です。

あなたは研究で扱った酵素について一つ一つコメントをつけ、データベースに保存していました。

しかし、ある日不運なことに一部酵素の名前データーが破損してしまいました。

この時、あなたは酵素とコメントがセットになっているデータとコメントのみのデータを持っています。

そこであなたは紛失してしまった酵素の名前をコメントを元に復元したいと考えました。

そこで扱うのが機械学習ランダムフォレストです。

機械にコメントと酵素の名前を学習させて、その後コメントから酵素の名前を予測してもらいましょう。

ツール

機械学習するためのツールを準備します。 使用する言語はpythonで、ライブラリーとして gensimsklearn を使用します

gensim

これはのちに説明するのですが、特徴ベクトルを作成するために使います。
特徴ベクトルとは機械がコメントを学習できるようにするために数値のベクトルで表されたものです。

sklearn

このライブラリーは機械学習などを行うために必要となるモジュールが豊富に含まれているものです。
今回はsklearnのランダムフォレストを使って学習を行います。

これらのライブラリーは pip install gensim pip install sklearnでインストールすることができます。とても簡単ですね!

それではまず、コメントから重要そうな単語を取り出します。

from gensim import corpora
import mysql

mysql = mysql.MySql()
words = []
for line in mysql.read_medtag():
    words.append(line["comment"].split(" "))

dictionary = corpora.Dictionary(words)
dictionary.filter_extremes(no_below=3, no_above=0.3)
dictionary.save_as_text('dict.txt')

このコードで何をしているか説明すると、

mysql = mysql.MySql()
words = []
for line in mysql.read_medtag():
    words.append(line["comment"].split(" "))

ここでデータベースからコメントを読み込み、スペースを区切りに文章を単語に分解して words という配列に格納していきます。

そして残りのコード

dictionary = corpora.Dictionary(words)
dictionary.filter_extremes(no_below=3, no_above=0.3)
dictionary.save_as_text('dict.txt')

では特徴語を作成し、dict.txt に保存しておきます。テキストに保存することで再度データベースを呼び出すことがなく、学習時間が節約できます。特にデータベースが大きいときには有効です。 corpora とはgensim に含まれているクラスでこちらを使い特徴語の辞書を作成します。 dictionary.filter_extremes(no_below=3, no_above=0.3) では特徴語として相応しくない単語を除いております。 no_below で指定された数値より下回る頻度で出現した単語は特徴語としてみなされず、また逆に no_above で書かれた割合より多く出現している単語は除かれます。ただ単に出現頻度が高い単語を特徴後とするのはあまり良い考えではないからです。(I He などの単語は出現頻度は高いが重要ではない)

少し長くなってしまったので、次回にランダムフォレストの実装について説明しようと思います。