Santander Customer Transaction Prediction に挑戦してみた。(その1)
Santander Customer Transaction Prediction に挑戦をしてみました。(提出期限は過ぎており、3つのチュートリアルを経て、4回目の挑戦)
このコンペは、20万人のデータ(1人につき200個のデータがあるが、何のデータかは不明)を分析し、その顧客は「サービスを購入するか?」、「ローンを払えるか?」を決めるものです。(多分・・・)
何のデータかも明かされておらず、目的も定かではいようでしたが、要するに、20万人を「0」「1」に振り分ける二値分類の問題です。ですが、提出するデータは0〜1の確率で示したものなのでご注意ください。(1回目の提出は0、1に変換して出してしまいました・・・)
- Santander Customer Transaction Prediction に挑戦してみた。(その2)
- Santander Customer Transaction Prediction に挑戦してみた。(その3)
参考文献
https://book.mynavi.jp/ec/products/detail/id=90124
https://www.manning.com/books/deep-learning-with-python
この記事について
- Kerasを用いて分析
- プログラミングを初めて1ヶ月の初心者が書いています。(もちろん、機械学習も初めて)
- コピペで提出まで完了しますが、モデルや前処理が良いものとは限りません。
開発環境
- python 3.7.3
- jupyter 1.0.0
- Keras 2.2.4
- matplotlib 3.1.0
- numpy 1.16.4
- pandas 0.24.2
- tensorflow 1.13.1
- scikit-learn 0.21.2
- scipy 1.3.0
- seaborn 0.9.0
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn.preprocessing import StandardScaler
import keras
from keras.models import Sequential
from keras.layers import Dense, Activation, Dropout
from keras import optimizers
(1)訓練データとテストデータ
使用するデータをダウンロード
データはこちらからダウンロードできます。(https://www.kaggle.com/c/santander-customer-transaction-prediction/data)
データの読み込み
# ファイルの場所を指定します
train = pd.read_csv("/Users/*****/Desktop/Kggale/santander-customer-transaction-prediction/train.csv")
test = pd.read_csv("/Users/*****/Desktop/Kggale/santander-customer-transaction-prediction/test.csv")
データの中身を確認する
訓練データ
訓練データは「200000行202列」で構成されており、20万人1人1人に「ID_code」と「target(ラベル)」と「200個のデータ」が与えられています。
print(train.shape)
train.head()
テストデータ
こちらも訓練データと同じ構成をしていますが、「target」が記されていない、「200000行201列」です。このコンペは、テストデータの「target」 を予測する問題です。
print(test.shape)
test.head()
統計量の確認(訓練データ)
今回は、特に使用しませんでしたが、どの程度データにばらつきがあるのかなどを確認しました。
検証に行く前に正規化を行なっていますが、しなくてもいいのでは?とも思いました。
train.describe()
(2)データをニューラルネットワーク用に変換
NumPy配列にする
DataFrameから値を取り出して、浮動小数点数のベクトルに変換しました。
x_train = train.iloc[:, 2:].values.astype("float32")#訓練データ
train_targets = train["target"].values.astype("float32")#訓練データラベル
y_train = test.iloc[:, 1:].values.astype("float32")#テストデータ
(3)データを詳しく見る
200個のデータをヒストグラムで表示(保存)
200個のデータをそれぞれ、「"target"が0の人」「"target"が1の人」に分けて、ヒストグラムで表示
"target"が0の人と1の人の人数が大きく異なり、グラフを重ね合わせると比較しにくいため、y軸を両方設定し、比較しやすいようにした。
train_columns_name = train.columns[2:]#データのカラムの名前のリスト
for i in range(len(train_columns_name)):
hist_data = train.iloc[:, [1, (i+2)]]
hist_data_0 = hist_data[hist_data["target"]==0]
hist_data_1 = hist_data[hist_data["target"]==1]
fig, ax1 = plt.subplots(figsize = (20, 10))
# ax1とax2を関連させる
ax2 = ax1.twinx()
ax1.hist(hist_data_0[train_columns_name[i]], bins = 300, label="0", alpha = 0.5, color = "red")
ax2.hist(hist_data_1[train_columns_name[i]], bins = 300, label="1", alpha = 0.5, color = "cornflowerblue")
handler1, label1 = ax1.get_legend_handles_labels()
handler2, label2 = ax2.get_legend_handles_labels()
# 凡例をまとめて出力する
ax1.legend(handler1 + handler2, label1 + label2)
plt.title("var_"+str(i), fontsize=20)
#通常、下の2行のどちらかはコメントアウト
plt.savefig("var_"+str(i)+".png")#表示だけなら、ここをコメントアウト
plt.show()#保存だけなら、ここをコメントアウト
保存された画像(グラフ)を見て、"target"を決まる際に影響が大きそうなものを選ぶ
次のように分類した(明確に分けるプログラムを組んだわけではなく、目視での確認のため、僕の価値観が大きく影響している気がします・・・)
- 大きく影響しそうなもの
- 少しは影響してそうなもの
- 影響してなさそうなもの
200枚の画像を載せるわけには行かないので、いくつか紹介します。
赤色のヒストグラムが「0の人」、青色のヒストグラムが「1の人」です。
■大きく影響しそうなもの
■少しは影響してそうなもの
■影響してなさそうなもの
振り分け結果
下のように振り分けてみました。(狙ったわけではありませんが、約3等分されています。)
目視で振り分けましたが、きっちりとしたルールを設けて振り分けるのがいいかなと思いました。
# ■大きく影響しそうなもの
high_feature_list = [1,6,9,12,13,18,21,22,26,32,33,34,40,44,53,56,67,
68,75,76,78,80,81,82,86,87,89,92,108,109,110,121,122,
123,133,134,139,146,148,164,165,166,169,170,173,174,
177,179,184,188,190,191,192,197,198,199]
# ■少しは影響してそうなもの
medium_feature_list = [0,2,5,20,23,24,28,31,35,36,43,48,49,51,52,58,
63,66,70,71,77,83,85,88,90,91,93,94,95,99,101,104,105,
106,107,111,112,114,115,116,118,119,120,125,127,128,
130,131,132,135,137,141,142,143,145,147,149,150,153,
154,155,156,157,162,163,167,172,178,180,186,187,193,
194,195,196]
# ■影響してなさそうなもの
low_feature_list = [3,4,7,8,10,11,14,15,16,17,19,25,27,29,30,37,38,39,
41,42,45,46,47,50,54,55,57,59,60,61,62,64,65,69,72,73,74,
79,84,96,97,98,100,102,103,113,117,124,126,129,136,138,
140,144,151,152,158,159,160,161,168,171,175,176,181,182,
183,185,189]
(4)[番外編]面白い形をしたヒストグラムができました!
一体、どんなデータをとったらこのようになるのか知りたいです。何のデータかわからないことがとても残念です・・・
(他にも面白いデータがありました)
続きはこちらから
Santander Customer Transaction Prediction に挑戦してみた。(その2)