51
53

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

はじめに

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コードなのでちょこっとルールをいじりたいというときに変更が容易なのもメリットかと思います。

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

51
53
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
51
53

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?