Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Kaggleにチャレンジ タイタニック

More than 3 years have passed since last update.

この記事

データ分析の勉強のためにkaggleにチャレンジしたメモ。
チュートリアルである「titanic」を試したが,pandasとかscikitとか,わからないことが多すぎる。下のコードでいけると思ったけど,スコアが良くない。

問題

(誤解を恐れずにざっくり説明すると)タイタニックの乗組員で生き残った人はどんな人たちかを考える問題。
与えられるのはtrainデータとtestデータで,どちらのデータにも性別や年齢などのデータが入っている。ただし,trainデータには生存データ(0/1)があるがtestデータにはない。つまり,trainデータから生存モデルを作ってtestデータの生存を予測する問題。(正誤は予測データをwebサイトで提出して確認できる。)

コード

# 下ごしらえ
def df_cleaner(df):
    # 足りない部分は補おう
    # 年齢
    median_age = np.median(df[(df['Age'].notnull())]['Age'])
    for passenger in df[(df['Age'].isnull())].index: #.index = 配列内のnullの場所
        df.loc[passenger, 'Age'] = median_age
    # fare
    median_fare = np.median(df[(df['Fare'].notnull())]['Fare'])
    for passenger in df[(df['Fare'].isnull())].index:
        df.loc[passenger, 'Fare'] = median_fare

    # 文字列データを数値データへ
    df.loc[(df['Sex'] == 'male'),'Sex'] = 0
    df.loc[(df['Sex'] == 'female'),'Sex'] = 1
    df.loc[(df['Sex'].isnull()),'Sex'] = 2
    df.loc[(df['Embarked'] == 'S'),'Embarked'] = 0
    df.loc[(df['Embarked'] == 'C'),'Embarked'] = 1
    df.loc[(df['Embarked'] == 'Q'),'Embarked'] = 2
    df.loc[(df['Embarked'].isnull()),'Embarked'] = 3

    return df

# 提出用csvを作りましょ
def make_csv(file_path, passengerId, predicts):
    f = open(file_path, "wb")
    writer = csv.writer(f)
    writer.writerow(["PassengerId", "Survived"])
    for row, survived in zip(passengerId, predicts):
        writer.writerow([row, survived])

# 作ったモデルの性能をしれべましょ
def getScore(answer, predicts):
    sum_p = 0.0
    total = 0.0
    for (row, predict) in zip(answer,predicts):
        if row == predict:
            sum_p += 1.0
        total += 1.0
    return sum_p/total

def main():
    # Read in the training data.
    train = pd.read_csv('./data/train.csv')
    test = pd.read_csv("./data/test.csv")
    # いらないデータ(予想)は消しましょう
    train.drop(['Name', 'PassengerId', 'Ticket', 'Cabin'], axis=1, inplace=True)
    test.drop(['Name', 'Ticket', 'Cabin'], axis=1, inplace=True)

    # 下ごしらえをする
    train = df_cleaner(train)
    test = df_cleaner(test)
    x_train = train[:][['Pclass', 'Sex','Age', 'SibSp', 'Parch', 'Fare', 'Embarked']]
    y_train = train[:][['Survived']]
    # ランダムフォレストでモデルを作ろう
    scores =[]
    for trees in range(1,100):
        model = RandomForestClassifier(n_estimators=trees)
        model.fit(x_train, np.ravel(y_train))
        # 一致率を見よう
        pre = model.predict(x_train)
        scores.append(getScore(y_train['Survived'],pre))
    plt.plot(scores,'-r')
    plt.show()

    # 本番のテストデータをお化粧直し
    x_test = test[:][['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked']]
    label = test[:][['PassengerId']]
    # modelを使って予測しよう
    output = model.predict(x_test)
    # 提出用csvを作ろう
    make_csv("./output/random_forest.csv", label['PassengerId'], output.astype(int))

if __name__ == '__main__':
    main()

github

ソースコード

スコア

上のコード:0.75120
チュートリアルのコピペ:0.76555

感想

オリジナルの方が悪い。。。
アルゴリズムとしては間違っていないと思うので,scikitのrandom forestの部分をもう少し調べてみる必要がありそう。

別件

アルゴリズムを視覚化して理解するサイトを作りました。タイタニックの問題はありませんがサンフランシスコの問題は関係あるので載せておきます。
Library of Algorithms:視覚的にアルゴリズムを理解するサイト

simanezumi1989
大学時代に微分方程式の定性的理論に関する研究が国際誌に掲載せれたことが自慢です。
http://fromalgorithm.jimdo.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away