プログラミングの芽

面白そうな技術を使って、楽しいことやりたい

k最近傍法でTitanic生存者予測

機械学習の勉強ちゃんとしなきゃなって想いでやりました。
タイトル通り、k最近傍法でTitanic生存者予測コンペをやります。普通だと決定木とか使うみたいですね。

参考


順順にやっていきます。

とりあえずtrain.csvとtest.csvを読み込む

import pandas as pd

train_df = pd.read_csv("train.csv")
test_df  = pd.read_csv("test.csv")


訓練データと訓練ラベルに分ける

#Survived、Sex、Ageを取り出す。
#male = 0、female = 1とする。
#Ageの欠損値は中央値で埋める。
train_df = train_df[["Survived", "Sex", "Age"]].replace("male", 0).replace("female", 1).fillna(train_df["Age"].median())

X_train = train_df[["Sex", "Age"]] #訓練データ
y_train = train_df["Survived"] #訓練ラベル


訓練をする。

from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=5) #n_neighbors : 近傍点の数

knn.fit(X_train, y_train) #訓練

>>KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
           metric_params=None, n_jobs=1, n_neighbors=5, p=2,
           weights='uniform')


テストデータを予測する。

X_test = test_df[["Sex", "Age"]].replace("male", 0).replace("female", 1).fillna(test_df["Age"].median())

y_pred = knn.predict(X_test) #予測

print("Test set predictions:\n {}".format(y_pred))
#print("Test set score: {:.2f}".format(knn.score(X_test, y_test))) #y_test(テストデータの正解ラベル)があれば正解率もわかる。

>>Test set predictions:
 [0 0 0 1 1 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 1 0 1 0 1 0 1 1 1 0 0 1 0 0 1
 0 0 1 0 1 0 1 1 0 0 1 0 1 1 0 1 1 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 1 0 0 0
 1 0 1 1 0 1 0 0 1 1 0 1 1 0 1 1 1 1 1 1 0 0 0 0 0 0 1 0 1 0 1 0 0 1 1 0 0
 1 1 0 0 0 1 1 1 1 1 1 1 0 1 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 1 0 1 0
 1 0 1 1 0 1 1 0 1 1 1 1 1 0 1 1 0 1 1 0 1 1 1 1 0 1 0 1 1 0 1 0 0 0 1 1 1
 0 0 0 1 0 0 1 0 0 1 0 1 0 0 1 1 1 0 1 0 1 0 0 1 0 0 1 0 0 0 1 1 0 1 1 1 0
 1 0 1 1 0 1 0 0 0 1 0 1 0 0 0 0 1 1 1 0 0 1 1 1 1 0 1 1 1 0 1 0 0 1 1 0 1
 0 0 0 1 1 0 1 1 1 1 0 0 1 1 1 1 1 0 0 0 0 1 1 1 0 0 0 1 1 1 1 1 0 1 0 0 0
 1 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 1 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 1 0 1
 1 1 0 0 0 0 1 0 0 1 1 1 1 0 0 0 1 1 0 0 0 1 0 1 1 1 0 0 1 1 1 1 1 1 1 1 0
 0 1 1 0 1 1 1 0 0 1 1 0 1 1 0 1 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 0 1 1 1 0 0
 0 1 0 1 1 1 1 1 0 1 1]

訓練データをさらに訓練用とテスト用に分けると、未知データに対する評価ができると思います。
ここではやりませんが。

提出用のcsvに書き出す。

import csv

submit_file = open("submit.csv", "w", newline="")
file_object = csv.writer(submit_file)
file_object.writerow(["PassengerId", "Survived"])
ids = test_df["PassengerId"].values
file_object.writerows(zip(ids, y_pred))
submit_file.close()


結果
f:id:atarms:20190131134258p:plain
0.73205でした。
訓練データにPclassも入れてみたら、画像の通り0.60765でした。

どうでもいいですけど、私は最初機械学習ライブラリの良さがよくわかりませんでした。
一行で訓練できるとはよく言いますけど、実際訓練させようとしたら上のような感じで1行じゃないじゃん。って思ってました。
最近になってようやく、一行で訓練できるって言葉に納得できるようになりました。

以上