「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つに分けられます。
「テーブルデータ」のカラム毎の意味は下記の通りです。
※画像とテーブルデータは「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
...
本コンペでは、開催期間終了後 賞金対象者のコードを公開し、ユーザーの皆様にチーティング有無をレビューしていただき順位確定させる、オープンレビュー方式のコンペティションを行います。
コード公開後1週間:
レビュアー(ユーザー)より、チーティングの疑いに関するコメントがある場合は、ご回答をお願いいたします。
※チーティングとは無関係のコメント(ノウハウに関する質疑 等)についてもご回答いただけると幸いですが、順位確定の判断材料とは致しません。
レビュアーからの質疑と、回答状況をふまえて、最終的に運営側で順位確定を判断します。
開始 2021/11/15 15:00 JST
提出締切 2022/2/13 22:00 JST
LB公開 2022/2/13 24:00 JST
エントリー締め切り なし
※コンペ期間中であっても、不正が疑われる場合は、運営より確認のためメール連絡させていただくことがございます。一週間以内にご回答いただけない場合も、不正と判断させていただきます。
公平性の担保、チーティング等の不正防止のため、予告なくルールの追加・変更を行う場合がございます。
ご不便をおかけすることもあるかと思いますが、サービス向上のためご了承ください。
はい。
精度の高い学習モデルを作成された入賞者様へ、賞金を贈呈します。
順位確定までのプロセスについては、ルール「Open Review Competition」を参照ください。
可能です。チームページから作成いただけます。
本コンペティションから取得できるデータのみを用いてチャレンジして下さい。
ただし、コンペ外データ(KivaのAPIから取得できるデータは除く)を用いて学習された学習済みモデルの使用は可能とします。
Seed を固定することが推奨です。
ただし、Seed を固定しなくても提出用コードとしては認めています。
(2021/12/29追記)
ファイル提出後、23時間ごとにリセットとなります。
グローバル展開していくにあたり、居住国(時差)による有利・不利を最小化するため、一定時間でリセットされる仕様としております。
このチュートリアルでは、Kivaデータに対して
を行います。
#環境確認
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('説明変数','目的変数')
と記述することでモデルの学習が可能となります。目的変数を説明変数の組み合わせで説明可能な回帰モデルを作成できます。
#scikit-learnライブラリをimport
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参加規約(以下「本規約」といいます。)に同意いただく必要があります。利用規約にて定義された用語は、本規約においても同様の意味で用いられるものとします。
第1条(適用)
第2条(定義)
本規約において次の各用語の定義は、それぞれ以下に定めるとおりとします。
第3条(権利の帰属)
第4条(入賞者の義務)
第5条(禁止事項)
第6条(本コンペの変更、中断、終了等)
第7条(損害賠償)
第8条(本規約の変更)
当社は、必要と判断した場合には、参加者に対して事前に通知する(本コンペにかかる当社ウェブサイト上での告知その他当社が適当と認める方法を含みます。)ことにより、いつでも本規約を変更することができるものとします。なお、変更内容の通知後、参加者が当社の定める期間内に本コンペへの参加を取り消す手続をとらなかった場合には、当該参加者は変更後の規約に同意したものとみなされます。当社は、本規約の変更により参加者に生じたすべての損害について一切の責任を負いません。
第9条(その他)
本契約の準拠法は日本法とし、本契約に起因し又は関連する一切の紛争については、当社の本店所在地を管轄する裁判所を第一審の専属的合意管轄裁判所とします。
(制定)2021年11月14日