はじめに
先日、子豚の有無を判別する学習モデルをランダムフォレストで作成しましたが、ほかの分類アルゴリズムも教科書に掲載されていたので、それぞれの分類アルゴリズムを使って精度を比較してみようと思いました。
比較するモデル
・サポートベクタマシン model_svc
・決定木 model_tree
・ランダムフォレスト model_forest
事前準備
同じデータを使って3種類のモデルを作成して、それぞれの結果を出力させます。
使用している画像やフォルダ構成についてはこちらの記事を参照してください。
それぞれのモデルを作成
from sklearn.svm import SVC
model_svc = SVC()
model_svc.fit(X_train, y_train)
from sklearn.tree import DecisionTreeClassifier
model_tree = DecisionTreeClassifier(max_depth=3)
model_tree.fit(X_train, y_train)
from sklearn.ensemble import RandomForestClassifier
model_forest = RandomForestClassifier(random_state=123)
model_forest.fit(X_train, y_train)
それぞれのモデルでテストデータを検証
in
from sklearn.metrics import classification_report
pred_svc = model_svc.predict(X_test)
print(classification_report(y_test, pred_svc))
pred_tree = model_tree.predict(X_test)
print(classification_report(y_test, pred_tree))
pred_forest = model_forest.predict(X_test)
print(classification_report(y_test, pred_forest))
out
precision recall f1-score support
0 0.84 0.59 0.70 54
1 0.67 0.88 0.76 51
accuracy 0.73 105
macro avg 0.76 0.74 0.73 105
weighted avg 0.76 0.73 0.73 105
precision recall f1-score support
0 0.67 0.85 0.75 54
1 0.78 0.55 0.64 51
accuracy 0.70 105
macro avg 0.72 0.70 0.70 105
weighted avg 0.72 0.70 0.70 105
precision recall f1-score support
0 0.88 0.81 0.85 54
1 0.82 0.88 0.85 51
accuracy 0.85 105
macro avg 0.85 0.85 0.85 105
weighted avg 0.85 0.85 0.85 105
確認結果
項目 | サポートベクタマシン | 決定木 | ランダムフォレスト |
---|---|---|---|
子豚なし(0)の適合率 | 0.84 | 0.67 | 0.88 |
子豚なし(0)の再現率 | 0.59 | 0.85 | 0.81 |
子豚あり(1)の適合率 | 0.67 | 0.78 | 0.82 |
子豚あり(1)の再現率 | 0.88 | 0.55 | 0.88 |
概ね予想通りでしたが、このような結果になりました。
子豚のあり・なしの単純な2値分類ですが、子豚検知には写真を使っていて、案外複雑な画像認識のような気もするので、ランダムフォレストのようなアンサンブル学習の精度が良くなるのかなと思いましたか。