titanic挑戦１

夏はデータ分析もやるぞ
まずはtitanicの精度を上げる色々な方法を学んでいきたい。
77パーくらいの精度が出たコードをまとめていく
ソースコード

```
import pandas as pd
import xgboost as xgb

df_train = pd.read_csv("train.csv")
df_test = pd.read_csv("test.csv")

# trainの前処理
df_train["Age"] = df_train["Age"].fillna(df_train["Age"].mean())
df_train["Cabin"] = df_train["Cabin"].fillna(df_train["Cabin"].mode()[0])
df_train["Embarked"] = df_train["Embarked"].fillna(df_train["Embarked"].mode()[0])
df_train.drop(["Name", "Ticket", "Cabin"], axis=1, inplace=True)
df_train["Sex"] = df_train["Sex"].replace({"male": 0, "female": 1})
df_train = pd.get_dummies(df_train)

# 説明変数、目的変数への分割
train_y = df_train["Survived"]
train_x = df_train.drop("Survived", axis=1)

# 機械学習アルゴリズムの宣言と学習
clf = xgb.XGBClassifier()
clf.fit(train_x, train_y)

# testの前処理
df_test["Age"] = df_test["Age"].fillna(df_test["Age"].mean())
df_test["Fare"] = df_test["Fare"].fillna(df_test["Fare"].mean())
df_test["Cabin"] = df_test["Cabin"].fillna(df_test["Cabin"].mode()[0])
df_test.drop(["Name", "Ticket", "Cabin"], axis=1, inplace=True)
df_test["Sex"] = df_test["Sex"].replace({"male": 0, "female": 1})
df_test = pd.get_dummies(df_test)
test_x = df_test # testにSurvived列はないのでdrop不要

# 予測
result = clf.predict(test_x)
pd.DataFrame({
    "PassengerId": test_x["PassengerId"],
    "Survived": result
}).to_csv("result.csv", index=False)

# Google Colab でデータダウンロードに必要
from google.colab import files
files.download("result.csv") # 出力なし（ダウンロード画面の起動）
```

```
import pandas as pd
import xgboost as xgb
```
xgboostが初見だから調べる
xgboostとはGradient BoostingとRandom Forestを組み合わせたアンサンブル学習（性能の低い学習器を組み合わせて高性能な学習器をつくる)である
Gradient boost:弱学習器を１つずつ順番に構築していく手法。
Random Forest:アンサンブル学習の一つ。決定木を複数集めて使うので木が集まってフォレストと呼ばれている。複数集めた各決定木の予測結果を多数決することによって結果を得る

```
1. ランダムにデータを抽出する
2. 決定木を成長させる
3. 1,2ステップを指定回繰り返す
4. 予測結果を多数決することによって分類閾値(ラベル)を決定する
```
メリット
・特徴量のスケーリング（最適な解決法を見つけるためのステップ数を減らすために特徴量の取りうる値の範囲を変える)が必要ない,考慮するパラメータが少ない,並列化が容易、どの特徴量が重要かを知ることができる
デメリット
・複雑なデータではSVMなどの分類手法に比べて汎化性能が下がる

SVMとは
線形の二値分類を行う手法。教師あり学習であり分類、回帰のいずれにも応用可能、データの前処理とパラメーターの調整が難しい、マージンという距離のような概念の最大化を目的としている

XGboostのメリット
.欠損値が多いなどのスパースなデータに対して事前に木の分岐の方向を決めるアルゴリズムを採用している、並列分散処理によりモデルの探索を高速化している、CPU外でも学習が回せるため大規模なデータも処理できる

```
df_train=pd.read_csv("train.csv")#読み込み
df_train.head()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275793/f8abbdb3-0e82-2ffe-1537-3e0ce2455ad7.png)

```
df_test=pd.read_csv("test.csv")
df_test.head()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275793/7bb5448b-33ba-bf3b-49d1-11e75b2b1931.png)

データの読み込み＆眺める
この時点で
test.csvはSurvived列がないこと、いくつかの列は数値がいくつかの列は文字が入っていることが、欠損値が含まれている列があることがわかる

今回はtest.csvのSurvivedを予測せよ、というのが目的なのでtest.csvにはSurvived列がない。

データを集める→データの前処理→学習→新規データに対する予測→精度評価の流れ

1.欠損値を埋める
この処理はtrainデータとtestデータ両方でやることが大事

```
import pandas as pd
import xgboost as xgb

df_train=pd.read_csv("train.csv")#読み込み
df_test=pd.read_csv("test.csv")

print("--train--")
for col in df_train.columns:
  if df_train[col].isnull().any():
    print(col,df_train[col].isnull().any())
print("--test--")
for col in df_test.columns:
  if df_test[col].isnull().any():
    print(col,df_test[col].isnull().any())
```

```
--train--
Age True
Cabin True
Embarked True
--test--
Age True
Fare True
Cabin True
```
df[col].isnull()で特定の列のすべての値にNaNが含まれているかを判定し
df[col].isnull().any()でその列の内一か所以上にNaNが含まれているかを判定

2.欠損値を埋める
df["列名"]=df["列名"].fillna(値)で特定の列の欠損値を埋めることができる
平均値はdf["列名"].mean()で、最頻値はdf["列名"].mode()[0]で取得できる

```
df_train["Age"]=df_train["Age"].fillna(df_train["Age"].mean())
df_train["Cabin"]=df_train["Cabin"].fillna(df_train["Cabin"].mode()[0])
df_train["Embarked"]=df_train["Embarked"].fillna(df_train["Embarked"].mode()[0])

df_test["Age"]=df_test["Age"].fillna(df_test["Age"].mean())
df_test["Fare"]=df_test["Fare"].fillna(df_test["Fare"].mean())
df_test["Cabin"]=df_test["Cabin"].fillna(df_test["Cabin"].mode()[0])

df_train.head()
```
結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275793/2bf5ddac-93b2-561c-21a8-b56c9a46f39b.png)

3.文字列を数字列に変換する
機械学習の時は基本的に数値型しか学習データに入れることができない
列の削除、0,1の値に変更する、ダミー変数化の3通りの戦略で数値に変える

```
df_train.drop(["Name","Ticket","Cabin"],axis=1,inplace=True)
#列の削除
df_train["Sex"]=df_train["Sex"].replace({"male":0,"female":1})
#値を置換
df_train=pd.get_dummies(df_train)
#ダミー変数化
```
df.drop(列名, axis=1, inplace=True) で特定の行を削除できます。

axis=1 は列の削除を表し、inplace=True は変数の中身を直接変更する（破壊的である）ことを表します。

df.replace(辞書) でデータフレーム内の値を置換できます。

ここでは、男性を0、女性を1として置換しています。

pd.get_dummies(データフレーム) でダミー変数化できます。

簡単な例

```
import pandas as pd
from IPython.display import display # 表示用

df = pd.DataFrame({
    "category": ["A", "A", "B"],
    "columns1": [1, 2, 3],
    "columns2": [2, 4, 6]
})

print("ダミー変数化前")
display(df)

print("ダミー変数化後")
display(pd.get_dummies(df))
```
変数化前
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275793/44a06ff3-0ec2-a9ee-52dc-72b19d042466.png)
変数化後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275793/203b5580-1054-e893-f560-03cd8fb42000.png)

4,説明変数、目的変数への分割
ここまでで前処理は終わり
機械学習をするときは説明変数と目的変数が必要
説明変数はtrain_x,目的変数はtest_yという変数に入れられることが多いよって今回はSurvived列をtrain_yに代入しそれ以外の列をtrain_xに代入

5,機械学習アルゴリズムの宣言と学習

```
clf = xgb.XGBClassifier()
clf.fit(train_x, train_y)
```
一行目は使用する機械学習アルゴリズムを宣言しただけの状態でありまだ学習は済んでない
2行目でclf.fit(x,y)とすることでclfが学習済み状態になる

6,テストデータの予測
テストデータの予測をする
clf.predict(データフレーム)で予測できる

```
result=clf.predict(test_x)
```
7,csvとして出力
ここでは１列目にPassengerId,２列目にSurvived列が必要なためそのように出力する

```
result=clf.predict(test_x)
pd.DataFrame({
    "PassengerId":test_x["PassengerId"],
    "Survived":result
}).to_csv("result.csv",index=False)
```
8.kaggleへsubmit

```
from google.colab import files
files.download("result.csv")