機械学習概論
をテンプレートにして作成
開始行:
* 機械学習概論:考え方と枠組み [#b4d05eef]
#contents
* 1. 機械学習の考え方 [#z144176a]
** 機械学習とは [#m86fa502]
*** 学習 (learning) [#u44cd8a4]
大辞林より
+ まなびおさめること.勉強すること.「新しい教科を―する」
+〔生〕 生後の反復した経験によって,個々の個体の行動に環...
+〔心〕 過去の経験によって行動の仕方がある程度永続的に変...
+〔教〕 新しい知識の獲得,感情の深化,よき習慣の形成など...
CENTER:&attachref(./3_gakushu.png,70%);~
CENTER:図1: ヒトの学習
*** 機械学習 (machine learning)[#i0bf0e0e]
- 統計的手法を使用して,明示的にプログラムされずにコンピ...
- コンピューターが新しいデータから学習してタスクの実行方...
- データを分析する方法の1つで,データから,「機械」(コ...
- 機械学習とは,AIが人間のような高度な判断を実行するに必...
- 観測センサーやその他の手段で収集されたデータの中から一...
*** プログラミングと機械学習 [#u8726945]
従来,機械(コンピュータ)に仕事をさせるには,人間が情報...
- プログラムは人間の英知によって書かれるもの
- 【メリット】100%指示した通りに動作する.テスト可能である
- 【デメリット】人間の経験と勘の域を出ない.仕事が変われ...
CENTER:&attachref(./3_programming.png,75%);~
CENTER:図2: プログラミングによる情報処理
一方,機械学習による情報処理では,機械(コンピュータ)が...
- 学習によって得られた法則に基づいて,機械は新しいデータ...
-- もちろん,データの前処理や学習の手順は人間がプログラミ...
- 【メリット】人間には見つけられない法則・パターンを見つ...
- 【デメリット】100%の正しさを保証できない.データの品質...
CENTER:&attachref(./3_machine_learning.png,75%);~
CENTER:図3: 機械学習による情報処理
** 機械学習の種類 [#f7293c5c]
*** 教師あり学習 (supervised learning) [#uedaa2db]
データにおける''入力X(特徴量)''と''出力y(正解データ)'...
機械学習の最も代表的なアプローチ.''回帰''と''分類''の2タ...
- ''回帰 (regression) ''
-- yを数値(連続値)として,Xから予測するモデルを構築する
-- 応用例:売上予測,需要予測,リードタイム予測,収穫量予測
-- モデル:線形回帰,リッジ回帰,ラッソ回帰,回帰木
- ''分類 (classification)''
-- yをカテゴリ(離散値)として,予測する問題
-- 応用例:故障予測,文字認識,感情認識,スパム判定
-- モデル:決定木,ロジスティック回帰,k近傍法,サポート...
*** 教師なし学習 (unsupervised learning) [#m576b3cd]
正解データを指定せず,データそのものがどのような性質を持...
代表的な方法に''次元削減'',''クラスタリング''がある.
- ''次元削減 (dimensionality reduction)''
-- 変数(列)同士の関係に着目して,情報をなるべく失わないよ...
-- 応用例:可視化,データの圧縮,特徴量の抽出
-- モデル:主成分分析(PCA)
- ''クラスタリング(clustering)''
-- サンプル(行)同士の関係に着目して,似た性質を持つデー...
-- 応用例:顧客のセグメンテーション(類型化),ブランド・...
-- モデル:k-means,階層的クラスタリング
*** その他 [#j27ae6a5]
- ''強化学習 (reinforcement learning)''
-- ある環境の下で,行動の結果が最も良くなるように,適切な...
-- 応用例:ゲーム,ロボット制御
- ''深層学習 (deep learning)''
-- 学習モデルに多層ニューラルネットワークを使用
-- 重要な特徴量を機械が自動的に学習し,データから結果まで...
-- 応用例:画像認識,音声認識,自然言語処理,異常検知
** 機械学習を使うべきか使わざるべきか? [#jc802fd4]
- 機械学習はあくまで目的を実現する''手段''に過ぎない.使...
- 機械学習はコストの高い手法.解決したい課題に対して本当...
-- ちょっとしたデータ分析で済む問題に対して,無理やり使お...
-- プログラム(ルール)が書ける問題に対して,データで説明...
*** 目的・問いを明確化する [#b5819eae]
- まず初めに,やりたいこと,目的,''問い(Research Questi...
-- なるべく具体的(Sharp)な質問を考える
--- ×売り上げがどうなるか?
--- △明日の売上個数はどうなるか?
--- ○商品Aの翌日の売上個数が何個になるか予測できるか?
- よく似た文章でも,RQとして考えると全く別物になる
-- 商品Aの翌日の売上個数は何個か?
-- 商品Aのこの先1週間の売上金額はいくらになるか?
-- 商品Aの売上個数の傾向に似た別の商品をどれか?
-- 商品Aに対する広告の効果があったか・なかったか?
-- 商品Aが既存の商品Bに比べてどれだけ売れているか?
-- 商品Aはこれまで何曜日に一番多く売れたか?
-- 商品Aに適用する消費税率はいくらか?
*** 機械学習向いている問題 [#z3122ebc]
- 目的に関連する質の良いデータが豊富にある
- 自明・既知のルールがない,あるいは,ルール化できない問題
- 既存のアルゴリズムでは性能に限界がある問題
** 機械学習とPython [#k99ee9ac]
- ''scikit-learn (サイキット・ラーン)''
-- 機械学習のための強力なライブラリ
--- [[API一覧:https://scikit-learn.org/stable/modules/cla...
-- 基本的な教師あり学習と教師なし学習に対応
-- 強化学習,深層学習,シーケンス予測には対応しない
- データ操作・可視化のためのライブラリ
-- Pandas
-- Numpy
-- Matplotlib
-- Seaborn: Matplotlibより高級な描画ライブラリ
- 他のライブラリ
-- Tensorflow: Googleが開発した深層学習のフレームワーク
-- Keras: ニューラルネットワーク向けのライブラリ.Tensorf...
--- 画像認識,音声認識,文章の生成,botシステムの作成など...
-- PyTorch: Facebookが開発した深層学習のフレームワーク
--- 自然言語処理への応用
* 2. 機械学習の体験(教師あり学習・分類) [#r528285d]
** アヤメ(Iris)の分類問題 [#hcca53cd]
- 教育目的によく用いられる古典的な分類問題.アヤメ(花)...
- RQ:アヤメ(花)の観測データから,その品種を見分けるこ...
-- 特徴: がくの長さ(cm),がくの幅(cm),花びらの長さ(cm)...
-- 品種:以下の3種類
- [[データ:https://www2.cmds.kobe-u.ac.jp/~masa-n/dshands...
|''ヒオウギ・アヤメ(Iris-Setosa)''|''ブルーフラッグ (Ir...
|&attachref(./iris_setosa.jpg,80%);|&attachref(./iris_ver...
|[[(C) Malcolm Manners - CC BY 2.0:https://www.flickr.com...
CENTER:図3:分類するアヤメの品種
** Google Colabでやってみよう [#kb059adf]
*** Google Colabの起動 [#of1ee063]
- Webブラウザを立ち上げ,[[''Googld Drive'':https://drive...
- +新規→(その他)→ Google Colaboratory
-- Google Colaboratoryが見つからない場合は,+アプリを追加...
- 上部にあるファイル名を,''iris.ipynb''に変更する
- 以下を貼り付けて実行
#準備(すべてに共通)
# 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
*** データのロード [#vbfc854f]
- コードセルを一つ追加し,以下を貼り付けて実行
#アヤメデータの取得
iris_data = pd.read_csv("https://www2.cmds.kobe-u.ac.jp/...
#確認
iris_data
*** データを眺める [#k60bcad5]
- データをよく眺めてみよう
-- 「表のマーク」アイコンを押すと,表データを見やすく操作...
- 表のサイズ
iris_data.shape
- 各列の統計量
iris_data.describe()
- それぞれの品種のサンプル数
iris_data["品種"].value_counts()
- 散布図行列 (詳細は第4回で)
#Seabornのペアプロットを使う
sns.pairplot(data=iris_data, hue="品種")
~
#Pandasにも機能がある.ただし,色分けするのに手間なので...
pd.plotting.scatter_matrix(iris_data)
*** アヤメ問題の定式化 [#b68752ef]
- がくの長さ,がくの幅,花びらの長さ,花びらの幅から 品種...
-- ''【入力 X】:'' 4つの数値 ex: 4.8, 3.3, 1.4, 0.2
--- Xは''特徴量(feature),説明変数''などと呼ばれる.予測...
-- ''【出力 y】:'' Iris-setosa, Iris-versicolor, Iris-vir...
--- yは''正解データ,ラベル,目的変数 (target)''などと呼...
- ''この問題において,機械学習で行うこと: y=f(X)のfを見...
-- データを読み込んで,入力Xと出力yの関係を学習し,法則 f...
-- fは''モデル(model)''と呼ばれる
--- モデルfには,最初は値が決まっていない変数(''パラメー...
--- 学習とは,大量のデータを読み込んで,Xとyの対応関係に...
--- パラメータの探し方には,様々な ''手法(アルゴリズム)...
-- アルゴリズムを動かす際に,人間が設定するパラメータを '...
--- 決定木の深さの上限:max_depth,葉ノードの数の上限:ma...
&attachref(./3_formulation.png,70%);~
図4: アヤメ問題への機械学習の適用
*** 機械学習を実行し,モデルを構築する [#ge41e7df]
- 決定木による分類モデル(DecisionTreeClassifier)を使っ...
#特徴に使う列名リスト
features = ["がくの長さ", "がくの幅", "花びらの長さ", "...
#正解データに使う列名
target = ["品種"]
X = iris_data[features]
y = iris_data[target]
from sklearn import tree
#決定木による分類モデルの構築.木の深さの上限を3とする(...
model = tree.DecisionTreeClassifier(random_state=0, max_...
model.fit(X,y)
*** 未知のデータで予測してみる [#x4991115]
- 元のデータを参考に,それぞれの品種に似たデータを3つ用意...
#未知のデータで予測してみる
new_data = pd.DataFrame([[4.8, 3.3, 1.4, 0.2],[7.3, 3.2,...
new_data
- 予測を実行する
#予測してみる
model.predict(new_data)
*** アプリに組み込んでみる [#vf64588a]
- ユーザと対話的に答えを出力するAIアプリ
#ユーザから入力を受け付けて,答えを出すプログラム
print("■アヤメの品種予測アプリ")
while True:
input_str = input("がくの長さ・幅,花びらの長さ・幅を...
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("終了します")
** 何が起きたのか? [#q51fed6d]
- 機械学習アルゴリズムの1つである''決定木''によって,X(...
- ''条件分岐''によって分類モデルを構築する機械学習アルゴ...
-- 回帰モデルにも応用可能
*** モデルを確認する [#xeb6de71]
- 構築された決定木のモデルを表示する
tree.plot_tree(model, feature_names=X.columns)
CENTER:&attachref(3_decision_tree_iris.png);~
CENTER:図5: 決定木によるアヤメの分類モデル
*** 決定木アルゴリズムの直感的な解説 [#s2e2bc87]
+ はじめは全体グループを表す根ノードから始める
+ 特徴量に関する条件を探し,それを満たすデータと満たさな...
-- この時,子ノードの''不純度 (gini)''がなるべく低くなる...
-- 決定木ではこの分割条件(変数名 <= 閾値)がパラメータと...
+ 不純度が0になる,あるいは,指定された深さ(この場合3)ま...
CENTER:&attachref(3_bunkatsu.png);~
CENTER:図6: 決定木によって分割されたデータ
※[[アルゴリズム詳細:https://scikit-learn.org/stable/modul...
*** 疑問 [#i214365f]
- このモデルってどこまで信頼していいの?
- 未知のデータに対して,アプリの出力は完ぺきなの?何パー...
→ ''モデルの評価'' が必要
- どうやって評価するの?
** モデルを評価する [#xfe72f74]
- すべてのデータで学習するのではなく,学習用のデータ(訓...
- 訓練データで作成したモデルを,テストデータを未知のデー...
- モデルの予測とテストデータの正解がどれだけ合致するかを...
*** データを分割する:ホールドアウト法 [#xb7970ad]
- 与えられたデータを2つに分割する (本当は3つに分けるのが...
-- ''訓練データ'': モデルの学習に使うデータ
-- ''テストデータ'': モデルの性能評価に使うデータ
- 特徴量X, 正解データyをそれぞれ同じところで分割する
CENTER:&attachref(./3_train_test_split.png,80%);~
CENTER:図7: 訓練データとテストデータの分割
- Pythonのコードでは,scikit-learnが提供する関数 train_te...
- パラメータ:
-- X: 特徴量
-- y: 正解データ
-- train_size: 訓練データの割合 (デフォルト0.75)
-- test_size: テストデータの割合(デフォルト0.25)
-- shuffle: ランダムに分割(デフォルトTrue)
-- random_state: 乱数シード
-- stratify: 指定したデータの分布が均一になるよう分割 (デ...
#X, yのそれぞれを訓練データとテストデータに分ける (訓練...
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y...
#それぞれ確認してみる
print(X_train, X_test, y_train, y_test)
*** モデルの学習 [#lc2d562e]
- モデルの学習では訓練データのみを使う
model.fit(X_train, y_train)
*** モデルの評価 [#rcee5596]
- モデルの評価ではテストデータのみを使う
acc = model.score(X_test, y_test)
print(f"分類精度: {acc}")
- model.score()は,分類モデルの場合,''精度(Accuracy)''...
-- 全テストデータのうち,いくつのデータを正確に当てられた...
- Pandasにテスト結果を書き出してみよう
#実際にあっているかどうかを評価
y_eval = pd.DataFrame() #空のデータフ...
y_eval["正解"] = y_test["品種"] #正解はテスト...
y_eval["予測"] = model.predict(X_test) #予測はモデル...
y_eval["結果"] = y_eval["正解"] == y_eval["予測"] #予測...
#表示
y_eval
- 分類問題の場合,''混同行列(confution_matrix)'' で評価...
#混同行列を表示する
from sklearn.metrics import confusion_matrix, ConfusionM...
cm = confusion_matrix(y_test, model.predict(X_test))
disp = ConfusionMatrixDisplay(confusion_matrix=cm, displ...
disp.plot()
CENTER:&attachref(3_confusion_matrix.png);~
CENTER:図8: 混同行列
- 決定木の場合,どの特徴量が分類に重要だったかを表す''重...
#決定木分類における重要度を表示する
importance = pd.DataFrame(index=features)
importance["重要度"] = model.feature_importances_
#確認
print(importance)
- 評価結果に満足がいかない場合は,設定を変えてモデルを再...
-- データの品質を上げる (サンプル数を増やす,欠損値を埋め...
-- 特徴量を絞ってみる(正解データに関連しないものは除去す...
-- 違う手法・アルゴリズムを選ぶ
-- パラメータを調整する(e.g., 決定木の深さ)
** モデルを保存する [#c480615a]
- 満足のいくモデルができたら,ファイルに書き出して保存し...
-- Pythonのpickleモジュールを使う
-- Google Driveに書き出す場合は,Colabにドライブをマウン...
*** モデルのセーブ [#rc738d48]
import pickle
with open("フォルダのパス名/保存ファイル名", "wb") as f:
pickle.dump(model, f)
*** モデルのロード [#d191a618]
import pickle
with open("フォルダのパス名/保存ファイル名", "rb") as f:
model = pickle.load(f)
#以降,アプリでmodelを利用する
** アヤメの分類問題・プログラム全体 [#od9ef16e]
+ 必要なライブラリのインポート
################### ライブラリのインポート ############...
#いつもの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
+ データの取得
########################### データの取得 ###############...
#アヤメデータの取得
iris_data = pd.read_csv("https://www2.cmds.kobe-u.ac.jp/...
+ データの理解・可視化
ここでは省略.様々な角度から,データを眺めてみる(探索的...
+ 前処理
############################## 前処理 ##################...
#特徴量に指定する列名リスト
features = ["がくの長さ", "がくの幅", "花びらの長さ", "...
# 正解データに指定する列名
target = ["品種"]
#特徴量
X = iris_data[features]
#正解データ
y = iris_data[target]
#X, yのそれぞれを訓練データとテストデータに分ける (訓練...
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y...
+ モデルの選択と学習
###################### モデルの選択と学習 ##############...
#モデルの選択
from sklearn import tree
model = tree.DecisionTreeClassifier(max_depth=3, random_...
#モデルの学習(訓練データを使う)
model.fit(X_train, y_train)
#モデルの表示(オプショナル)
tree.plot_tree(model, feature_names=X.columns)
plt.show()
+ モデルの評価
########################### モデルの評価 ###############...
#分類精度
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, ConfusionM...
cm = confusion_matrix(y_test, model.predict(X_test))
disp = ConfusionMatrixDisplay(confusion_matrix=cm, displ...
disp.plot()
+ モデルの保存
with open("/content/drive/MyDrive/フォルダ名/ファイル名....
pickle.dump(model, f)
//* 4. 機械学習の枠組み [#f7be4b61]
* 3. 機械学習の枠組み [#f7be4b61]
** 教師あり機械学習の実装の流れ [#tbabfd7f]
- 今回行った機械学習体験を振り返りながら,教師あり機械学...
-- 図には今回行わなかった作業も含まれている
CENTER:&attachref(./3_process.png,70%);~
CENTER:図12: 教師あり機械学習モデルの開発プロセス
** CRISP-DM: データ分析の標準的な手順 [#b8defa9e]
- [[CRISP-DM(CRoss-Industry Standard Process for Data Mi...
-- データマイニング専門家によく利用される汎用的なアプロー...
-- 図12のものと流れはほぼ同じ
CENTER:&attachref(./3_CRISP-DM_Process_Diagram.png,50%);~
CENTER:図13: CRISP-DMの構成図 ([[Wikipedia:https://en.wik...
+ ''ビジネス理解 (Business Understanding)''
-- 対象とするビジネスがどのようなのものなのか,課題は何か...
-- データ分析の具体的な目標を決める.何をどこまで解決した...
-- ''問いを立てる''
+ ''データ理解 (Data Understanding)''
-- 分析するデータ(一次データ,生データ)がどのようなものな...
-- 目標達成のために必要なデータ項目があるかを吟味する
-- 難しければフェーズ1に立ち返ってよい
+ ''データ準備 (Data Preparation)''
-- 一次データに前処理を行い,実施するデータ分析に必要な''...
-- 質の良いデータセットを得られるかが,データ分析の結果を...
+ ''モデル作成 (Modeling)''
-- データセットに対して分析手法を適用し,モデルを作成する
+ ''評価 (Evaluation)''
-- 分析で得られた結果が,課題解決のために十分であるかをビ...
+ ''配備・運用 (Deployment)''
-- データ分析の結果を実際のビジネスに適用するための施策を...
-- フェーズ1で設定した目標を達成するための具体的なアクシ...
** 他の教師あり機械学習アルゴリズム [#jfa59e5e]
- Scikit-Learnには,他にも様々なアルゴリズムが用意されて...
-- [[Scikit-Learn API リファレンス:https://scikit-learn.o...
- 同じアルゴリズムでも考え方を少し変えることで,分類と回...
-- 決定木(DecisionTreeClassifier) と 回帰木(DecisionTreeR...
*** 分類 [#l1bea562]
- ロジスティック回帰 (logistic regression)
- サポートベクタマシン (support vector machine)
- ランダムフォレスト (random forest)
- 勾配ブースティング (gradient boosting)
*** 回帰 [#p3f3af28]
- リッジ (ridge)
- ラッソ (lasso)
- 最近傍法 (nearest neighbors)
- 勾配ブースティング (gradient boosting)
** 機械学習が抱えるチャレンジ [#z318e3b0]
- 大量の教師データ(例題と正解がペアになっているデータ)...
-- 単純な問題でも数千個,イメージ認識や音声認識だと数百万...
- 現実を表したデータを用意できるか?
-- データが現在の運用実態にあっていないとうまくいかない....
- 品質の良いデータを用意できるか?
-- 欠損値や外れ値,ノイズがたくさん含まれている場合,背後...
- 関係のある特徴量をそろえられるか?
-- 目的変数に関係のある特徴量が十分に含まれ,無関係な特徴...
-- 特徴量選択,特徴量抽出を駆使して,目的に寄与する特徴量...
- 訓練データへの過学習を防げるか?
-- 訓練データに合わせようとすればするほど,未知のデータに...
* 神戸大学のDXリカレント事業の紹介へ進む [#v15b43b1]
[[DXリカレント教育事業]]
終了行:
* 機械学習概論:考え方と枠組み [#b4d05eef]
#contents
* 1. 機械学習の考え方 [#z144176a]
** 機械学習とは [#m86fa502]
*** 学習 (learning) [#u44cd8a4]
大辞林より
+ まなびおさめること.勉強すること.「新しい教科を―する」
+〔生〕 生後の反復した経験によって,個々の個体の行動に環...
+〔心〕 過去の経験によって行動の仕方がある程度永続的に変...
+〔教〕 新しい知識の獲得,感情の深化,よき習慣の形成など...
CENTER:&attachref(./3_gakushu.png,70%);~
CENTER:図1: ヒトの学習
*** 機械学習 (machine learning)[#i0bf0e0e]
- 統計的手法を使用して,明示的にプログラムされずにコンピ...
- コンピューターが新しいデータから学習してタスクの実行方...
- データを分析する方法の1つで,データから,「機械」(コ...
- 機械学習とは,AIが人間のような高度な判断を実行するに必...
- 観測センサーやその他の手段で収集されたデータの中から一...
*** プログラミングと機械学習 [#u8726945]
従来,機械(コンピュータ)に仕事をさせるには,人間が情報...
- プログラムは人間の英知によって書かれるもの
- 【メリット】100%指示した通りに動作する.テスト可能である
- 【デメリット】人間の経験と勘の域を出ない.仕事が変われ...
CENTER:&attachref(./3_programming.png,75%);~
CENTER:図2: プログラミングによる情報処理
一方,機械学習による情報処理では,機械(コンピュータ)が...
- 学習によって得られた法則に基づいて,機械は新しいデータ...
-- もちろん,データの前処理や学習の手順は人間がプログラミ...
- 【メリット】人間には見つけられない法則・パターンを見つ...
- 【デメリット】100%の正しさを保証できない.データの品質...
CENTER:&attachref(./3_machine_learning.png,75%);~
CENTER:図3: 機械学習による情報処理
** 機械学習の種類 [#f7293c5c]
*** 教師あり学習 (supervised learning) [#uedaa2db]
データにおける''入力X(特徴量)''と''出力y(正解データ)'...
機械学習の最も代表的なアプローチ.''回帰''と''分類''の2タ...
- ''回帰 (regression) ''
-- yを数値(連続値)として,Xから予測するモデルを構築する
-- 応用例:売上予測,需要予測,リードタイム予測,収穫量予測
-- モデル:線形回帰,リッジ回帰,ラッソ回帰,回帰木
- ''分類 (classification)''
-- yをカテゴリ(離散値)として,予測する問題
-- 応用例:故障予測,文字認識,感情認識,スパム判定
-- モデル:決定木,ロジスティック回帰,k近傍法,サポート...
*** 教師なし学習 (unsupervised learning) [#m576b3cd]
正解データを指定せず,データそのものがどのような性質を持...
代表的な方法に''次元削減'',''クラスタリング''がある.
- ''次元削減 (dimensionality reduction)''
-- 変数(列)同士の関係に着目して,情報をなるべく失わないよ...
-- 応用例:可視化,データの圧縮,特徴量の抽出
-- モデル:主成分分析(PCA)
- ''クラスタリング(clustering)''
-- サンプル(行)同士の関係に着目して,似た性質を持つデー...
-- 応用例:顧客のセグメンテーション(類型化),ブランド・...
-- モデル:k-means,階層的クラスタリング
*** その他 [#j27ae6a5]
- ''強化学習 (reinforcement learning)''
-- ある環境の下で,行動の結果が最も良くなるように,適切な...
-- 応用例:ゲーム,ロボット制御
- ''深層学習 (deep learning)''
-- 学習モデルに多層ニューラルネットワークを使用
-- 重要な特徴量を機械が自動的に学習し,データから結果まで...
-- 応用例:画像認識,音声認識,自然言語処理,異常検知
** 機械学習を使うべきか使わざるべきか? [#jc802fd4]
- 機械学習はあくまで目的を実現する''手段''に過ぎない.使...
- 機械学習はコストの高い手法.解決したい課題に対して本当...
-- ちょっとしたデータ分析で済む問題に対して,無理やり使お...
-- プログラム(ルール)が書ける問題に対して,データで説明...
*** 目的・問いを明確化する [#b5819eae]
- まず初めに,やりたいこと,目的,''問い(Research Questi...
-- なるべく具体的(Sharp)な質問を考える
--- ×売り上げがどうなるか?
--- △明日の売上個数はどうなるか?
--- ○商品Aの翌日の売上個数が何個になるか予測できるか?
- よく似た文章でも,RQとして考えると全く別物になる
-- 商品Aの翌日の売上個数は何個か?
-- 商品Aのこの先1週間の売上金額はいくらになるか?
-- 商品Aの売上個数の傾向に似た別の商品をどれか?
-- 商品Aに対する広告の効果があったか・なかったか?
-- 商品Aが既存の商品Bに比べてどれだけ売れているか?
-- 商品Aはこれまで何曜日に一番多く売れたか?
-- 商品Aに適用する消費税率はいくらか?
*** 機械学習向いている問題 [#z3122ebc]
- 目的に関連する質の良いデータが豊富にある
- 自明・既知のルールがない,あるいは,ルール化できない問題
- 既存のアルゴリズムでは性能に限界がある問題
** 機械学習とPython [#k99ee9ac]
- ''scikit-learn (サイキット・ラーン)''
-- 機械学習のための強力なライブラリ
--- [[API一覧:https://scikit-learn.org/stable/modules/cla...
-- 基本的な教師あり学習と教師なし学習に対応
-- 強化学習,深層学習,シーケンス予測には対応しない
- データ操作・可視化のためのライブラリ
-- Pandas
-- Numpy
-- Matplotlib
-- Seaborn: Matplotlibより高級な描画ライブラリ
- 他のライブラリ
-- Tensorflow: Googleが開発した深層学習のフレームワーク
-- Keras: ニューラルネットワーク向けのライブラリ.Tensorf...
--- 画像認識,音声認識,文章の生成,botシステムの作成など...
-- PyTorch: Facebookが開発した深層学習のフレームワーク
--- 自然言語処理への応用
* 2. 機械学習の体験(教師あり学習・分類) [#r528285d]
** アヤメ(Iris)の分類問題 [#hcca53cd]
- 教育目的によく用いられる古典的な分類問題.アヤメ(花)...
- RQ:アヤメ(花)の観測データから,その品種を見分けるこ...
-- 特徴: がくの長さ(cm),がくの幅(cm),花びらの長さ(cm)...
-- 品種:以下の3種類
- [[データ:https://www2.cmds.kobe-u.ac.jp/~masa-n/dshands...
|''ヒオウギ・アヤメ(Iris-Setosa)''|''ブルーフラッグ (Ir...
|&attachref(./iris_setosa.jpg,80%);|&attachref(./iris_ver...
|[[(C) Malcolm Manners - CC BY 2.0:https://www.flickr.com...
CENTER:図3:分類するアヤメの品種
** Google Colabでやってみよう [#kb059adf]
*** Google Colabの起動 [#of1ee063]
- Webブラウザを立ち上げ,[[''Googld Drive'':https://drive...
- +新規→(その他)→ Google Colaboratory
-- Google Colaboratoryが見つからない場合は,+アプリを追加...
- 上部にあるファイル名を,''iris.ipynb''に変更する
- 以下を貼り付けて実行
#準備(すべてに共通)
# 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
*** データのロード [#vbfc854f]
- コードセルを一つ追加し,以下を貼り付けて実行
#アヤメデータの取得
iris_data = pd.read_csv("https://www2.cmds.kobe-u.ac.jp/...
#確認
iris_data
*** データを眺める [#k60bcad5]
- データをよく眺めてみよう
-- 「表のマーク」アイコンを押すと,表データを見やすく操作...
- 表のサイズ
iris_data.shape
- 各列の統計量
iris_data.describe()
- それぞれの品種のサンプル数
iris_data["品種"].value_counts()
- 散布図行列 (詳細は第4回で)
#Seabornのペアプロットを使う
sns.pairplot(data=iris_data, hue="品種")
~
#Pandasにも機能がある.ただし,色分けするのに手間なので...
pd.plotting.scatter_matrix(iris_data)
*** アヤメ問題の定式化 [#b68752ef]
- がくの長さ,がくの幅,花びらの長さ,花びらの幅から 品種...
-- ''【入力 X】:'' 4つの数値 ex: 4.8, 3.3, 1.4, 0.2
--- Xは''特徴量(feature),説明変数''などと呼ばれる.予測...
-- ''【出力 y】:'' Iris-setosa, Iris-versicolor, Iris-vir...
--- yは''正解データ,ラベル,目的変数 (target)''などと呼...
- ''この問題において,機械学習で行うこと: y=f(X)のfを見...
-- データを読み込んで,入力Xと出力yの関係を学習し,法則 f...
-- fは''モデル(model)''と呼ばれる
--- モデルfには,最初は値が決まっていない変数(''パラメー...
--- 学習とは,大量のデータを読み込んで,Xとyの対応関係に...
--- パラメータの探し方には,様々な ''手法(アルゴリズム)...
-- アルゴリズムを動かす際に,人間が設定するパラメータを '...
--- 決定木の深さの上限:max_depth,葉ノードの数の上限:ma...
&attachref(./3_formulation.png,70%);~
図4: アヤメ問題への機械学習の適用
*** 機械学習を実行し,モデルを構築する [#ge41e7df]
- 決定木による分類モデル(DecisionTreeClassifier)を使っ...
#特徴に使う列名リスト
features = ["がくの長さ", "がくの幅", "花びらの長さ", "...
#正解データに使う列名
target = ["品種"]
X = iris_data[features]
y = iris_data[target]
from sklearn import tree
#決定木による分類モデルの構築.木の深さの上限を3とする(...
model = tree.DecisionTreeClassifier(random_state=0, max_...
model.fit(X,y)
*** 未知のデータで予測してみる [#x4991115]
- 元のデータを参考に,それぞれの品種に似たデータを3つ用意...
#未知のデータで予測してみる
new_data = pd.DataFrame([[4.8, 3.3, 1.4, 0.2],[7.3, 3.2,...
new_data
- 予測を実行する
#予測してみる
model.predict(new_data)
*** アプリに組み込んでみる [#vf64588a]
- ユーザと対話的に答えを出力するAIアプリ
#ユーザから入力を受け付けて,答えを出すプログラム
print("■アヤメの品種予測アプリ")
while True:
input_str = input("がくの長さ・幅,花びらの長さ・幅を...
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("終了します")
** 何が起きたのか? [#q51fed6d]
- 機械学習アルゴリズムの1つである''決定木''によって,X(...
- ''条件分岐''によって分類モデルを構築する機械学習アルゴ...
-- 回帰モデルにも応用可能
*** モデルを確認する [#xeb6de71]
- 構築された決定木のモデルを表示する
tree.plot_tree(model, feature_names=X.columns)
CENTER:&attachref(3_decision_tree_iris.png);~
CENTER:図5: 決定木によるアヤメの分類モデル
*** 決定木アルゴリズムの直感的な解説 [#s2e2bc87]
+ はじめは全体グループを表す根ノードから始める
+ 特徴量に関する条件を探し,それを満たすデータと満たさな...
-- この時,子ノードの''不純度 (gini)''がなるべく低くなる...
-- 決定木ではこの分割条件(変数名 <= 閾値)がパラメータと...
+ 不純度が0になる,あるいは,指定された深さ(この場合3)ま...
CENTER:&attachref(3_bunkatsu.png);~
CENTER:図6: 決定木によって分割されたデータ
※[[アルゴリズム詳細:https://scikit-learn.org/stable/modul...
*** 疑問 [#i214365f]
- このモデルってどこまで信頼していいの?
- 未知のデータに対して,アプリの出力は完ぺきなの?何パー...
→ ''モデルの評価'' が必要
- どうやって評価するの?
** モデルを評価する [#xfe72f74]
- すべてのデータで学習するのではなく,学習用のデータ(訓...
- 訓練データで作成したモデルを,テストデータを未知のデー...
- モデルの予測とテストデータの正解がどれだけ合致するかを...
*** データを分割する:ホールドアウト法 [#xb7970ad]
- 与えられたデータを2つに分割する (本当は3つに分けるのが...
-- ''訓練データ'': モデルの学習に使うデータ
-- ''テストデータ'': モデルの性能評価に使うデータ
- 特徴量X, 正解データyをそれぞれ同じところで分割する
CENTER:&attachref(./3_train_test_split.png,80%);~
CENTER:図7: 訓練データとテストデータの分割
- Pythonのコードでは,scikit-learnが提供する関数 train_te...
- パラメータ:
-- X: 特徴量
-- y: 正解データ
-- train_size: 訓練データの割合 (デフォルト0.75)
-- test_size: テストデータの割合(デフォルト0.25)
-- shuffle: ランダムに分割(デフォルトTrue)
-- random_state: 乱数シード
-- stratify: 指定したデータの分布が均一になるよう分割 (デ...
#X, yのそれぞれを訓練データとテストデータに分ける (訓練...
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y...
#それぞれ確認してみる
print(X_train, X_test, y_train, y_test)
*** モデルの学習 [#lc2d562e]
- モデルの学習では訓練データのみを使う
model.fit(X_train, y_train)
*** モデルの評価 [#rcee5596]
- モデルの評価ではテストデータのみを使う
acc = model.score(X_test, y_test)
print(f"分類精度: {acc}")
- model.score()は,分類モデルの場合,''精度(Accuracy)''...
-- 全テストデータのうち,いくつのデータを正確に当てられた...
- Pandasにテスト結果を書き出してみよう
#実際にあっているかどうかを評価
y_eval = pd.DataFrame() #空のデータフ...
y_eval["正解"] = y_test["品種"] #正解はテスト...
y_eval["予測"] = model.predict(X_test) #予測はモデル...
y_eval["結果"] = y_eval["正解"] == y_eval["予測"] #予測...
#表示
y_eval
- 分類問題の場合,''混同行列(confution_matrix)'' で評価...
#混同行列を表示する
from sklearn.metrics import confusion_matrix, ConfusionM...
cm = confusion_matrix(y_test, model.predict(X_test))
disp = ConfusionMatrixDisplay(confusion_matrix=cm, displ...
disp.plot()
CENTER:&attachref(3_confusion_matrix.png);~
CENTER:図8: 混同行列
- 決定木の場合,どの特徴量が分類に重要だったかを表す''重...
#決定木分類における重要度を表示する
importance = pd.DataFrame(index=features)
importance["重要度"] = model.feature_importances_
#確認
print(importance)
- 評価結果に満足がいかない場合は,設定を変えてモデルを再...
-- データの品質を上げる (サンプル数を増やす,欠損値を埋め...
-- 特徴量を絞ってみる(正解データに関連しないものは除去す...
-- 違う手法・アルゴリズムを選ぶ
-- パラメータを調整する(e.g., 決定木の深さ)
** モデルを保存する [#c480615a]
- 満足のいくモデルができたら,ファイルに書き出して保存し...
-- Pythonのpickleモジュールを使う
-- Google Driveに書き出す場合は,Colabにドライブをマウン...
*** モデルのセーブ [#rc738d48]
import pickle
with open("フォルダのパス名/保存ファイル名", "wb") as f:
pickle.dump(model, f)
*** モデルのロード [#d191a618]
import pickle
with open("フォルダのパス名/保存ファイル名", "rb") as f:
model = pickle.load(f)
#以降,アプリでmodelを利用する
** アヤメの分類問題・プログラム全体 [#od9ef16e]
+ 必要なライブラリのインポート
################### ライブラリのインポート ############...
#いつもの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
+ データの取得
########################### データの取得 ###############...
#アヤメデータの取得
iris_data = pd.read_csv("https://www2.cmds.kobe-u.ac.jp/...
+ データの理解・可視化
ここでは省略.様々な角度から,データを眺めてみる(探索的...
+ 前処理
############################## 前処理 ##################...
#特徴量に指定する列名リスト
features = ["がくの長さ", "がくの幅", "花びらの長さ", "...
# 正解データに指定する列名
target = ["品種"]
#特徴量
X = iris_data[features]
#正解データ
y = iris_data[target]
#X, yのそれぞれを訓練データとテストデータに分ける (訓練...
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y...
+ モデルの選択と学習
###################### モデルの選択と学習 ##############...
#モデルの選択
from sklearn import tree
model = tree.DecisionTreeClassifier(max_depth=3, random_...
#モデルの学習(訓練データを使う)
model.fit(X_train, y_train)
#モデルの表示(オプショナル)
tree.plot_tree(model, feature_names=X.columns)
plt.show()
+ モデルの評価
########################### モデルの評価 ###############...
#分類精度
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, ConfusionM...
cm = confusion_matrix(y_test, model.predict(X_test))
disp = ConfusionMatrixDisplay(confusion_matrix=cm, displ...
disp.plot()
+ モデルの保存
with open("/content/drive/MyDrive/フォルダ名/ファイル名....
pickle.dump(model, f)
//* 4. 機械学習の枠組み [#f7be4b61]
* 3. 機械学習の枠組み [#f7be4b61]
** 教師あり機械学習の実装の流れ [#tbabfd7f]
- 今回行った機械学習体験を振り返りながら,教師あり機械学...
-- 図には今回行わなかった作業も含まれている
CENTER:&attachref(./3_process.png,70%);~
CENTER:図12: 教師あり機械学習モデルの開発プロセス
** CRISP-DM: データ分析の標準的な手順 [#b8defa9e]
- [[CRISP-DM(CRoss-Industry Standard Process for Data Mi...
-- データマイニング専門家によく利用される汎用的なアプロー...
-- 図12のものと流れはほぼ同じ
CENTER:&attachref(./3_CRISP-DM_Process_Diagram.png,50%);~
CENTER:図13: CRISP-DMの構成図 ([[Wikipedia:https://en.wik...
+ ''ビジネス理解 (Business Understanding)''
-- 対象とするビジネスがどのようなのものなのか,課題は何か...
-- データ分析の具体的な目標を決める.何をどこまで解決した...
-- ''問いを立てる''
+ ''データ理解 (Data Understanding)''
-- 分析するデータ(一次データ,生データ)がどのようなものな...
-- 目標達成のために必要なデータ項目があるかを吟味する
-- 難しければフェーズ1に立ち返ってよい
+ ''データ準備 (Data Preparation)''
-- 一次データに前処理を行い,実施するデータ分析に必要な''...
-- 質の良いデータセットを得られるかが,データ分析の結果を...
+ ''モデル作成 (Modeling)''
-- データセットに対して分析手法を適用し,モデルを作成する
+ ''評価 (Evaluation)''
-- 分析で得られた結果が,課題解決のために十分であるかをビ...
+ ''配備・運用 (Deployment)''
-- データ分析の結果を実際のビジネスに適用するための施策を...
-- フェーズ1で設定した目標を達成するための具体的なアクシ...
** 他の教師あり機械学習アルゴリズム [#jfa59e5e]
- Scikit-Learnには,他にも様々なアルゴリズムが用意されて...
-- [[Scikit-Learn API リファレンス:https://scikit-learn.o...
- 同じアルゴリズムでも考え方を少し変えることで,分類と回...
-- 決定木(DecisionTreeClassifier) と 回帰木(DecisionTreeR...
*** 分類 [#l1bea562]
- ロジスティック回帰 (logistic regression)
- サポートベクタマシン (support vector machine)
- ランダムフォレスト (random forest)
- 勾配ブースティング (gradient boosting)
*** 回帰 [#p3f3af28]
- リッジ (ridge)
- ラッソ (lasso)
- 最近傍法 (nearest neighbors)
- 勾配ブースティング (gradient boosting)
** 機械学習が抱えるチャレンジ [#z318e3b0]
- 大量の教師データ(例題と正解がペアになっているデータ)...
-- 単純な問題でも数千個,イメージ認識や音声認識だと数百万...
- 現実を表したデータを用意できるか?
-- データが現在の運用実態にあっていないとうまくいかない....
- 品質の良いデータを用意できるか?
-- 欠損値や外れ値,ノイズがたくさん含まれている場合,背後...
- 関係のある特徴量をそろえられるか?
-- 目的変数に関係のある特徴量が十分に含まれ,無関係な特徴...
-- 特徴量選択,特徴量抽出を駆使して,目的に寄与する特徴量...
- 訓練データへの過学習を防げるか?
-- 訓練データに合わせようとすればするほど,未知のデータに...
* 神戸大学のDXリカレント事業の紹介へ進む [#v15b43b1]
[[DXリカレント教育事業]]
ページ名: