はじめに
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コードなのでちょこっとルールをいじりたいというときに変更が容易なのもメリットかと思います。
ただし、コード生成に限った話ではありませんが、特徴量が多い場合だと決定木の中身を出力をすると大変複雑なことになりがちなので使い方には気を付けましょう。