Kaggleのtitanicをしてみました

今年はKaggleのコンペに参加すべく、まずはtitanicから始めてみました。

手順については以下の記事が参考になりました。

機械学習を仕事に使うには? 03_Pythonのコーディング手順を全公開 - Qiita

Jupyter notebookのデータはgithubにあります。

kaggle/titanic at master · unokun/kaggle

レーニングデータ読み込み

以下のページからtrain.csvをダウンロードします。

Titanic: Machine Learning from Disaster | Kaggle

pandas.DataFrameに読み込みます。

# ライブラリのインポート
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

# トレーニングデータ読み込み
df = pd.read_csv('./train.csv')

# データ表示(一部)
df.head()

f:id:unokun3:20200105090718p:plain

変数の説明

train.csvをダウンロードしたページにあるData Dictionaryを参照します。

titanicタスクの場合、Survivalが目的変数、それ以外が説明変数になります。

Variable Definition Key
survival Survival 0 = No, 1 = Yes
pclass Ticket class 1 = 1st, 2 = 2nd, 3 = 3rd
sex Sex
Age Age in years
sibsp # of siblings / spouses aboard the Titanic
parch # of parents / children aboard the Titanic
ticket Ticket number
fare Passenger fare
cabin Cabin number
embarked Port of Embarkation C = Cherbourg, Q = Queenstown, S = Southampton

変数の概要を調べます。

データのバラツキなどを見る時に使います。titanicの生き残った人より死んだ人の方が多かったことがわかります。

# 説明変数の概要を調べる
df.describe()

f:id:unokun3:20200105090743p:plain

データクレンジング

欠損したデータの対応が、データクレンジングと呼ばれます。

まずは、データの欠損有無を調べます。

# データの欠損有無
df.isnull().sum()

f:id:unokun3:20200105090801p:plain

欠損値がある場合、1)データを削除する、2)特定の値を設定する方法があります。今回は平均値を設定しました。また、後述の分類(ランダムフォレスト)を実施するためには数値でない変数は使えないので、Cabin、Name、PassengerId、Ticketは説明変数から削除しました。

# 欠損値処理
# 平均値をセットする
df['Fare'] = df['Fare'].fillna(df['Fare'].median())
df['Age'] = df['Age'].fillna(df['Age'].median())
df['Embarked'] = df['Embarked'].fillna('S')

# カテゴリ変数の変換
df['Sex'] = df['Sex'].apply(lambda x: 1 if x == 'male' else 0)
df['Embarked'] = df['Embarked'].map( {'S': 0, 'C': 1, 'Q': 2} ).astype(int)

# 不要な変数削除
df = df.drop(['Cabin','Name','PassengerId','Ticket'],axis=1)

変数の相関を調べます。

生存(Survival)に強く関連する説明変数が旅客クラス(Pclass)、性別(Sex)、料金(Fare)であることがわかります。

# 説明変数の相関を調べる
df.corr()

f:id:unokun3:20200105090818p:plain

データの可視化

可視化ライブラリ(seaborn)を使うとデータに対する理解が深まります。

# データ可視化
sns.countplot('Sex',hue='Survived',data=df)

f:id:unokun3:20200105090835p:plain

機械学習

データの準備

  • レーニングデータ(説明変数)から目的変数(生存データ)を削除します。

  • 生存データを目的変数とします。

  • データの70%を使ってトレーニングを行い、残りの30%で精度評価します。
# https://www.randpy.tokyo/entry/python_random_forest
from sklearn.model_selection import train_test_split

# 説明変数(train_X)と結果に分割(train_y)
train_X = df.drop('Survived', axis=1)
train_y = df.Survived

# トレーニングデータとテストデータ(精度計測用)に分割
# https://docs.pyq.jp/python/machine_learning/tips/train_test_split.html
# test_size: テストデータのサイズ。トレーニングデータのサイズは1-テストデータのサイズ
# random_state: 乱数発生のシード。未指定の場合にはnp.randomが用いられる
(train_X, test_X ,train_y, test_y) = train_test_split(train_X, train_y, test_size = 0.3, random_state = 666)

分類

分類モデルはランダムフォレストを使ってみます。約82%の精度が得られました。

# ランダムフォレスト
# https://ja.wikipedia.org/wiki/%E3%83%A9%E3%83%B3%E3%83%80%E3%83%A0%E3%83%95%E3%82%A9%E3%83%AC%E3%82%B9%E3%83%88
from sklearn.ensemble import RandomForestClassifier
clf = RandomForestClassifier(n_estimators=100, random_state=0)
clf = clf.fit(train_X, train_y)
pred = clf.predict(test_X)

# 精度計算
from sklearn.metrics import (roc_curve, auc, accuracy_score)
fpr, tpr, thresholds = roc_curve(test_y, pred, pos_label=1)
auc(fpr, tpr)
accuracy_score(pred, test_y)

f:id:unokun3:20200105090907p:plain

特徴量の影響度を調べます。

性別(Sex)、年齢(Age)、料金(Fare)の影響が強かったことがわかります。データの相関では旅客クラス(Pclass)が高かったのですが、このデータは料金(Fare)と関連があるため、年齢の影響が強くなったのだと考えられます。

# 特徴量の影響度
fti = clf.feature_importances_ 
print('Pclass, Sex, Age, SibSp, Parch, Fare, Embarked')
print(fti)

f:id:unokun3:20200105090930p:plain

参考

coreml(apple)を試してみました

以下の記事を参考にcoreml(apple)を試してみました。

coremltools 3.1の環境構築(2019年11月版) - Qiita

実行環境

環境構築

appleのcoremltoolsを参考に環境構築。

apple/coremltools: Core ML Community Tools.

# 仮想環境作成
$ pip install virtualenv
$ virtualenv coreml
$ coreml/bin/activate

# coreml
(coreml) $ pip install -U coremltools
(coreml) $ pip install keras==2.2.4 tensorflow==1.14.0

# jupyter-labで実行するカーネルをインストール
(coreml) $ pip install ipykernel
(coreml) $ ipython kernel install --user --name=coreml

# jupyter-labインストール
(coreml) $ pip install jupyterlab

カーネルインストールは以下を参考にしました。

実行

jupyter-labを起動します。仮想環境外でもjupyter-labをインストールしている可能性があるので仮想環境のjupyter-labをパスを指定して呼び出した方が確実です。

$ coreml/bin/jupyter-lab

f:id:unokun3:20191124045735p:plain

インストールしたカーネルを選択します。

「Kernel/change kernel]メニューをクリック。

インストールしたカーネルの名前を選択します。

f:id:unokun3:20191124045931p:plain

画面右上のカーネルが選択したカーネル名になっていることがわかります。 f:id:unokun3:20191124050128p:plain

このままだとインストールしたモジュールが使えないのでパスを設定します。

設定前 f:id:unokun3:20191124050254p:plain

設定後 f:id:unokun3:20191124050318p:plain

インストールしたモジュール(Keras、tensorfow)のバージョンを確認します。 f:id:unokun3:20191124050602p:plain f:id:unokun3:20191124050627p:plain

updatable_mnist.ipynbを選択して実行します。問題なく最後まで実行できます。 f:id:unokun3:20191124050841p:plain

tensorflowをバージョン指定しない(2.0)場合、OperatorNotAllowedInGraphErrorが発生します。 f:id:unokun3:20191124051109p:plain f:id:unokun3:20191124051123p:plain

TODO

作成したモデルをアプリに組み込む予定です。

Flutter(続き)

Google公式サイトを参考に、Flutterアプリ(ステップ2まで)を作成してみました。

Googleの本気度が伝わりました。

Hot Reloadは便利ですね。

iOSアプリも変更が即時反映していたのは驚きました。

今回の作品です。

f:id:unokun3:20191109142843p:plain

参考

Flutterに触ってみました

Googleが開発するスマートフォンアプリ環境であるflutterに触ってみました。 iOSAndroidの両方で動くアプリケーションを開発できます。

本家のチュートリアル(MacOS版)を実施しました。

macOS install - Flutter

作成したアプリが実機で動くところまでは確認できました。後はUI部品(Widget)がどれくらい使えるかですね。

flutter SDKインストール

二つの方法があります。どちらも大差ありません。

zipファイルをダウンロードして解凍する

flutter_macos_v1.9.1+hotfix.6-stable.zip

gitからcloneする

flutter/flutter: Flutter makes it easy and fast to build beautiful mobile apps.

# パスの設定
.zshrcに設定しておくと毎回設定する必要はない。
export PATH="$PATH:[flutterをダウンロード(clone)したディレクトリ]/flutter/bin"

# git版でもflutter dockerすると必要なモジュールをダウンロードしてくれる。
$ flutter doctor

flutter app作成

$ flutter create my_app

Platformごとのセットアップ

iOS setup

install Xcode

すでにcommand-line toolのインストール済みの場合にはなにも実行されません。

 $ sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
 $ sudo xcodebuild -runFirstLaunch

Set up the iOS simulator

シミュレータを起動します。

$ open -a Simulator

run a simple Flutter app

iOSのシミュレータを起動しておくと、iOSアプリが起動します。

$ cd my_app
$ flutter run
Downloading ios tools...                                            4.8s
Downloading ios-profile tools...                                    3.2s
Downloading ios-release tools...                                   12.9s

Launching lib/main.dart on iPhone 11 Pro Max in debug mode...
Running Xcode build...

 ├─Assembling Flutter resources...                          11.2s
 └─Compiling, linking and signing...                        17.9s
Xcode build done.                                           35.9s
Syncing files to device iPhone 11 Pro Max...
 9,682ms (!)

🔥  To hot reload changes while running, press "r". To hot restart (and rebuild
state), press "R".
An Observatory debugger and profiler on iPhone 11 Pro Max is available at:
http://127.0.0.1:57661/vBeZHgO6_xE=/
For a more detailed help message, press "h". To detach, press "d"; to quit,
press "q".

f:id:unokun3:20191104124756p:plain

Deploy to iOS devices

実機にdeployするためには、Xcodeからインストールする必要があります。Xcodeプロジェクトが作成されるのですね。

$ ls ios
Flutter                 Runner                  Runner.xcworkspace
Frameworks              Runner.xcodeproj        ServiceDefinitions.json

$ open Runner.xcodeproj

実機の場合には、signinする必要があります。

f:id:unokun3:20191104130107p:plain

モジュール管理にはcocoapodsを使っているようです。

$ sudo gem install cocoapods
Password:
Fetching: thread_safe-0.3.6.gem (100%)
Successfully installed thread_safe-0.3.6
Fetching: tzinfo-1.2.5.gem (100%)
...
Fetching: cocoapods-1.8.4.gem (100%)
Successfully installed cocoapods-1.8.4
30 gems installed

実機にインストールします。 f:id:unokun3:20191104131635j:plain

Android setup

Install Android Studio

割愛

Set up the iOS simulator(emulator)

Android StudioからAVD Managerを起動する。 f:id:unokun3:20191104125358p:plain

run a simple Flutter app

$ flutter run

Using hardware rendering with device Android SDK built for x86. If you get
graphics artifacts, consider enabling software rendering with
"--enable-software-rendering".
Launching lib/main.dart on Android SDK built for x86 in debug mode...
Running Gradle task 'assembleDebug'...
Running Gradle task 'assembleDebug'... Done                        79.4s
✓ Built build/app/outputs/apk/debug/app-debug.apk.
Installing build/app/outputs/apk/app.apk...                         3.5s
I/Choreographer( 5078): Skipped 56 frames!  The application may be doing too much work on its main thread.
D/EGL_emulation( 5078): eglMakeCurrent: 0xd8067180: ver 3 0 (tinfo 0xefade5e0)
I/OpenGLRenderer( 5078): Davey! duration=1339ms; Flags=1, IntendedVsync=231214310519, Vsync=232147643815, OldestInputEvent=9223372036854775807, NewestInputEvent=0, HandleInputStart=232154779768, AnimationStart=232154810458, PerformTraversalsStart=232154812593, DrawStart=232172042436, SyncQueued=232188163101, SyncStart=232221350860, IssueDrawCommandsStart=232221553060, SwapBuffers=232468630724, FrameCompleted=232587351657, DequeueBufferDuration=71181000, QueueBufferDuration=2190000,
Syncing files to device Android SDK built for x86...
D/EGL_emulation( 5078): eglMakeCurrent: 0xebd85420: ver 3 0 (tinfo 0xebd836d0)
Syncing files to device Android SDK built for x86...            13,622ms (!)
🔥  To hot reload changes while running, press "r". To hot restart (and rebuild
state), press "R".
An Observatory debugger and profiler on Android SDK built for x86 is available
at: http://127.0.0.1:58674/R0KmIpo2wI4=/
For a more detailed help message, press "h". To detach, press "d"; to quit,
press "q".

f:id:unokun3:20191104125336p:plain

実機にインストールします。

f:id:unokun3:20191104131823p:plain

その他

device一覧

Android

$ flutter devices
2 connected devices:

ANE LX2J                  • SCV7N18522006899 • android-arm64 • Android 9 (API
28)
Android SDK built for x86 • emulator-5554    • android-x86   • Android 9 (API
28) (emulator)

iPhone

$ flutter devices
1 connected device:

宇野昌明のiPhone • a5f6160a18c068493881fcd58ecf93eb8b81438a • ios • iOS 13.1.3

emulators一覧

$ flutter emulators
2 available emulators:

Nexus_5X_API_28         • Nexus 5X API 28         • Google • android
apple_ios_simulator     • iOS Simulator           • Apple  • ios

JVMの仕組み

JVMに関するとても分かりやすい記事です。

お勧めです。

第1回 JVMはどのようにメモリ空間を利用するのか:Javaはどのように動くのか~図解でわかるJVMの仕組み|gihyo.jp … 技術評論社

第1回 問題の発生に備えてどんなことを知っておくべきか:Javaでなぜ問題が起きるのか 〜システムをきちんと運用するための基礎知識|gihyo.jp … 技術評論社

Centos7でgit 2.x系を使う

古いバージョンのgitを削除

$ sudo  yum remove git

最新版のgitが入っているレポジトリを取得

$ sudo yum -y install https://centos7.iuscommunity.org/ius-release.rpm

デフォルト無効にする

# sudo cat vi /etc/yum.repos.d/ius.repo

[ius]
name = IUS for Enterprise Linux 7 - $basearch
baseurl = https://repo.ius.io/7/$basearch/
enabled = 0      # 1→0に変更
repo_gpgcheck = 0
gpgcheck = 1

確認

iusパッケージが無効になっていればOK

$ sudo yum repolist all
...
ius-archive/x86_64                 IUS for Enterprise Linux 7 - Arc 無効
ius-archive-debuginfo/x86_64       IUS for Enterprise Linux 7 - Arc 無効
...

インストール

$sudo yum install git --enablerepo=ius --disablerepo=base,epel,extras,updates

エラーが発生したので以下を試しました。

$sudo yum --enablerepo=ius list git2u

存在していたのでインストール。

$ sudo yum install git2u --enablerepo=ius

centosやめてubuntuに変えようかと思う今日この頃...

参考

coreファイルを使ったgoのデバッグ

以下の記事を参考にcore dumpからgoプログラムのデバッグする方法をためしてみた。

Analyzing Core Dump Generated By Go Program - Speaker Deck

C言語の場合gdbを使うが、go言語の場合、dlvを使うようだ。

覚えておいて損はなさそう。ただし、macosではcoreファイルが作成されないようだ。残念。

$ ulimit -c unlimited
$ cat main.go
package main

func main() {
    var p *int
    p = nil
    *p = 1
}

$ export GOTRACEBACK=crash
$ go build main.go
$ ./main
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x44ebb2]

goroutine 1 [running]:
panic(0x45d560, 0x4b7ce0)
    /usr/local/go/src/runtime/panic.go:556 +0x2cb fp=0xc000032720 sp=0xc000032690 pc=0x421edb
runtime.panicmem()
    /usr/local/go/src/runtime/panic.go:82 +0x5e fp=0xc000032740 sp=0xc000032720 pc=0x420f1e
runtime.sigpanic()
    /usr/local/go/src/runtime/signal_unix.go:390 +0x182 fp=0xc000032790 sp=0xc000032740 pc=0x4342f2
main.main()
    /home/unokun/work/go/main.go:6 +0x2 fp=0xc000032798 sp=0xc000032790 pc=0x44ebb2
runtime.main()
    /usr/local/go/src/runtime/proc.go:201 +0x207 fp=0xc0000327e0 sp=0xc000032798 pc=0x423bc7
runtime.goexit()
    /usr/local/go/src/runtime/asm_amd64.s:1333 +0x1 fp=0xc0000327e8 sp=0xc0000327e0 pc=0x448d21

goroutine 2 [force gc (idle)]:
runtime.gopark(0x470bd8, 0x4b9ae0, 0x1410, 0x1)
    /usr/local/go/src/runtime/proc.go:302 +0xeb fp=0xc000032f80 sp=0xc000032f60 pc=0x423fab
runtime.goparkunlock(0x4b9ae0, 0x1410, 0x1)
    /usr/local/go/src/runtime/proc.go:308 +0x53 fp=0xc000032fb0 sp=0xc000032f80 pc=0x424053
runtime.forcegchelper()
    /usr/local/go/src/runtime/proc.go:251 +0xb3 fp=0xc000032fe0 sp=0xc000032fb0 pc=0x423e23
runtime.goexit()
    /usr/local/go/src/runtime/asm_amd64.s:1333 +0x1 fp=0xc000032fe8 sp=0xc000032fe0 pc=0x448d21
created by runtime.init.4
    /usr/local/go/src/runtime/proc.go:240 +0x35

goroutine 3 [GC sweep wait]:
runtime.gopark(0x470bd8, 0x4b9ba0, 0x41140c, 0x1)
    /usr/local/go/src/runtime/proc.go:302 +0xeb fp=0xc000033780 sp=0xc000033760 pc=0x423fab
runtime.goparkunlock(0x4b9ba0, 0x47140c, 0x1)
    /usr/local/go/src/runtime/proc.go:308 +0x53 fp=0xc0000337b0 sp=0xc000033780 pc=0x424053
runtime.bgsweep(0xc000052000)
    /usr/local/go/src/runtime/mgcsweep.go:52 +0x8f fp=0xc0000337d8 sp=0xc0000337b0 pc=0x418a9f
runtime.goexit()
    /usr/local/go/src/runtime/asm_amd64.s:1333 +0x1 fp=0xc0000337e0 sp=0xc0000337d8 pc=0x448d21
created by runtime.gcenable
    /usr/local/go/src/runtime/mgc.go:216 +0x58
[1]    29625 abort (core dumped)  ./main

$ ls
core.29625  main  main.go

$ dlv core main core.29625
Type 'help' for list of commands.
(dlv) bt
 0  0x000000000044a624 in runtime.raise
    at /usr/local/go/src/runtime/sys_linux_amd64.s:146
 1  0x00000000004344ab in runtime.dieFromSignal
    at /usr/local/go/src/runtime/signal_unix.go:424
 2  0x0000000000434928 in runtime.sigfwdgo
    at /usr/local/go/src/runtime/signal_unix.go:629
 3  0x0000000000433d08 in runtime.sigtrampgo
    at /usr/local/go/src/runtime/signal_unix.go:289
 4  0x000000000044a913 in runtime.sigtramp
    at /usr/local/go/src/runtime/sys_linux_amd64.s:353
 5  0x000000000044aa00 in runtime.sigreturn
    at /usr/local/go/src/runtime/sys_linux_amd64.s:445
 6  0x000000000043466a in runtime.crash
    at /usr/local/go/src/runtime/signal_unix.go:518
 7  0x00000000004224d7 in runtime.fatalpanic
    at /usr/local/go/src/runtime/panic.go:708
 8  0x0000000000421edb in runtime.gopanic
    at /usr/local/go/src/runtime/panic.go:556
 9  0x0000000000420f1e in runtime.panicmem
    at /usr/local/go/src/runtime/panic.go:82
10  0x00000000004342f2 in runtime.sigpanic
    at /usr/local/go/src/runtime/signal_unix.go:390
11  0x000000000044ebb2 in main.main
    at ./main.go:6
12  0x0000000000423bc7 in runtime.main
    at /usr/local/go/src/runtime/proc.go:201
13  0x0000000000448d21 in runtime.goexit
    at /usr/local/go/src/runtime/asm_amd64.s:1333
(dlv) frame 11
> runtime.raise() /usr/local/go/src/runtime/sys_linux_amd64.s:146 (PC: 0x44a624)
Warning: debugging optimized function
Frame 11: ./main.go:6 (PC: 44ebb2)
     1: package main
     2:
     3: func main() {
     4:     var p *int
     5:     p = nil
=>   6:      *p = 1
     7: }
(dlv) locals
p = (unreadable empty OP stack)
(dlv) disass
TEXT main.main(SB) /home/unokun/work/go/main.go
    main.go:6   0x44ebb0    31c0        xor eax, eax
    main.go:6   0x44ebb2    48c70001000000  mov qword ptr [rax], 0x1
    main.go:7   0x44ebb9    c3      ret
(dlv) regs
...
     Rax = 0x0000000000000000
...
(dlv)