kuzushikiのぺーじ

セキュリティに関することを書きたいですね

GitHub Twitter

Kaggleで企業の倒産予測に挑戦

kaggleで起業の倒産予測にチャレンジしました

自身の研究で機械学習に触れていたこともあり、興味があったのでkaggleに初挑戦してみました!

チュートリアルとして有名なTitanic, House Pricesに加え、面白そうな問題だったCompanies bankruptcy forecast(企業の倒産予測)を解いてみました。

Titanic

タイタニック号の生存者予測をする問題です。

この問題に関しては日本語のチュートリアルが沢山あるので説明は割愛させていただきます。

このチュートリアルほぼコピペ参考にしました。

結果は0.77511ポイントで9550位でした。

FireShot Capture 019 - Titanic_ Machine Learning from Disaster - Kaggle - www kaggle com

House Prices

家の値段を予想する問題です。

この問題も日本語のチュートリアルが沢山あるので説明は割愛させていただきます。

今回はコピペでは無く、自分で考えながらプログラムを書きました。

家の広さの指標が最も家賃に影響すると考えたので、以下のようなプログラムを作りました。

import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
df = pd.read_csv("../input/house-prices-advanced-regression-techniques/train.csv")
# 結果は省略
df.head()
# ここがオリジナル
# 1F, 2F, BFの面積を足したものをXとした
X = df[["1stFlrSF"]].values + df[["2ndFlrSF"]].values + df[["TotalBsmtSF"]].values
y = df["SalePrice"].values
# 線形回帰
slr = LinearRegression()
slr.fit(X,y)
# NAを0に
df_test = pd.read_csv("../input/house-prices-advanced-regression-techniques/test.csv")
df_test["TotalBsmtSF"] = df_test["TotalBsmtSF"].fillna(0)
# 結果は省略
df_test
X_test = df_test[["1stFlrSF"]].values + df_test[["2ndFlrSF"]].values + df_test[["TotalBsmtSF"]].values
y_test = slr.predict(X_test)
df_test["SalePrice"] = y_test
df_test[["Id","SalePrice"]].to_csv("submission.csv",index=False)

結果は0.24761ポイントで3833位でした

FireShot Capture 022 - House Prices_ Advanced Regression Techniques - Kaggle - www kaggle com

Companies bankruptcy forecast

日本語のサイトでオススメされている問題は上記の2つぐらいでした。

「次は何やろうか?」と色々問題を探していました。

すると、勉強会のメンバーの方が、「企業倒産予測」という面白そうな問題をやっていたので、自分もやってみることにしました。

問題のリンク

倒産を予測するにあたって、以下のデータがあります。

Data fields
attr1 - net profit / total assets
attr2 - total liabilities / total assets
attr3 - working capital / total assets
attr4 - current assets / short-term liabilities
attr5 - [(cash + short-term securities + receivables - short-term liabilities) / (operating expenses - depreciation)] * 365
attr6 - retained earnings / total assets
attr7 - EBIT / total assets
attr8 - book value of equity / total liabilities
attr9 - sales / total assets
attr10 - equity / total assets
attr11 - (gross profit + extraordinary items + financial expenses) / total assets
attr12 - gross profit / short-term liabilities
attr13 - (gross profit + depreciation) / sales
attr14 - (gross profit + interest) / total assets
attr15 - (total liabilities * 365) / (gross profit + depreciation)
attr16 - (gross profit + depreciation) / total liabilities
attr17 - total assets / total liabilities
attr18 - gross profit / total assets
attr19 - gross profit / sales
attr20 - (inventory * 365) / sales
attr21 - sales (n) / sales (n-1)
attr22 - profit on operating activities / total assets
attr23 - net profit / sales
attr24 - gross profit (in 3 years) / total assets
attr25 - (equity - share capital) / total assets
attr26 - (net profit + depreciation) / total liabilities
attr27 - profit on operating activities / financial expenses
attr28 - working capital / fixed assets
attr29 - logarithm of total assets
attr30 - (total liabilities - cash) / sales
attr31 - (gross profit + interest) / sales
attr32 - (current liabilities * 365) / cost of products sold
attr33 - operating expenses / short-term liabilities
attr34 - operating expenses / total liabilities
attr35 - profit on sales / total assets
attr36 - total sales / total assets
attr37 - (current assets - inventories) / long-term liabilities
attr38 - constant capital / total assets
attr39 - profit on sales / sales
attr40 - (current assets - inventory - receivables) / short-term liabilities
attr41 - total liabilities / ((profit on operating activities + depreciation) * (12/365))
attr42 - profit on operating activities / sales
attr43 - rotation receivables + inventory turnover in days
attr44 - (receivables * 365) / sales
attr45 - net profit / inventory
attr46 - (current assets - inventory) / short-term liabilities
attr47 - (inventory * 365) / cost of products sold
attr48 - EBITDA (profit on operating activities - depreciation) / total assets
attr49 - EBITDA (profit on operating activities - depreciation) / sales
attr50 - current assets / total liabilities
attr51 - short-term liabilities / total assets
attr52 - (short-term liabilities * 365) / cost of products sold)
attr53 - equity / fixed assets
attr54 - constant capital / fixed assets
attr55 - working capital
attr56 - (sales - cost of products sold) / sales
attr57 - (current assets - inventory - short-term liabilities) / (sales - gross profit - depreciation)
attr58 - total costs /total sales
attr59 - long-term liabilities / equity
attr60 - sales / inventory
attr61 - sales / receivables
attr62 - (short-term liabilities *365) / sales
attr63 - sales / short-term liabilities
attr64 - sales / fixed assets
class - the response variable Y: 0 = did not bankrupt; 1 = bankrupt

種類が多い上に指標の意味が良く分かりません。

経済学を一切勉強してこなかったことを少し悔やみました。

とりあえず全部の指標を用いることにしました。

以下プログラム

import pandas as pd
import pandas_profiling as pdp
import numpy as np
from sklearn.ensemble import RandomForestClassifier
df = pd.read_csv("../input/companies-bankruptcy-forecast/bankruptcy_Train.csv")
df_test_class = pd.read_csv("../input/companies-bankruptcy-forecast/bankruptcy_Test_X.csv")
df_test = df_test_class.drop(["ID"], axis=1)
df_x = df.drop(["class"], axis=1)
df_y = df["class"]
random_forest = RandomForestClassifier(n_estimators=100)
random_forest.fit(df_x, df_y)
# predict_probaを用いることで0,1ではなく確率を算出
# [:, 1] を付けると1(倒産)の確率を求められる
Y_pred = random_forest.predict_proba(df_test)[:, 1] 
Y_pred 
df_test_class["class"] = Y_pred
df_test_class[["ID","class"]].to_csv("submission.csv",index=False)

結果は0.87537ポイントでした。

(終了済みのコンテストのせいか順位は出ませんでした。)

FireShot Capture 023 - Companies bankruptcy forecast - Kaggle - www kaggle com

感想

こんなに簡単にできるなんて!

ただ、上位を目指すにはデータの意味を考え、取捨選択をする必要があると感じました。

他にも数字の判定(MNIST)や動画の真偽判定(deepfake)のチュートリアルとなるnotebookを見て、ソースコードを読んだりしました。

気が向いたらまたやりたいですね。

気になること

この記事を書いていて思ったのですが、ipynbファイルを出力も含めて綺麗なmarkdownにするにはどうすればいいでしょう?

このツールを使いましたが、表の出力などがjson形式になってしまい、うまくできませんでした…