こんにちは! 初投稿です!
kaggleのタイタニック沈没事故の生存予測を実施してみたので投稿します!
分かりやすくするためにプログラムの記述と結果を細かく記載しています。
今回は決定木を使いました!
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import missingno as msno
from sklearn.tree import DecisionTreeClassifier
train = pd.read_csv('train.csv') #学習用データ
test = pd.read_csv('test.csv') #予測データ
train.head()
変数の解説↓
"Survived":生死(0:死亡 1:生存)
"Pclass":チケットのランク
"Name":名前
"Sex":性別
"Age":年齢
"SibSp":同乗している兄弟・配偶者の数
"Parch":同乗している親・子供の数
"Ticket":チケット番号
"Fare":料金
"Cabin":客室番号
"Embarked":出港地
msno.bar(train)
データ数を見ると、Age・Cabinのデータ数が少ないようです。
#Ageの欠損部分に中央値を代入します。
train["Age"] = train["Age"].fillna(train["Age"].median())
msno.bar(train)
#Sexを数値化 「male」→0 「female」→1
train.replace({"male":0,"female":1},inplace=True)
#出港場所を質的変換
train = pd.concat([train, pd.get_dummies(train["Embarked"], prefix="Embarked")], axis=1).drop(columns=["Embarked"])
#不要な列を削除
train = train.drop(columns=["Name", "Ticket", "Cabin"])
train.head()
結果↓
データが数値化されて見やすくなりました。これでtrainデータの前処理は終了です。
続いてtestデータを見てみましょう!
test.head()
結果↓
テストデータなので目的変数のSurvivedがありませんね。
次にtrainデータと同じようにtestデータの欠損を確認してみましょう。
msno.bar(test)
Age・Fare・Cabinのデータ数が少ないことが分かります。
#Age・Fareの欠損部分に中央値を代入します。
test['Age'] = test['Age'].fillna(test['Age'].median())
test['Fare'] = test['Fare'].fillna(test['Fare'].median())
msno.bar(test)
#Sexを数値化 「male」→0 「female」→1
test.replace({"male":0,"female":1},inplace=True)
#出港場所を質的変換
test = pd.concat([test, pd.get_dummies(test["Embarked"], prefix="Embarked")], axis=1).drop(columns=["Embarked"])
#不要な列を削除
test = test.drop(columns=["Name", "Ticket", "Cabin"])
test.head()
#「Pclass(チケットのランク)」、「Sex(性別)」、「Age(年齢)」、「Fare(料金)」を元に、目的変数「Survived(生死のフラグ)」を予測するモデルを作成
train_features = train[['Pclass', 'Sex', 'Age', 'Fare', 'Embarked_C', 'Embarked_Q', 'Embarked_S']].values
train_target = train['Survived'].values
#モデルを作成の上、学習を実施
model = DecisionTreeClassifier(max_depth = 5, class_weight = 'balanced', random_state=0)
model.fit(train_features, train_target)
#テストデータの特徴量を取得して、上記で作成したモデルで目的変数を予測
test_features = test[['Pclass', 'Sex', 'Age', 'Fare', 'Embarked_C', 'Embarked_Q', 'Embarked_S']].values
predict_test_target = model.predict(test_features)
submission = pd.DataFrame({'PassengerId': test['PassengerId'], 'Survived': predict_test_target})
submission.to_csv('submission_Titanic_DecisionTreeClassifier.csv', index = False )
これで決定木の機械学習は終了です。
さて、今回の予測結果をkaggleに提出してみましょう。
スコアは0.73でした。まだまだ改善の余地がありそうです。前処理に標準化・正規化などをするとスコアが上がるかもしれません。
今後もkaggleのタイタニックコンペに関する投稿をしていきます!
ありがとうございました!