LoginSignup
16
18

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-05-18

この記事

データ分析の勉強のために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:視覚的にアルゴリズムを理解するサイト

16
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
18