今回は機械学習の話。
トマトの尻腐れ症の発症を予測してみようという話です。
入力データは日照、活力剤、初期に化成の3項目。
結果は発症(Onset)と未発症(Safe)として、
これを機械学習で学習させ、発症か未発症かを予測してみようという話となります。
参考にしたのは以下。
須藤秋良(2020)『スッキリわかる Pythonによる機械学習入門』株式会社インプレス
以下こうなった経緯です。
私は家庭菜園をやっているのですが、今年はトマトに尻腐れ症が発生してしまいました。
カルシウム不足が原因なのですが、日当たりの違う二か所の畑で症状の出方が違いました。
日当たりの多かった畑でのみ発症していたのです。
カルシウムはトマトの成長でも消費されるので、おそらく日照の多さが原因で成長しすぎてカルシウム不足になったと思われます。
またこちらの畑は植え付け初期に心配になって肥料をたくさんまいた畑でもありました。
それも成長しすぎに寄与したと思われます。
カルシウム不足にはカルシウムを与えるのが重要です。
そこでリキダスという活力剤を与えました。
今のところ症状は収まってきた感じです。
以上の経緯から変数には日照(7時間と5時間)、活力剤(散布なら1、なしなら0)、初期に化成(与えたなら1、与えないなら0)を採用します。
今回は機械学習の分類の問題として、分類方法に決定木を用います。
入力データは以下となります(illness.csv)。
日照時間 | 活力剤 | 初期に化成 | 発症 |
7 | 0 | 1 | Onset |
7 | 1 | 1 | Safe |
5 | 0 | 0 | Safe |
初期に化成が1で活力剤も1というデータは一応こうなるんじゃないかという仮定のデータです。
実際には初期に化成を与えて最初から活力剤を散布しているデータはないのですが、途中から活力剤を与えて症状が止まったので、最初から与えたらたぶん症状の発症はなかったのではないかという予想の元、このようなデータを作りました。
機械学習のプログラムは以下。
pandas v1.2.0
Copyright (c) 2008-2021 the pandas development team.
Released under the BSD 3-Clause License
https://pandas.pydata.org/pandas-docs/stable/getting_started/overview.html
scikit-learn v0.24.0
Copyright (c) 2007 - 2020 scikit-learn developers.
Released under the BSD 3-Clause License
https://github.com/scikit-learn/scikit-learn/blob/main/COPYING
import pandas as pd
df = pd.read_csv('illness.csv')
from sklearn import tree
model = tree.DecisionTreeClassifier(max_depth = 2, random_state = 0)
xcol = ['日照時間','活力剤','初期に化成']
x = df[xcol]
t = df['発症']
model.fit(x, t)
print(model.score(x,t))
data1 = [[7, 1, 0]]
print(model.predict(data1))
出力は以下。
1.0
[‘Safe’]
分類の成績は1.0。つまり入力データは矛盾なくすべて分類できているということです。
[‘Safe’]と出たので[7, 1, 0]という入力データに対しては発症しないということです。
つまり日当たりの良い畑でリキダスを散布して初期に肥料をあげすぎなければ発症しないという予測をしています。
求める結果が出たのでまあまあ満足です。
機械学習は今あるデータでなんとなく予測するときに便利ですね。
実験計画法とかだと手法で決められたパターンのデータをすべて集めないと実験できない可能性が高いので、その点では便利です。
その分元のデータの分布が偏ったりするので予想精度に影響が出たりするんでしょうけど。
ただ機械学習に学習させなくてもデータを表で眺めたり、実際にリキダスを与えたりした結果からリキダスの効果はわかったので、機械学習をしなくても来年からは肥料を与えすぎないで最初からリキダスを使えばよいくらいのことはわかります。
ただしたくさんデータがあってそれをあまり考えずに分類したいというときに一つの指針となるくらいの効果はある···かも。
次回もこのテーマが続く予定です。