[kaggle翻訳]Titanic Data Science Solutions(Manav Sehgal) (4)

Kaggleのチュートリアルとして公開されているTitanic問題に対する素敵な解答を提出されている方がいたので、（データ分析と英語の）勉強を兼ねて翻訳してみます。

私はデータ分析も英語も特に出来るわけではないので、いろいろ誤りがあるかと思います。
もしお気づきの点があればお知らせくだされば幸いです。

なお、訳出は適宜抜粋しつつ行うものとします。全文訳ではないことをご承知おきください。

本記事は4記事目となります。前回記事などをお読みでなければ先にそちらをご覧ください。


#前回までのまとめ
前回まではデータを分析し、使用する特徴を決定することを行いました。

|特徴名|意味|説明|
|----|----|----|----|----|
|Survived|生存|生存の成否についての情報。特に処理はされていない
|Pclass|乗船クラス|乗船した階級についての情報。特に処理はされていない
|Sex|性別|乗客の性別についての情報。元々文字列で表されていたが、数値に変換されている
|Age|年齢|乗客の年齢帯についての情報。元々年齢そのものを表していたが、年齢帯に分けられている
|Fare|料金|乗客が支払った料金帯についての情報。元々料金そのものを表していたが、料金帯に分けられている
|Embarked|乗船地|乗船地についての情報。元々文字列で表されていたが、数値に変換されている
|Title|敬称|乗客の名前についている敬称についての情報。名前項目から抽出して作成され、数値に変換されている
|isAlone|家族構成|乗客の家族構成についての情報。親、子供、兄弟姉妹、配偶者などの情報が統合され作り出された
|Age*Class|年齢と乗船クラスの乗算結果|年齢と乗船クラスを乗算したもの


# モデルによる推測と解決
今やっと私たちは、モデルを訓練し必要とされる解決法を推測するだけの用意が整った。推測を行うためのアルゴリズムモデルは60以上もあり、使用するにあたってはそこから選び出さなければいけない。私たちが評価を行い得るいくつかのモデルを選定するためにも、私たちは問題と解法が求めるところを理解しなければいけない。私たちの問題は分類と回帰の問題である。ここでは、Survivedという結果と他の特徴(性別、年齢、港...)などの変数または特徴との関連性を確認したい。私たちはここで与えられた訓練用データと本番用データを用いているので、今私たちが行っていることは、機械学習の中でも教師あり学習と呼ばれるカテゴリのものとなる。これら二つの基準-教師あり学習と分類/回帰ということによって、私たちは使用するモデルの選択肢をいくつかに絞ることができる。それはこのようなものだ。

- ロジスティック回帰
- K近傍法
- サポートベクターマシーン
- ナイーブベイズ分類器
- 決定木
- ランダムフォレスト
- パーセプトロン
- 人口ニューラルネットワーク
- 関連性ベクトルマシン


```python:３５．データの前準備
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


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

```


## Logistic Regression
ロジスティック回帰は、ワークフローの初期段階において実行するのに便利である。ロジスティック回帰は分類された変数（特徴）と一つまたは複数の変数の間にある関係性を、累積ロジスティック分布であるロジスティック関数を用いて確率を推測する方法である。詳細はWikipediaを参照すること。

訓練用のデータをもとに作られたモデルが生成した信頼できる次のスコアに注目する。

```python:３６．ロジスティック回帰
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.359999999999999
```

ロジスティック回帰を使用することで、私たちが作り補完した特徴に対する仮定と決定を確認することができる。これは決定関数における特徴係数を計算することによってなされている。

正の係数は応答の対数を増加させ（つまり確率を増価させ）、負の係数は応答の対数を減少させる（つまり確率を減少させる）。

- Sexは値の増加を伴う高い正の係数(男性で0,女性で1)であり、Survivedが1のときに最も増加する。
- Pclassは増加と反比例しており、Survivedが1のときに最も減少する。
- この方法においてはAge*ClassがSurvivedと二番目に高い負の相関性を持ってモデリングすることのできる優れた特徴である。
- よってTitleは二番目に高い正の相関性をもっている。


```python:３７．特徴と相関係数
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)


>>>
	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 Machine
次に、分類と回帰の分析に用いられる関連的機械学習としての教師あり学習アルゴリズムである、サポートベクターマシンを使用してモデリングをしていく。与えられた訓練用のデータについて、それぞれ二つのうちの一つあるいは他方のカテゴリに属させるようにし、そのアルゴリズムによりテストデータを一つのカテゴリあるいは他方のそれに割り当てる、非確率的バイナリ線形分類器としてモデリングする。詳細はWikipediaを参照すること。

このモデルはロジスティック回帰よりも高い信頼できるスコアを生成していることに注目する。

```python:３８．サポートベクターマシーン
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


>>>
83.840000000000003
```

## K-nearest Neighbors
パターン認識において、K近傍法は分類と回帰に用いられる非パラメトリックな方法である。一つのサンプルは近隣の多数決により分類され、ｋ個の際近傍の中で最も一般的なクラスに割り当てられる。ｋ＝１の場合、対象は単純に最も近いクラスに割り当てられる。詳細はWikipediaを参照すること。

K近傍法のスコアは、ロジスティック回帰よりは優れているが、サポートベクターマシーンには劣る。

```python:３８．K近傍法
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


>>>
84.739999999999995
```

## ナイーブベイズ分類器
機械学習において、ナイーブベイズ分類器はベイズの定理に基づき特徴間の強い特徴を適用した、確率的分類器の仲間である。ナイーブベイズ分類器はスケーラビリティが高く、学習対象の問題における多くの変数委について多くの線形パラメータを必要とする。詳細はWikipediaを参照すること。

このモデルが生成するスコアはここまでに評価されたモデルの中で最も低い。

```python:３８．ナイーブベイズ分類器
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

>>>
72.280000000000001
```

## Perceptron
パーセプトロンは教師あり学習におけるバイナリ分類器のアルゴリズムである（数字ベクトルで表現される入力値が、特定のクラスに属するかどうかを決定する関数）。これは線形分類器の一つであり、重みと特徴ベクトルを組み合わせる線形確率関数に基づき、確率を予測するアルゴリズムである。このアルゴリズムはオンライン学習を可能とし、訓練用のデータを一度に一つずつ処理していく。詳細はWikipediaを参照すること。

```python:３９．パーセプトロン
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


>>>
78.0
```


## Decision Tree
これは対象の値を結論づけるために特徴を関連付ける推測モデルとして、決定木を用いる。対象の値が有限であるものを用いるものを分類木という。これらの木構造では、葉っぱはクラスのラベルを表現し、枝はこれらのクラスラベルにつながる特徴を結合させるものとして表現される。対象の値が連続的な値をとる場合は、これらは回帰木と呼ばれる。詳細はWikipediaを参照すること。

このモデルは最も高いスコアを生成する。

```python:４０．決定木
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


>>>
86.760000000000005
```

## Random Forest
次のランダムフォレストは最も人気のモデルである。ランダムフォレストまたはランダム決定木は分類、回帰、またはその他の課題を解くのにアンサンブル学習方法を用いるもので、その処理は訓練時に多数の決定木を用いたりクラスもしくは決定木の標準値推測を出力することによって構成される。詳細はWikipediaを参照すること。

このモデルが生成する評価は、今までのモデルの中で最も高い。
私たちはこのモデルの出力を使用して、コンペへ提出する正解案または結果を決定する。


```python:４１．ランダムフォレスト
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


>>>
86.760000000000005
```


# モデルの評価
ここで私たちは、私たちの問題において最も優れたものを選ぶためにすべてのモデルを評価しランク付けする。決定木とランダムフォレストのスコアは同じであるが、ランダムフォレストを選択することとする。それは過学習してしまった決定木の習慣について修正を必要とするからだ。

```python:４２．モデルのランク付け
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)


>>>
	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
```

```python:４３．提出物の作成
submission = pd.DataFrame({"PassengerId}:test_df["PassengerId"], 
                           "Survived":Y_pred})
```


私たちがKaggleコンペに提出した結果は、コンペに参加した6082組中3883位であった。この結果は、コンペが今もなお実行され続けていることを示している。今回の結果は提出された結果の一部でしかない。私たちの最初の試みとしては悪くない結果だ。私たちのスコアをもっと優れたものにする意見を歓迎します。


<br><br><br>
-------------原文ここまで----------------

# まとめ（翻訳者による）

## Survivedに強い関連を持っていた特徴

|特徴名|意味|相関性|
|----|----|----|----|----|
|Sex|性別|最も強い正の相関性を示した
|Title|敬称|二番目に強い正の相関性を示した
|Pclass|乗船クラス|最も強い負の相関性を示した
|Age*Class||二番目に強い負の相関性を示した


## アルゴリズムランキング

|順位|アルゴリズム名|スコア|
|----|----|----|
| 1| ランダムフォレスト|86.76
| 2| 決定木|86.76
| 3| K近傍法|84.74
| 4| サポートベクターマシーン|83.84
| 5| ロジスティック回帰|80.36
| 6| パーセプトロン|78.00
| 7| ナイーブベイズ|72.28


<br><br>
以上。ここまでお読みいただき、ありがとうございました。
間違いなどあれば、ぜひご指摘いただければと思います。

# 原文
https://www.kaggle.com/startupsci/titanic-data-science-solutions