目次 †
微分 †線形回帰 ( Linear regression ) †最小2乗法(LSM) (単回帰) †予測値と実際の値の差異が最小になるようにして線形モデルを導き出す方法。 線形モデル式を 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() 勾配降下法(最急降下法) †学習回数と学習率を指定して、何度も計算(最適化)を行って誤差が最小となる値を求める方法。 上記の数式を python で実装してみる。 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])) 結果 重回帰分析 †正規化 †分析を行う際、特徴量の範囲が異なる時は特徴量のスケールを調整する(正規化)事で、収束までのコストを抑える事ができる。 z-socre Normalization (標準化) †平均が0、標準偏差が1となるように調整する。 ※ std: 標準偏差 min-max normalization †最大値が1最小値が0となるように調整する。 目的関数 / 評価指標 など †予測値を評価する為の指標は、目的関数により定義される。 平均二乗誤差(MSE) / 二乗平均平方根誤差 ( RMSE ) †回帰モデルの誤差を評価する指標の一つ。
とした場合。
回帰直線(予測値)を y_pred とした場合、以下で求める事ができる。 # MSE mse = np.sum([(y[i] - y_pred[i]) ** 2 for i in range(len(y))]) / len(y) # 遅い mse = np.power(y - y_pred, 2).sum() / len(y) # 速い # RMSE rmse = np.sqrt(mse) 交差エントロピー †分類モデルの誤差を評価する指標の一つ。 コスト関数 †
単回帰
※ 特徴量の行列をX、パラメータの行列をWとした場合
正解率 †適合率 †再現率 †F1 Score †ROC曲線とAUC †頻度分析 †観測頻度と相対頻度 †標準化頻度 †※観測頻度 - 平均値 / 標準偏差 TF-IDF †各テキストの特徴的な単語を抽出する為の技法 数理モデル †ロジスティック回帰 †TODO:
決定木 †ある事項に対する観察結果から、その事項の目標値に関する結論を導く手法。 ランダムフォレスト †複数の決定木モデルを構築して、それらを一つにまとめてより正確で質の高い予測を行う手法。おもに分類(判別)・回帰(予測)の用途で使用される。 サポートベクターマシン †サポートベクターマシン(SVM)は、教師あり学習を用いるパターン認識モデルの一つである。分類や回帰へ適用できる。
SVMのハイパーパラメータ †
ナイーブベイズ (単純ベイズ分類器) †TODO:
確率的なアプローチを利用して分類を行う機械学習の手法。 「ベイズの定理(Bayes' theorem)」と呼ばれる、条件付き確率の定理が基となっている。 アダブースト †ランダムよりも少し精度がいいような弱い識別機を組みわせて、強い識別機を作成しようとする機械学習モデル k近傍法 †k近傍法(ケイきんぼうほう、英: k-nearest neighbor algorithm, k-NN)は、特徴空間における最も近い訓練例に基づいた分類の手法であり、パターン認識でよく使われる。 k平均法 †TODO:
ニューラルネットワーク †脳機能に見られるいくつかの特性に類似した数理的モデル マルコフ連鎖 †TODO:
その他/用語など †偏差 †値と平均値の差。 マスク配列 †正則化 †※過学習の回避 ドロップアウト法 †※過学習の回避 順伝播 †損失関数 †誤差逆伝播法 †指数関数と対数関数 †シグモイド関数 †シグモイド関数は値を0〜1のレンジにコンパクトにする計算を行う。 ReLU関数 ( 正規化線形関数 ) †混同行列 †条件付き確率 †ベイズの定理 †グリッドサーチ †様々なパラメーターの値の組み合わせでモデルを何度も構築し、最適なパラメータの値を算出する手法。 アンサンブル学習 †複数のモデルを融合させて1つの学習モデルを生成する手法。 説明変数 †学習で使用する入力データ。(教師データ、特徴量) 目的変数 †教師あり学習で使用する実結果データ。( 従属変数や被説明変数 ) 乗法公式 † |