Help us understand the problem. What is going on with this article?

scikit-learnの決定木/ランダムフォレストのルールからPythonコードを生成

More than 3 years have passed since last update.

はじめに

Pythonで機械学習といえばscikit-learnですが、scikit-learnを使うにはnumpyやscipyといった大きめのライブラリを入れる必要があります。でも、プログラムでほんのちょこっとだけ機械学習のモデルを使って分類したいって場合だと、わざわざそういう重いもの入れたくないなーと思うときがあります。scikit-learnで学習したものをnumpy, scipy, scikit-learnなしに使って分類処理ができたらなーって。

そこで今回はscikit-learnの決定木 (DecisionTreeClassifier) やRandom forest (RandomForestClassifier) からif-then形式のコードを生成するものを紹介します。

コード

特徴量のデータを入れるとクラス番号を返す関数のコードを作ります。
このコードでは各分岐点ごとにサンプル数が付記されているので、どこが重要かわかるようになってます。
ちなみにこれはstackoverflowにあったコードを参考に書きました。

irisのデータを学習した決定木からはこんな感じのコードが生成されます。

def f(sepal_length=0, sepal_width=0, petal_length=0, petal_width=0):
    """
    0 -> setosa
    1 -> versicolor
    2 -> virginica
    """
    if petal_width <= 0.800000011921:  # samples=150
        return 0  # samples=50
    else:
        if petal_width <= 1.75:  # samples=100
            if petal_length <= 4.94999980927:  # samples=54
                if petal_width <= 1.65000009537:  # samples=48
                    return 1  # samples=47
                else:
                    return 2  # samples=1
            else:
                if petal_width <= 1.54999995232:  # samples=6
                    return 2  # samples=3
                else:
                    if petal_length <= 5.44999980927:  # samples=3
                        return 1  # samples=2
                    else:
                        return 2  # samples=1
        else:
            if petal_length <= 4.85000038147:  # samples=46
                if sepal_length <= 5.94999980927:  # samples=3
                    return 1  # samples=1
                else:
                    return 2  # samples=2
            else:
                return 2  # samples=43

参考用ノートブック

ランダムフォレストの場合は、複数の木からコード生成したり多数決処理を書いたりする必要があるので、ちょっと手間がかかります。

おわりに

scikit-learnの決定木やランダムフォレストのルールから分類用Pythonコードを生成するものを紹介しました。これによっていちいちscikit-learnなどのライブラリからモデルを読み込まずに直接分類処理ができるようになります。そのため、numpy, scipy, scikit-learnのインストールが不要になります。また、普通のPythonコードなのでちょこっとルールをいじりたいというときに変更が容易なのもメリットかと思います。

ただし、コード生成に限った話ではありませんが、特徴量が多い場合だと決定木の中身を出力をすると大変複雑なことになりがちなので使い方には気を付けましょう。

yukinoi
自然言語処理とかPythonについて書きます。
http://ikegami-yukino.github.io
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away