見出し画像

python:機械学習(タイタニックの生存者を予測)

機械学習の練習として、タイタニックで生き残る人を機械に予測してもらうプログラミングを書いていきます。

データをダウンロード

下記のURLでタイタニックで生き残る人を機械で予測するために必要なデータがダウンロードできます。

Download Allで3つのファイルをダウンロードし、自分のPCの適当な場所に保存します。

キャプチャ

今回は、この3つのファイルの中で下記の2つを使用します。

・test == 機械が学習した後にテストするファイル

・train == 機械が学習するためのファイル

ファイルをpythonで読み込む

import pandas as pd
import numpy as np

train = pd.read_csv("C:/Users/user/Desktop/titanic/train.csv")
test = pd.read_csv("C:/Users/user/Desktop/titanic/test.csv")

train.head()

キャプチャ

test.head()

キャプチャ

pandasのread_csv()メソッドを使えば、簡単にCSVファイルを読み込むことができます。

.head(読み込みたい行数)メソッドで読み込んだCSVファイルをプレビューすることができます。読み込みたい行数を何も指定しなければ、最初の5行を表示できます。

読み込んでみると、乗客IDや名前、性別、年齢…色々な情報が記載されております。その中で『Survived』という項目で生存していれば、1、死んだ場合は0で表示されています。

項目についての詳細は、下記のURLへ詳しく記載されております。

機械が学習する用のファイルtrainでは『Survived』という項目はありますが、testファイルでは『Survived』はありません。

欠損データの確認

NAや抜けているデータがあると機械は学習できません。

.isnull()でNAの項目に対しては、True、それ以外にはFalseを返します。.sum()でTrueの数を集計しています。

train.isnull().sum()

キャプチャ

test.isnull().sum()

キャプチャ


欠損データに代理データを入れる

trainファイルでは『Age』と『Cabin』と『Embarked』に欠損データがありましたが、今回は、その中でも『Age』と『Embarked』しか使用しないので、その2項目の欠損データに代理データをいれていきます。

まず、Ageには中央値を入れていきます。

train["Age"] = train["Age"].fillna(train["Age"].median())

欠損値を他の値に置換(穴埋め)するにはfillna()メソッドを使います。

上記でちゃんと置換できたのか、.isnull().sum()で確認してみます。

train.isnull().sum()

キャプチャ

NAが0となっていましたので『Age』項目はOKです。


次に、『Embarked』の欠損データに代理データを入れていきます。

『Embarked』S,C,Qで構成されており、データを見てみると、Sがダントツで一番多かったので、欠損箇所にはSを入れておきます。

『Age』と同じように.fillna()メソッドを使います。

キャプチャ

.isnull().sum()で確認すると0となっており、ちゃんと置換されていました。

文字列から数値列へ変換する

機械学習につかう項目で『Sex』や『Embarked』は数値ではなく、文字で表現されていました。maleやfemale、S,Q,C…

キャプチャ

機械に学習させるには数値に変換しておく必要があります。ただし、Nameは機械学習には使わないので変換は行いません。

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["Age"] = test["Age"].fillna(test["Age"].median())
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


機械に学習させる

scikit-learnのインポート

from sklearn import tree

機械学習でとても便利なライブラリであるscikit-learnを使うのでインポートします。

目的変数と説明変数の設定

target = train["Survived"].values
features_one = train[["Pclass", "Sex", "Age"]].values

目的変数は予測したい変数のことです。今回は生存するか、死ぬかを予測したいのでその項目を表す『Survived』を設定します。

説明変数は目的変数を説明するための変数。要は、目的変数を導くための変数となります。今回は、PclassとSexとAgeを使ってみます。

モデルの設定と学習

my_tree_one = tree.DecisionTreeClassifier()
my_tree_one = my_tree_one.fit(features_one, target)

今回は決定木モデルを使って、予測します。上記の2行で機械は学習が完了します。

決定木とは木が枝分かれするように段階的にデータを分割していき、最終的な答えに導くというような分析方法。詳しくは以下のURLに説明されていますのでご参照してみてください。

機械の学習結果

testファイルの説明変数の値を取得

test_features = test[["Pclass", "Sex", "Age"]].values

testファイルの説明変数を使って「my_tree_one」のモデルで予測

my_prediction = my_tree_one.predict(test_features)

testファイルの説明変数の値を取得して、その説明変数によって、目的変数を予測します。

PassengerIdを取得

PassengerId = np.array(test["PassengerId"]).astype(int)

my_prediction(予測データ)とPassengerIdをデータフレームへ落とし込む

my_solution = pd.DataFrame(my_prediction, PassengerId, columns = ["Survived"])

乗客IDと機械が予測したSurvivedを横並びにしたデータフレームを作成します。

CSVファイルの書き出し

my_solution.to_csv("my_tree_one.csv", index_label = ["PassengerId"])

作業している場所にCSVが保存されます。任意の場所に保存したければ、"my_tree_one.csv" この部分を任意のパスに変更します。

キャプチャ

上記のようなCSVファイルが作成できます。

Kaggleにこのファイルを投稿して、精度を確かめる

上記のURLにアクセスし、Submit Predictionsをクリックし、さきほど作成したCSVファイルを投稿します。

キャプチャ

キャプチャ

すると、右端にScoreが出てきます。今回は60%でした。微妙ですね。。

精度を高めるために…

精度を高めるために生き残る要素に影響が高い項目は何か、確認してみましょう。

import matplotlib.pyplot as plt

#空リストの作成
test_list = []

#test_list[0]にSurvivedが0のデータを格納
#test_list[1]にSurvivedが1のデータを格納
for survived in [0,1]:
   test_list.append(train[train.Survived==survived])
   

#test_list[0]のAge項目でNAを除いたデータと
#test_list[1]のAge項目でNAを除いたデータを作成
data = [i["Pclass"].dropna() for i in test_list]


#ヒストグラフの表示。積み上げ型
plt.hist(data, stacked=True)
plt.show()

オレンジ色が生きた人で青色が死んだ人です。

キャプチャ

チケットのクラスを表すPlassを見てみると、3rdクラスで死んでる人が多いということがわかります。チケットのクラスによって、救助の優先順位が変わっていたのかもしれません。

次にAgeを見てみます。すると、70歳以上の人は殆ど死んでいるように見えて、10歳未満は半数以上が生きていますね。

キャプチャ

このような感じで項目を見ていき、影響が高い項目を説明変数に指定することによって、精度が高められます。

以上でpythonでの機械学習でした。ぜひ、ご参考ください。

過去記事


この記事が気に入ったらサポートをしてみませんか?