Kaggle(24) - タイタニック(Titanic)コンペ - 決定木編

今回はアルゴリズムに決定木を使ってみます。

決定木とは、ツリー状に条件分岐を繰り返すことによって分類するクラスを予測するモデルです。

枝分かれ部分の条件は、データの変数を使って作ります。

データ読み込みと前処理

Kaggleに準備されているタイタニックの訓練データを読み込みます。

データの前処理(不要列の削除・欠損処理・カテゴリ変数の変換)と、正解ラベルとそれ以外にデータを分けるところまで一気に実行します。

[ソース]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import numpy as np
import pandas as pd

df_train = pd.read_csv('/kaggle/input/titanic/train.csv')

# データ前処理
def preprocessing(df):
# 不要な列の削除
df.drop(['Name', 'Ticket', 'Cabin'], axis=1, inplace=True)

# 欠損値処理
df['Age'] = df['Age'].fillna(df['Age'].median())
df['Fare'] = df['Fare'].fillna(df['Fare'].median())
df['Embarked'] = df['Embarked'].fillna('S')

# カテゴリ変数の変換
df = pd.get_dummies(df, columns=['Sex', 'Embarked'])

return df

x_titanic = preprocessing(df_train.drop(['Survived'], axis=1))
y_titanic = df_train['Survived']

決定木アルゴリズムで学習・推測

決定木アルゴリズムを準備します。

学習・推測を行う前に、分割交差検証を使ってどのくらいの正答率になるか調べてみます。

[ソース]

1
2
3
4
5
6
7
8
9
from sklearn import svm, metrics, model_selection
from sklearn import tree

clf = tree.DecisionTreeClassifier(max_depth=5)

# 分割交差検証を実行
score = model_selection.cross_val_score(clf, x_titanic, y_titanic, cv=4) # cv=4は4分割の意
print('各正解率', score)
print('正解率', score.mean())

[出力]

平均正解率は78.34%とそこそこの結果というところでしょうか。


決定木アルゴリズムで学習を行い、データを予測し提出用のCSVファイルを作成します。

[ソース]

1
2
3
4
5
6
7
8
9
10
11
12
# 学習する
clf.fit(x_titanic, y_titanic)

# データを予測
df_test = pd.read_csv('/kaggle/input/titanic/test.csv')
pre = clf.predict(preprocessing(df_test))

# 予測結果をファイルに出力
result = pd.DataFrame(df_test['PassengerId'])
result['Survived'] = pre
result
result.to_csv('tree_result.csv', index=False)

予測結果を提出します。

[提出結果]

提出結果は71.291%という正解率になりました。

前回記事のSVMの時よりはましになりましたが、7割程度の正解率ではイマイチですね。