機械学習の勉強ちゃんとしなきゃなって想いでやりました。
タイトル通り、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()
結果
0.73205でした。
訓練データにPclassも入れてみたら、画像の通り0.60765でした。
どうでもいいですけど、私は最初機械学習ライブラリの良さがよくわかりませんでした。
一行で訓練できるとはよく言いますけど、実際訓練させようとしたら上のような感じで1行じゃないじゃん。って思ってました。
最近になってようやく、一行で訓練できるって言葉に納得できるようになりました。
以上