エンジニア

なんくるないさ

「このブログはアフィリエイト広告を利用しています」

kaggleのタイタニックにNNCを使って入門してみた(前処理偏)

kaggleがなんかデータ分析に良いって耳にしたのでkaggle入門のtitanicをNNCでやってみた

やったこと

  1. 前処理
  2. 前処理
  3. 前処理
  4. 学習

以上
(学習と評価はNNCっていう便利AIツールにやってもらいます)
今回はそのツールに投げるための前処理が9.9割です。

前処理

よし、さっそくデータ見よう!!!


import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)

import os
for dirname, _, filenames in os.walk('/kaggle/input'):
    for filename in filenames:
        print(os.path.join(dirname, filename))

#出力
#/kaggle/input/titanic/train.csv
#/kaggle/input/titanic/gender_submission.csv
#/kaggle/input/titanic/test.csv

ここにファイルがあるのね

train_df=pd.read_csv("/kaggle/input/titanic/train.csv",header=0)
test_df=pd.read_csv("/kaggle/input/titanic/test.csv",header=0)

とりあえずtrain,test用のデータフレームにいれます。 んで一部を見てみる

f:id:jump1268:20190825155936p:plain

ん~よくわからん。日本語でお願いしますって感じですね

いろいろ調べてわかったことは
trainにはsurvivedの列があって実際に生死がわかる
testにはsurvivedの列がない。
trainを使って学習モデルを作り、testにある人の生死を予測するぞってこと

じゃあまず何が必要かなって考える。
今回はNNCで学習させなきゃいけないことを考えると,,,,
f:id:jump1268:20190825160458p:plain 参考ページ
このような形にする必要がありそう

他にも
1. 欠損値がある
2. データに文字がある
この二つが邪魔そう

欠損値の処理

欠損値処理をするために欠損値がどれほどあるかを調べます
めちゃくちゃわかりやすい解説があり、今回はこれにほぼ乗っかています
参考

def kesson_table(df): 
        null_val = df.isnull().sum()
        percent = 100 * df.isnull().sum()/len(df)
        kesson_table = pd.concat([null_val, percent], axis=1)
        kesson_table_ren_columns = kesson_table.rename(
        columns = {0 : '欠損数', 1 : '%'})
        return kesson_table_ren_columns
 
print(kesson_table(train_df))
print(kesson_table(test_df))

cabinの欠損値とAge,Fare(1つだけ),embarked?の欠損があります
f:id:jump1268:20190825161057p:plain

train=train_df
train["Age"] = train["Age"].fillna(train["Age"].median())
train["Embarked"] = train["Embarked"].fillna("S")

とりあえず年齢は中央値でEmbarkedはSで埋めます

で性別の文字とembrakedは数字に直します(Embarkedは最終的に使ってないのでしなくてもよい)

train["Sex"][train["Sex"] =="male"]=0
train["Sex"][train["Sex"] =="female"]=1
train["Embarked"][train["Embarked"] == "S" ] = 0
train["Embarked"][train["Embarked"] == "C" ] = 1
train["Embarked"][train["Embarked"] == "Q"] = 2

同様に

test=test_df
test["Sex"][test["Sex"]== "male"]=0
test["Sex"][test["Sex"]== "female"]=1
test["Embarked"][test["Embarked"] == "S" ] = 0
test["Embarked"][test["Embarked"] == "C" ] = 1
test["Embarked"][test["Embarked"] == "Q"] = 2
test["Age"] =test["Age"].fillna(test["Age"].median())

んでtestに一つだけfareの欠損値があるので

test["Fare"].loc[152] = test.Fare.median()

で埋めます。


これで一般的な前処理は大体終わりました。
あとはSVMでも決定木でも、なんでもやってください
ただ機械学習なんにもわからないマンな僕はモデルがどんな形なのか
しっかり見たいのです。
そのためにNNCを使います

で神ツールのNNCが読める形にしなければいけません。

まず列を"x__0","x__1"..."y"とします

NNC_train=NNC_train[["Pclass","Sex","Age","Fare","Parch","Survived"]]
NNC_test=NNC_test[["Pclass","Sex","Age","Fare","Parch"]]

NNC_train1=pd.DataFrame()
NNC_test1=pd.DataFrame()

i=0
col = pd.DataFrame()
for y in  NNC_train.columns:
    print("x__"+str(i)+":"+y)
    i=i+1
    if y=="Survived":
        NNC_train1["y:"+y]=NNC_train[y]
        continue;
    NNC_train1["x__"+str(i)+":"+y]=NNC_train[y]

これでこんな感じのdfができます
f:id:jump1268:20190825162611p:plain

testファイルは0うめのsurvivedを付け足します

i=0
col = pd.DataFrame()
for y in  NNC_test.columns:
    print("x__"+str(i)+":"+y)
    i=i+1
    if y=="Survived":
        NNC_test1["y:"+y]=NNC_test[y]
        continue;
    NNC_test1["x__"+str(i)+":"+y]=NNC_test[y]
NNC_test1["y:Survived"]=0

これでこんな感じのができます

f:id:jump1268:20190825162517p:plain

少しつかれたので続きは次回