学習内容
- 画像分類/データセットの準備
- CNN モデルの定義/目的関数と最適化手法の選択/モデルの学習/
- ファインチューニング/全結合層を追加/モデルの学習/予測精度の評価
学習させるのに5日間を要した。(PCを使用している間のみ、バックグラウンドで学習。)
学習させるのに5日間を要した。(PCを使用している間のみ、バックグラウンドで学習。)
今回は「畳み込みニューラルネットワークの実装 - KIKAGAKU」を学ぶ。
データセット読み込み後、1つ目の画像を抽出。
Colaboratory を使わない場合、 OpenCV をインストールしないといけないが、ここに書かれている cv2 だとインストールできなかった。
pip install opencv_python でインストールした。
なお、PIL はすでに pip install pillow でインストール済み。
OpenCV では画像が BGR の順に格納されており、Matplotlib では画像が RGB の順で格納されているため青味がかった色になっている。
OpenCV に格納された画像を cvtColor() で RGB の順に変換した結果。
グレースケール変換した結果。Matplotlib が RGB の 3 チャンネルの画像の入力を標準としているため、白黒になっていない。
plt.imshow(img_gray, cmap='gray') で表示した結果。
横方向のエッジ検出を行った結果。
縦方向のエッジ検出を行った結果。
キカガク(KIKAGAKU)で「ニューラルネットワークの実装(回帰)」を学ぶで練習問題が出ていたので、解いてみた。
上記の結果のように、平均ニ乗誤差 (MSE) が検証データに対して約 73となっており、誤差を二乗しているとしても少し予測誤差が大きいことがわかります。この原因を考え、対策をうち、平均ニ乗誤差が小さくなるようなモデルを考えてみましょう。ヒント
- Batch Normalization をいれる
- エポック数を増やす
- 最適化手法 (optimizer) を変更する
- データセットを可視化し、必要な特徴量を選択する or 増やす
試行錯誤することで、実際の動作などの理解が深まるのでぜひ取り組りくんでください。
モデル変更前の MSE は次のとおり。
[62.691704245174634, 6.1231995]
なぜか、73
よりよくなっている。
Batch Normalization をいれると、MSE は次のような結果になった。
[36.493252174527036,
4.8187714]
改善前と比べて 58% 改善した。
変更箇所はソースコード 42 行目から 47 行目までを参照。
エポック数を 30 から 60 に増やすと、MSE は次のような結果になった。
[27.27410544601141, 3.981625]
改善前と比べて 43%
改善した。
変更箇所はソースコード 62 行目を参照。
optimaizer を adam から sgd に変更すると、MSE は次のような結果になった。
[40.223956089393766,
4.9830503]
前回までと比べると悪化したので、optimaizer は adam の方が適しているといえる。
変更箇所はソースコード 50 行目を参照。
ちなみに RMSprop
に変更すると、MSE は次のような結果になった。
[26.024830537683822, 3.8633108]
特徴量を 13 から 12に減らすと、MSE は次のような結果になった。
[20.303845349480124,
3.5017285]
改善前と比べて 32% 改善した。
今回は、4つ目の変数 CHAS を減らした。
CHAS | チャールズ川によるダミー変数 (1: 川の周辺, 0: それ以外) |
前回「キカガク(KIKAGAKU)で「ニューラルネットワークの実装(分類)」を学ぶ」のつづき。
今回は「ニューラルネットワークの実装(回帰) -
KIKAGAKU」を学ぶ。
今回も PyCharm を使って演習を行った。
そのため、tf.keras.utils.plot_model(model)
でモデル構造の可視化する際、pydot と pydotplus、pydot_ng、graphviz のインストールが必要となった。(ソースコード 56 行目参照)
Graphviz の実行モジュールは下記 URL からダウンロード
https://graphviz.gitlab.io/_pages/Download/Download_windows.html
Graphviz をインストールした後、環境変数に Graphviz の実行モジュールがインストールされているフォルダパス(例 C:\Program Files (x86)\Graphviz2.38\bin )をセットしておく必要がある。
tf.keras.utils.plot_model(model) を実行すると、model.png が作成される。
model.png
目的関数の可視化
評価指標の可視化
練習問題は後でじっくりと。
Google Colaboratory を使用していないため、print や plt.show() を追記して実行結果を表示している。
前回「キカガク(KIKAGAKU)で逆伝播を学ぶ」のつづき。
今回は「ニューラルネットワークの実装(分類)
- KIKAGAKU」を学ぶ。
演習では、敢えて Google Colaboratory 使わずに、PyCharm の環境で Tensorflow や scikit-learn をインストールして演習を行った。
Tensorflow は「pip
での TensorFlow のインストール」 を参照してインストールした。
前回「キカガク(KIKAGAKU)で順伝播を学ぶ」のつづき
前回「キカガク(KIKAGAKU)で機械学習実践(教師なし学習)を学ぶ」のつづき
今回はキカガクで「機械学習 実践(ハイパーパラメータ) - KIKAGAKU」と「機械学習 実践(教師なし学習) - KIKAGAKU」を学んだ。
今回はキカガクで「機械学習 実践(教師あり学習:回帰) - KIKAGAKU」と「機械学習 実践(教師あり学習:分類) - KIKAGAKU」を学んだ。
直線で表現することを線形回帰という。
直線ではない形で表現するアルゴリズムを非線形回帰という。
Kaggle などの世界的な分析プラットフォームでは、勾配ブースティングと呼ばれる手法が多く使用されており、有名な例として XGBoost や LightGBM がある。
回帰分析とは、2 つ以上の変数から回帰分析を行う多変量解析の一つ。
目的関数は単回帰分析と同様に二乗和誤差を用いて最適化する。
モデルの検証において、LinearRegression クラスは score() メソッドを提供しており、入力変数と目的変数を与えると学習済みのモデルを用いて計算した決定係数 (coefficient of determination) という指標を返す。決定係数の最大値は 1 であり、値が大きいほど(1 に近いほど)モデルが与えられたデータに当てはまっていることを表す。
学習時に用いたデータに対してはよく当てはまっていても、学習時に用いなかったデータに対しては予測値と目標値の差異が大きくなってしまう現象を、過学習 (overfitting) という。
過学習を抑制するアプローチは次のとおり。
正則化 (regularization) は、機械学習において、正則化は目的関数に正則化項と呼ばれるモデルの複雑性に罰則(ペナルティ)を科すために追加の項を導入して過学習を抑制する。
Ridge 回帰は、重回帰分析に対して正則化を行うことで、モデルの過度な複雑さに罰則を課して過学習を抑制する。重回帰分析の目的関数である最小二乗法と正則化項という 2 つの最小化した場所を最適解とする。
ハイパーパラメータとは、モデルの学習を実行する前に設定する値。
ノルムとは、長さを一般化したもので、ベクトル空間で距離を与えるための概念。
Lasso 回帰も、重回帰分析に対して正則化を行うが、不要な入力変数の重みを 0 にし(スパース性)、実質的に入力変数を減らすことによって過学習を抑制する。
スパース性とは物事の本質的な特徴を決定づける要素はわずかであるという性質を示す。
Fig.1 パラメータの分布をヒストグラムで可視化
Fig.2 Rigde 回帰のパラメータの分布
Fig.3 Lasso 回帰のパラメータの分布
過学習が起こる原因の一つとして、入力変数同士の相関が強いものが含まれていると発生する多重共線性 (Multicollinearity) という問題がある。
一般的に機械学習アルゴリズムは、学習時に相関の高い入力変数を使用することにより、モデルの予測精度向上の妨げとなる場合がある。その対策として、単純にデータセットの中から相関の高い入力変数のどちらかを削除する方法や、使用するアルゴリズムを変更する方法がある。
.corr() を使用して相関関係を表す数値(相関係数)を確認する。
相関係数はヒートマップで可視化する。ヒートマップは、seaborn.heatmap() メソッドを使用する。
2 つの変数の関係を可視化するには sns.jointplot() を使用する。
Partial Least Squares (PLS) は、多重共線性の問題の対処法として有力なアルゴリズムである。
主成分分析は、100 個の特徴量があった場合にその特徴量の数を分散を用いて 10 や 20 個などに削減する手法(次元削減)である。
PLS との違いは教師あり学習と教師なし学習で、主成分を抽出するときに目標値の情報を使うか使わないかの違いがある。
scikit-learn に用意されているモジュール PLSRegression を使用すると、これらのステップを意識せずに実装できる。
分類はカテゴリが異なる複数のデータを見分けることができる境界線を求めることが目的。
二次元平面上にあるデータ(集合)を一本の直線で分けられることを線形分離可能といい、そのアルゴリズムを線形分類器と呼ぶ。
線形分類器として有名なものは、
等。
線形分離可能ではない場合に、線形ではない形で分類するアルゴリズムを非線形分類器と呼ぶ。
非線形分類器として有名なものは、
等。
scikit-learn は問題設定が回帰、分類問わず、
の 3 ステップで進める。
分類では、回帰の時に使用した指標である決定係数ではなく、決定木の score() メソッドで表示される正解率 (Accuracy) を用いる。
正解率の最小値は
0 となり、最大値は 1 となる。
目的関数は、回帰では平均二乗誤差が用いられていたが、分類では交差エントロピーが主に用いる。
ただし、どちらの目的関数も正解と予測の差を評価したいという考えは同じ。
分類の問題設定でも、scikit-learn を用いての実装は回帰の場合と大きな違いはなく、推論も同様に predict() メソッドで実行することが可能。
決定木は複数の分岐を繰り返すことによって分類を行う。
特徴は次の 2 つ。
ハイパーパラメータは次の 2 つ。
決定木単体では高い性能を出せない複雑な問題設定に対してはアンサンブル学習が用いられる。
アンサンブル学習は、決定木を基本として、学習器を複数用意して一つのモデルにしようというアルゴリズムである。
アンサンブル学習には、
等がある。
サポートベクトルマシンは、2 つのカテゴリを識別する分類器。
サポートベクトルマシンでは、境界線に最も近いサンプルとの距離(マージン)が最大となるように境界線が定義される。
サポートベクトルマシンにカーネル関数を取り入れた一連の手法をカーネルトリックと呼ぶ。
カーネル関数により、高次元(無限次元)の特徴空間へ写像し、特徴空間上で線形分離を行う。
特徴は次の 2 つ。
ハイパーパラメータは次の 2 つ。
サポートベクトルマシンは一般的にデータに対して標準化を適用する必要がある。
標準化 (Standardization)
は平均と標準偏差を算出して行なう。
標準化を行うには、sklearn.preprocessiong 以下の StandardScaler を用いる。
算出した平均と標準偏差から実際にデータセットの値を変換するには transform() メソッドを使用する。
ロジスティック回帰 (Logistic regression) は、あるデータがカテゴリに属する確率を予測するための回帰のアルゴリズムに該当するが、確率を予測することが可能な特性から分類の問題設定で用いられることが多い。
ロジスティック回帰は入力変数から目的変数に対して二値分類をおこなうモデル。
特徴は次の 2 つ。
ハイパーパラメータは次の 2 つ。
ロジスティック回帰ではオッズ比を用いて、目的変数に対する各入力変数の影響の大きさを確認する。
オッズ比とは、ある事象の 1 つの群と 1
つの群におけるオッズの比として定義される。
オッズ比が 1 になると事象の起こりやすさが同じであることを表し、1 よりも大きい(小さい)とオッズ A がオッズ B よりも起こりやすい(起こりにくい)ということになる。
分類のアルゴリズムには確率を予測できるものと確率を予測できないものに分けることができる。
特に、分類器では前者を識別モデル、後者を識別関数と呼ぶ。
ロジスティック回帰は識別モデルに該当し、predict() メソッドで推論を行い分類結果を取得でき、predict_proba() メソッドで確率を取得することができる。
scikit-learn を用いて推論を行う際の入力変数は行列である必要がある。
分類において、学習済みモデルを評価する指標
Precision と Recall は互いにトレードオフの関係にあり、どちらかの値を上げようとすると、もう一方の値が下がることになる。
混同行列 (Confusion Matrix) は実測値と予測値の関係性を示す表。
Fig.6 入力変数の影響度
Fig.7 特徴量の重み
Fig.8 オッズ比
Fig.9 目的変数のデータ個数
Fig.10 混同行列
Fig.11 評価指標
※2020年4月6日の投稿記事を再編集しました。
※キカガクはリニューアルされ、この記事で紹介している講座は受講できません。
KIKAGAKU | AIを無料で学べる学習サイト が Web ニュースで紹介されていた。
コロナ禍で家にいることが多くなったこともあり、このサイトで AI を学んでみることにした。
コンテンツのコンセプトが説明されている。
利用する上で、費用や環境等に支障がないことがわかり安心。
学習する側に立った配慮がなされている。
学習方法や学習環境の構築についても懇切丁寧に説明されている。
データサイエンスとは、与えられたデータに基づいて知見を見出し、次の行動にその知見を活かすこと。
データサイエンティストとは、データサイエンスを駆使する人のこと。
ビジネスの中に存在する課題を把握し、課題に対しデータ解析を行い、解決への活路を見つけ、その解決策を継続的に利用可能な形に変えていくスキルが必要。
機械学習は、収集したデータに基づいてモデルの学習を行い、そのデータの構造の特徴を掴むこと。
アルゴリズムは、実際にコンピューターが実行できるレベルまで具体的な手順を明確化したもの。
機械学習アルゴリズムのひとつがディープラーニング。
ディープラーニングは主に教師あり学習で用いられる。
ディープラーニングは、特徴抽出の工程をアルゴリズムの一部として組み込むことに成功し、データに基づいて特徴抽出まで学習できることで、属人的であった工程を省くことができるようになった。
ディープラーニング以外の機械学習アルゴリズムとして、決定木やロジスティック回帰などがある。
機械学習の開発ロードマップ(開発プロセス)は次のような順序になる。
東京大学で開催された「Deep Learning 基礎講座」のコンテンツ( Deep Learning基礎講座演習コンテンツ 公開ページ | 東京大学松尾研究室 - Matsuo Lab )を Google Colaboratory にアップロードして学習中。
講義は視聴できず、演習のみ。
今回は、演習を通じてデータ分析でよく使用されるライブラリ(Numpy、Scipy、Pandas、Matplotlib)の使い方を学んだ。
多次元配列、転置、行列の積、乱数、復元抽出、非復元抽出
逆行列、固有値、固有ベクトル、最適化
Series、DataFrame、データの操作、データの結合、ソート
データビジュアライゼーション、散布図、ヒストグラム
ようこそ、当サイトにお越しいただきまして、誠にありがとうございます。
当サイトでは、人生の改善・生活の改善をテーマとし、自身の経験や知識にもとづいた記事を提供してまいります。
よろしくお願いいたします。