野菜取引価格の予測

野菜価格に影響する要因を探り当てよう!

賞金: 100,000 参加ユーザー数: 301 約1年前に終了

課題背景・目的

農業従事者にとって、野菜の価格を正確に予測することは、事業運営の安定性を確保する上で重要です。しかしながら、天候の変動性が生産量に及ぼす影響は、価格の予測を極めて複雑なものにしており、農業業界全体で解決すべき重要な課題となっています。

この課題に取り組むため、NEDO(産業技術総合開発機構)、大学、ベンチャー企業などが中心となり、野菜の価格変動を予測するモデルの開発が進められています。これらの取り組みもあり、価格変動に影響を及ぼす要素とその関連性がより詳細に明らかになってきました。

具体的に、例えば以下のような関係性が明らかになっています:

  1. 積算温度(ある期間中の各日の平均気温のうち、基準値を超えた分を合計した値)は、野菜の収穫量に大きな影響を及ぼす
  2. 複数の産地で栽培される野菜の場合、一部の産地で天候が悪い状況でも、その価格への影響は限定的である
  3. 産地と消費地の距離が長いほど、輸送コストが増加し、それが価格に反映される

これらの因子を複合的に考慮することで、より精度の高い価格予測が可能となります。

本コンペティションを通じて、皆様には精度の高い価格推定モデルの開発を追求するだけでなく、店頭の野菜の価格がどのように決定され、その背後にある様々な要素を理解し、興味を深めていただければ幸いです。

2019/11月までのデータをもとに、2019年12月の各地域、野菜の価格を予測していただきます。

本コンペティションの特徴

今回のコンペティションでは、各地の野菜の価格情報に加えて、気候情報等が補足データセットとして提供されています。これら多種多様なデータセットを適切に組み合わせたテーブルコンペの手法に親しんでいただけますと幸いです。

参考文献

野菜データの「見える化」―データ活用による野菜振興「槇 晋介」
データ分析のための数理モデル入門「江崎貴裕」

ダウンロード

データをダウンロードするにはログインまたはユーザー登録して下さい

概要

コンペに使用するデータは、大きく2種類です。

  • 価格データ(train_data.csv)
  • 天候データ(weather.csv)

データの形式

価格データ(train_data.csv)

野菜の種類、地域の組み合わせ毎に2016/1~2019/11の価格データが提供されます。

※ 出荷量が少ない一部組み合わせのデータについては提供されていません
※ コロナの影響を考慮し、2019年までのデータに限定しています

野菜の種類(42品目)

だいこん、ばれいしょ、トマト、にら、ミニトマト、きゅうり、その他の野菜、しょうが、ちんげんさい、かぼちゃ、やまのいも、えのきだけ、みつば、ねぎ、はくさい、生しいたけ、レタス、ほうれんそう、たまねぎ、ごぼう、こまつな、なめこ、にんにく、ブロッコリー、ピーマン、セルリー、れんこん、かぶ、しゅんぎく、カリフラワー、その他の菜類、ししとうがらし、しめじ、にんじん、さといも、なす、キャベツ、かんしょ、パセリ、みずな、さやえんどう、さやいんげん

消費地域(9地域)

東北、関東、北海道、九州、近畿、東海、四国、中国、北陸


天候データ(weather.csv)

天候観測所348箇所ごとに、2015/1~2019/11の月次の天候データが与えられます。
天候情報(17項目)

日照時間0.1時間未満日数(日)、日降水量の最大(mm)、日照時間(時間)、降水量の合計(mm)、降雪量合計(cm)、日最高気温の平均(℃)、日最高気温25℃以上日数(日)、最深積雪(cm)、平均気温(℃)、日平均気温0℃未満日数(日)、最高気温(℃)、日最低気温の平均(℃)、日最高気温0℃未満日数(日)、最低気温(℃)、日平均気温25℃以上日探数(日)、日最低気温25℃以上日数(日)、日最低気温0℃未満日数(日)

出典:

  1. 「青果物卸売市場調査」(農林水産省)(https://www.maff.go.jp/j/tokei/kouhyou/seika_orosi/)
  2. 気象庁ホームページ(https://www.data.jma.go.jp/obd/stats/etrn/index.php)
※2023/5/22 出典の表記に謝りがございましたので訂正しております
メトリック

このコンペティションは、RMSLEによって評価されます。
訓練用データセットを使って作成したモデルで予測を行い、 その結果を次のフォーマットのcsvファイルで提出してください。

2019年11月までのデータをもとに、2019年12月の各地域、野菜の価格を予測していただきます。

from sklearn.metrics import mean_squared_log_error

# y_trueが真の値、y_predが予測値
y_true = np.array([1.0, 1.1, 1.3, 1.4, 1.6, 1.7, 1.9, 2.0])
y_pred = np.array([1.0, 1.2, 1.3, 1.5, 1.5, 1.9, 1.9, 2.0])

# scikit-learn で計算する場合
rmsle = np.sqrt(mean_squared_log_error(y_true, y_pred))
print(rmsle)
0.03618562381135613
提出ファイルの形式

回答用のsubmission.csvを用意する(エントリーとヘッダー行を含む) 。
提出されたファイルに余分な行や列が含まれていた場合はエラーとなります。
提出する際には価格データのカラムがインデックスとなるように転置し提出を行ってください。


以下は提出ファイルの例です。 2019年12月の各地域、野菜の価格を予測いただきます。
  • id(価格データのカラムと同じ順序)
  • y(各品目の価格)
id,y
えのきだけ_中国,211.252894562
えのきだけ_九州,112.664679218
えのきだけ_北海道,19.432182194
えのきだけ_北陸,182.880560423

コンペティションルール

■Open Review Competition

本コンペでは、開催期間終了後 賞金対象者のコードを公開し、ユーザーの皆様にチーティング有無をレビューしていただき順位確定させる、オープンレビュー方式のコンペティションを行います。


賞金対象ユーザー

コンペ終了後1週間以内:
トピックにて、学習過程の分かるコードの公開をお願いいたします。 (簡易解説までつけていただけると助かります。)

コード公開後1週間:
レビュアー(ユーザー)より、チーティングの疑いに関するコメントがある場合は、ご回答をお願いいたします。
※チーティングとは無関係のコメント(ノウハウに関する質疑 等)についてもご回答いただけると幸いですが、順位確定の判断材料とは致しません。


レビュアー(ユーザーの皆様)
コード公開後1週間: 公開コードを確認いただき、チーティングが疑われる場合は、トピックを通して質疑の投稿をお願いいたします。

レビュアーからの質疑と、回答状況をふまえて、最終的に運営側で順位確定を判断します。

■順位決定ロジック
  1. コンペ期間中はPublicリーダーボード(以下LB)により暫定評価を、最終結果についてはPrivate LBにより評価します。
    ※ Private LBはコンペ終了と同時に表示されます。
  2. Private スコア計算に使われるファイルについては、2つまで選択可能です。
    ※ 未選択の場合は、Public スコアの上位ファイルが提出上限まで自動選択されます。
  3. スコアが同値の場合は、早い日時に提出いただいたユーザーが上位となります。
  4. コンペ終了後であっても、不正が発覚の際は、対象ユーザーは失格となり、全体の順位が繰り上がります。
    順位繰上げにより賞金対象者となられた場合は、繰上げ日より一週間以内に、トピックにてコードを公開いただき、「Open Review Competition」と同様のフローにて順位を確定させていただきます。
■タイムライン

開始日 2023/5/19 0:00 JST
提出締切 2023/8/20 22:00 JST
終了日 2023/8/20 24:00 JST

エントリー締め切り なし

■システム利用
  • 参加者ごとに1つのアカウントでご参加ください
  • チーム参加の場合は、最大5名までエントリー可能です
  • 1日あたり、各チーム最大5回までの提出が可能です
■禁止事項
  • ユーザー間での情報共有
    コンペティションに関連するコード・データを、チーム外のユーザーと共有することはできません。全参加者が利用できる場合に限り、共有可能です。
  • 外部データの使用
    原則、本コンペティションの基本情報/データから取得できるデータのみを用いてチャレンジして下さい。コンペ外データを用いて学習されたモデルの使用も禁止とします。
    ただし、トピック上で、運営より承認された外部データのみ、使用を許可いたします。承認プロセスについては、「外部データの使用申請について」をご確認ください。

※コンペ期間中であっても、不正が疑われる場合は、運営より確認のためメール連絡させていただくことがございます。一週間以内にご回答いただけない場合も、不正と判断させていただきます。

■外部データの使用申請について

原則外部データ/学習済みモデルの使用は禁止としておりますが、正解データの入手につながらない場合は、下記承認プロセスにより使用できることといたします。

1.トピックを作成し、取得元情報とデータ(格納先URLも可)を添付
2.運営にて判断・承認
注)ただし、コンペ終了まで7日をきってからの申請は禁止とします。

■運営からのお願い

公平性の担保、チーティング等の不正防止のため、予告なくルールの追加・変更を行う場合がございます。
ご不便をおかけすることもあるかと思いますが、サービス向上のためご了承ください。

FAQ

このコンペティションでは賞金はでますか?

はい。
最も精度の高い学習モデルを作成した優勝者には、賞金を贈呈します。
順位確定までのプロセスについては、ルール「Open Review Competition」を参照ください。

チームで参加できますか?

可能です。チームページから作成いただけます。

どこでアカウントをつくればいいですか?

こちらから作成いただけます。

コンペティション参加にはアカウント登録が必要となりますのでご注意ください。

コードを提出するにあたって Seed を固定する必要はありますか?

Seed を固定することが推奨です。
ただし、Seed を固定しなくても提出用コードとしては認めています。

概要

このチュートリアルでは、野菜の相場データに対して

  • データの読み込み
  • データの確認と前処理
  • Lasso回帰による回帰モデルの作成、学習
  • 提出用データの作成

を行います。

#環境確認
import pandas as pd
import numpy as np
import sklearn
!python3 --version
print(pd.__version__)
print(np.__version__)
print(sklearn.__version__)
import matplotlib
print(matplotlib.__version__)
Python 3.7.7
1.1.5
1.19.4
0.21.3
3.1.3

データのロード

まずはデータを読みます。
csvデータの読み込みは一般的によく使われるpandasread_csv関数が機能が豊富なため利用します。
csvデータについて、pandas.DataFrameとして返してくれます。

#データの読み込みと前処理
import pandas as pd
train_data = pd.read_csv("train_data.csv", index_col='id')
print(train_data.shape)
(47, 340)

また、DataFrameには.head()というメソッドが定義されており、これを呼び出すとDataFrameの先頭の数行を確認できます。

train_data.head()

えのきだけ_中国 えのきだけ_九州 えのきだけ_北海道 えのきだけ_北陸 えのきだけ_四国 えのきだけ_東北 えのきだけ_東海 えのきだけ_近畿 えのきだけ_関東 かぶ_北海道 ... レタス_関東 生しいたけ_中国 生しいたけ_九州 生しいたけ_北海道 生しいたけ_北陸 生しいたけ_四国 生しいたけ_東北 生しいたけ_東海 生しいたけ_近畿 生しいたけ_関東
id
2016-01-01 314.0 301.0 304.0 274.0 267.0 213.0 278.0 285.0 279.0 124.0 ... 271.0 1098.0 1048.0 737.0 1231.0 1021.0 988.0 1119.0 1113.0 1118.0
2016-02-01 306.0 316.0 309.0 288.0 293.0 278.0 286.0 295.0 291.0 157.0 ... 311.0 1080.0 956.0 750.0 1241.0 1037.0 964.0 1139.0 1127.0 1116.0
2016-03-01 245.0 217.0 317.0 219.0 227.0 164.0 210.0 213.0 204.0 185.0 ... 278.0 946.0 739.0 728.0 1202.0 886.0 941.0 989.0 937.0 1044.0
2016-04-01 227.0 182.0 304.0 195.0 202.0 153.0 205.0 203.0 189.0 189.0 ... 209.0 875.0 749.0 734.0 1014.0 827.0 887.0 924.0 882.0 982.0
2016-05-01 232.0 202.0 306.0 206.0 215.0 170.0 221.0 220.0 206.0 150.0 ... 165.0 886.0 821.0 710.0 1055.0 892.0 867.0 942.0 946.0 990.0

5 rows × 340 columns

同様に天候情報についてもデータを読み込みます。

weather = pd.read_csv('weather.csv', index_col=0, header=[0,1,2])
print(weather.shape)
(59, 5967)
weather.head()

宗谷 ... 沖縄
稚内 ... 南大東(南大東島)
平均気温(℃) 日平均気温25℃以上日数(日) 日最高気温の平均(℃) 日平均気温0℃未満日数(日) 日最低気温の平均(℃) 日最高気温25℃以上日数(日) 最高気温(℃) 日最高気温0℃未満日数(日) 最低気温(℃) 日最低気温25℃以上日数(日) ... 日最高気温0℃未満日数(日) 最低気温(℃) 日最低気温25℃以上日数(日) 日最低気温0℃未満日数(日) 降水量の合計(mm) 日降水量の最大(mm) 最深積雪(cm) 降雪量合計(cm) 日照時間(時間) 日照時間0.1時間未満日数(日)
年月
2015/1 -2.9 0.0 -1.1 28.0 -5.0 0.0 4.3 19.0 -8.1 0.0 ... 0.0 7.3 0.0 0.0 42.0 14.5 0.0 0.0 99.8 5.0
2015/2 -1.7 0.0 0.2 21.0 -4.0 0.0 5.3 14.0 -11.0 0.0 ... 0.0 5.8 0.0 0.0 7.0 4.5 0.0 0.0 126.7 1.0
2015/3 2.3 0.0 4.4 4.0 0.1 0.0 10.0 0.0 -5.2 0.0 ... 0.0 10.1 0.0 0.0 26.0 10.5 0.0 0.0 178.0 2.0
2015/4 5.9 0.0 8.9 0.0 3.1 0.0 15.7 0.0 -2.0 0.0 ... 0.0 11.8 0.0 0.0 120.0 36.0 0.0 0.0 171.2 1.0
2015/5 9.9 0.0 13.1 0.0 7.1 0.0 18.8 0.0 2.9 0.0 ... 0.0 16.2 8.0 0.0 313.5 166.0 0.0 0.0 210.0 1.0

5 rows × 5967 columns

天候情報については2015年1月分のデータから存在するようです。
毎月1日の地域ごとの野菜の価格がデータにまとめられていることがわかります。

データの確認と前処理

訓練データの各品目の価格分布について確認します。

train_data.describe()

えのきだけ_中国 えのきだけ_九州 えのきだけ_北海道 えのきだけ_北陸 えのきだけ_四国 えのきだけ_東北 えのきだけ_東海 えのきだけ_近畿 えのきだけ_関東 かぶ_北海道 ... レタス_関東 生しいたけ_中国 生しいたけ_九州 生しいたけ_北海道 生しいたけ_北陸 生しいたけ_四国 生しいたけ_東北 生しいたけ_東海 生しいたけ_近畿 生しいたけ_関東
count 47.000000 47.000000 47.000000 47.000000 47.000000 47.000000 47.000000 47.000000 47.000000 47.000000 ... 47.000000 47.000000 47.000000 47.000000 47.000000 47.000000 47.000000 47.000000 47.000000 47.000000
mean 251.425532 235.574468 284.723404 230.659574 240.829787 179.957447 239.872340 232.978723 223.744681 156.638298 ... 208.936170 898.936170 857.808511 684.914894 1019.872340 896.361702 859.489362 951.404255 938.106383 995.234043
std 55.707990 63.407497 22.070738 55.274523 55.517455 66.101686 55.335584 57.252868 58.983221 37.791433 ... 95.682538 118.526534 156.466782 57.738101 126.364486 115.511420 92.727247 120.762192 125.053421 97.040380
min 166.000000 119.000000 237.000000 152.000000 151.000000 77.000000 150.000000 143.000000 128.000000 96.000000 ... 110.000000 718.000000 624.000000 525.000000 759.000000 721.000000 686.000000 780.000000 748.000000 859.000000
25% 207.000000 180.500000 269.000000 192.500000 203.000000 135.500000 203.500000 185.500000 174.500000 135.000000 ... 148.000000 805.000000 732.000000 637.500000 929.500000 794.000000 793.500000 853.000000 829.000000 914.000000
50% 246.000000 228.000000 287.000000 218.000000 230.000000 168.000000 223.000000 220.000000 208.000000 152.000000 ... 174.000000 889.000000 821.000000 686.000000 1017.000000 883.000000 847.000000 942.000000 932.000000 979.000000
75% 293.000000 287.500000 301.000000 263.500000 272.500000 230.000000 276.000000 274.500000 268.000000 167.500000 ... 230.500000 989.500000 1004.000000 731.000000 1112.500000 994.000000 943.000000 1033.500000 1043.500000 1073.000000
max 388.000000 384.000000 331.000000 372.000000 383.000000 330.000000 382.000000 365.000000 364.000000 286.000000 ... 550.000000 1160.000000 1251.000000 801.000000 1247.000000 1188.000000 1029.000000 1265.000000 1251.000000 1225.000000

8 rows × 340 columns

stdが各カラムにおける標準偏差であり、この値が大きいほど価格が大きく変動していることになります。品目毎に値動きの大きさは変わります。

また、同じ品目でも地域ごとに価格の安定した地域、不安定な地域があることが確認できました。産地からの距離が運送に影響を与えていたり、消費地域の需要の高低といった要因によって、価格の安定性に影響が出ていると考えられます。

set(weather.columns) - set(weather.dropna(axis=1).columns)
{('三重', '上野', '最深積雪(cm)'),
 ('三重', '上野', '降雪量合計(cm)'),
 ('三重', '四日市', '最深積雪(cm)'),
 ('三重', '四日市', '降雪量合計(cm)'),
 ('三重', '尾鷲', '最深積雪(cm)'),
 ('三重', '尾鷲', '降雪量合計(cm)'),
 ('兵庫', '兎和野高原', '最深積雪(cm)'),
 ('兵庫', '兎和野高原', '降雪量合計(cm)'),
 ('兵庫', '姫路', '最深積雪(cm)'),
 ('兵庫', '姫路', '降雪量合計(cm)'),
 ('兵庫', '洲本', '最深積雪(cm)'),
 ('兵庫', '洲本', '降雪量合計(cm)'),
 ('千葉', '勝浦', '最深積雪(cm)'),
 ('千葉', '勝浦', '降雪量合計(cm)'),
 ('千葉', '千葉', '最深積雪(cm)'),
 ('千葉', '千葉', '降雪量合計(cm)'),
 ('千葉', '館山', '最深積雪(cm)'),
 ('千葉', '館山', '降雪量合計(cm)'),
 ('和歌山', '潮岬', '最深積雪(cm)'),
 ('和歌山', '潮岬', '降雪量合計(cm)'),
 ('大分', '日田', '最深積雪(cm)'),
 ('大分', '日田', '降雪量合計(cm)'),
 ('宮崎', '延岡', '最深積雪(cm)'),
 ('宮崎', '延岡', '降雪量合計(cm)'),
 ('宮崎', '油津', '最深積雪(cm)'),
 ('宮崎', '油津', '降雪量合計(cm)'),
 ('宮崎', '都城', '最深積雪(cm)'),
 ('宮崎', '都城', '降雪量合計(cm)'),
 ('山口', '萩', '最深積雪(cm)'),
 ('山口', '萩', '降雪量合計(cm)'),
 ('島根', '浜田', '最深積雪(cm)'),
 ('島根', '浜田', '降雪量合計(cm)'),
 ('広島', '呉', '最深積雪(cm)'),
 ('広島', '呉', '降雪量合計(cm)'),
 ('広島', '福山', '最深積雪(cm)'),
 ('広島', '福山', '降雪量合計(cm)'),
 ('愛媛', '宇和島', '最深積雪(cm)'),
 ('愛媛', '宇和島', '降雪量合計(cm)'),
 ('愛知', '伊良湖', '最深積雪(cm)'),
 ('愛知', '伊良湖', '降雪量合計(cm)'),
 ('東京', '三宅島', '最深積雪(cm)'),
 ('東京', '三宅島', '降雪量合計(cm)'),
 ('東京', '八丈島', '最深積雪(cm)'),
 ('東京', '八丈島', '降雪量合計(cm)'),
 ('東京', '南鳥島', '最深積雪(cm)'),
 ('東京', '南鳥島', '降雪量合計(cm)'),
 ('東京', '大島', '最深積雪(cm)'),
 ('東京', '大島', '降雪量合計(cm)'),
 ('東京', '父島', '最深積雪(cm)'),
 ('東京', '父島', '降雪量合計(cm)'),
 ('沖縄', '与那国島', '最深積雪(cm)'),
 ('沖縄', '与那国島', '降雪量合計(cm)'),
 ('沖縄', '久米島', '最深積雪(cm)'),
 ('沖縄', '久米島', '降雪量合計(cm)'),
 ('沖縄', '名護', '最深積雪(cm)'),
 ('沖縄', '名護', '降雪量合計(cm)'),
 ('沖縄', '西表島', '最深積雪(cm)'),
 ('沖縄', '西表島', '降雪量合計(cm)'),
 ('熊本', '人吉', '最深積雪(cm)'),
 ('熊本', '人吉', '降雪量合計(cm)'),
 ('熊本', '牛深', '最深積雪(cm)'),
 ('熊本', '牛深', '降雪量合計(cm)'),
 ('福岡', '飯塚', '最深積雪(cm)'),
 ('福岡', '飯塚', '降雪量合計(cm)'),
 ('福島', '小名浜', '最深積雪(cm)'),
 ('福島', '小名浜', '降雪量合計(cm)'),
 ('長崎', '佐世保', '最深積雪(cm)'),
 ('長崎', '佐世保', '降雪量合計(cm)'),
 ('長崎', '厳原', '最深積雪(cm)'),
 ('長崎', '厳原', '降雪量合計(cm)'),
 ('長崎', '平戸', '最深積雪(cm)'),
 ('長崎', '平戸', '降雪量合計(cm)'),
 ('長崎', '福江', '最深積雪(cm)'),
 ('長崎', '福江', '降雪量合計(cm)'),
 ('長崎', '雲仙岳', '最深積雪(cm)'),
 ('長崎', '雲仙岳', '降雪量合計(cm)'),
 ('静岡', '三島', '最深積雪(cm)'),
 ('静岡', '三島', '降雪量合計(cm)'),
 ('静岡', '御前崎', '最深積雪(cm)'),
 ('静岡', '御前崎', '降雪量合計(cm)'),
 ('静岡', '浜松', '最深積雪(cm)'),
 ('静岡', '浜松', '降雪量合計(cm)'),
 ('静岡', '石廊崎', '最深積雪(cm)'),
 ('静岡', '石廊崎', '降雪量合計(cm)'),
 ('静岡', '網代', '最深積雪(cm)'),
 ('静岡', '網代', '降雪量合計(cm)'),
 ('香川', '多度津', '最深積雪(cm)'),
 ('香川', '多度津', '降雪量合計(cm)'),
 ('高知', '室戸岬', '最深積雪(cm)'),
 ('高知', '室戸岬', '降雪量合計(cm)'),
 ('高知', '宿毛', '最深積雪(cm)'),
 ('高知', '宿毛', '降雪量合計(cm)'),
 ('高知', '清水', '最深積雪(cm)'),
 ('高知', '清水', '降雪量合計(cm)'),
 ('鹿児島', '屋久島', '最深積雪(cm)'),
 ('鹿児島', '屋久島', '降雪量合計(cm)'),
 ('鹿児島', '枕崎', '最深積雪(cm)'),
 ('鹿児島', '枕崎', '降雪量合計(cm)'),
 ('鹿児島', '沖永良部', '最深積雪(cm)'),
 ('鹿児島', '沖永良部', '降雪量合計(cm)'),
 ('鹿児島', '種子島', '最深積雪(cm)'),
 ('鹿児島', '種子島', '降雪量合計(cm)'),
 ('鹿児島', '阿久根', '最深積雪(cm)'),
 ('鹿児島', '阿久根', '降雪量合計(cm)')}

非降雪地帯の降雪に関するカラムにはNaNが含まれるようです。

予測モデルの作成、学習

モデルに投入する目的変数(y)と、説明変数(X)を作成します。
今回は前月の天候情報からある月の相場を予測します。
train_dataでは、月次の価格データが時系列で与えられるため、2か月以上前の農作物の価格や、その推移情報についても活用することが可能です。

X = weather.iloc[11:-1, :].fillna(0)
y = train_data

いよいよ予測モデルの作成に入ります。
model.fit('説明変数','目的変数')とすることで、学習データを使用した回帰モデルを作成できます。

今回は、Lasso回帰と呼ばれる回帰手法を利用して予測をします。比較用に一般的な線形回帰モデルでも学習をしてみます。

#scikit-learnライブラリをimport
import sklearn
from sklearn.linear_model import Lasso
from sklearn.linear_model import LinearRegression
#線形回帰モデルのインスタンス化
Lasso = Lasso(max_iter=10000)
lr = LinearRegression()
#予測モデルの作成
Lasso.fit(X, y)
lr.fit(X, y)

モデルの評価

また、コンペの評価指標となるRMSLEスコアを確認してみましょう。
今回は、sklearn.metricsに含まれるmean_squared_errorメソッドを使用します。
0に近いほど予測精度が高いことを表します。
モデルを元にした予測値は、model.predict('説明変数')で表します。

from sklearn.metrics import mean_squared_log_error
y_true = y
y_pred = lr.predict(X)
print(np.sqrt(mean_squared_log_error(y_true, y_pred)))
2.145828653485621e-15

今回作成したモデルのRMSLEは上記の通りでした。

テストデータに対する出力

最後に、作成したモデルを使用して将来の野菜価格を予測します。

test_data = weather.iloc[-1:, :].fillna(0)
test_data.head()

宗谷 ... 沖縄
稚内 ... 南大東(南大東島)
平均気温(℃) 日平均気温25℃以上日数(日) 日最高気温の平均(℃) 日平均気温0℃未満日数(日) 日最低気温の平均(℃) 日最高気温25℃以上日数(日) 最高気温(℃) 日最高気温0℃未満日数(日) 最低気温(℃) 日最低気温25℃以上日数(日) ... 日最高気温0℃未満日数(日) 最低気温(℃) 日最低気温25℃以上日数(日) 日最低気温0℃未満日数(日) 降水量の合計(mm) 日降水量の最大(mm) 最深積雪(cm) 降雪量合計(cm) 日照時間(時間) 日照時間0.1時間未満日数(日)
年月
2019/11 2.6 0.0 5.3 10.0 -0.3 0.0 12.8 4.0 -7.3 0.0 ... 0.0 16.7 0.0 0.0 54.5 32.5 0.0 0.0 123.5 6.0

1 rows × 5967 columns

先ほど使用したmodel.predict('説明変数')説明変数にテストデータの値を代入することで、テストデータの予測値を算出することができます。

下記のようにして、提出用のsubmission.csvを出力することが可能です。

#テスト結果の出力
test_predicted = lr.predict(test_data)
submit_df = pd.DataFrame(test_predicted)
submit_df.columns = train_data.columns
submit_df = submit_df.transpose()
submit_df.index.name = 'id'
submit_df.columns = ['y']
submit_df.to_csv('submission.csv')
submit_df
id  y                  
えのきだけ_中国    314.878998
えのきだけ_九州    288.642959
えのきだけ_北海道   282.941308
えのきだけ_北陸    279.403830
えのきだけ_四国    285.298373
...                ...
生しいたけ_四国   1040.834107
生しいたけ_東北    975.056885
生しいたけ_東海   1124.099756
生しいたけ_近畿   1132.671180
生しいたけ_関東   1110.588409

「野菜取引価格の予測」コンペティション参加規約

コンペティションへの参加に際しては、ProbSpace利用規約(以下、「利用規約」といいます。)に加え、本ProbSpace参加規約(以下「本規約」といいます。)に同意いただく必要があります。利用規約にて定義された用語は、本規約においても同様の意味で用いられるものとします。

第1条(適用)

  1. 参加者(第2条に定義します。)は、コンペティションに参加した時点で、本規約、利用規約、その他ご同意いただいた規約のすべて、及びコンペティションサイトに掲載されているコンペティションに関するルールの一切に同意したものとみなされます。
  2. 本規約、利用規約、その他ご同意いただいた規約のすべて、及びコンペティションサイトに掲載されているコンペティションに関するルールは、コンペティションの終了後も参加者に適用されます。

第2条(定義)
本規約において次の各用語の定義は、それぞれ以下に定めるとおりとします。

  1. 「本コンペ」とは、当社ウェブサイト上で開催されるAI開発又はデータ分析等に関するコンペティションのうち、本規約に紐づく特定のコンペティションを意味します。
  2. 「主催者」とは、当社またはユーザーのうち、本コンペを主催する者を意味します。また、本コンペが、当社の顧客又は提携先の企業、学校その他の団体等がスポンサードするものである場合は、当該団体等も主催者の定義に含まれます。
  3. 「参加者」とは、ユーザーのうち、主催者側以外の立場で本コンペに参加する方を意味します。
  4. 「成果物」とは、本コンペにおいて参加者により開発される学習済みモデル、そのソースコード及び乱数シード等の設定値を意味します。
  5. 「入賞者」とは、当社より本コンペに入賞した旨の通知を受けた参加者を意味します。
  6. 「知的財産権」とは、著作権(著作権法第27条及び第28条に定める権利を含みます。)、特許権、実用新案権、商標権、意匠権、その他のノウハウ及び技術情報等の知的財産権(それらの権利を取得し、又はそれらの権利につき登録等を出願する権利を含みます。)を意味します。

第3条(権利の帰属)

  1. 本コンペで発生した成果物に関する知的財産権は、参加者に帰属します。

第4条(入賞者の義務)

  1. 入賞者は、本コンペで公開した成果物を、MITライセンスを適用し、商用利用の許諾条項及び著作権人格権の包括的不行使条項をライセンス条項に付与した形式で、オープンソースソフトウェアとして公開する義務を負うものとします。その前提として、入賞者は、成果物について本項に基づく方法でオープンソース化する権利を有していることを当社に対して表明保証するものとします。
    ※第三者が、授業・研修・セミナー等で活用できるようにするための規約となります。ご理解のほどよろしくお願いいたします。
  2. 当社は、以下の3点の確認が完了した時点で、本コンペの賞金または商品を、入賞者に対して授与するものとします。
    1. 入賞者が、前項に基づいて成果物のオープンソース化を実施したこと
    2. 入賞者が、本規約、利用規約、その他ご同意いただいた規約のすべて、及びコンペティションサイトに掲載されているコンペティションに関するルールの一切に違反していないこと
    3. 当社が定める方法による本人確認
  3. 当社は、入賞者が第1項に基づいてオープンソース化した成果物を、自由に商用利用することができます。

第5条(禁止事項)

  1. 参加者は、本コンペにおいて、以下の各号のいずれかに該当する行為を行ってはならないものとします。
    1. クラッキングやチート行為、なりすまし、盗用等の不正行為
    2. 第三者の知的財産権その他の権利を侵害する内容ないし態様で、参加者公開事項を公開する行為
    3. 主催者(当社以外の者に限ります。)に対する直接連絡、相談、依頼、勧誘、勧誘対応等の活動(但し、当社を介して当社が認めた方法により行うものは除きます。)
    4. 本コンペにおいて、当該コンペと直接関係のない成果物等を提出すること
    5. 本規約における参加者としての地位又は参加者としての権利義務について、譲渡、移転、担保設定、その他の処分をすること
    6. その他、本規約、参加ルール及び利用規約に違反する行為
  2. 参加者が前項に規定する禁止行為を行ったと当社が認める場合、当社は、当該参加者に事前に通知することなく、当該参加者の本コンペにおける失格処分、当社サービスの全部又は一部の利用停止、ユーザー登録の抹消、その他当社が必要と判断した措置をとることができるものとします。

第6条(本コンペの変更、中断、終了等)

  1. 当社は、参加者に事前の通知をすることなく本規約に基づく本コンペの開催内容の変更、本コンペの一時的な中断又は終了を行うことができます。
  2. 当社は、本条に基づき当社が行った措置により生じた結果及び損害について、一切の責任を負わないものとします。

第7条(損害賠償)

  1. 参加者は、本コンペに関連して、自らの責に帰すべき事由により、当社、主催者その他の第三者に損害を与えた場合には、その一切の損害(逸失利益、弁護士費用を含みます。)を賠償するものとします。
  2. 参加者が本規約の規定に違反したことにより主催者(当社を除きます。)その他の第三者が当社に対して何らかの訴え、異議、請求等がなされた場合において、当社から処理の要請がなされたときは、参加者は自己の責任と費用負担において、当社に代わって当該第三者との紛争を処理するとともに、当社がかかる訴え、異議、請求等により被った一切の損害(逸失利益、弁護士費用を含みます。)を賠償するものとします。

第8条(本規約の変更)
当社は、必要と判断した場合には、参加者に対して事前に通知する(本コンペにかかる当社ウェブサイト上での告知その他当社が適当と認める方法を含みます。)ことにより、いつでも本規約を変更することができるものとします。なお、変更内容の通知後、参加者が当社の定める期間内に本コンペへの参加を取り消す手続をとらなかった場合には、当該参加者は変更後の規約に同意したものとみなされます。当社は、本規約の変更により参加者に生じたすべての損害について一切の責任を負いません。

第9条(その他)
本契約の準拠法は日本法とし、本契約に起因し又は関連する一切の紛争については、当社の本店所在地を管轄する裁判所を第一審の専属的合意管轄裁判所とします。

(制定)2020年6月22日