# 3. 上級: ペンギンの分類モデル構築
ペンギンの種別と特徴量が与えられたデータがあります。ファイル名は`penguins2.csv`です。
このデータに関して、下記の問に答えてください。
データは https://gist.github.com/mohira/61a4960a2b4154745b1bbe6f4ee97414#file-readme-md からダウンロードしてください。
目的変数を`species`、説明変数をそれ以外の列(`'island', 'bill_depth_mm', 'flipper_length_mm', 'body_mass_g', 'sex'`)としていくつかの分類モデルの学習と評価を行います。
### Q1. 学習のための前処理とデータセットの分割
- Q. モデル構築のための前処理が必要です。`pd.get_dummies()`を使って、`island`, `sex`列をダミー変数化して、新しく`pandas`の`DataFrame`を作成してください。
- Q. `train_test_split()`を使ってデータセットを分割してください。
- なお、次の設定に従うこと
- `test_size=0.2`とすること
- `random_state=0`とすること
### Q2. ロジスティック回帰モデル
- Q. `species`を目的変数に、それ以外を説明変数にしてロジスティック回帰モデルを学習してください。
- Q. 学習データおよびテストデータにおける予測値を計算してください。
- Q. 学習データおよびテストデータにおける正答率を調べてください。
### Q3. 決定木モデル
- Q. `species`を目的変数に、それ以外を説明変数にして決定木モデルを学習してください。
- Q. 学習データおよびテストデータにおける予測値を計算してください。
- Q. 学習データおよびテストデータにおける正答率を調べてください。
### Q4. ランダムフォレストモデル
- Q. `species`を目的変数に、それ以外を説明変数にしてランダムフォレストモデルを学習してください。
- Q. 学習データおよびテストデータにおける予測値を計算してください。
- Q. 学習データおよびテストデータにおける正答率を調べてください。
### Q5. 各モデルの混同行列
- Q. 各モデルにおける学習データおよびテストデータの混同行列を観察してください。
<details>
<summary>解答例</summary>
```python
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
def main():
df = pd.read_csv('penguins2.csv')
# 説明変数と目的変数
X = df[['island', 'bill_depth_mm', 'flipper_length_mm', 'body_mass_g', 'sex']]
y = df['species']
# ダミー変数化
X_dummy = pd.get_dummies(X, drop_first=True)
# データセットの分割
X_train, X_test, y_train, y_test = train_test_split(X_dummy, y, test_size=0.2, random_state=0)
# ロジスティック回帰
model1 = LogisticRegression()
model1.fit(X_train, y_train)
y_pred1_train = model1.predict(X_train)
y_pred1_test = model1.predict(X_test)
acc1_train = accuracy_score(y_train, y_pred1_train)
acc1_test = accuracy_score(y_test, y_pred1_test)
print(f'LogisticRegression: 正答率(学習データ): {acc1_train:.3f}, 正答率(テストデータ): {acc1_test:.3f}')
# 決定木
model2 = DecisionTreeClassifier()
model2.fit(X_train, y_train)
y_pred2_train = model2.predict(X_train)
y_pred2_test = model2.predict(X_test)
acc2_train = accuracy_score(y_train, y_pred2_train)
acc2_test = accuracy_score(y_test, y_pred2_test)
print(f'DecisionTreeClassifier: 正答率(学習データ): {acc2_train:.3f}, 正答率(テストデータ): {acc2_test:.3f}')
# ランダムフォレスト
model3 = RandomForestClassifier()
model3.fit(X_train, y_train)
y_pred3_train = model3.predict(X_train)
y_pred3_test = model3.predict(X_test)
acc3_train = accuracy_score(y_train, y_pred3_train)
acc3_test = accuracy_score(y_test, y_pred3_test)
print(f'RandomForestClassifier: 正答率(学習データ): {acc3_train:.3f}, 正答率(テストデータ): {acc3_test:.3f}')
# 各モデルの混同行列
cf1_train = confusion_matrix(y_train, y_pred1_train)
cf1_test = confusion_matrix(y_test, y_pred1_test)
print('LogisticRegressionの混同行列')
print(cf1_train)
print(cf1_test)
cf2_train = confusion_matrix(y_train, y_pred2_train)
cf2_test = confusion_matrix(y_test, y_pred2_test)
print('DecisionTreeClassifierの混同行列')
print(cf2_train)
print(cf2_test)
cf3_train = confusion_matrix(y_train, y_pred3_train)
cf3_test = confusion_matrix(y_test, y_pred3_test)
print('RandomForestClassifierの混同行列')
print(cf3_train)
print(cf3_test)
if __name__ == '__main__':
main()
```
</details>