キカガクで AI・機械学習を学ぶ


久しぶりに キカガク を訪問したら、リニューアルしていたので、復習を兼ねて受講することにした。
記事内の数式は正しい表記になっておらず、またほとんどの数式を省略している。
まとめにも書いているが、非常に理解しやすく解説されているので、実際に受講されることをおすすめする。

「キカガク」の使用方法

基本的な操作の方法を動画で説明。

  1. 設定
    プロフィールの変更
    パスワードの変更
    学習コースの選択
    学習開始日と学習終了日の設定


  2. ダッシュボード
    学習の開始
    学習の進捗状況の表示


    Fig.2 ダッシュボード

  3. コース一覧
    無料コース
    有料コース(「AI 人材育成長期コース」購入者はすべて学習可能)


    Fig.3 コース一覧

「Python & 機械学習入門」の内容

導入

当コースの流れについて説明。

  1. 線形代数
  2. 重回帰分析
  3. 重回帰分析の実装
  4. 実データで演習
  5. 統計
  6. 外れ値除去スケーリングを考慮した重回帰分析
  7. ビジネス活用

概念の紹介

人工知能、機械学習、ディープラーニングの概念について紹介。

  1. 人工知能(AI)
    目:画像、耳:音声(時系列)、口:自然言語、それぞれの要素を数値に変換
  2. 機械学習
    変換された数値をもとに、入力と出力の関係性(規則性)を発見
  3. ディープラーニング
    機械学習のアルゴリズムの一部
    他のアルゴリズムとして単回帰分析、SVM などがある

これらは、人工知能 ⊃ 機械学習 ⊃ ディープラーニング の関係になる。

機械学習に必要な数学

機械学習に必要となる数学の分野は次の3つ。

  1. 微分・積分
  2. 線形代数
  3. 確率・統計

機械学習の3大トピック

機械学習には次の3つの種類がある。

  1. 教師あり学習
    入力 X と出力 Y の関係性を学習
    回帰:「数値」を予測
    分類:「カテゴリ」を予測
  2. 教師なし学習
    入力 X の情報構造を学習
    クラスタリング:傾向で分類
    次元削減:入力の変数を削減
  3. 強化学習
    データがない、データがほとんどない状態から、データ収集しながら学習

簡単な機械学習と内挿、外挿

機械学習が保証するのは内挿の予測まで。

  1. 内挿:データの範囲内
  2. 外挿:データの範囲外

外挿は機械学習の保証外となるが、時系列のデータに関しては外挿であっても構わない。

微分

微分は何に使えるか

機械学習における微分の利用目的はモデルとなる関数の誤差を最小にすること。

  1. 接線(y = ax + b)の傾きが求められる
    誤差が最小のとき、傾きはゼロ
  2. 傾きゼロを利用することで、関数(誤差)が最小となる点を求める
    機械学習では誤差を最小にしたい

微分(導関数) 1

機械学習における微分の使い方(2点から直線を求める)。

  1. 2点を通る直線の傾きを求める
  2. 傾き a = f(x) の増加量 ÷ x の増加量

微分(導関数) 2

機械学習における微分の使い方(1点から直線を求める)。

  1. 極限(lim)を使って1点を通る直線の傾き求める
  2. 条件:h → 0、対象:2x + h のとき、極限(lim):2x
  3. 傾き a = f(x+h) - f(x) / (x - x + h)
    傾き a = f(x+h) - f(x) / h

微分の公式

次の3つの公式は頻繁に使うので覚えておく。

  1. (1)' = 0
  2. (x)' = 1
  3. (x**2)' = 2x

以下は演算例。

  1. (3x**2)' = 3 * 2x = 6x
  2. (4x+3)' =(4x)' + (3)' = 4 * (x)' + 3 * (1)' = 4
  3. (3x**2+4x+7)' = 3 * (x**2)' + 4 * (x)' + 7 * (1)' = 3 * 2x + 4 + 0 = 6x + 4  

偏微分

機械学習では複数の変数を取り扱うので、偏微分の演算方法を覚えておく。

偏微分とは多変数の微分すること。

∂/∂a():a 以外を定数だと仮定して微分する。
定数は微分から外だし可能。

計算例
∂/∂a(c-2ca+ca**2) = c * (1)' - 2 * c * (a)'  + c * (a**2)' = -2c + 2ca

線形代数

スカラー・ベクトル・行列

スカラー・ベクトル・行列はそれぞれサイズが異る。
テンソルは複数の行列を並べたもの。

  1. スカラー
    サイズ:1行 × 1列
  2. ベクトル
    サイズ:n行 × 1列
  3. 行列
    サイズ:n行 × m列

行列の演算

行列の基本的な演算方法。

  1. 行列の加減算
    同じ行位置、列位置毎に加減算する。
    条件:サイズが等しいこと
  2. 行列積
    加減算とは異なり、行の順序位置と列の順序位置を一致させて積算した結果を加算する。
    条件:行列 A と 行列 B を掛けるとき、A の列と B の行が等しいこと

サイズ

演算結果のサイズには法則性がある。

  1. ベクトルとベクトルの積はスカラーになる
  2. 行列とベクトルの積はベクトルになる
  3. ベクトルと行列とベクトルの積はスカラーになる

転置(Transpose)

スカラー・行列の行と列を置き換えることを転置という。
転置には次のような法則がある。

  1. スカラーを転置しても同じ値になる。
  2. 転置された行列 A を転置すると、行列 A に戻る。
  3. 行列 A と行列 B の積の転置は、行列 B の転置と行列 A の転置の積に等しい。
  4. 行列 A と行列 B と行列 C の積の転置は、行列 C の転置と行列 B の転置と行列 A の転置の積に等しい。

単位行列・逆行列

単位行列と逆行列の関係性

  1. 単位行列
    対角成分に 1 が並び、その他は 0 となる正方行列
    行列 A と単位行列 I の積は行列 A となる。
    単位行列 I と行列 A の積は行列 A となる。
  2. 逆行列(Inverse Matrix)
    行列 A と逆行列 AI の積は単位行列 I になる
    逆行列 AI と行列 A の積は単位行列 I になる
    条件:行列は正方行列であること

ベクトルで微分

機械学習では評価関数を最適化するためにベクトルを偏微分するため、演算方法を覚えておく。
ベクトルの微分は各要素を偏微分すればよい。

  1. 定数のベクトルを微分したゼロベクトルになる
  2. 転置されたベクトル a とベクトル x の積を偏微分するとベクトル a になる
  3. 転置されたベクトル x と行列 A とベクトル x の積を偏微分すると、行列 A と転置された行列 A を足したものとベクトル x の積となる。

単回帰分析

問題設定

問題設定では、出力変数と入力変数を決める。
ただし、単回帰分析の場合、入力変数は1つに限定する。
入力変数を複数扱う場合は重回帰分析を行う。

分析は学習と推論のフェーズがある

  1. 学習ではモデルを構築する
  2. 推論ではモデルを通して予測値を求める

「モデル」を決める

モデルを決めるために、入力変数と出力変数の関係を直線で表し、傾きと切片を求める。

この傾きと切片をパラメータという。
データ(入力変数と出力変数)にもとづいて適切にパラメータを決定する。

パラメータを決定するためにデータの中心化(Centering)を行う。
データの中心化を行うと切片がゼロになり、演算が楽になる。
データの中心化は各データから入力変数と出力変数の平均値を引けばよい。

「評価関数」を決める

パラメータを適切に決定することを評価関数を決めるという。
評価関数は損失関数ともいう。

実際の値と予測値の差を誤差という。

評価関数は二乗誤差(誤差を二乗したもの)の合計値を求める。

評価関数を「最小化」する

誤差を最小化するために、評価関数の傾きがゼロになるように調整する。
すなわち、傾きがゼロになるように評価関数を偏微分する。

演算は次の2つのステップに分ける。

  1. 式を変形する
    評価関数の式に傾きの変数が含まれるように変形する
    傾きの変数が含まれない項は単純な変数に置き換える
  2. 最適なパラメータを求める
    単純な変数に置き換えられた評価関数を偏微分する
    偏微分後、単純な変数に置き換えられた項を元に戻す

重回帰分析 1

「モデル」を決める

単回帰分析と同様、入力変数と出力変数の関係を直線で表し、傾きと切片(パラメータ)を求める。
ただし入力変数は複数になり、傾きも複数になる。
傾きは「重み」といい、入力変数毎に異なる。

切片は「バイアス」という。
入力変数を定数 1 にすれば、他の入力変数と同じように扱うことができる。

モデルはベクトル式で表現できる。

「評価関数」を決める

単回帰分析と同様、パラメータを適切に決める。

評価関数は実測値から予測値を引いた数の二乗誤差の合計値を求める。

評価関数はベクトル式で表現できる。

評価関数を「最小化」する

単回帰分析と同様、演算は2つのステップで行う。

  1. 式を変形する
    予測値は、行のサイズがサンプル数、列のサイズが入力変数の数の行列で表現できる。
  2. 最適なパラメータを求める
    評価関数を重みのベクトルで微分するとゼロベクトルになる。
    割り算が行えないので、逆行列をかける。
    逆行列は正方行列であることが条件。
    逆行列の条件として「多重共線性」というのもある。

Python 速習

環境構築

Google Colaboratory を使うため、PC に Python やライブラリをインストールするなどの環境構築作業は要らない。

  1. Google アカウント作成
  2. Google Colaboratory で新規ノートブック作成
    Google Colaboratory は無料。
    すでに Python やライブラリ等、必要な環境がそろっている。
    !pip list の実行でインストールされているライブラリ等を表示できる。
  3. 基本動作
    コードモードとテキストモード(マークダウン記法やTEX)
    Ctrl + Enter :実行
    Ctrl + m + b :下にセル追加
    Ctrl + m + a :上にセル追加
    Ctrl + m + d :セル削除
    Ctrl + m + m :テキストモード(マークダウン)
    Ctrl + m + y :コマンドモード
  4. データのアップロード
    Google drive にマウントすることができる。
    %%time で処理時間計測できる。
    ラインタイムのタイプを変更すると GPU や TPU が使えるようになる。
    !nvidia-smi の実行で割り振られている GPU が表示される。

変数

  1. print(変数) :変数に代入されている値を表示
  2. type(変数) :変数の型を表示
  3. リスト:[]
  4. タプル:()
  5. 辞書:{}

基本構文

  1. 比較演算子
  2. エスケープシーケンス

制御構文

よく使用する制御文。

  1. for 文:繰り返し処理
  2. if 文:条件分岐

関数

関数には3つの種類がある。

  1. 入力(引数)のない関数
  2. 入力(引数)のある関数
    デフォルト値を設定することができる。
  3. 返り値のある関数

クラスの基礎

クラスには3種類の関数を定義することができる。

  1. init 関数:インスタンス化
  2. 通常の関数
  3. call 関数:インスタンスに対して引数を与えるだけで実行ができる

単回帰分析の実装

Numpy の速習

Numpy は数値計算を行うために使用する。
  1. import numpy as np
  2. ベクトルの定義
    x = np.array([[1, 2, 3]])
    y = np.arrya([[2, 3.9, 6.1]])
  3. データの中心化(Centering)
    xc = x - x.mean() #データから平均値を引く
    yc = y - y.mean()
  4. 傾き a の計算
    xx = xc * xc #centering された x の要素積
    xy = xc * xy #centering された x と y の要素積
    a = xy.sum() / xx.sum() #xy の総和 ÷ xx の総和
  5. 実装する際は、scikit-learn 等のライブラリを用いるため、このような計算は不要。 

Pandas 速習

Pandas はデータの操作( CSV ファイルの読み込み、SQL 等によるデータベースとの連携等)で使用する。

  1. import pandas as pd
  2. CSV ファイルの読み込み
    df = pd.read_csv("sample.csv") #data frame 型
  3. 先頭から~行表示
    df.head() #先頭から 5行分表示
    df.head(3) #末尾から 3行分表示
  4. 末尾から~行表示
    df.tail() #末尾から 5行分を表示
    df.tail(3) #末尾から 3行分を表示
  5. 行で区切って表示
    df[2:10] #2行目から 10行分を表示
    df[:10] #0行目から 10行分を表示
    df[2:] #2行目から最後の行までを表示
  6. 行と列を指定して表示
    df.iloc[0, 0] #0行目の0列目を表示
    df.iloc[1, 1] #1行目の1列目を表示
    df.iloc[:10, 0] #0行目から 10行分、0列目を表示
    df.iloc[:5, :] #0行目から 5行分、0列目から最後の列までを表示
  7. カラム名を指定して取得
    df['x'] # x列を pandas.core.series.series 型で表示
    df['y'] # y列をを pandas.core.series.series 型で表示 

Matplotlib 速習

Matplotlib はグラフ等を描画するために使用する。

  1. import matplotlib.pyplot as plt
  2. 散布図を表示
    plt.scatter(x, y)
    plt.show()
  3. 描画のサイズを変える
    fig = plt.figure(figsize(8, 8)) #縦と横のサイズを 8 にする
    ax = fig.add_subplot(1, 1, 1) #複数のグラフを表示する
    ax.scatter(x, y) #縦と横のサイズが大きくなる
    ax.scatter(x, y, c='red') #ドットを赤色にする
    ax.set_title('first scatter') #「first scatter」というタイトルを付ける
    ax.set_xlabel('x') #x軸に「x」というラベルを付ける
    ax.set_ylabel('y') #y軸に「y」というラベルを付ける

Numpy による単回帰分析の実装

Numpy を使って単回帰分析を行う。

  1. ライブラリのインポート
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
  2. CSV ファイルの読み込み
    df = pd.csv_read('sample.csv')
    df.head(3)
  3. データの中心化
    df.describ() #データ項目の表示
    df_c = df - df.mean()
    x = df_c['x']
    y = df_c['y']
    plt.scatter(x, y) #散布図の表示
  4. パラメータ a の計算
    xx = x * x
    xy = x * y
    a = xy.sum() / xx.sum()
  5. 結果をグラフ表示
    plt.scatter(x, y, label='y') #実績値の散布図
    plt.plot(x, a * x, c='red'), label='y_hat' #予測値の直線
    plt.legend() #凡例の表示
  6. 予測
    x_new = 40 #x が 40 のとき y_hat はいくらになるか
    xc_new = x_new - mean['x'] #データの中心化
    yc = a * xc_new
    y_hat = yc + mean['y'] #中心化前の状態に戻す
  7. 予測値を算出する関数を作成
    def predict(x):
        #定数項
        a = 10069.022519284063
        xm = 37.62222
        ym = 121065.0
        #中心化
        xc = x - xm
        #予測
        y_hat = a * xc + ym
        return y_hat
  8. 内挿と外挿
    内挿:学習したデータの範囲内
    外挿:学習したデータの範囲外
    機械学習では外挿のデータは正しく予測できない。

重回帰分析の実装

行列演算の基礎

行列演算に必要な知識

  • ベクトルの定義
  • 行列の定義
  • 転置
  • 逆行列
  • 行列積

重みを算出

  1. ライブラリのインポート
    import numpy as np
  2. ベクトルの定義
    x = np.array([[1], [2], [3]])
  3. 行列の定義
    X = np.array([[1, 2], [3, 4]])
  4. 転置(Transpose)
    Xt = X.T
  5. 逆行列(linalg : linear algebra : 線形代数)
    X_inv = np.linalg.inv(X)
  6. 行列積
    XX_inv = np.dot(X, X_inv) #結果は単位行列になる

NumPy でよく使用する処理

  1. 行の数と列の数を取得
    B = np.array([[1, 2, 3], [4, 5, 6]])
    row, col = B.shape #row には行の数、col には列の数が入る
  2. 行毎に要素を抽出
    for b in B:

演習

  1. import numpy as np
  2. X = np.array([[1, 2, 3], [1, 2, 5], [1, 3, 4], [1, 5, 9]])
  3. y = np.array([[1], [5], [6], [8]])
  4. Xt = X.T
  5. XtX = np.dot(Xt, X)
  6. XtX_inv = np.linalg.inv(XtX)
  7. Xty = np.dot(Xt, y)
  8. w = np.dot(XtX_inv, Xty)

実装の際は上記のような計算は行わない。scikit-learn 等のライブラリを使用して、ミスを減らし、効率的にモデルを構築する。

scikit-learn で実装

重回帰分析は、sklearn.linear_model.LinearRegression を使用する。

    1. ライブラリのインポート
      import numpy as np
      import sklearn
    2. データの準備
      X = np.array([[1,2,3], [1,2,5],[1,3,4],[1,5,9]])
      y = np.array([[1],[5],[6],[8]])
    3. モデルの宣言(インスタンス化)
      from sklearn.linear_model import LinearRegression
      model = LinearRegression(fit_intercept=False)
      ※ fit_intercept=False : 切片の計算も行う
    4. モデルの学習(パラメータの調整)
      model.fit(X,y)
    5. 調整後のパラメータの確認
      print(model.coef_)
    6. 予測精度の確認(決定係数 0 ~ 1)
      print(model.score(X, y))
    7. 予測
      X_new = np.array([[1, 3, 6]])
      y_pred = model.predict(X_new)
      print(y_pred)

    まとめ

    キカガク代表取締役会長の吉崎さんが講師をご担当。
    黒と赤のマジックペンと A4 の白紙を使って手書きで非常にわかりやすく説明されていた。
    まるで家庭教師に教えていただいているようだった。
    こちらもノートを用意し、同じように手書きで式を書いたり、重要事項をメモしたりした。
    内容的には、機械学習に必要となる数学の基礎知識が精選され、かつ順序よく説明されていたので、とても理解しやすかった。

    機械学習を独学で習得しようとして、線形代数や微分等で躓いた人は是非このコースを受講されることをおすすめしたい。

    参考資料

    キカガク|AI・機械学習を学ぶ e ラーニングプラットフォーム | キカガク

    The Matrix Cookbook

    Posted in  on 5/16/2021 by rteak |