この記事は3年以上前に書かれた記事で内容が古い可能性があります
svmで天気を分析してみる
2017-10-22
■準備
特に何も分析したいものがないので、天気のデータを分析する
気象庁のページから情報を拝借、データの形を整える
csvデータはこちら
できたのは、こんな感じの中身のデータ
気温、降水量(mm)、日照時間(h)、降雪量(cm)、風速(m/s)などの情報から天気を当てさせようとしている
root@e283ad583064:/yoshi_work# head data.csv temp,rain_mm,sun_h,snow_cm,wind_ms,cloud_percent,daytime,nighttime 21.9,0,10,0,3,2.3,sunny,sunny 18.2,0,4.9,0,3,7.5,cloudy,cloudy 16.7,0,0.1,0,2.1,10,cloudy,cloudy 18.1,0,4.8,0,2.4,9.8,cloudy,cloudy 14.9,0,9.8,0,2.4,2.5,sunny,sunny 14,1,2.4,0,2,6.3,cloudy,cloudy 19.1,0,9.6,0,1.7,5,sunny,cloudy 19,0,7.6,0,3.3,4.8,sunny,sunny 12.2,18,0,0,2.4,9.5,cloudy,rainy root@e283ad583064:/yoshi_work# cat data.csv | wc -l 367 root@e283ad583064:/yoshi_work#
■中身
中身はこんな感じ
import pandas as pd from sklearn import svm, metrics, cross_validation csv = pd.read_csv('data.csv') csv_data = csv[["temp","rain_mm","sun_h","snow_cm","wind_ms","cloud_percent"]] csv_label = csv["daytime"] train_data, test_data, train_label, test_label = cross_validation.train_test_split(csv_data, csv_label) clf = svm.SVC() clf.fit(train_data, train_label) pre = clf.predict(test_data) print(pre) ac_score = metrics.accuracy_score(test_label, pre) print('accuracy: ', ac_score)
■実行
リストで出ているのが、予測天候
テストデータとして使われたデータ(答え)はtest_labelに入っているので照らし合わせても良いが、一応一番下を見ると、80%くらい(0.804347826087)の割合で当たっていることがわかる
root@e283ad583064:/yoshi_work# python weather-train.py ['sunny' 'sunny' 'cloudy' 'cloudy' 'sunny' 'sunny' 'cloudy' 'sunny' 'cloudy' 'cloudy' 'cloudy' 'cloudy' 'cloudy' 'cloudy' 'cloudy' 'cloudy' 'cloudy' 'cloudy' 'sunny' 'cloudy' 'sunny' 'cloudy' 'cloudy' 'cloudy' 'cloudy' 'cloudy' 'cloudy' 'sunny' 'cloudy' 'sunny' 'cloudy' 'sunny' 'cloudy' 'sunny' 'sunny' 'sunny' 'sunny' 'cloudy' 'cloudy' 'cloudy' 'sunny' 'sunny' 'cloudy' 'sunny' 'sunny' 'sunny' 'cloudy' 'cloudy' 'cloudy' 'sunny' 'cloudy' 'sunny' 'rainy' 'cloudy' 'cloudy' 'cloudy' 'cloudy' 'sunny' 'sunny' 'sunny' 'sunny' 'cloudy' 'cloudy' 'cloudy' 'sunny' 'cloudy' 'cloudy' 'sunny' 'cloudy' 'sunny' 'cloudy' 'cloudy' 'sunny' 'sunny' 'sunny' 'cloudy' 'cloudy' 'sunny' 'cloudy' 'cloudy' 'sunny' 'sunny' 'sunny' 'sunny' 'sunny' 'cloudy' 'sunny' 'sunny' 'sunny' 'cloudy' 'sunny' 'sunny'] accuracy: 0.804347826087 root@e283ad583064:/yoshi_work#
今は、cross_validationを使って学習データと、テストデータを作成してしまっているが、もう少し地道に学習データとテストデータの割合を調整すれば正答率も変わってきそう