予測値と実際の値の差異が最小になるようにして線形モデルを導き出す方法。
線形モデル式を Y = 傾き * X + Y切片 とした場合、傾き(係数) を θ1、Y切片(定数項) を θ0 で表現すると、
import numpy as np import matplotlib import pandas as pd data = pd.read_csv('./data/sample.csv') x = data['X'] y = data['Y'] n = len(x) # データの個数 mean_x = np.mean(x) # xの平均値 mean_y = np.mean(y) # yの平均値 #xとyの共分散 covariance = (1 / n) * sum([(x[i] - mean_x) * (y[i] - mean_y) for i in range(n)]) #xの分散 variance = (1 / n) * sum([(x[i] - mean_x) ** 2 for i in range(n)]) # θ1、θ0 を求める t1 = covariance / variance t0 = mean_y - (t1 * mean_x) # np.polyfit を使えば1行で書ける #t1, t0 = np.polyfit(x, y, 1) # 第3引数は次数 # 回帰直線を求める y_pred = t1*x + t0 # 描画 plt.scatter(x, y, color="red") plt.plot(x, y_pred) plt.grid(True) plt.show()
学習回数と学習率を指定して、何度も計算(最適化)を行って誤差が最小となる値を求める方法。
※関数の最小値を探索する連続最適化問題の勾配法のアルゴリズムの一つ。( wikipedia より)
上記の数式を python で実装してみる。
※以下では計算(最適化)毎のコスト算出用に目的関数も定義している。
※ここでは、θ0,θ1 の 初期値は 0 とした。
def cost_func(x, y, t0, t1): """目的関数.""" m = x.size # return (np.sqrt(sum([(y[j] - (t1 * x[j] + t0)) ** 2 for j in range(m)]) / m)) # RMSEの場合 return 1 / (2*m) * sum([((t1 * x[i] + t0) - y[i]) ** 2 for i in range(m)]) def gradient_descent(x, y, alpha, iter_num): """最急降下法.""" m = len(x) t0 = 0.0 t1 = 0.0 costs = np.zeros(iter_num) for i in range(iter_num): # θ0, θ1 の計算 及び 更新 h = t0 + t1 * x t0 = t0 - alpha * np.sum(h - y) / m t1 = t1 - alpha * np.sum((h - y) * x) / m costs[i] = cost_func(x, y, t0, t1) #costs[i] = np.sqrt(sum([(y[j] - (t1 * x[j] + t0)) ** 2 for j in range(m)]) / m) return (t0, t1, costs)
上記で作成した関数を用いて回帰直線 及び 最適化毎のコスト(誤差)をプロットしてみる。
# パラメータ設定 alpha = 0.01 # 学習率 iter_num = 100 # 学習回数 # サンプルデータ x1 = np.array(range(1, 10), dtype=np.float64) y1 = np.array([x1[i] + random.randrange(0, 3) for i in range(len(x1))], dtype=np.float64) # 最急降下法 t0, t1, costs = gradient_descent(x1, y1, alpha, iter_num) fig = plt.figure(figsize=(10, 5)) # データのプロット ax1 = fig.add_subplot(1, 2, 1) ax1.set_xlabel('data x') ax1.set_ylabel('data y') ax1.scatter(x1, y1, c='r') # 散布図(実際の値) ax1.grid(True) ax1.plot(x1, x1 * t1 + t0, '-') # 回帰直線 # コスト遷移状況をプロット ax2 = fig.add_subplot(1, 2, 2) ax2.set_xlabel('iterations') ax2.set_ylabel('cost') ax2.plot(range(costs.size), costs, "-b", linewidth=2 ) ax2.grid(True) plt.show() # t1(係数)とt0(定数項)を確認 print(f"t0: {t0}, t1: {t1}") print("cost(最終): {}".format(costs[len(costs)-1]))
結果
分析を行う際、特徴量の範囲が異なる時は特徴量のスケールを調整する(正規化)を行う。
平均が0、標準偏差が1となるように調整する。
※ std: 標準偏差
最大値が1最小値が0となるように調整する。
予測値を評価する為の指標は、目的関数により定義される。
※予測と実績の誤差(コスト)を評価する為の関数。
回帰モデルの誤差を評価する指標の一つ。
https://tutorials.chainer.org/ja/03_Basic_Math_for_Machine_Learning.html#%E7%9B%AE%E7%9A%84%E9%96%A2%E6%95%B0
回帰直線(予測値)を y_pred とした場合、以下で求める事ができる。
rmse = np.sqrt(sum([(y[i] - y_pred[i]) ** 2 for i in range(n)]) / n)
分類モデルの誤差を評価する指標の一つ。
※観測頻度 - 平均値 / 標準偏差
各テキストの特徴的な単語を抽出する為の技法
TF(単語の観測度) * IDF(その単語が出現するテキストの数でテキストの総数を割った値の対数)
ある事項に対する観察結果から、その事項の目標値に関する結論を導く手法。
複数の決定木モデルを構築して、それらを一つにまとめてより正確で質の高い予測を行う手法。おもに分類(判別)・回帰(予測)の用途で使用される。
サポートベクターマシン(SVM)は、教師あり学習を用いるパターン認識モデルの一つである。分類や回帰へ適用できる。
パラメータ | 説明 |
C (Cパラメータ) 分類ミスをどのくらい許容するか設定する値 | Cパラメータが低い状態を「ソフトマージン」、高い状態を「ハードマージン」と呼ぶ |
decision_function_shape(多項分類) | OVR: 1つの分類クラスと「他の全ての分類クラス」でハイパープレインを導き出す。 OVO: 各クラスと「別の1クラス毎」にハイパープレインを導き出す。 |
kernel(カーネル) | データに新たな次元を追加してハイパープレインを導き出す仕組み。 よく使用されるカーネル関数に 線形、多項式、放射基底関数、シグモイド関数 などがある。 |
gamma(ガンマ) | モデルが訓練データへどれくらいフィットさせるかを調整する値。 ガンマの値が小さいと分類はシンプルなものになり、高いと複雑な分類を行われる。 |
確率的なアプローチを利用して分類を行う機械学習の手法。
「ベイズの定理(Bayes' theorem)」と呼ばれる、条件付き確率の定理が基となっている。
ランダムよりも少し精度がいいような弱い識別機を組みわせて、強い識別機を作成しようとする機械学習モデル
k近傍法(ケイきんぼうほう、英: k-nearest neighbor algorithm, k-NN)は、特徴空間における最も近い訓練例に基づいた分類の手法であり、パターン認識でよく使われる。
最近傍探索問題の一つ。k近傍法は、インスタンスに基づく学習の一種であり、怠惰学習 (lazy learning) の一種。
その関数は局所的な近似に過ぎず、全ての計算は分類時まで後回しにされる。また、回帰分析にも使われる。
k近傍法は、ほぼあらゆる機械学習アルゴリズムの中で最も単純。
脳機能に見られるいくつかの特性に類似した数理的モデル
ニューラルネットワークはシナプスの結合によりネットワークを形成した人工ニューロン(ノード)が、学習によってシナプスの結合強度を変化させ、問題解決能力を持つようなモデル全般を指す
値と平均値の差。
※過学習の回避
※過学習の回避
シグモイド関数は値を0〜1のレンジにコンパクトにする計算を行う。
※ 線形回帰のモデル式を圧縮して0〜1の確率となるような値を出力する。
様々なパラメーターの値の組み合わせでモデルを何度も構築し、最適なパラメータの値を算出する手法。
複数のモデルを融合させて1つの学習モデルを生成する手法。