【kaggle】機械学習イントロ - 初めての機械学習モデル【備忘翻訳】

# はじめに
当記事はkaggleのLearnの[Intro to Machine Learning](https://www.kaggle.com/learn/intro-to-machine-learning)の[Your First Machine Learning Model](https://www.kaggle.com/code/dansbecker/your-first-machine-learning-model)を翻訳して備忘としたものです。
拙い英語力なので間違い等あればご指摘いただけたらと思います。

まとめ:[【kaggle】翻訳記事まとめ【備忘翻訳】](https://qiita.com/leafeon00000/items/71e57af5b2d9b0b7c846)
【前】:[【kaggle】機械学習イントロ - 基本的なデータ探索【備忘翻訳】](https://qiita.com/leafeon00000/private/c3138d1b3a895eff2895)
【次】:[【kaggle】機械学習イントロ - モデルの検証【備忘翻訳】](https://qiita.com/leafeon00000/private/1672eb0d2e453eca883e)

:::note warn
当記事に含まれるコードはkaggle内のnotebook内で正常に動作します。動作を試したい場合はkaggleのnotebookで試してください。
:::

----

# 初めての機械学習モデル

## モデリングのためのデータ選択
データセットには変数が多すぎて把握するのが難しく、綺麗に出力することさえ難しいです。この膨大なデータを理解できるまで、削減するにはどのようなことができるでしょうか？

まず、直感的に選んだいくつかの変数を使ってみます。後のコースでは変数を自動的に優先順位付けする統計手法を紹介します。

変数/列を選択するには、データセット内の全ての列のリストを確認する必要があります。DataFrameの**columns**プロパティを使用することで確認できます。(以下のコードの1番下の行を参照)
```python
import pandas as pd

melbourne_file_path = '../input/melbourne-housing-snapshot/melb_data.csv'
melbourne_data = pd.read_csv(melbourne_file_path) 
melbourne_data.columns
```

```console
Index(['Suburb', 'Address', 'Rooms', 'Type', 'Price', 'Method', 'SellerG',
       'Date', 'Distance', 'Postcode', 'Bedroom2', 'Bathroom', 'Car',
       'Landsize', 'BuildingArea', 'YearBuilt', 'CouncilArea', 'Lattitude',
       'Longtitude', 'Regionname', 'Propertycount'],
      dtype='object')
```

```python
# The Melbourne data has some missing values (some houses for which some variables weren't recorded.)
# メルボルンのデータにはいくつか欠損値があります(いくつかの変数が記録されなかった家もあります)
# We'll learn to handle missing values in a later tutorial.  
# 欠損値の処理方法については、後のチュートリアルで学習します。
# Your Iowa data doesn't have missing values in the columns you use.
# アイオワ州のデータ(kaggleでハンズオン学習するデータ)では欠損値はありません。
# So we will take the simplest option for now, and drop houses from our data. 
# そのため、今は単純な処理によって欠損値を削除します。
# Don't worry about this much for now, though the code is:
# コードは以下の通りです

# dropna drops missing values (think of na as "not available")
# 欠損値を削除します(na は「利用不可」と考えてください)
melbourne_data = melbourne_data.dropna(axis=0)
```

データのサブセットを選択する方法はたくさんあります。[Pandasコース](https://www.kaggle.com/learn/pandas)では深堀していますが、ここでは2つのアプローチに焦点を当てていきます。

1. 「予測対象」を選択するためのドット記法
1. 「特徴量」を選択するために、列リストでの選択

:::note info
個人的な理解です。「サブセットを選択する」とは予測したい値を指定すること(1)と、その予測するために必要なデータを選択する(2)ことだと考えています。
:::

### 予測対象の選択
**ドット記法**を利用して変数を取り出すことができます。この単一の列は**Series**に格納され、これはデータの列が一つだけのDataFrameに似ています。

ドット記法を使用して予測する列(予測ターゲットと呼ばれる)を選択します。慣例により、予測対象は**y**と呼ばれます。したがって、メルボルンのデータの住宅価格を保存するために必要なコードは以下の通りです。
```python
y = melbourne_data.Price
```

## 「特徴量」を選ぶ
モデルに入力され、後に予測を行うために使用される列は「特徴量」と呼ばれます。今回の場合は、住宅価格を決定するために使用される列のことを指します。予測目的の列以外の全ての列を特徴量として使用する場合もありますが、逆に特徴量が少ないほうが良い場合もあります。

今回はいくつかの特徴量のみで作成したモデルを構築します。後ほど、様々な特徴量で構築されたモデルを繰り返し比較する方法を説明します。

カッコ内に列名を列挙していき、複数の特徴量を選択します。各項目は文字列型(引用符号付)である必要があります。

例えば:
```python
melbourne_features = ['Rooms', 'Bathroom', 'Landsize', 'Lattitude', 'Longtitude']
```

慣例により、このデータは**X**と呼ばれます。
```python
X = melbourne_data[melbourne_features]
```

``describe``メソッドと``head``メソッドを用いて、住宅価格を予想するために使用するデータを簡単に確認してみましょう。

```python
X.describe()
```

|Rooms|Bathroom|Landsize|Lattitude|Longtitude|
|-----|-----|-----|-----|-----|
|count|6196.000000|6196.000000|6196.000000|6196.000000|6196.000000|
|mean|2.931407|1.576340|471.006940|-37.807904|144.990201|
|std|0.971079|0.711362|897.449881|0.075850|0.099165|
|min|1.000000|1.000000|0.000000|-38.164920|144.542370|
|25%|2.000000|1.000000|152.000000|-37.855438|144.926198|
|50%|3.000000|1.000000|373.000000|-37.802250|144.995800|
|75%|4.000000|2.000000|628.000000|-37.758200|145.052700|
|max|8.000000|8.000000|37000.000000|-37.457090|145.526350|

```python
X.head()
```
|Rooms|Bathroom|Landsize|Lattitude|Longtitude|
|-----|-----|-----|-----|-----|
|1|2|1.0|156.0|-37.8079|144.9934|
|2|3|2.0|134.0|-37.8093|144.9944|
|4|4|1.0|120.0|-37.8072|144.9941|
|6|3|2.0|245.0|-37.8024|144.9993|
|7|2|1.0|256.0|-37.8060|144.9954|

これらのコマンドを利用して視覚的にデータをチェックすることはデータサイエンスの仕事の中でも重要な部分です。データセットにはさらに詳しく調べるべき価値のある内容が頻繁に見つかります。

----

## 自分のモデルを作ろう！
モデルを作成するには**scikit-learn**ライブラリを使用します。サンプルコードにあるようにコーディング時にはこのライブラリは**sklearn**として記述されます。scikit-learnはDataFrameのデータをモデル化するための最も人気のあるライブラリです。

モデルを構築して使用する手順は以下の通りです。
* **定義(define)**:モデルの種類はどのようなものにしますか？決定木か？それとも他の種類のモデルか？モデルタイプによってパラメータも指定します。
* **学習(fit)**:提供されたデータからパターンを取得します。これがモデリングの核心です。
* **予測(predict)**:まさにそのまま予測します。
* **評価(evalute)**:モデルの予測がどの程度正確であるかを判断します。

以下はScikit-learnを使用して、決定木モデルを定義し、それを特徴量で学習させる例です。
```python
from sklearn.tree import DecisionTreeRegressor

# Define model. Specify a number for random_state to ensure same results each run
melbourne_model = DecisionTreeRegressor(random_state=1)

# Fit model
melbourne_model.fit(X, y)
```

```console:console
DecisionTreeRegressor(random_state=1)
```

多くの機械学習モデルではモデルトレーニングにおいてある程度のランダム性が許容されています。``random_state``に数値を指定すると、実行ごとに同じ結果が得られます。これは良い習慣だと考えられています。任意の数値を使用でき、モデルの品質には大きく影響されることはありません。

これで予測に使用するモデルができました。

実際は、すでに価格が分かっている住宅ではなく、市場に出回る前の新しい住宅について予測を立てることになるでしょう。ただし、予測関数がどのように機能するかを確認するために、トレーニングデータの最初の数行について予測を行います。

```python
print("Making predictions for the following 5 houses:")
print(X.head())
print("The predictions are")
print(melbourne_model.predict(X.head()))
```

```console:console
Making predictions for the following 5 houses:
   Rooms  Bathroom  Landsize  Lattitude  Longtitude
1      2       1.0     156.0   -37.8079    144.9934
2      3       2.0     134.0   -37.8093    144.9944
4      4       1.0     120.0   -37.8072    144.9941
6      3       2.0     245.0   -37.8024    144.9993
7      2       1.0     256.0   -37.8060    144.9954
The predictions are
[1035000. 1465000. 1600000. 1876000. 1636000.]
```