0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[Kaggle]Santander Customer Transaction Prediction(その1)

Last updated at Posted at 2019-06-07

Santander Customer Transaction Prediction に挑戦してみた。(その1)

Santander Customer Transaction Prediction に挑戦をしてみました。(提出期限は過ぎており、3つのチュートリアルを経て、4回目の挑戦)
このコンペは、20万人のデータ(1人につき200個のデータがあるが、何のデータかは不明)を分析し、その顧客は「サービスを購入するか?」、「ローンを払えるか?」を決めるものです。(多分・・・)
何のデータかも明かされておらず、目的も定かではいようでしたが、要するに、20万人を「0」「1」に振り分ける二値分類の問題です。ですが、提出するデータは0〜1の確率で示したものなのでご注意ください。(1回目の提出は0、1に変換して出してしまいました・・・)

参考文献

https://book.mynavi.jp/ec/products/detail/id=90124
https://www.manning.com/books/deep-learning-with-python
90124_ext_06_0.jpg

この記事について

  • 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
0-1
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)

データの読み込み

1-1
# ファイルの場所を指定します
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個のデータ」が与えられています。

1-2
print(train.shape)
train.head()

テストデータ

こちらも訓練データと同じ構成をしていますが、「target」が記されていない、「200000行201列」です。このコンペは、テストデータの「target」 を予測する問題です。

1-3
print(test.shape)
test.head()

統計量の確認(訓練データ)

今回は、特に使用しませんでしたが、どの程度データにばらつきがあるのかなどを確認しました。
検証に行く前に正規化を行なっていますが、しなくてもいいのでは?とも思いました。

1-4
train.describe()

スクリーンショット 2019-06-07 午後12.58.14 午後.png

(2)データをニューラルネットワーク用に変換

NumPy配列にする

DataFrameから値を取り出して、浮動小数点数のベクトルに変換しました。

2-1
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軸を両方設定し、比較しやすいようにした。

3-1
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の人」です。

■大きく影響しそうなもの

赤と青にズレが大きいものは、影響が大きいと判断しました。
var_44.png
var_190.png

■少しは影響してそうなもの

var_43.png
var_104.png

■影響してなさそうなもの

var_7.png
var_38.png

振り分け結果

下のように振り分けてみました。(狙ったわけではありませんが、約3等分されています。)
目視で振り分けましたが、きっちりとしたルールを設けて振り分けるのがいいかなと思いました。

3-2
# ■大きく影響しそうなもの
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)[番外編]面白い形をしたヒストグラムができました!

一体、どんなデータをとったらこのようになるのか知りたいです。何のデータかわからないことがとても残念です・・・
(他にも面白いデータがありました)
var_68.png
var_108.png

続きはこちらから
Santander Customer Transaction Prediction に挑戦してみた。(その2)

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?