【このページは現在作成中です】
第7回:教師なし学習・次元削減,機械学習の実践的アプローチ†
7.1 教師なし学習・次元削減【中村】†
次元削減 (Dimensionality Reduction) とは†
- データの変数(列)間の関係を学習し,次元数を減らすこと
- より少ない特徴量でデータを説明する
- なるべく情報量を落とさないように,複数の特徴量をまとめた新しい特徴量を作る
図1:教師あり学習と教師なし学習のイメージ(再掲)
なぜ次元を削減するのか?†
- データの理解・可視化
- 次元を削減することで,データの理解・可視化がやりやすくなる
- 人間が理解できる表現方法はせいぜい3次元まで
- 1次元:サンプル同士を直接値で比較できる
- 2次元:サンプルを2軸で説明できる
- 3次元:サンプルを空間上で可視化できる
- 4次元以上: 1つの図では可視化不可能
- データの圧縮
- 高次元のデータを低次元に圧縮することで,計算処理を効率化できる
- 次元の呪いへの対処
- 次元が増えるほど訓練に必要なデータが指数的に増える (少ないままだと過学習が起こる)
- 次元削減で減らす
次元削減の手法の例†
- 主成分分析 (Principal Component Analysis, PCA)
- 非負値行列因子分解(Non-negative Matric Factorization, NMF)
- t-SNE ( t-distributed Stochastic Neighbor Embedding)
- データポイントの距離を可能な限り維持する2次元表現を見つけようとする
PCA†
次元削減によるデータの説明†
次元削減によるデータの圧縮†
次元削減による特徴量抽出†
7.2 特徴量エンジニアリング【中村】†
特徴量を開発する (feature engineering)†
- 精度の良い学習モデルを作るためには,正解データ(目的変数)をうまく説明できる特徴量(説明変数)が不可欠である
- しかしながら,往々にしてうまい特徴量がない場合がある
- そのような場合はどうするか? → 作る(エンジニアリング)
アプローチ†
- ドメイン知識に基づいて作る
- データを眺めて考える
- EDAを行い,目的変数に関するパターンや法則が見えないか?
- 機械的に作る
- ある変数xの2乗,3乗を変数として加える
- 2つの変数x, y の積を変数として加える
【例題】製品の売上予測†
- RQ: あるスーパーで販売中のヨーグルトAの売上データに基づいて,Aが明日何個売れるかを予測したい
【売上データ】
- #0: 売上日付
- #1: 売上数 (目的変数):その日に売れたAの戸数
- #2: 売上額 (目的変数):その日に売れたAの総売上金額
【問題】
→ 特徴量エンジニアリングによって,新しい特徴量を作る
データを眺める†
#準備(すべてに共通)
# PandasとNumpyをインポート
import pandas as pd
import numpy as np
# 日本語化Matplotlibもインポート
import matplotlib.pyplot as plt
#↓の1行は提出時にはコメントアウトしてください
!pip install japanize-matplotlib
import japanize_matplotlib
# Seabornもインポート
import seaborn as sns
# pickleをインポート(モデルの保存用)
import pickle
# pandasのデータフレームを表示する関数
from IPython.display import display
#データをロードする(エクセルデータの読み込み)
data = pd.read_excel("https://www2.cmds.kobe-u.ac.jp/~masa-n/dshandson/yogurt.xlsx")
data
#型チェック
data.dtypes
#整形
df = data.copy()
#売上日付をインデクスに
df = df.set_index("売上日付")
df
#売上個数を可視化
#箱ひげ図
df["売上数"].plot.box()
#時系列
df["売上数"].plot()
#月別に可視化
for y in [2021, 2022]:
for i in range(1,13):
df[(df.index.year==y)&(df.index.month==i)]["売上数"].plot.bar(title=f"{y}年{i}月", figsize=(8,6))
plt.show()
ドメイン知識による特徴量抽出†
7.3 モデルのチューニング【伊藤】†
関数化†
検証用データ†
- これまでは,元データを,訓練,テストの2つに分けていた
- チューニングしていくにあたり,テストデータに合わせたチューニングになってしまうのが問題
- なので,元データを,訓練,検証,テストの3つにわけるべし
クロスバリデーション†
グリッドサーチ†
最適化†
7.4 アプリケーション【陳】†
作成したモデルをAPI化する†
訓練済みモデルの利用†