#この記事は
機械学習を始めたばかりの素人がkaggleのcompetisionに参加するまでの記事です。
実際に参加してどういったことが学べたのか、書きたいと思います。
#kaggleとは
データサイエンティストが登録している世界最大のデータ解析コンペサイトです。
https://www.kaggle.com/
賞金も出ます。リクルートさんやメルカリさんもコンペ開催して一時期話題になってました。
#なんのコンペに参加するか
有名なタイタニック号の事故の生存率に参加します。
https://www.kaggle.com/c/titanic
データもここからダウンロードします。
#分析環境
MacBook Air (13-inch, Mid 2012) ←買い換えたい
python version3.6.3
##手順
###用意されてるデータ
ライブラリのimportとデータの中身を見ます。
import pandas as pd
from pandas import Series,DataFrame
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
df = pd.read_csv('train.csv')
df.head()
df.info()
df.describe()
countが列の数、meanが中央値、stdが標準偏差を表しています。
Ageの欠損値が多いよう。
↓以下は参考にデータの中身を可視化。
sns.countplot('Sex',data=df)
sns.countplot('Pclass',data=df)
sns.countplot('Pclass',data= df,hue='Sex')
特に3等には男性が多い。女性は基本男性の配偶者の立場で乗船していたんだろうと推測。
df['Age'].hist(bins=80)
plt.figure(figsize=(10,5))
sns.pointplot(x='Embarked', y='Survived',data=df, color='g')
乗船した港と生存率。S港とC港では1.5倍の生存率の差がある。
sns.factorplot('Embarked','Survived', col='Pclass',data=df)
###特徴量の設計
やっていることは
・Ageの欠損値を中央値に
・文字列を数値に変換
・予測値に関係なさそうな値を削除
df.Age = df.Age.fillna(df.Age.mean())
df = df.replace('male',0).replace('female',1).replace('C',0).replace('Q',1).replace('S',2)
df.drop(['PassengerId', 'Name', 'Ticket', 'Cabin'], axis=1, inplace=True)
df = df.dropna()
df_data = df.values
df.head(10)
corrmat = df.corr()
corrmat
##モデル作成
random forestを使います。
####random Forestとは?
多様なたくさん作り、それぞれ個別の木のアウトプットの多数決を取るアルゴリズムです。
下記図は決定木のイメージです。これの木の数と木の深さが予測精度を決める重要な要素になってきます。
以下はモデル作成とkaggle提出用のcsv作成。
from sklearn.ensemble import RandomForestClassifier
forest = RandomForestClassifier(n_estimators =90)
forest = forest.fit(df_data[0::,1::],df_data[0::,0])
test = pd.read_csv('test.csv')
ids = test["PassengerId"].values
test.Age = test.Age.fillna(test.Age.mean())
test.Fare = test.Fare.fillna(test.Fare.mean())
test = test.replace("male",0).replace("female",1).replace("C",0).replace("Q",1).replace("S",2)
test = test.drop(["Name", "Ticket", "Cabin", "PassengerId"], axis=1)
test_data = test.values
submit = forest.predict(test_data)
import csv
submit_file = open("submit.csv", "w")
file = csv.writer(submit_file)
file.writerow(["PassengerId","Survived"])
file.writerows(zip(ids, submit.astype(np.int64)))
output_file.close()
これで出来ました。投稿出来ます。
##気になる順位は?
結果は、、、
予測精度0.75598
順位は9716中8713位でした!
低い!特徴量の設計とモデルも見直します。
#所感
・順位が表示されてやる気が出る。
・特徴量の設計からモデル作成して実際に予測するところまで出来て、データサイエンスの一通りの手順を学べる。
・色々なデータサイエンティストが投稿していて刺激を受ける。
・普通に楽しい
#参考
https://towardsdatascience.com/enchanted-random-forest-b08d418cb411