Kaggle チャレンジ 3日目 タイタニックの問題 モデル作りに挑戦

シェアする

  • このエントリーをはてなブックマークに追加

スポンサーリンク

はじめに

 今回は、前回までにデータを分析し、使用するデータを整えた状態で実際に色々な手法で学習させ、実際に精度を計測していきたいと思います。

前回の記事:

Kaggle チャレンジ 1日目 タイタニックの問題からデータを読み解いてみる

Kaggle チャレンジ 2日目 タイタニックの問題でデータ分析に挑戦


やること

 前回のデータからタイタニックの問題をGoogleColaboratoryとKernelsを使って実際に分析していきたいと思います。

・今回参考にするKernels: Titanic Data Science Solutions

GoogleColaboratoryの使い方はこちら

対象者

機械学習をKaggleを使って学びたい方、Kaggleに興味があるけどどうすればいいかわからない方。

 

Titanic : Machine Learning from Disaster

 まず、前回必要ない特徴を削除し、欠損値のある特徴には補完、そしてカテゴリを持つ特徴を数値に置き換えるなどしてデータを整えました。最初の10件を表示させたのが次のものになります。このデータを使ってモデルをトレーニングし、テストデータの生存者を予測していきます。

In[1]:

test_df.head(10)

Out[1]:

PassengerId Pclass Sex Age Fare Embarked Title IsAlone Age*Class
0 892 3 0 2 0 2 1 1 6
1 893 3 1 2 0 0 3 0 6
2 894 2 0 3 1 2 1 1 6
3 895 3 0 1 1 0 1 1 3
4 896 3 1 1 1 0 3 0 3
5 897 3 0 0 1 0 1 1 0
6 898 3 1 1 0 2 2 1 3
7 899 2 0 1 2 0 1 0 2
8 900 3 1 1 0 1 3 1 3
9 901 3 0 1 2 0 1 0 3

モデル

モデルをトレーニングするための準備が整ったので実際に問題を予測していきます。今回の問題は、分類と回帰の問題です。 他の変数や特徴(性別、年齢、乗船港など)と生存との関係(生存しているか否か)を予測したい。 今回、与えられたデータセットでモデルを学習させているので、教師あり学習です。 これらの2つの基準(教師あり学習と分類と回帰)では、モデルの選択肢をいくつかに絞り込むことができます。 それが次のものになります。順番に試していきましょう。

  • Logistic Regression
  • KNN or k-Nearest Neighbors
  • Support Vector Machines
  • Naive Bayes classifier
  • Decision Tree
  • Random Forrest
  • Perceptron
  • Artificial neural network
  • RVM or Relevance Vector Machine

In[2]:

X_train = train_df.drop("Survived", axis=1)
Y_train = train_df["Survived"]
X_test  = test_df.drop("PassengerId", axis=1).copy()
X_train.shape, Y_train.shape, X_test.shape

Out[2]:

((891, 8), (891,), (418, 8))

Logistic Regression

 ロジスティック回帰は、ロジスティック関数を使用して確率を推定することによって、カテゴリ依存変数(特徴)と1つ以上の独立変数(今回の場合:survived)との間の関係を測定する。

In[3]:

# Logistic Regression

logreg = LogisticRegression()
logreg.fit(X_train, Y_train)
Y_pred = logreg.predict(X_test)
acc_log = round(logreg.score(X_train, Y_train) * 100, 2)
acc_log
80.36

 ロジスティック回帰を使用して、前回の前提について検証できます。 これは、決定関数内の特徴の係数を計算することによって行なうことができます。

  • 正の係数は応答の対数 – オッズを増加させ(したがって確率を増加させる)、負の係数は応答の対数 – オッズを減少させる(したがって確率を減少させる)。 
  • 性別値が高いほど(男性:0〜女性:1)、生存確率= 1が最も高くなります。
  • 逆にPclassが増加すると、Survived = 1の確率が最も低下します。

 このように、Age * Classは、Survivedと2番目に高い負の相関を持つため、モデル化するための優れた人工的に作成した特徴です。2番目に高い正の相関を得られたタイトルも同様です。

In[4]:

coeff_df = pd.DataFrame(train_df.columns.delete(0))
coeff_df.columns = ['Feature']
coeff_df["Correlation"] = pd.Series(logreg.coef_[0])

coeff_df.sort_values(by='Correlation', ascending=False)

Out[4]:

Feature Correlation
1 Sex 2.201527
5 Title 0.398234
2 Age 0.287163
4 Embarked 0.261762
6 IsAlone 0.129140
3 Fare -0.085150
7 Age*Class -0.311200
0 Pclass -0.749007

Support Vector Machines

 SVMの最大の特徴は「マージン最大化」です。マージン最大化とは、学習データの中で最も他クラスと近い位置にいるもの(サポートベクトル)を基準として,そのユークリッド距離が最も大きくなるような位置に識別境界を設定することをいいます.結果はロジスティック回帰より良いものが得られています。

In[5]:

# Support Vector Machines

svc = SVC()
svc.fit(X_train, Y_train)
Y_pred = svc.predict(X_test)
acc_svc = round(svc.score(X_train, Y_train) * 100, 2)
acc_svc

Out[5]:

83.84

k-Nearest Neighbors

パターン認識において、k近傍法(略してk-NN)は、学習データをベクトル空間上にプロットしておき、未知のデータが得られたら、そこから距離が近い順に任意のK個を取得し、多数決でデータが属するクラスを推定する。

KNNのスコアはロジスティック回帰よりも良いがSVMより悪かった。

In[6]:

knn = KNeighborsClassifier(n_neighbors = 3)
knn.fit(X_train, Y_train)
Y_pred = knn.predict(X_test)
acc_knn = round(knn.score(X_train, Y_train) * 100, 2)
acc_knn

Out[6]:

84.74

Naive Bayes classifier

 単純ベイズ分類器の元となる確率モデルは強い(単純な)独立性仮定と共にベイズの定理を適用することに基づいている。

確率モデルの性質に基づいて、単純ベイズ分類器は教師あり学習で効率的に学習可能である。多くの実用例では、単純ベイズ分類器のパラメータ推定には最尤法が使われる。

(数式なしでうまく説明できそうになかったのでwikiから引っ張ってきました。気になる方は、ナイーブベイズ分類器と検索してください)

In[7]:

# Gaussian Naive Bayes

gaussian = GaussianNB()
gaussian.fit(X_train, Y_train)
Y_pred = gaussian.predict(X_test)
acc_gaussian = round(gaussian.score(X_train, Y_train) * 100, 2)
acc_gaussian

Out[7]:

72.28

Perceptron

パーセプトロンは、入力ベクトル(x)と重みベクトル(w)を掛け合わせた値を足して、その値が閾値を超えたか超えなかったかで分類をするシンプルな2値分類です。

In[8]:

perceptron = Perceptron()
perceptron.fit(X_train, Y_train)
Y_pred = perceptron.predict(X_test)
acc_perceptron = round(perceptron.score(X_train, Y_train) * 100, 2)
acc_perceptron

Out[8]:

78.0

In[9]:

# Linear SVC

linear_svc = LinearSVC()
linear_svc.fit(X_train, Y_train)
Y_pred = linear_svc.predict(X_test)
acc_linear_svc = round(linear_svc.score(X_train, Y_train) * 100, 2)
acc_linear_svc

Out[9]:

79.12

In[10]:

# Stochastic Gradient Descent

sgd = SGDClassifier()
sgd.fit(X_train, Y_train)
Y_pred = sgd.predict(X_test)
acc_sgd = round(sgd.score(X_train, Y_train) * 100, 2)
acc_sgd

Out[10]:

77.67

Decision Tree

 決定木は、「段階的にデータを分割していき、木のような分析結果を出力する」ものです。特徴としては次のようなものになっている

  • 解釈が容易
  • 数値、カテゴリデータが混在していても大丈夫
  • 必要な前処理が少ない
  • 汎化性能が低い
  • 「分類」にも「回帰」にも利用可

モデルのスコアはこれまでに評価されたモデルの中で最も高い。

In[11]:

# Decision Tree

decision_tree = DecisionTreeClassifier()
decision_tree.fit(X_train, Y_train)
Y_pred = decision_tree.predict(X_test)
acc_decision_tree = round(decision_tree.score(X_train, Y_train) * 100, 2)
acc_decision_tree

Out[11]:

86.76

 Random Forest

 ランダムフォレストは、複数の決定木を使用して、「分類」または「回帰」をする、機械学習の代表的なアルゴリズムです。

名前の由来は、木が集まって、アンサンブル的な学習を行うことからフォレストと称されます。

In[12]:

# Random Forest

random_forest = RandomForestClassifier(n_estimators=100)
random_forest.fit(X_train, Y_train)
Y_pred = random_forest.predict(X_test)
random_forest.score(X_train, Y_train)
acc_random_forest = round(random_forest.score(X_train, Y_train) * 100, 2)
acc_random_forest

Out[12]:

86.76

モデル評価

すべてのモデルの評価をランク付けして、問題のための最良のモデルを選ぶことができます。 Decision TreeとRandom Forestのスコアは同じですが、Random Forestを使用することに決めました。理由は決定木がトレーニングセットにあふれてしまう習慣を修正するためです。

In[13]:

models = pd.DataFrame({
    'Model': ['Support Vector Machines', 'KNN', 'Logistic Regression', 
              'Random Forest', 'Naive Bayes', 'Perceptron', 
              'Stochastic Gradient Decent', 'Linear SVC', 
              'Decision Tree'],
    'Score': [acc_svc, acc_knn, acc_log, 
              acc_random_forest, acc_gaussian, acc_perceptron, 
              acc_sgd, acc_linear_svc, acc_decision_tree]})
models.sort_values(by='Score', ascending=False)

Out[13]:

Model Score
3 Random Forest 86.76
8 Decision Tree 86.76
1 KNN 84.74
0 Support Vector Machines 83.84
2 Logistic Regression 80.36
7 Linear SVC 79.12
5 Perceptron 78.00
6 Stochastic Gradient Decent 77.67
4 Naive Bayes 72.28

提出

 最後にこのデータを提出しましょう。csvファイルにして、下のコマンドでローカルにダウンロードすることができます。

In[14]:

submission = pd.DataFrame({
        "PassengerId": test_df["PassengerId"],
        "Survived": Y_pred
    })
submission.to_csv('submission.csv', index=False)

In[15]:

from google.colab import files
files.download('submission.csv')

 ダウンロードしたら、submissionのページに行き、ダウンロードしたcsvファイルをドロップして提出しましょう。これで、kaggleの一連の流れは終了になります。もっと順位を上げてみたい方は、他のkernelsを参考にしたりしてみてください。




 今回は、前回整えたデータをもとに、様々なモデルを作り比較してみました。今回のタイタニックの問題で、kaggleに参加する基本的な流れはわかったのではないかと思います。

最後まで読んでいただきありがとうございました。よろしければこの記事をシェアしていただけると励みになります。よろしくお願いします。

スポンサーリンク
レクタングル広告(大)
レクタングル広告(大)

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
レクタングル広告(大)