[PR]当サイトはアフィリエイト広告を利用しています。
前回はトマトの尻腐れ症を決定木で分類してみました。
今回は分類方法を決定木ではなくSVM(Support Vector Machine)で分類していきます。
決定木はそれぞれの変数を右か左かで分けていきますけど、SVMは変数空間全体を滑らかに分類していくので、かゆいところに手が届くイメージですね。今回は非線形分類器を用います。
参考にしたのは以下。
オーレリアン・ジュロン.(2020). 『scikit-learn、Keras、TensorFlowによる実践機械学習 第2版』. 下田倫大・長尾高弘(訳). 株式会社オーム社.
SVMに関する情報はネット上に色々あるので割愛します。
前回同様以下のような情報を扱います。
日照時間 | 活力剤 | 初期に化成 | 発症 |
7 | 0 | 1 | Onset |
7 | 1 | 1 | Safe |
5 | 0 | 0 | Safe |
これを分類するプログラムが以下。
pandas v1.2.0
Copyright (c) 2008-2021 the pandas development team.
Released under the BSD 3-Clause License
Package overview — pandas 2.2.3 documentation
scikit-learn v0.24.0
Copyright (c) 2007 - 2020 scikit-learn developers.
Released under the BSD 3-Clause License
scikit-learn/COPYING at main · scikit-learn/scikit-learnscikit-learn: machine learning in Python. Contribute to scikit-learn/scikit-learn development by creating an account on ...
import pandas as pd
from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler
df = pd.read_csv('illness.csv')
xcol = ['日照時間','活力剤','初期に化成']
x = df[xcol]
t = df['発症']
sc_model_X = StandardScaler()
sc_model_X.fit(x)
sc_x = sc_model_X.transform(x)
clf = SVC(kernel='rbf', C=10, gamma=0.1)
clf.fit(sc_x, t)
data1 = [[7, 1, 0]]
test_x = sc_model_X.transform(data1)
print(clf.predict(test_x))
print(clf.score(sc_x,t))
前回と違うのは標準化でStandardScaler()を使うところと、RBFカーネルを使うことくらいですかね。
SVMはスケールの影響を受けやすいので、変数のスケールが今回のように日照で7くらいの大きな値を使っているのに、他の変数は1くらいの小さな値だとうまく分類できません。ちゃんと標準化する必要があります。
コードの骨組みは前回を参考にしてください。
今回も日照7時間、リキダス散布、初期に化成なしで分類してみます。
出力は以下。
[‘Safe’]
1.0
スコアが1.0なので入力データは矛盾なくすべて分類できています。
前回も思いましたが、やっぱり最初に化成をバッサバッサとまかなければ大丈夫だったんでしょうねえ。
来年は植え付け初期で大きくなるか不安だからと肥料をやりすぎず、隠し味にリキダスをまくことにします。
このシリーズはまだ続きます。
次回もご覧いただければ幸いです。