読者です 読者をやめる 読者になる 読者になる

プログラミングを上達させたい

プログラミングの勉強を始めた、情報学専攻の大学院生です。モチベーション維持のため、ブログに勉強したことを書いていきます。→就職。IT全然関係ない仕事をしています

引き続き、少しKaggle(Titanicの例題)

昨日の今日なので、まだやる気は続いています。
明日から仕事なので、また一旦途切れることでしょう。
いや途切れるなよ

昨日の記事では、実際にKaggleで提出をし、
少し答えを改良するところまでやりました。
使った問題はTitanicの例題です。
JenderModelという、性別のみで分ける超単純な推定です。
今回は、もう少しだけ回答を改良しました。

参考にしたのは、Kaggle内にあるこのページ
ちゃんとこういうチュートリアルがあるんですね。易しい。
ただ、英語で書かれています。英語で書くなよ

このページを参考にして、
『性別(Sex)、部屋のランク(Pclass)、料金のランク(Fareを少しいじったもの)で、生死を推定する』という回答を作りました。
書いたRのコードはこんな感じです。
使いこなせたら大分嬉しいらしい、apply関数も使ってみました。

traindata <- read.table("train.csv", header=T, sep=",")
testdata <- read.table("test.csv", header=T, sep=",")

faredevide <- function(x){
	if(is.na(x)){
		return(1)
	}else if(x < 20){
		return(1)
	}else if(x < 20){
		return(2)
	}else if(x < 30){
		return(3)
	}else{
		return(4)
	}
}

# FareRankという列を追加する
traindata["FareRank"] <- apply(traindata["Fare"], 1, faredevide)
testdata["FareRank"] <- apply(testdata["Fare"], 1, faredevide)

 out <- file("./ansFor3ele.csv", "w") # 書き込みモードで開く
 writeLines("PassengerId,Survived", out) # ヘッダーを記入

 for (i in 1:nrow(testdata)) {
 	nowdata <- testdata[i,]
 	nowtraindata <- traindata[traindata$Sex == nowdata$Sex & traindata$FareRank == nowdata$FareRank & traindata$Pclass == nowdata$Pclass, ]
 	nowsurviveddata <- nowtraindata["Survived"]
 	nowscore <- sum(nowsurviveddata) / nrow(nowsurviveddata)
 	writeLines(paste(testdata[i, "PassengerId"]), out, sep = ",")
 	if(nowscore < 0.5){
 		writeLines(paste(0), out, sep = "\n")
 	}else{
 		writeLines(paste(1), out, sep = "\n")
 	}
 }
 close(out)                        # ファイルを閉じる

いちいち、traindataを全て走査するのがダサいですが・・・
今回はデータが小さいので大丈夫でした。データが大きくなったら、上のようなやり方ではなくて、
注目要素の組み合わせごとの値を先に出すようにしないとダメですね。

FareRankについて、説明を。
Fareを10刻みで、0~10,10~20,20~30,30~の4ランクに分ける関数『faredevide』を作りました。
そんで、『Fare』にそれを作用させた『FareRank』というデータを作って、使うわけです。

ここで手こずったのが、『データ内に普通にNAがあること』です。
AtCoderとかのプログラミングコンテストではなかった、『欠損値』というものが普通に入ってきてるんですね。
それに気づくのにだいぶかかりました。

それはさておき、上のコードで作った回答を提出すると・・・
スコア:0.77990 (0.01435.アップ!)
2402位/3754(全体) ( 約700位アップ!)
となり、自己ベスト!
というか、前回よりスコアの上がり幅が大分小さくなったのに、順位の上がり方はこっちの方が大きかったです。
かなり細かい差の戦いになるんですね・・・

あと、Kaggleが定めている『My First Random Forest』のスコア(0.77512)を超えてしまいました。ええぇ・・・・
まぁしかし、どうやらランダムフォレストは大事な手法らしいので、ちゃんとチャレンジします。しますとも。

スコアが少し改良されて嬉しかったので記事更新。
少しずつ続けていければ・・・!

広告を非表示にする