データ分析　タイタニック号3

[Aidemy](https://aidemy.net/)　2020/10/31
#はじめに
　こんにちは、んがょぺです！バリバリの文系ですが、AIの可能性に興味を持ったのがきっかけで、AI特化型スクール「Aidemy」に通い、勉強しています。ここで得られた知識を皆さんと共有したいと思い、Qiitaでまとめています。以前のまとめ記事も多くの方に読んでいただけてとても嬉しいです。ありがとうございます！
　今回は、「データ分析　タイタニック号」の3つ目の投稿になります。どうぞよろしくお願いします。

＊本記事は「Aidemy」での学習内容を「自分の言葉で」まとめたものになります。表現の間違いや勘違いを含む可能性があります。ご了承ください。

今回学ぶこと
・⑤問題のモデル化、予測、解決

#モデルの作成
##使用するアルゴリズムの選択
・Chapter2でデータ処理が完了したので、ここからは実際に__モデルにデータを渡して予測し、解決するところまでを行う__。
・はじめに、__どのアルゴリズムでモデルを作成するか__を決める必要がある。予測問題には__「分類」と「回帰」__があり、前者はデータをクラスに分けて渡されたデータがどの「クラス」に属するかを予測するもので、後者はデータの「値」を予測するものである。
・今回のタイタニック号の予測問題は__Survivedが0か1かを「分類」するもの__である。使用するアルゴリズムは、__「ロジスティック回帰」「SVC」「k-NN」「決定木」「ランダムフォレスト」__によるモデルを作成する。

##データの準備
・モデルに渡す__「X_train」「y_train」「X_test」__を準備する。いつもはsklearn.model_serectionの__train_test_split()__を使っているが、__今回は自分で分割する__。
・X_trainは__Survived以外のtrain_df__、y_trainは__Survivedのみのtrain_df__、X_testは__PassengerId以外のtest_df__を代入すれば良い。

・コード![スクリーンショット 2020-10-24 18.32.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/57f40d79-e73c-3912-e3be-ea8389d5e6fb.png)

##ロジスティック回帰
・（復習）__ロジスティック回帰__は__シグモイド関数__を使って二値のクラス分類を行うものである。シグモイド関数は__0から1の間で値を取る関数__である。__LogidticRegression()__を使ってモデルを作成する。
・今回は目的変数である__Survivedが0か1か__を説明変数__AgeやPclass__などを使って予測する。

・また、モデルに渡すデータであるが、ロジスティック回帰のみ、__X_trainとY_trainをさらに8:2の割合で訓練データとテストデータに分けたものを使用する__。

・コード（結果も含む）![スクリーンショット 2020-10-24 19.03.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/79db1564-18c1-c397-80b0-e236333cad58.png)

##どの説明変数（特徴量）が結果を左右しやすいのかを可視化
・__「どの説明変数（特徴量）が結果を左右しやすいのか」__を知るには、目的変数と説明変数との間の__偏回帰係数__を計算する。__値が大きいほど結果を左右しやすい__と言える。
・偏回帰係数の計算は、__「model.corf_」__で行う。DataFrameで扱いたいので、train_dfのcolumnsを行（"Feature"）に持つDataFrameを作成し、新しい列として"Partial regression coefficient"を作り、偏回帰係数をそこに格納する。
・DataFrame作成時にdelete(0)としているのは、偏回帰係数の計算の過程で0が出てくると計算ができず、NaNになってしまうからである。

・コード![スクリーンショット 2020-10-24 19.25.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/1cd46828-9fcd-bec9-0851-275745c732b3.png)

・結果![スクリーンショット 2020-10-24 19.26.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/efd82e96-a574-36ea-80ac-2bc177a5ed6f.png)

##SVM
・（復習）__サポートベクターマシン（SVM）__を使って分類するアルゴリズム。分類の境界線が他クラスと最も距離が遠くなるように引かれるため、__汎化されやすい__。__カーネル法__によって非線形から線形に変換しているので、__非線形データにも対応できる__。線形SVMは__LinearSVC()__で、非線形SVMは__SVC()__で使用する。

・コード(LinearSVCも同様に作成すればOK　今回の結果は「83.84」)
![スクリーンショット 2020-10-24 19.48.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/286b2ff3-6b33-6bb3-066f-8ea2634ba52d.png)

##k-NN
・（復習）__k-NN__は、__予測データと類似している教師データをk個抽出し__、最も多かったクラスを予測結果として出力するアルゴリズムである。__学習コストが0__であり、__予測精度が高い__ことが特徴である。__KNeighborsClassifier()__で使うことができ、抽出するデータの個数kは引数に__「n_neighbors」__を指定することで設定できる。

・コード![スクリーンショット 2020-10-24 19.56.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/04b20121-5e79-cf72-9d79-4d5c9ce7018d.png)

##決定木
・（復習）__決定木__は、データから抽出されたルールが木構造で表されるので、このような名前になっている。ルールとは、例えば説明変数Ageが1（16才〜32才）ならPclassについて判定する、といったものである。これらが進んでいくと最終的にはクラスを分類することができる。__DecisionTreeClassifier()__で使用することができる。

##ランダムフォレスト
・（復習）__ランダムフォレスト__は__多数の決定木を構築__し、それぞれの結果のうち最も多数のものを最終的な結果として出力するアルゴリズムである。このような複数の分類器を使用する学習を__アンサンブル学習__という。__RandomForestClassifier()__で使用でき、決定木の個数は引数に__「n_estimators」__を指定することで行える。

#モデルの評価
・以上で作成したそれぞれの__モデルの精度（acc）__をDataFrameで一覧にすることで、どのモデルを使用するのが良いかを決める。

・コード![スクリーンショット 2020-10-24 21.52.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/5140731d-b25a-73c6-2b77-0780d617f121.png)

・結果![スクリーンショット 2020-10-24 22.10.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/c7ac0fac-5ba4-f9e3-3939-cc0a12fe92c1.png)

##モデルの保存
・前項の結果で見た通り、__決定木とランダムフォレストを使ったモデルの精度が最も高い__ことがわかった。今回はよりモデルの汎化が期待できそうな__ランダムフォレストのモデルを使用する__ことに決め、このモデルをcsvファイルで保存する。
・csvファイルの書き出し、保存は__「to_csv」__で行える。ファイルには、'PassengerId'としてtest_dfのPassengerIdを格納した列と'Survived'としてランダムフォレスト(決定木)の予測結果'Y_pred'を格納した列を持つDataFrameとしてファイルを作成する。

・コード（ファイルパスは架空のもの）
![スクリーンショット 2020-10-24 22.24.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/b2bea2b6-7319-834a-c858-252111891be4.png)

#まとめ
・前回までで作成したデータを__train_X,train_y,test_Xに分割する__。これらのデータを使ってモデルを作成する。
・__「どの説明変数（特徴量）が結果を左右しやすいのか」__を知るには、__偏回帰係数__を計算し可視化すると良い。
・それぞれのモデルのscoreから、どのモデルの__精度（acc）__が最も高いかを比較し、一番高かったモデルはcsvファイルで__保存__する。

今回は以上です。最後まで読んでいただき、ありがとうございました。