# 住宅価格予測のための scikit-learn と Hivemall を使用した特徴選択

Treasure ワークフロー は、Linear Regression 予測器を使用して、価格やエネルギー消費量などの連続値を予測する簡単な方法を提供します。機械学習アルゴリズムは、Python カスタムスクリプトを使用して、スケジュールされたワークフローの一部として実行できます。この記事では、Python スクリプトで scikit-learn を使用した特徴選択を紹介します。これにより、重要な特徴を選択し、Hivemall で住宅価格を予測するための部分クエリを構築します。

[特徴選択](https://en.wikipedia.org/wiki/Feature_selection)は、モデルを簡素化して理解しやすくし、無関係または冗長な情報を削除することで汎化性能を向上させるために使用される一般的な機械学習技術です。

## Python カスタムスクリプトを使用した特徴選択

この記事では、[Boston 住宅価格データセット](https://www.cs.toronto.edu/~delve/data/boston/bostonDetail.html)と [Linear Regression 予測器](http://hivemall.incubator.apache.org/userguide/regression/general.html)を使用して住宅価格を予測する方法について説明します。scikit-learn の特徴選択は、教師ありモデルを作成するための意味のある属性を特定するのに役立ちます。

### 住宅価格を予測するワークフローの例

ワークフロー：

トレーニングデータセットとテストデータセットを分割します

scikit-learn で重要な特徴を選択します

Hivemall 用の部分クエリを構築します

Hivemall で選択した特徴を使用してモデルをトレーニングおよび評価します

### 前提条件

Treasure アカウントでカスタムスクリプト機能が有効になっていることを確認してください。

TD Toolbelt と TD Toolbelt Workflow モジュールをダウンロードしてインストールしてください。詳細については、[Treasure ワークフロー クイックスタート](/ja/products/customer-data-platform/data-workbench/workflows/treasure-workflow-quick-start-using-td-toolbelt-in-a-cli)を参照してください。

Treasure ワークフロー の構文に関する基本知識

### ワークフロー例の実行

1. [住宅価格予測プロジェクト](https://github.com/treasure-data/treasure-boxes/tree/master/machine-learning-box/house-price-prediction)をダウンロードします。
2. コマンドラインターミナルウィンドウから、house-price-prediction ディレクトリに移動します。例：
3. Cd house-price-prediction
4. *data.sh* を実行して、Treasure Data にトレーニングデータとテストデータを取り込みます。スクリプトは、モデルを構築するために約506件のケースを含む Boston Housing Dataset を使用します。スクリプトは、データを保存するために *boston* という名前のデータベースと *house_prices* という名前のテーブルも作成します。


```bash
$ ./data.sh
```

### 入力

入力テーブルは以下のとおりです：

| crimdouble | zndouble | indusdouble | chasint | noxdouble | rmdouble | agedouble | disdouble | radint | taxint | ptratiodouble | bdouble | lstatdouble | medvdouble |
|  --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 0.00632 | 18 | 2.31 | 0 | 0.538 | 6.575 | 65.2 | 4.09 | 1 | 296 | 15.3 | 396.9 | 4.98 | 24 |
| 0.02731 | 0 | 7.07 | 0 | 0.469 | 6.421 | 78.9 | 4.9671 | 2 | 242 | 17.8 | 396.9 | 9.14 | 21.6 |
| 0.02729 | 0 | 7.07 | 0 | 0.469 | 7.185 | 61.1 | 4.9671 | 2 | 242 | 17.8 | 392.83 | 4.03 | 34.7 |
| 0.03237 | 0 | 2.18 | 0 | 0.458 | 6.998 | 45.8 | 6.0622 | 3 | 222 | 18.7 | 394.63 | 2.94 | 33.4 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |


ここで "medv" は所有者居住住宅の中央値（単位：1000ドル）で、回帰のターゲット値です。"chas" と "rad" はカテゴリ値で、その他の特徴は量的変数です。

デフォルトでは、medv と最も相関の高い上位4つのカラムが使用されます。

以下のようにワークフロー例を実行します：

```bash
td workflow push regressor
```

### このワークフローの認証情報を設定

```bash
export TD_API_KEY=1/xxxxx
export TD_API_SERVER=https://api.treasuredata.com
td wf secrets --project regressor --set apikey --set endpoint
```

apikey（例：X/XXXXXXX）と endpoint（例：https://api.treasuredata.com）を入力します

```bash
td wf start regressor regression-py`
```

住宅価格の予測結果は *predictions* テーブルに保存されます。

テーブルを表示するには：

1. Treasure コンソール にログインします。
2. boston データベースを検索します。
3. *predictions* テーブルを探します


### 出力

このワークフローは予測結果を出力します

| rowidstring | predicted_pricedouble |
|  --- | --- |
| 1-10 | 33.97034232809395 |
| 1-121 | 30.3377696027913 |
| ... | ... |


## ワークフローのカスタム Python スクリプトの確認

ディレクトリの内容を確認します：

[regression-py.dig](https://github.com/treasure-data/treasure-boxes/blob/master/machine-learning-box/house-price-prediction/regression-py.dig) - 売上予測と Slack への通知のワークフロー例。

[task/**init**.py](https://github.com/treasure-data/treasure-boxes/tree/master/machine-learning-box/house-price-prediction/tasks) - scikit-learn を使用したカスタム Python スクリプト。重要な特徴を選択し、Hivemall 用の部分クエリを構築します。

この例では、scikit-learn の [SelectFromModel 関数](https://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.SelectFromModel.html#sklearn.feature_selection.SelectFromModel)を使用しています。これにより、予測モデルを構築する際に特徴を選択できます。

```bash
$ ./data.sh
# Ingest example data to Treasure Data
```

```python
reg = ExtraTreesRegressor()
reg = reg.fit(X, y)
model = SelectFromModel(reg, prefit=True)
feature_idx = model.get_support()
feature_name = df.drop(columns=['medv']).columns[feature_idx]
selected_features = set(feature_name)(snip)
feature_query = self._feature_column_query(selected_features, feature_types=feature_types)
```

この例では、特徴の重要度を取得するために [ExtraTreeRegressor](http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.ExtraTreesRegressor.html) を使用していますが、[LassoCV](http://scikit-learn.org/stable/auto_examples/feature_selection/plot_select_from_model_boston.html) などの他のロジックも使用できます。

サンプルコードには、Python で Hivemall モデルをトレーニングするためのベクトル化されたテーブルを作成する _create_vectorize_table 関数があります。

```python
self._create_vectorize_table(engine_hive, dbname, "train", "{}_train".format(source_table), feature_query)
```

部分クエリをエクスポートする代わりに、カスタム Python スクリプト内でこの関数を使用できますが、クエリをエクスポートすることをお勧めします。クエリをエクスポートすると、Digdag の並列化と Treasure コンソール での管理性の利点が得られます。