コンペティション概要
背景と目的
「Kiva」とは、世界中の人々と発展途上国の起業家・学生をつなぎ、格差による貧困の軽減を目指してマイクロファイナンスを行う非営利団体(NPO)です。一口25ドルからの支援が可能なクラウドファンディング(https://www.kiva.org) を通じて、これまで十分なサービスを受けられなかった人々に対し、人生を変える機会となる融資を行う仕組みを提供しております。2005年の設立以来、80ヵ国、250万人に対して、10億ドル以上の融資が実現されてきました。
今回は、Kivaの取組みを多くの方に知ってほしいとの想いから、当団体のプログラムを支援されているRidgelinez様と共同でコンペティションを開催することとなりました。途上国で変革を志すリーダーを知り・活動を支援する文化を、少しでも広げられればと考えております。
※1 本コンペティションで優秀な成績を収められた方には、Ridgelinez様の社会変革型プロジェクトへお誘いをさせていただくことがございますこと、ご了承ください。
※2 また本コンペでは、表彰式を兼ねた懇親会を予定しております。ぜひともご参加ください(詳細につきましては、別途ご連絡いたします)。
課題内容
クラウドファンディングによってどれだけ資金調達できるかは、実際にプロジェクトとして募集をかけてみないとわからないのが実状です。明確な答えがない中、借りたお金の用途や適切な返済期間、さらには希望の融資額を考える必要があります。
そこで本コンペでは、過去のクラウドファンディング実績をもとに、妥当な融資額を予測する問題を設計いたしました。
皆さまには、2018,19年の過去2年の融資実績を訓練データとして、2020,21年の融資額を予測、精度を競っていただきます。
なお今回は、シンプルなテーブルデータに加え、融資内容の文章説明や画像が含まれます。マルチモーダルなコンペティションをお楽しみください。
賞金
1位 100,000円
2位 60,000円
3位 40,000円
※ 入賞者(1-3位)の方には、表彰式にてご自身の解法を発表いただく可能性がございます
締め切り
2022年2月13日 22:00 JST
※ LB公開 2月13日 24:00 JST
ダウンロード
データをダウンロードするにはログインまたはユーザー登録して下さい
概要
コンペに使用するデータは5つに分けられます。
- 訓練テーブルデータ(train.csv)
- 訓練画像データ(train_images.zip)
- テストテーブルデータ(train.csv)
- テスト画像データ(test_images.zip)
- サンプルサブミット用データ(sample_submission.csv)
データラベル
「テーブルデータ」のカラム毎の意味は下記の通りです。
※画像とテーブルデータは「IMAGE_ID」を用いて紐付けが可能となります。
一部画像データが存在しない可能性があることに注意してください。
no |
カラム名 |
意味 |
0 |
LOAN_ID |
融資ID |
1 |
ORIGINAL_LANGUAGE |
使用言語 |
2 |
DESCRIPTION |
融資者説明 |
3 |
DESCRIPTION_TRANSLATED |
融資者説明(英訳後) |
4 |
LOAN_AMOUNT(目的変数) |
融資額(ドル) |
5 |
IMAGE_ID |
画像ID |
6 |
ACTIVITY_NAME |
融資内容 |
7 |
SECTOR_NAME |
融資内容カテゴリ |
8 |
LOAN_USE |
融資の具体的な使い道 |
9 |
COUNTRY_CODE |
国コード |
10 |
COUNTRY_NAME |
国名 |
11 |
TOWN_NAME |
街名 |
12 |
CURRENCY_POLICY |
通貨方針 |
13 |
CURRENCY_EXCHANGE_COVERAGE_RATE |
通貨交換レート |
14 |
CURRENCY |
通貨種 |
15 |
TAGS |
タグ |
16 |
REPAYMENT_INTERVAL |
返済間隔 |
17 |
DISTRIBUTION_MODEL |
融資形態 |
「サンプルサブミット用データ」のカラム毎の意味は下記の通りです。
no |
カラム名 |
意味 |
0 |
LOAN_ID |
融資ID |
1 |
LOAN_AMOUNT |
融資額(ドル) |
メトリック
このコンペティションは、MAEによって評価されます。
訓練用データセットを使って作成したモデルで予測を行い、 その結果を次のフォーマットのcsvファイルで提出してください。
提出ファイルのフォーマット
以下のフォーマットで提出します
LOAN_ID,LOAN_AMOUNT
XXXX,775
YYYY,1625
ZZZZ,875
...
コンペティションルール
■Open Review Competition
本コンペでは、開催期間終了後 賞金対象者のコードを公開し、ユーザーの皆様にチーティング有無をレビューしていただき順位確定させる、オープンレビュー方式のコンペティションを行います。
賞金対象ユーザー
コンペ終了後1週間以内:
トピックにて、学習過程の分かるコードの公開をお願いいたします。
(簡易解説までつけていただけると助かります。)
コード公開後1週間:
レビュアー(ユーザー)より、チーティングの疑いに関するコメントがある場合は、ご回答をお願いいたします。
※チーティングとは無関係のコメント(ノウハウに関する質疑 等)についてもご回答いただけると幸いですが、順位確定の判断材料とは致しません。
レビュアー(ユーザーの皆様)
コード公開後1週間:
公開コードを確認いただき、チーティングが疑われる場合は、トピックを通して質疑の投稿をお願いいたします。
レビュアーからの質疑と、回答状況をふまえて、最終的に運営側で順位確定を判断します。
■順位決定ロジック
- コンペ期間中はPublicリーダーボード(以下LB)により暫定評価を、最終結果についてはPrivate LBにより評価します。
※ Private LBはコンペ終了と同時に表示されます。
- Private スコア計算に使われるファイルについては、2つまで選択可能です。
※ 未選択の場合は、Public スコアの上位ファイルが提出上限まで自動選択されます。
- スコアが同値の場合は、早い日時に提出いただいたユーザーが上位となります。
- コンペ終了後であっても、不正が発覚の際は、対象ユーザーは失格となり、全体の順位が繰り上がります。
順位繰上げにより賞金対象者となられた場合は、繰上げ日より一週間以内に、トピックにてコードを公開いただき、「Open Review Competition」と同様のフローにて順位を確定させていただきます。
■タイムライン
開始 2021/11/15 15:00 JST
提出締切 2022/2/13 22:00 JST
LB公開 2022/2/13 24:00 JST
エントリー締め切り なし
■システム利用
- 参加者ごとに1つのアカウントでご参加ください
- チーム参加の場合は、最大5名までエントリー可能です
- 1日あたり、最大5回までの提出が可能です
■禁止事項
- ユーザー間での情報共有
コンペティションに関連するコード・データを、チーム外のユーザーと共有することはできません。全参加者が利用できる場合に限り、共有可能です。
- 外部データ/学習済みモデルの使用
本コンペティションの基本情報/データから取得できるデータのみを用いてチャレンジして下さい。
ただし、コンペ外データ(KivaのAPIから取得できるデータは除く)を用いて学習された学習済みモデルの使用は可能とします。
※コンペ期間中であっても、不正が疑われる場合は、運営より確認のためメール連絡させていただくことがございます。一週間以内にご回答いただけない場合も、不正と判断させていただきます。
■運営からのお願い
公平性の担保、チーティング等の不正防止のため、予告なくルールの追加・変更を行う場合がございます。
ご不便をおかけすることもあるかと思いますが、サービス向上のためご了承ください。
FAQ
このコンペティションでは賞金はでますか?
はい。
精度の高い学習モデルを作成された入賞者様へ、賞金を贈呈します。
順位確定までのプロセスについては、ルール「Open Review Competition」を参照ください。
チームで参加できますか?
可能です。チームページから作成いただけます。
外部データ/学習済みモデルを使うことは可能ですか?
本コンペティションから取得できるデータのみを用いてチャレンジして下さい。
ただし、コンペ外データ(KivaのAPIから取得できるデータは除く)を用いて学習された学習済みモデルの使用は可能とします。
コードを提出するにあたって Seed を固定する必要はありますか?
Seed を固定することが推奨です。
ただし、Seed を固定しなくても提出用コードとしては認めています。
(2021/12/29追記)
提出回数はいつリセットされますか?
ファイル提出後、23時間ごとにリセットとなります。
グローバル展開していくにあたり、居住国(時差)による有利・不利を最小化するため、一定時間でリセットされる仕様としております。
概要
このチュートリアルでは、Kivaデータに対して
- データの読み込み
- データの確認と前処理
- sklearnを用いた回帰モデルの作成、学習
- 提出用データの作成
を行います。
import pandas as pd
import numpy as np
!python3 --version
print(pd.__version__)
print(np.__version__)
import matplotlib
print(matplotlib.__version__)
Python 3.9.6
1.3.3
1.20.3
3.4.3
データのロード
まずはデータを読み込んで見ましょう。csvデータの読み込みは複数のやり方がありえますが、pandas
のread_csv
関数はその中でも機能が豊富で、扱いやすいためこれを使います。
これを使うと、csvデータを読み込み、pandas.DataFrame
にして返してくれます。
train_df = pd.read_csv("../data/train.csv")
test_df = pd.read_csv("../data/test.csv")
submit_df = pd.read_csv("../data/sample_submission.csv")
print(train_df.shape)
print(test_df.shape)
(91333, 18)
(91822, 17)
また、DataFrame
には.head()
というメソッドが定義されており、これを呼び出すとDataFrame
の先頭の数行を確認できます。
train_df.head()
|
LOAN_ID |
ORIGINAL_LANGUAGE |
DESCRIPTION |
DESCRIPTION_TRANSLATED |
LOAN_AMOUNT |
IMAGE_ID |
ACTIVITY_NAME |
SECTOR_NAME |
LOAN_USE |
COUNTRY_CODE |
COUNTRY_NAME |
TOWN_NAME |
CURRENCY_POLICY |
CURRENCY_EXCHANGE_COVERAGE_RATE |
CURRENCY |
TAGS |
REPAYMENT_INTERVAL |
DISTRIBUTION_MODEL |
0 |
1733169 |
English |
Teodora is a 50-year-old married |
Teodora is a 50-year-old married |
100 |
3115271 |
Weaving |
Arts |
to purchase materials like nipa palm, bamboo stick and sibit (for binding) |
PH |
Philippines |
Maribojoc, Bohol |
shared |
0.1 |
PHP |
#Elderly |
monthly |
field_partner |
1 |
1546998 |
English |
Diego is 32 years old and lives |
Diego is 32 years old and lives /td>
| 1350 |
2870403 |
Barber Shop |
Services |
to buy two hair clippers, a new barber chair, and other supplies to improve his business. |
CO |
Colombia |
Apartadó |
shared |
0.1 |
COP |
user_favorite, user_favorite |
monthly |
field_partner |
2 |
1808517 |
Spanish |
Osman, es un joven de 27 años de edad, |
Osman is a young man, 27 years old, |
225 |
3215705 |
Farming |
Agriculture |
to purchase sacks of fertilizers to care for and maintain the coffee. |
HN |
Honduras |
Nueva Frontera, Santa Barbara. |
shared |
0.1 |
HNL |
NaN |
bullet |
field_partner |
3 |
1452940 |
English |
His name is Nino, 31 years old, |
His name is Nino, 31 years old, |
350 |
2745031 |
Motorcycle Transport |
Transportation |
to pay for fuel, tires and change oil for his tricycle. |
PH |
Philippines |
Silang, Cavite |
shared |
0.1 |
PHP |
user_favorite |
monthly |
field_partner |
4 |
1778420 |
English |
Pictured above is Teresa, often described |
Pictured above is Teresa, often described |
625 |
3083800 |
Farming |
Agriculture |
to purchase hybrid seeds and fertilizer to improve harvests of maize\t\t\t\t\t\t\t |
KE |
Kenya |
Mumias |
shared |
0.1 |
KES |
#Eco-friendly, #Sustainable Ag, #Parent, #Elderly, #Vegan, #Repeat Borrower, #Technology, #Woman-Owned Business |
bullet |
field_partner |
5 rows × 18 columns
train_df.columns
Index(['LOAN_ID', 'ORIGINAL_LANGUAGE', 'DESCRIPTION', 'DESCRIPTION_TRANSLATED',
'LOAN_AMOUNT', 'IMAGE_ID', 'ACTIVITY_NAME', 'SECTOR_NAME', 'LOAN_USE',
'COUNTRY_CODE', 'COUNTRY_NAME', 'TOWN_NAME', 'CURRENCY_POLICY',
'CURRENCY_EXCHANGE_COVERAGE_RATE', 'CURRENCY', 'TAGS',
'REPAYMENT_INTERVAL', 'DISTRIBUTION_MODEL'],
dtype='object')
データの確認と前処理
訓練データの融資額の価格分布について確認します。
train_df['LOAN_AMOUNT'].describe()
count 91333.000000
mean 738.149957
std 1013.752868
min 25.000000
25% 225.000000
50% 450.000000
75% 825.000000
max 10000.000000
Name: LOAN_AMOUNT, dtype: float64
MAXの値がかなり大きく、ハズレ値と考えた方が融資額の全体感がわかるかもかもしれません。
分布をわかりやすくするために、quantile()関数を使用します。
train_df['LOAN_AMOUNT'].quantile(0.95)
2325.0
算出した分位数95%の値を考慮せずに融資額を可視化してみましょう。
train_df['LOAN_AMOUNT'].hist(bins=list(range(0,2325,200)), color='blue', alpha=0.5)
250-500ドルくらいの融資が多く、Kivaでの融資は銀行などの融資に比べて、少額からの融資が多いことがわかります。
予測モデルの作成、学習
モデルに投入する目的変数(y)、説明変数(X)を作成します。
train_columns = ['ORIGINAL_LANGUAGE','ACTIVITY_NAME']
target = 'LOAN_AMOUNT'
X = pd.get_dummies(train_df[train_columns], drop_first=True)
y = train_df[target]
いよいよ予測モデルの作成に入ります。
model.fit('説明変数','目的変数')
と記述することでモデルの学習が可能となります。目的変数を説明変数の組み合わせで説明可能な回帰モデルを作成できます。
import sklearn
from sklearn.ensemble import RandomForestRegressor as RFR
model = RFR()
result = model.fit(X, y)
予測モデルの評価
score
メソッドを用いてモデルの評価を行うことができます。
テストデータに対する回帰モデルの当てはまりの良さの指標としては'決定係数'などの指標が用いられます。
決定係数の値は、.score
で確認が可能です。
1に近いほど回帰式で予測された値が実際のデータに当てはまることを表します。
model.score(X, y)
0.14660277169957947
また、コンペの評価指標となるMAE
についても出力が可能です。
今回は、sklearn.metrics
に含まれるmean_absolute_error
メソッドを使用します。
MAE が小さいほど誤差が少なく、予測モデルが正確に予測できていることを示し、MAE が大きいほど実際の値と予測値に誤差が大きく、予測モデルが正確に予測できていないといえます。
モデルによる予測値は、model.predict('説明変数')
で表します。
from sklearn.metrics import mean_absolute_error
y_true = y
y_pred = model.predict(X)
print(mean_absolute_error(y_true, y_pred))
494.6187266711223
現状のモデルではまだ性能が不十分なようです。
提出データの作成
提出データを作成します。
test_X = pd.get_dummies(test_df[train_columns], drop_first=True)
test_predicted = model.predict(test_X)
予測した値をサンプル用のファイルに代入します。
submit_df['LOAN_AMOUNT']=test_predicted
submit_df.to_csv('../submission.csv',index=False)
本コンペティションにおける特約
本コンペティションは、Ridgelinez株式会社(以下「スポンサー企業」といいます。)による人材発掘を目的とするものです。本コンペティションに参加された方に関して、当社が保有する個人情報等のうち、以下の情報が、スポンサー企業に対して提供されます。
本コンペティションの順位、チーム名、ユーザー名、メールアドレス、所属、出身大学、過去の当社コンペティション参加実績に関する情報、スポンサー企業への関心の有無、紹介文、経験
スポンサー企業に対する、上記個人情報等の提供に同意のうえ、本コンペティションへの参加をお願いいたします。(本コンペティションに参加していない会員の個人情報がスポンサー企業に提供されることはありません。)
ProbSpace参加規約
コンペティションへの参加に際しては、ProbSpace利用規約(以下、「利用規約」といいます。)に加え、本ProbSpace参加規約(以下「本規約」といいます。)に同意いただく必要があります。利用規約にて定義された用語は、本規約においても同様の意味で用いられるものとします。
第1条(適用)
- 参加者(第2条に定義します。)は、コンペティションに参加した時点で、本規約、利用規約、その他ご同意いただいた規約のすべて、及びコンペティションサイトに掲載されているコンペティションに関するルールの一切に同意したものとみなされます。
- 本規約、利用規約、その他ご同意いただいた規約のすべて、及びコンペティションサイトに掲載されているコンペティションに関するルールは、コンペティションの終了後も参加者に適用されます。
第2条(定義)
本規約において次の各用語の定義は、それぞれ以下に定めるとおりとします。
- 「本コンペ」とは、当社ウェブサイト上で開催されるAI開発又はデータ分析等に関するコンペティションのうち、本規約に紐づく特定のコンペティションを意味します。
- 「主催者」とは、当社またはユーザーのうち、本コンペを主催する者を意味します。また、本コンペが、当社の顧客又は提携先の企業、学校その他の団体等がスポンサードするものである場合は、当該団体等も主催者の定義に含まれます。
- 「参加者」とは、ユーザーのうち、主催者側以外の立場で本コンペに参加する方を意味します。
- 「成果物」とは、本コンペにおいて参加者により開発される学習済みモデル、そのソースコード及び乱数シード等の設定値を意味します。
- 「入賞者」とは、当社より本コンペに入賞した旨の通知を受けた参加者を意味します。
- 「知的財産権」とは、著作権(著作権法第27条及び第28条に定める権利を含みます。)、特許権、実用新案権、商標権、意匠権、その他のノウハウ及び技術情報等の知的財産権(それらの権利を取得し、又はそれらの権利につき登録等を出願する権利を含みます。)を意味します。
第3条(権利の帰属)
- 本コンペで発生した成果物に関する知的財産権は、参加者に帰属します。
第4条(入賞者の義務)
- 入賞者は、本コンペで公開した成果物を、MITライセンスを適用し、商用利用の許諾条項及び著作権人格権の包括的不行使条項をライセンス条項に付与した形式で、オープンソースソフトウェアとして公開する義務を負うものとします。その前提として、入賞者は、成果物について本項に基づく方法でオープンソース化する権利を有していることを当社に対して表明保証するものとします。
※第三者が、授業・研修・セミナー等で活用できるようにするための規約となります。ご理解のほどよろしくお願いいたします。
- 当社は、以下の3点の確認が完了した時点で、本コンペの賞金または商品を、入賞者に対して授与するものとします。
- 入賞者が、前項に基づいて成果物のオープンソース化を実施したこと
- 入賞者が、本規約、利用規約、その他ご同意いただいた規約のすべて、及びコンペティションサイトに掲載されているコンペティションに関するルールの一切に違反していないこと
- 当社が定める方法による本人確認
- 当社は、入賞者が第1項に基づいてオープンソース化した成果物を、自由に商用利用することができます。
第5条(禁止事項)
- 参加者は、本コンペにおいて、以下の各号のいずれかに該当する行為を行ってはならないものとします。
- クラッキングやチート行為、なりすまし、盗用等の不正行為
- 第三者の知的財産権その他の権利を侵害する内容ないし態様で、参加者公開事項を公開する行為
- 主催者(当社以外の者に限ります。)に対する直接連絡、相談、依頼、勧誘、勧誘対応等の活動(但し、当社を介して当社が認めた方法により行うものは除きます。)
- 本コンペにおいて、当該コンペと直接関係のない成果物等を提出すること
- 本規約における参加者としての地位又は参加者としての権利義務について、譲渡、移転、担保設定、その他の処分をすること
- その他、本規約、参加ルール及び利用規約に違反する行為
- 参加者が前項に規定する禁止行為を行ったと当社が認める場合、当社は、当該参加者に事前に通知することなく、当該参加者の本コンペにおける失格処分、当社サービスの全部又は一部の利用停止、ユーザー登録の抹消、その他当社が必要と判断した措置をとることができるものとします。
第6条(本コンペの変更、中断、終了等)
- 当社は、参加者に事前の通知をすることなく本規約に基づく本コンペの開催内容の変更、本コンペの一時的な中断又は終了を行うことができます。
- 当社は、本条に基づき当社が行った措置により生じた結果及び損害について、一切の責任を負わないものとします。
第7条(損害賠償)
- 参加者は、本コンペに関連して、自らの責に帰すべき事由により、当社、主催者その他の第三者に損害を与えた場合には、その一切の損害(逸失利益、弁護士費用を含みます。)を賠償するものとします。
- 参加者が本規約の規定に違反したことにより主催者(当社を除きます。)その他の第三者が当社に対して何らかの訴え、異議、請求等がなされた場合において、当社から処理の要請がなされたときは、参加者は自己の責任と費用負担において、当社に代わって当該第三者との紛争を処理するとともに、当社がかかる訴え、異議、請求等により被った一切の損害(逸失利益、弁護士費用を含みます。)を賠償するものとします。
第8条(本規約の変更)
当社は、必要と判断した場合には、参加者に対して事前に通知する(本コンペにかかる当社ウェブサイト上での告知その他当社が適当と認める方法を含みます。)ことにより、いつでも本規約を変更することができるものとします。なお、変更内容の通知後、参加者が当社の定める期間内に本コンペへの参加を取り消す手続をとらなかった場合には、当該参加者は変更後の規約に同意したものとみなされます。当社は、本規約の変更により参加者に生じたすべての損害について一切の責任を負いません。
第9条(その他)
本契約の準拠法は日本法とし、本契約に起因し又は関連する一切の紛争については、当社の本店所在地を管轄する裁判所を第一審の専属的合意管轄裁判所とします。
(制定)2021年11月14日