AIを作ってみよう:消費予測(4/6) までの記事で、AIを作り中身の解説をしてきました。
実行してみた結果はどうだったでしょうか。それほど正確ではなかったと思います。それは、プログラムもデータも簡単なものにしているからです。
ではAIの結果を良くする=精度を上げるにはどうしたらいいでしょうか。
方法はいくつかあります。この記事では、統計的機械学習の精度を改善していく方法をお教えします。
改善方法1:アルゴリズムの実行比較
今回AIのアルゴリズムとして実行したのはSVR(SupportVectorRegression)というものでした。今回の課題が教師あり学習でかつ数値予測が必要だったからです。
しかし教師あり学習で数値予測をするアルゴリズムは、他にもあります。どれが良いのかは実際のところ実行してみないと分かりません。各理論を知っていればある程度の想像はできますが、結果を出してみるのが一番なのです。
教師あり学習で数値予測ができるアルゴリズム例
アルゴリズム名 | プログラムでの置き換え方 |
---|---|
SVR | mymodel = SVR() |
SGDRegressor | mymodel = linear_model.SGDRegressor() |
LinearRegression | mymodel = linear_model.LinearRegression() |
LASSO | mymodel = linear_model.Lasso() |
詳しい理論の解説はここではしませんが、このようにプログラムの1行を置き換えるだけで学習・予測を実行することができます。試してみてください。
開発現場でも、全てを実行して最も良い結果を出すアルゴリズムを選ぶ、という実装をしています。
改善方法2:学習データの増量
今回の学習データは1ヶ月分でした。
これを6ヶ月、1年分と増やしていくほど、AIの結果は正確になっていきます。学習データが多いほど、AIは色々なケースを含んだ平均値を覚えることができるからです。
ただし、データが多いほど学習時間が長くなります。
ページの最後に、データを増やしたサンプルを貼っています。試してみてください。
改善方法3:データの要素を増やす
今回の学習・予測データは、「天気」と「お酒の消費量」という要素を使いました。でもお酒の消費量が関係するのは天気だけでしょうか。恐らく気温も関係しますね。気付かない他の要因もあるかもしれません。
例えば、「天気」だけでなく「天気、気温、雨量、日照時間、気圧、風速、湿度」を一度に学習することもできます。この場合、AIは自動的に一番影響する要素というものを見出します。そして強く影響する要素を使い予測を行います。
このあたりが統計的機械学習の真骨頂ではないでしょうか。一度に色んな要素を学習して相関性を見出す=同時に多次元で分析する、というのは人間にはできません。人間は3次元が精一杯です。
データの要素を増やすと、読み込むプログラムも改修が必要です。また、計算時間は前項の単純な増量よりももっと長くなります。
ページの最後に、このあたりを拡張したデータとプログラムを掲載しますので試してみてください。
参考:データの標準化
もう一つAIの精度を上げる方法がありますが、既にプログラムに反映しているので「参考」としました。
ちょっと難しくなりますが、データの数値を「標準化」するという方法です。
例えば、気温はだいたい-20~+50(度)という値の範囲ですね。一方、日照時間は0~24(時間)という値です。AIがこれらの値を使う時、意味あいを知らず数値として見るだけなので、このままだと的外れな計算をします。
同じ度合いの数値として扱えるよう全てのデータを-1~1の間の数字に押し込め、変化量だけに注目できるようにする、というのが標準化です。
これは既にプログラムに反映しています。この部分です。
精度向上のためにこういったテクニックもあります。
改善プログラム
それでは、上記の1.2.3.を全て反映したプログラムを貼ります。同じように実行を試してみてください。分析するデータの要素も行数も増えたので、実行には時間がかかります。
MODELNUM = の行を0,1,2,3 に変更するとアルゴリズムを変更できます。
プログラム
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
import pandas as pd from time import time from sklearn import linear_model from sklearn.svm import SVR from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler # # read data with header # all_data = pd.read_csv('tenkisake-gakushu-data2.csv', header=0) features_data = all_data[['weather','temp','rainfalls','daylight','wind','pressure','humidily']].values labels_data = all_data['alcohol'].values # hyojunka sc = StandardScaler() sc.fit(features_data) # invest before set features_data = sc.transform(features_data) # set to seikika value # data bunkatu features_train, features_test, labels_train, labels_test = train_test_split(features_data, labels_data, test_size=0.1) # # machine laeaning # sgd = linear_model.SGDRegressor() # SGDRegressor linearreg = linear_model.LinearRegression() # Linear Regression lasso = linear_model.Lasso() # Lasso svr = SVR() # SVR models = [sgd, linearreg, lasso, svr] modelnm = ['sgd', 'linearreg', 'lasso', 'svr'] #### Change here to change Algorithm#### MODELNUM = 0 print('Algorithm = ', modelnm[MODELNUM]) ### gakushu t0 = time() models[MODELNUM].fit(features_train, labels_train) print('fit time:', round(time()-t0, 5), 's') t0 = time() pred = models[MODELNUM].predict(features_test) print('predict time:', round(time()-t0, 5), 's') print('score train = ', models[MODELNUM].score(features_train, labels_train)) print('score test = ', models[MODELNUM].score(features_test, labels_test)) ### yosoku features_test = pd.read_csv('tenkisake-yosoku-data2.csv', header=0) features_test = sc.transform(features_test) print('features tomorrow = ' , features_test) print('yokoku tomorrow = ' , models[MODELNUM].predict(features_test)) |
学習データ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
weather,temp,rainfalls,daylight,wind,pressure,humidily,alcohol 4,26.1,21,0.2,10.9,1003.3,81,129.83 2,26.1,20.5,11.2,7.5,1006.2,66,116.22 4,24,3,2.7,3.3,1013.5,74,105.37 4,25.4,54.5,0.3,8.9,1005.5,84,152.77 10,25.9,3.5,4,6.8,1005.6,80,149.17 4,26,25,0,8.2,1008.9,83,82.65 4,27.6,0,0.4,11.2,1007.5,80,102.69 10,26.2,3,1.4,9.7,1005.3,81,92.68 4,25.3,14.5,0,6.6,1009.2,83,97.71 4,26.8,0,0.6,5.9,1010.9,78,134.38 4,27.7,0.5,3.3,10.1,1005.8,81,125.44 2,25.5,3,6.4,5.4,1003.6,79,146.33 4,20.9,8,0.2,3.5,1010.2,85,85.14 4,24.1,5.5,0.1,4.5,1001.8,86,94.26 4,20.4,4,0,3.4,1000.4,89,124.52 4,20.5,0.5,0.2,2.9,1006.7,83,98.44 4,19.4,19.5,0,2.5,1010.5,92,122.98 10,20.7,46.5,0,2,1011.2,95,157.55 2,24.4,0.5,7.4,3.4,1010.8,87,148.52 4,26.4,0,6.7,2.4,1011.1,78,118.56 4,25.1,1,1.4,2.3,1011.5,83,104.70 10,26,53,0.5,2.9,1008.2,88,127.53 4,24.2,0.5,0,1.8,1007.9,89,138.76 4,25.4,0,0.3,1.9,1009.4,82,143.80 4,25.8,52.5,0.6,3.8,1010.9,89,127.26 2,26.3,52.5,4.6,5.3,1013.7,87,156.01 4,27.3,0,3.6,5.9,1013.4,79,91.04 4,27.3,0.5,1.8,6.1,1009.6,83,92.78 4,22.8,0,0,3.8,1013,80,84.86 4,22.5,0.5,0,2.5,1015.2,82,116.63 4,21.7,0,0,3.5,1011.9,76,118.89 4,25,0,0.3,2.4,1006.7,65,127.78 4,25.9,0,0.5,3,1004.9,63,117.38 4,26.2,0,0.1,2.6,1005.6,58,98.38 2,27.3,0,1,4.3,1005.6,55,128.60 4,28.6,0,0.2,4,1005.8,52,164.47 2,24.6,0,0.6,4.2,1008.9,48,184.23 2,26.4,0,1,2.8,1016.5,52,114.58 2,28.1,0,1,6.2,1018.2,53,111.08 2,28.2,0,1,8.8,1015.8,55,122.48 2,28.6,0,0.7,11.3,1007.2,64,105.60 4,28.5,0,0.3,5.9,1004.3,69,126.19 10,20,2,0,4.9,1005.7,93,147.38 10,22.2,0.5,0,0.7,1006.4,93,154.71 4,30,0,0.9,2,1000.4,50,141.25 4,26.7,0,0,3.8,1000.1,57,133.28 2,26.8,0,0.9,4.7,1006.2,49,136.03 4,25,0,0,2.5,1006.8,63,101.22 10,19.8,0,0,2.5,999.8,91,120.54 2,25.3,0,1,4.7,1006.9,65,226.18 10,24.3,0,0,4.3,1011.5,63,203.66 10,20.8,2.5,0,4.2,1007.8,89,95.25 4,24.7,0,0.1,1.2,1010.5,66,111.43 4,21.8,0,0,4.8,1013,78,109.18 10,20.1,0,0,1.9,1008.3,92,100.82 4,26.3,0,0.1,2.7,1003.3,79,113.72 4,26.6,0,0,0.7,1004.4,75,192.81 10,21.6,4.5,0,4.1,998.5,92,185.50 4,27.3,0,0.4,4.8,1006.6,55,122.07 4,28.1,0,0,5.9,1005.6,61,122.83 |
予測データ
1 2 |
weather,temp,rainfalls,daylight,wind,pressure,humidily 4,24.7,0.5,3.5,2,1011.5,83 |
いかがでしたか。
予測の正解は、「105.03」です。
AIの結果は良くなったでしょうか。もしかしたらそれでも結果は良くないかもしれません。
このように、AIの開発は地道な試行錯誤を繰り返して良いものにしていきます。
さて次は、せっかく増やしたデータに不要なものがあるかもしれないというお話をします。-> AIを作ってみよう:消費予測(6/6)