機械学習概論:考え方と枠組み

1. 機械学習の考え方

機械学習とは

学習 (learning)

大辞林より

  1. まなびおさめること.勉強すること.「新しい教科を―する」
  2. 〔生〕 生後の反復した経験によって,個々の個体の行動に環境に対して適応した変化が現れる過程.ヒトでは社会的生活に関与するほとんどすべての行動がこれによって習得される.
  3. 〔心〕 過去の経験によって行動の仕方がある程度永続的に変容すること.新しい習慣が形成されること.
  4. 〔教〕 新しい知識の獲得,感情の深化,よき習慣の形成などの目標に向かって努力を伴って展開される意識的行動.
3_gakushu.png
図1: ヒトの学習

機械学習 (machine learning)

プログラミングと機械学習

従来,機械(コンピュータ)に仕事をさせるには,人間が情報処理の手順や法則をプログラムとして記述し,機械に与えて実行していた

3_programming.png
図2: プログラミングによる情報処理

一方,機械学習による情報処理では,機械(コンピュータ)がデータから法則を自動的・統計的に学習する

3_machine_learning.png
図3: 機械学習による情報処理

機械学習の種類

教師あり学習 (supervised learning)

データにおける入力X(特徴量)と出力y(正解データ)関係f (y = f(X))を学習する. 機械学習の最も代表的なアプローチ.回帰分類の2タイプに大別される.

教師なし学習 (unsupervised learning)

正解データを指定せず,データそのものがどのような性質を持っているかを学習する. 代表的な方法に次元削減クラスタリングがある.

その他

機械学習を使うべきか使わざるべきか?

目的・問いを明確化する

機械学習向いている問題

機械学習とPython

2. 機械学習の体験(教師あり学習・分類)

アヤメ(Iris)の分類問題

ヒオウギ・アヤメ(Iris-Setosa)ブルーフラッグ (Iris-Versicolour)バージニカ (Iris-Virginica)
iris_setosa.jpgiris_versicolour.jpgiris_verginica.jpg
(C) Malcolm Manners - CC BY 2.0(C) Maja Dumat - CC BY 2.0(C) Frank Mayfield - CC BY-SA 2.0
図3:分類するアヤメの品種

Google Colabでやってみよう

Google Colabの起動

データのロード

データを眺める

アヤメ問題の定式化

3_formulation.png
図4: アヤメ問題への機械学習の適用

機械学習を実行し,モデルを構築する

#特徴に使う列名リスト
features = ["がくの長さ", "がくの幅", "花びらの長さ", "花びらの幅"]
#正解データに使う列名
target = ["品種"]

X = iris_data[features]
y = iris_data[target]

from sklearn import tree
#決定木による分類モデルの構築.木の深さの上限を3とする(ハイパーパラメータ)
model = tree.DecisionTreeClassifier(random_state=0, max_depth=3)
model.fit(X,y)

未知のデータで予測してみる

#未知のデータで予測してみる
new_data = pd.DataFrame([[4.8, 3.3, 1.4, 0.2],[7.3, 3.2, 4.4, 1.3],[5.5, 2.6, 5.5, 2.7] ], columns=features)
new_data
#予測してみる
model.predict(new_data)

アプリに組み込んでみる

#ユーザから入力を受け付けて,答えを出すプログラム
print("■アヤメの品種予測アプリ")
while True:
  input_str = input("がくの長さ・幅,花びらの長さ・幅を入力(0で終了):")
  if (input_str == "0"):
    break
  vals = np.array(input_str.split()).astype(float)
  if (len(vals) != 4):
    print(" ×エラー:4つの数値が必要です.やり直し")
    continue
  df_params = pd.DataFrame([vals], columns=features)
  print(f" ○AI:品種は{model.predict(df_params)[0]}と思われます")
print("終了します")

何が起きたのか?

モデルを確認する

3_decision_tree_iris.png
図5: 決定木によるアヤメの分類モデル

決定木アルゴリズムの直感的な解説

  1. はじめは全体グループを表す根ノードから始める
  2. 特徴量に関する条件を探し,それを満たすデータと満たさないデータに分割して,2つの子ノードを作る
    • この時,子ノードの不純度 (gini)がなるべく低くなるような条件を探索する
    • 決定木ではこの分割条件(変数名 <= 閾値)がパラメータとなる
  3. 不純度が0になる,あるいは,指定された深さ(この場合3)まで到達すれば終了.そうでなければ,2.に戻る
3_bunkatsu.png
図6: 決定木によって分割されたデータ

アルゴリズム詳細

疑問

モデルの評価 が必要

モデルを評価する

データを分割する:ホールドアウト法

3_train_test_split.png
図7: 訓練データとテストデータの分割
#X, yのそれぞれを訓練データとテストデータに分ける (訓練:テスト=2:1)
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=0)

#それぞれ確認してみる
print(X_train, X_test, y_train, y_test)

モデルの学習

モデルの評価

3_confusion_matrix.png
図8: 混同行列

モデルを保存する

モデルのセーブ

import pickle
with open("フォルダのパス名/保存ファイル名", "wb") as f:
  pickle.dump(model, f)

モデルのロード

import pickle
with open("フォルダのパス名/保存ファイル名", "rb") as f:
  model = pickle.load(f)
#以降,アプリでmodelを利用する

アヤメの分類問題・プログラム全体

  1. 必要なライブラリのインポート
    ###################  ライブラリのインポート #########################
    #いつものPandasとNumPyをインポート
    import pandas as pd
    import numpy as np
    
    #日本語化MatplotLib
    import matplotlib.pyplot as plt
    !pip install japanize-matplotlib
    import japanize_matplotlib
    
    # Seabornをインポート
    import seaborn as sns
    
    # Pickleをインポート
    import pickle
    
  2. データの取得
    ########################### データの取得 ############################
    #アヤメデータの取得
    iris_data = pd.read_csv("https://www2.cmds.kobe-u.ac.jp/~masa-n/dshandson/iris-sample.csv")
    
  3. データの理解・可視化
    ここでは省略.様々な角度から,データを眺めてみる(探索的データ分析:次回)
  4. 前処理
    ############################## 前処理 ################################
    
    #特徴量に指定する列名リスト
    features = ["がくの長さ", "がくの幅", "花びらの長さ", "花びらの幅"]
    
    # 正解データに指定する列名
    target = ["品種"]
    
    #特徴量
    X = iris_data[features] 
    
    #正解データ
    y = iris_data[target]
    
    #X, yのそれぞれを訓練データとテストデータに分ける (訓練:テスト=2:1)
    from sklearn.model_selection import train_test_split
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=0)
    
  5. モデルの選択と学習
    ###################### モデルの選択と学習 #############################
    
    #モデルの選択
    from sklearn import tree
    model = tree.DecisionTreeClassifier(max_depth=3, random_state=0)
    
    #モデルの学習(訓練データを使う)
    model.fit(X_train, y_train)
    
    #モデルの表示(オプショナル)
    tree.plot_tree(model, feature_names=X.columns)
    plt.show()
  6. モデルの評価
    ########################### モデルの評価 ###############################
    
    #分類精度
    acc = model.score(X_test, y_test)
    print(f"分類精度: {acc}")
    
    #実際にあっているかどうかを確認してみる (オプショナル)
    y_eval = pd.DataFrame()
    y_eval["正解"] = y_test["品種"]
    y_eval["予測"] = model.predict(X_test)
    y_eval["結果"] = (y_eval["正解"] == y_eval["予測"])
    print(y_eval)
    
    #混同行列を表示する (オプショナル)
    from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay
    cm = confusion_matrix(y_test, model.predict(X_test))
    disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=model.classes_)
    disp.plot()
  7. モデルの保存
    with open("/content/drive/MyDrive/フォルダ名/ファイル名.pkl", "wb") as f:
       pickle.dump(model, f)

3. 機械学習の枠組み

教師あり機械学習の実装の流れ

3_process.png
図12: 教師あり機械学習モデルの開発プロセス

CRISP-DM: データ分析の標準的な手順

3_CRISP-DM_Process_Diagram.png
図13: CRISP-DMの構成図 (Wikipediaより)
  1. ビジネス理解 (Business Understanding)
    • 対象とするビジネスがどのようなのものなのか,課題は何かを理解する
    • データ分析の具体的な目標を決める.何をどこまで解決したいのか?
    • 問いを立てる
  2. データ理解 (Data Understanding)
    • 分析するデータ(一次データ,生データ)がどのようなものなのかを理解する
    • 目標達成のために必要なデータ項目があるかを吟味する
    • 難しければフェーズ1に立ち返ってよい
  3. データ準備 (Data Preparation)
    • 一次データに前処理を行い,実施するデータ分析に必要なデータセットを構築する
    • 質の良いデータセットを得られるかが,データ分析の結果を大きく作用する
  4. モデル作成 (Modeling)
    • データセットに対して分析手法を適用し,モデルを作成する
  5. 評価 (Evaluation)
    • 分析で得られた結果が,課題解決のために十分であるかをビジネスの観点から評価する
  6. 配備・運用 (Deployment)
    • データ分析の結果を実際のビジネスに適用するための施策を考えていく
    • フェーズ1で設定した目標を達成するための具体的なアクションを起こしていく

他の教師あり機械学習アルゴリズム

分類

回帰

機械学習が抱えるチャレンジ


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS