15.9K Views
December 14, 22
スライド概要
マテリアルズ・インフォマティクス 連続セミナー 第二回
動画:https://youtu.be/wrANu-Cqv_0 (音量修正版、2022, Dec 27 修正済み)
2022, Dec. 27修正
ソースコード (2023, Jan. 9改定):https://bitbucket.org/kino_h/python_mi_seminar_2023/src/master/
マテリアルズインフォマティクスチュートリアル
2022年度 マテリアルズ・インフォマティクス 連続セミナー 第二回 木野日織(きのひおり)
今回の内容 二回目内容 Pythonモ ジュールの紹 介 データの紹介 Scikit-learn 回帰手法の紹 介
今回の内容 内容 Pythonモ ジュールの紹 介 numpy データの紹介 Pandas Scikit-learn 回帰手法の紹 介
代数計算クラスライブラリ 問題点:Pythonのリストは多次元ベクトルを書けるが、四則演算は できない。例えば演算子+はリストのappendになる。 目的:Pythonでの代数ベクトルや高次元行列の基本型を与え、演算 を行う。 手段:numpy
代数演算 numpy import nump as np # リストからarrayへの変換 Aarray = np.array(Alist) ベクトル演算 行列演算 手法: numpy.array 手法: numpy.matrix 作成方法 Pythonリスト から作成 Pandasデータ フレームから 作成
numpy 手法: numpy.array 作成方法 import pandas as pd Pandasデータ フレームから 作成 Pythonリスト から作成 # dfがpandasデータフレーム # pandasからarrayへの変換 Aarray = df.values Aarray = df.loc[:, COLUMN_LIST].values 全データから 作成 カラムを指定 して作成
表形式データクラスライブラリ 目的:表形式のデータの操作を行う。(“データ解析学のExcel”) 手段:Pandasデータフレーム できること:列毎に複数の型を入れる。データ欠如セルの操作。可視化。 Pandasデータフレーム カラム 名1 ヵラム 名2 カラム 名3 カラム 名4 … CSVファイル numpy array 整数、実数、文字列、・・・
Pandasデータフレーム iImport pandas as pd 目的:表形式 データ import pandas as pd # CSVファイルから観測データ を読み込む。 df = pd.read_csv(filepath) 手段:Pandas データフレー ム 作成方法 numpy.array から作成 # CSVファイルへ観測データを保 存する。 df = pd.to_csv(filepath) リストから作 成 辞書から作成 保存方法 CSVファイル から読み込む CSVファイル へ保存する
今回の内容 内容 Pythonモジュー ルの紹介 Scikit-learn回 データの紹介 トイモデル 帰手法の紹介 希土類コバルト 合金𝑇𝐶
今回用いるデータ • トイモデル 𝑥Ԧ = (𝑥, 𝑥 2 , 𝑥 3 , 𝑥 4 , 𝑥 5 , sin 𝑥 ) 𝑦 = sin 𝑥 + 𝑁(0, 𝑠𝑐𝑎𝑙𝑒 2 ) • 希土類コバルト(ReCo)合金磁気相転移温度(𝑇𝐶 ) 説明変数 希土類元素: 原子番号 (カラム名 Z) d,f 軌道の電子配置 (f4,d5)期待値 その射影量 (4f, S4f, J4f,(g-1)J4f, (2-g)J4f) 構造由来説明変数 : 希土類元素の体積あたり数密度 (C_R) Co の体積あたり数密度 (C_T) 元素あたりの体積(vol_per_atom) (構造はAtomWorkから取得し加工済み。) Re Z 目的変数:磁気相転移温度T_C
今回の内容 内容 Pythonモ ジュールの紹 介 データの紹介 Scikit-learn 回帰手法の紹 介 今回の本題
Scikit-learn • 2022/12/13の最新版versin 1.2.0の説明を参照して書いています。 • Versionが変わると動作が変わる可能性があります。 ご了承ください。
Scikit-learnの使い方 基本的な使い方が統一されています。 回帰・分類・クラスタリング reg = LinearRegression(…) reg.fit(X,y) yp =reg.predict(X) 規格化・次元圧縮 dr = PCA(…) dr.fit(X) Xtransformed =dr.transform(X) dr.fit_transform(X) としか呼べないモジュー ルもあります。
今回の内容 今回は • 主として回帰の説明を行いますが、 • 訓練・テストデータ分割、交差検定も同 時に行うので、次回以降の次元圧縮・分 類・クラスタリングと比べて、説明量が 多くなっています。
Scikit-learnの説明に関して 説明 例 https://scikitlearn.org/stable/modules/generated/sklearn.linear_ model.LassoCV.html#sklearn.linear_model.LassoCV
回帰モデル:予測モデル学習と未知データへの適用 未知データに対 して予測する 未知データに対 して予測値を得 る 予測モデルを得 る 観測データを収 集する 観測データを加 工する 予測モデルを学 習する 未知データを収 集する 未知データを加 工する 予測モデルで未 知データに対し て予測値を得る
回帰予測モデル 予測モデルを学習 する プログラム組み合 わせ方式 ハイパーパラメタ を幾つか選ぶ 観測データ分割を 行う 既存関数方式 モデル当てはめを 行う 一組の訓練・テス トデータ 交差検定 train_test_split KFold 線形回帰モデル LinearRegression Lasso モデル評価を行う カーネル法 Ridge KernelRidge モデルを選択する 交差検定で線形回 帰モデルを作る LassoCV RidgeCV 交差検定で一般的 な回帰モデルを作 る GridSearchCV
例1 レポジトリ内のファイル 010.regression/ 010.050.text.linear_regression.ipynb 010.055.text.linear_regression-CV.ipynb 010.060.text.RETM-KR.ipynb 010.110.answer.linear_regression.ipynb … • • • • トイモデル Z-score Normalization 線形回帰モデル 一組の訓練・テストデータに分割
010.050 予測モデルを学習 する プログラム組み合 わせ方式 ハイパーパラメタ を幾つか選ぶ 観測データ分割を 行う 既存関数方式 モデル当てはめを 行う 一組の訓練・テス トデータ 交差検定 train_test_split KFold 線形回帰モデル LinearRegression Lasso モデル評価を行う カーネル法 Ridge 目的:これらの関数の利用法を知ること。 KernelRidge モデルを選択する 交差検定で線形回 帰モデルを作る LassoCV RidgeCV 交差検定で一般的 な回帰モデルを作 る GridSearchCV
回帰モデル:学習 未知データに 対して予測す る 予測モデルを 得る 観測データを 収集する ファイル x5_sin.csvを 読み込む (データ作成) 観測データを 加工する 未知データに 対して予測値 を得る 予測モデルを 学習する 結果の解釈 を行う 生観測データ 規格化関数を を得る 作成する
回帰モデル:学習 未知データに 対して予測す る 予測モデルを 得る 観測データを 収集する ファイル x5_sin.csvを 読み込む (データ作成) 観測データを 加工する 未知データに 対して予測値 を得る 予測モデルを 学習する 結果の解釈 を行う 生観測データ 規格化関数を を得る 作成する
観測・未知データ作成 x1 x2 x3 x4 x5 x6 y 𝑥Ԧ = (𝑥, 𝑥 2 , 𝑥 3 , 𝑥 4 , 𝑥 5 , sin 𝑥 ) 𝑦 = sin 𝑥 + 𝑁(0, 𝑠𝑐𝑎𝑙𝑒 2 ) 𝑁(𝜇, 𝑠𝑐𝑎𝑙𝑒 2 ): 平均𝜇, 分散𝑠𝑐𝑎𝑙𝑒 2 の正規分布。 観測データ:x5_sin.csv 未知データ:x5_sin_new.csv
回帰モデル:学習 未知データに 対して予測す る 予測モデルを 得る 観測データを 収集する ファイル x5_sin.csvを 読み込む (データ作成) 観測データを 加工する 未知データに 対して予測値 を得る 予測モデルを 学習する 結果の解釈 を行う 生観測データ 規格化関数を を得る 作成する
データ取得 1 2 3 4 5 6 Filename = f”{ROOT}/data_calculated/x5_sin.csv” DESCRIPTOR_NAMES = [‘x1’, ‘x2’, ‘x3’, ‘x4’, ‘x5’, ‘x6’] TARGET_NAME = “y” df_obs = pd.read_csv(filename) Xraw = df_obs.loc[:, DESCRIPTOR_NAMES].values y = df_obs.loc[:, TARGET_NAME].values 説明変数,目的変数 カラムの設定 データファイルの読 み込み 生観測データを得る 説明変数 Xraw 目的変数 y
変数名定義(1) 説明変数 生説明変数 Xraw 加工済み説 明変数X 訓練データ Xtrain テストデー タXtest
変数名定義(2) 目的変数 観測データ目 的変数 訓練データ ytrain テストデータ ytest 目的変数予測 値 訓練データ ytrainp テストデータ ytestp
データ加工 Scikit-learnのライブラリは黄色表示 1 2 3 4 from sklearn.preprocessing import StandardScaler scaler = StandardScaler() データ加工 scaler.fit(Xraw) Z-score Normalizationによる規格化のみ行う。 X = scaler.transform(Xraw)
予測モデル学習の各過程 観測データから 学習する 1. 観測データ 分割を行う 2. モデル当て はめを行う 3. モデル評価 を行う 4. モデルを選 択する 訓練データ・テ ストデータに分 ける 訓練データに対 してある関数を 最適化する テストデータに 対して性能評価 指標値を得る 性能評価指標値 から妥当なモデ ルを選択する。 (階層構造の一例)
一組の訓練データ、テストデータへの分割 train_test_split テストデータサイ ズ指定方法 test_size={割合} ランダム分割指定 方法 shuffle=True 目的:毎回、同 じ結果を得る random_state={整 数} スクリプトの毎実行同じ乱数でランダムに分け、テストデータ=観測データの25%とする。 from sklearn.model_selection import train_test_split Xtrain, Xtest, ytrain, ytest = train_test_split(X, y, test_size=0.25, shuffle=True, random_state=1)
予測値生成 回帰 モデル学習 予測値作成 .fit() .predict()
モデル当てはめ 罰則項が無い線形回帰モデル 1 from sklearn.linear_model import LinearRegression 2 reg = LinearRegression() 訓練データを用いて回帰モデルを作成する 3 reg.fit(Xtrain, ytrain) 予測値を生成する。 4 ytrainp = reg.predict(Xtrain) 5 ytestp = reg.predict(Xtest)
回帰係数 reg.fit(Xtrain, ytrain) で回帰係数と切片が求まっている。 それらの表示を行う。 print("coef", reg.coef_) print("intercept", reg.intercept_)
予測モデルの性能評価 テストデータを用いた評価指標値RMSE, MAE, R2 の値を得る。 (RMSEは√𝑀𝑆𝐸 とする。) 1 2 3 4 5 6 7 8 from sklearn.metrics import r2_score from sklearn.metrics import mean_squared_error from sklearn.metrics import mean_absolute_error rmse = np.sqrt(mean_squared_error(ytest, ytestp)) mae = mean_absolute_error(ytest, ytestp) r2 = r2_score(ytest, ytestp) print("RMSE, MAE, R2", rmse, mae, r2)
回帰モデル:未知データへの適用 結果の解釈 を行う 未知データに対 して予測する 未知データに対 して予測値を得 る 予測モデルを得 る 観測データを収 集する ファイル x5_sin.csvを読 み込む 生観測データを 得る 観測データを加 工する 観測データから 学習する 規格化関数を作 成する reg変数 未知データを収 集する ファイル x5_sin_new.csv を読み込む 生未知データを 得る 未知データを加 工する 予測モデルで未 知データに対し て予測値を得る 規格化関数を適 用する reg変数 適用 (データ作成) scaler変数 scaler変数 適用
新規データへの適用 「未知データ」→データがある場合は「新規データ」と読み替える。 新規データを含むファイルを読む。 1 2 3 4 5 6 filename_new = f"ROOT/data_calculated/x5_sin_new.csv" df_new = pd.read_csv(filename_new) Xraw_new = df_new.loc[:, DESCRIPTOR_NAMES].values ynew = df_new.loc[:, TARGET_NAME].values Xnew = scaler.transform(Xraw_new) ynewp = reg.predict(Xnew) 新規データ生説明変数 Xraw_new 新規データ目的変数 ynew (答え合わせの ために新規データ目的変数がある。) データ加工 観測モデル変換と同じ scaler で説明変 数を変換する 同じ回帰モデルで、新規データ目的変数予 測値を生成する
結果解釈 未知データに 対して予測す る 予測モデルを 得る 未知データに 対して予測値 を得る 結果の解釈 を行う
結果解釈:観測データの規格化前後可視化 生観測データ説明変数 # 2パネルある図 fig, axes = plt.subplots(1, 2) # 左図は index vs Xraw,マーカー".-" axes[0].plot(Xraw, ".-") # 右図は index vs X axes[1].plot(X, ".-") # 図の軸ラベルをつける # 横軸名前 "x1" # 縦軸名前 "y" plt.xlabel("x1") plt.ylabel("y") 規格化後 観測データ説明変数
結果解釈:観測データと新規データの可視化 # 規格化後観測データ plt.plot(X[:, 0], X[:, 1:], ".-") # 規格化後新規データ plt.plot(Xnew[:, 0], Xnew[:, 1:], "o") # 軸の名前 plt.xlabel("x1") plt.ylabel("X") 新規データ 観測データ 外挿領域
結果解釈:訓練データ・テストデータ分割の可視化 plt.plot(Xtrain[:, 0], Xtrain[:, 1:], ".") plt.plot(Xtest[:, 0], Xtest[:, 1:], "o", markersize=10) # 図が印刷可能範囲を出ないようにする. plt.tight_layout() 観測データのうち訓練データでないデータがテス トデータになる。 訓練(・) テスト(○)
観測データ、新規データ予測値の可視化 訓練データとテストデータ 新規データ # 2 パネルの図 fig, axes = plt.subplots(1, 2) # 左が訓練データとテストデータの # 目的変数観測値vs予測値 axes[0].plot(ytrain, ytrainp, ".") axes[0].plot(ytest, ytestp, "o") axes[0].set_aspect("equal", "box") # 右が新規データの # 目的変数観測値vs予測値 axes[1].plot(ynew, ynewp, "x") axes[1].set_aspect("equal", "box") fig.tight_layout() 横軸:目的変数観測値, 縦軸:予測値
例2 レポジトリ内のファイル 010.regression/ 010.050.text.linear_regression.ipynb 010.055.text.linear_regression-CV.ipynb 010.060.text.RETM-KR.ipynb 010.110.answer.linear_regression.ipynb … • • • • トイモデル Z-score Normalization 線形回帰モデル 交差検定で訓練・テストデータに分割
010.055 予測モデルを学習 する プログラム組み合 わせ方式 ハイパーパラメタ を幾つか選ぶ 観測データ分割を 行う 既存関数方式 モデル当てはめを 行う 一組の訓練・テス トデータ 交差検定 train_test_split KFold 線形回帰モデル LinearRegression Lasso モデル評価を行う カーネル法 Ridge 目的:これらの関数の利用法を知ること。 KernelRidge モデルを選択する 交差検定で線形回 帰モデルを作る LassoCV RidgeCV 交差検定で一般的 な回帰モデルを作 る GridSearchCV
交差検定: KFold KFold 交差検定回数 n_splits={回数} shuffle=True 分割指定方法 ランダム random_state={整 数} 非ランダム Default shuffle=False kf = KFold(n_splits=5, shuffle=True, random_state=1) 目的:ランダム時 に毎回、同じ結果 を得る
交差検定 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 from sklearn.model_selection import KFold from sklearn.metrics import r2_score from sklearn.linear_model import Lasso N_SPLITS = 5 SHUFFLE = True alpha = ある値を指定する score_function = r2_score cv_test_score_list = [] # テストデータ回帰評価指標値保存用配列 kf = KFold(n_splits=N_SPLITS, shuffle=SHUFFLE, random_state=1) for train, test in kf.split(X): reg = Lasso(alpha=alpha) Xtrain, ytrain = X[train], y[train] # 訓練データ Xtest, ytest = X[test], y[test] # テストデータ reg.fit(Xtrain, ytrain) # 訓練データを用いて fit ytestp = reg.predict(Xtest) # テストデータへの予測値 testscore = score_function(ytest, ytestp) cv_test_score_list.append(testscore) test_score_list.append([np.mean(cv_test_score_list), np.std(cv_test_score_list), alpha]) r2_score以外を用いるために別関数 としている。 N_SPLITS変数で指定した回数だけ for loopが行われる。 train, test は各回の訓練・テス トデータのインデックスが入る。 交差検定test_scoreの平均値と標 準偏差
罰則項有り線 形回帰モデル Lasso L1罰則項 L2罰則項 Lasso Ridge インスタンス を作成する モデル作成 予測値作成 ハイパーパラ メタ .fit() .predict() alpha={実数} Ridge回帰も同じ。
交差検定部分 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 from sklearn.model_selection import KFold from sklearn.metrics import r2_score from sklearn.linear_model import Lasso N_SPLITS = 5 SHUFFLE = True alpha = {実数} # ある値を指定する score_function = r2_score cv_test_score_list = [] # テストデータ回帰評価指標値保存用配列 kf = KFold(n_splits=N_SPLITS, shuffle=SHUFFLE, random_state=1) for train, test in kf.split(X): reg = Lasso(alpha=alpha) Xtrain, ytrain = X[train], y[train] # 訓練データ Xtest, ytest = X[test], y[test] # テストデータ reg.fit(Xtrain, ytrain) # 訓練データを用いて fit ytestp = reg.predict(Xtest) # テストデータへの予測値 testscore = score_function(ytest, ytestp) cv_test_score_list.append(testscore) test_score_list.append([np.mean(cv_test_score_list), np.std(cv_test_score_list), alpha]) インスタンス作成時に alphaを指定する。
Lassoのハイパーパラメタループ部分 1 2 3 4 5 6 7 8 9 10 11 12 13 alpha_list = np.logspace(-5, -1, 20) # 用いる alpha の値のリスト test_score_list = [] # alphaのループを行う。 for alpha in alpha_list: ハイパーパラメタの可能性を 全て探索する=網羅(brute force)探索 # 各アルファで交差検定を行う。 kf = KFold(n_splits=N_SPLITS, shuffle=SHUFFLE, random_state=1) for train, test in kf.split(X): Xtrain, ytrain = X[train], y[train] … test_score_list.append([np.mean(cv_test_score_list), np.std(cv_test_score_list), alpha]) 交差検定 部分
結果解釈:可視化 columns_list = ["mean(R2)_train", "std(R2)_train", "alpha"] df_train_score = pd.DataFrame(train_score_list, columns=columns_list) columns_list = ["mean(R2)_test", "std(R2)_test", "alpha"] df_test_score = pd.DataFrame(test_score_list, columns=columns_list) # df_train_scoreとdf_test_scoreをまとめる df_score = df_train_score.merge(df_test_score, on=“alpha”) # 可視化 from regression_misc import plot_alpha_yerror # ユーザー定義関数 plot_alpha_yerror(df_score) 回帰係数は𝑅2 (𝑡𝑒𝑠𝑡)~0.999 for log10 (𝛼) < −2
交差検定 5分割の場合 𝒙 𝑦 𝒙1 𝑦1 𝒙𝟐 𝑦2 𝒙𝟑 𝑦3 𝒙𝟒 𝑦4 𝒙𝟓 𝑦5 𝒙𝟔 𝑦6 𝒙7 𝑦7 𝒙8 𝑦8 𝒙9 𝑦9 𝒙10 𝑦10 𝒙11 𝑦11 訓練 データ #1 𝐿の 最適化 #2 回帰 モデル #3 テスト データ #4 評価 指標値 #5 #2,#3, #1,#3, #1,#2, #1,#2, #1,#2, #4,#5 #4,#5 #4,#5 #3,#5 #3,#4 𝑓2345 (𝑥) Ԧ #1 score1 𝑓1234 (𝑥) Ԧ 𝑓1245 (𝑥) Ԧ 𝑓1345 (𝑥) Ԧ #2 score2 𝑓1235 (𝑥) Ԧ #3 score3 #4 #5 score4 ave(score), stddev(score) score5
予測モデル選択 1 2 3 4 imax = np.argmax(df_score[“mean(R2)_test”]) # alpha の最適値 alpha_opt = df_score.loc[imax, "alpha"] print("alpha_opt", alpha_opt) 過学習にならないようにalphaが大きい側が良 いが、ここでは最大値を与えるindexを機械的 に求める。 alphaの最適値が求まった。(モデルが一つ求まったわけではない。) 例えば、scikit-learnの*CV関数は、最適alpha 値を用いて、全観測データを用いてモデルを作り直す。 5 6 7 8 reg = Lasso(alpha=alpha_opt) reg.fit(X, y) # 観測データ全てを用いた学習 print(reg.coef_, reg.intercept_) # 回帰係数と切片 yp = reg.predict(X) # 観測データの予測値 reg.coef_部分:[-0.003 -0. -0. -0. -0. 0.718]
交差検定と新規データへの目的変数予測値 観測データ交差検定 目的変数観測値 vs 予測値 新規データ 目的変数観測値 vs 予測値 観測データ・新規データ x1 vs y 新規データの外挿領域でも妥当な予測が できています。(Lassoでは常にこうな るわけではありません。)
追加コード
目的:alphaを変えて回帰係数の変化を見る。
010.055.text.linear_regression-CV.ipynb最後に追加。
from sklearn.model_selection import cross_val_score
from sklearn.metrics import make_scorer
result_coef = []
for alpha in alpha_list:
reg = Lasso(alpha=alpha)
reg.fit(X,y)
result_coef.append(reg.coef_)
df_coef = pd.DataFrame(result_coef, columns=DESCRIPTOR_NAMES)
df_alpha = pd.DataFrame({"alpha":alpha_list})
df_coef = df_coef.merge(df_alpha, left_index=True, right_index=True)
df_coef.plot(x="alpha", marker="o", logx=True)
追加コード結果 目的:alphaを変えて回帰係数の変化を見る。 sin(𝑥)項のみ。 (𝑥, sin(𝑥))のみ 𝑥𝑖 Lassoは積極的に不要な係 数を(厳密に)0とする。 l𝑜𝑔10 (𝛼)
𝑃 Lassoによる変数選択 𝑓 𝑥Ԧ = 𝑤𝑝 𝑥𝑝 + 𝑤0 𝑝 𝑥Ԧ = 𝑥1 , 𝑥2 , … , 𝑥𝑃 𝑤 = 𝑤, 𝑤2 , … , 𝑤𝑃 よくある説明 𝐿𝑎𝑠𝑠𝑜:𝐿𝑟𝑒𝑔 = 1 2𝑁 𝑁 σ 𝑖 𝑡𝑟𝑎𝑖𝑛 𝑡𝑟𝑎𝑖𝑛 𝑦𝑖 − 𝑓 𝑥Ԧ𝑖 2 +𝛼 𝑤 1 1 を最小化 第一項の寄与 𝑤2 第一項の最適値 𝑤1 ≠ 0, 𝑤2 ≠ 0, 第二項の最適値 𝑤1 第二項の寄与 𝐿𝑟𝑒𝑔 の最適パラメタ(この場合は𝑤1 ≠ 0, 𝑤2 =0)
罰則項有り線 形回帰モデル Lasso 目的:回帰と モデル選択を 同時に行う L1罰則項 L2罰則項 Lasso Ridge インスタンス を作成する モデル作成 予測値作成 ハイパーパラ メタ .fit() .predict() alpha={実数} Ridge回帰も同じ。
010.055の一部 予測モデルを学習 する プログラム組み合 既存関数方式 わせ方式 ハイパーパラメタ 観測データ分割を モデル当てはめを を幾つか選ぶ 行う 行う 一組の訓練・テス トデータ train_test_split 交差検定 KFold 線形回帰モデル LinearRegression Lasso モデル評価を行う カーネル法 Ridge KernelRidge モデルを選択する 交差検定で線形回 LassoCV 帰モデルを作る RidgeCV 交差検定で一般的 な回帰モデルを作 る GridSearchCV 目的:この関数の利用法を知ること。
LassoCV 010.055は途中で以下のコードを挟んでいます。 LassoCV ハイパーパラ メタの値の指 定 交差検定の指 定 alphas={値リ スト} cv=KFold 1 2 3 4 5 6 7 8 alpha_list = np.logspace(-5, -1, 20) # もっと上の行に記述した。 … from sklearn.linear_model import LassoCV kf = KFold(N_SPLITS, shuffle=True, random_state=1) reg = LassoCV(cv=kf, alphas=alpha_list) reg.fit(X, y) ハイパーパラメタの網羅探索 print("alpha", reg.alpha_) print("coef", reg.coef_) 全観測データに対してkfで指定した交差検定を行い最適 なハイパーパラメタを求め、最後に最適化されたハイ パーパラメタを用い、全観測データを用いて回帰モデル を一つ生成します。 LassoCVも.fit()の後は.predict()が使えます。全観測 データに対する予測値の生成は以下で得られます。 yp = reg.predict(X)
例3 レポジトリ内のファイル 010.regression/ 010.050.text.linear_regression.ipynb 010.055.text.linear_regression-CV.ipynb 010.060.text.RETM-KR.ipynb 010.110.answer.linear_regression.ipynb … • • • • ReCo合金の磁気相転移温度 Z-score Normalization カーネル回帰モデル 交差検定
010.060 予測モデルを学習す る プログラム組み合わ せ方式 ハイパーパラメタを 幾つか選ぶ 観測データ分割を行 う 既存関数方式 モデル当てはめを行 う 一組の訓練・テスト データ 交差検定 train_test_split KFold 線形回帰モデル LinearRegression Lasso モデル評価を行う カーネル法 Ridge KernelRidge モデルを選択する 交差検定で線形回帰 モデルを作る LassoCV 交差検定で一般的な 回帰モデルを作る RidgeCV GridSearchCV 回帰モデルの指定 その他の指定 KernelRidge 目的:この関数の利用法を知ること。
観測データの取得
ReCo磁気相転移温度データのファイルからの読み込み
1
2
3
4
5
6
7
8
9
filename = f"{ROOT}/data/TC_ReCo_detail_descriptor.csv"
DESCRIPTOR_NAMES = ['C_R', 'C_T', 'vol_per_atom', ‘Z‘,
‘f4’, ‘d5’, ‘L4f‘, 'S4f', 'J4f','(g-1)J4f’,
'(2-g)J4f']
TARGET_NAME = 'Tc'
RANDOM_STATE = 5 # 乱数設定
df_obs = pd.read_csv(filename)
Xraw = df_obs.loc[:, DESCRIPTOR_NAMES].values
y = df_obs.loc[:, TARGET_NAME].values
説明変数カラム,目的変
数カラムの設定
ファイルから読み込み
生説明変数
目的変数
カーネル法回帰 カーネルリッジ回帰 関数𝐿𝑟𝑒𝑔 = σ𝑖 𝑦𝑖 − 𝑓 𝑥Ԧ𝑖 2 +𝛼 𝑤 2 を最小化 2 カーネルリッジ法 回帰 ガウス過程回帰 𝑁 カーネルの形 𝑓 𝑥Ԧ = 𝑤𝑖 𝐾(𝑥, Ԧ 𝑥Ԧ𝑖 ) L2罰則項 𝑖 RBFカーネル: 𝐾(𝑥, 𝑦) = exp(−𝛾 𝑥 − 𝑦 2 2 Sklearn.metrics.p airwise ) RBFカーネル sklearn.metrics.pairwiseで定義される。 alpha={実数} kernel=“rbf” (ガウス過程回帰のRBFカーネルとは異なる。 sklearn.gaussian_process.kernels.RBF) gamma={実数} RBFカーネルを用いるカーネルリッジ回帰では ハイパーパラメタが2つある。 estimator = KernelRidge(alpha=1 , gamma=1, kernel="rbf")
KernelRidge回帰の可能なkernel文字列
sklearn.kernel_ridge.KernelRidgeのParameters:部分の説明
from sklearn.metrics import pairwise
print(pairwise.PAIRWISE_KERNEL_FUNCTIONS)
{'additive_chi2': <function additive_chi2_kernel at 0x7f5d4f3471f0>, 'chi2': <function
chi2_kernel at 0x7f5d4f347280>, …
文字列と関数の対応がわかります。
一般的なハイパーパラメタの最適化 GridSearchCV モデル モデル内ハイパー パラメタ 性能評価指標 交差検定 estimator={回帰ク ラス|分類クラス} param_grid={辞 書} scoring={文字列} cv=KFold Default scoring=“r2” Scoringで可能な文字列Ref. https://scikit-learn.org/stable/modules/model_evaluation.html#scoring-parameter Default KFold, 5 fold, shuffle=False
カーネルリッジ回帰+交差検定
1
2
3
4
5
6
7
8
9
10
11
from sklearn.model_selection import KFold
from sklearn.kernel_ridge import KernelRidge
名前確認のためにalpha=,
from sklearn.model_selection import GridSearchCV
gamma=を書いた。
nfold = 10
kf = KFold(nfold, shuffle=True, random_state=RANDOM_STATE)
estimator = KernelRidge(alpha=1 , gamma=1, kernel="rbf")
ハイパーパラメタ
param_grid = {“alpha”: np.logspace(-6, 0, 11), "gamma": np.logspace(-5, 0, 11)}
の名前を合わせる。
reg_cv = GridSearchCV(estimator, cv=kf, param_grid=param_grid)
reg_cv.fit(X, y)
交差検定で最適なハイパーパラメタ
print("best hyperparameter")
を得て、最後に観測データ全てを用
print(reg_cv.best_params_)
いて最適なハイパーパラメタで一つ
回帰モデルを学習する。
Scikit-learnの*CVモジュールは同様
の機能を持つ。
best hyperparameter
{'alpha': 6.309573444801929e-05, 'gamma': 0.00031622776601683794}
カーネルリッジ回帰+交差検定
from sklearn.model_selection import KFold
from sklearn.kernel_ridge import KernelRidge
from sklearn.model_selection import GridSearchCV
nfold = 10
kf = KFold(nfold, shuffle=True, random_state=RANDOM_STATE)
estimator = KernelRidge(alpha=1 , gamma=1, kernel="rbf")
param_grid = {“alpha”: np.logspace(-6, 0, 11), "gamma": np.logspace(-5, 0, 11)}
reg_cv = GridSearchCV(estimator, cv=kf, param_grid=param_grid)
reg_cv.fit(X, y)
print("best hyperparameter")
print(reg_cv.best_params_)
gamma
np.logspace(-5, 0, 11)
1
2
3
4
5
6
7
8
9
10
ハイパーパラメタ
の網羅探索
alpha
np.logspace(-6, 0, 11)
GridSearchCVの出力 reg_cv. cv_results_ が結果出力辞書を返します。 print(reg_cv.cv_results_.keys()) 10回交差検定の場合の出力例 dict_keys(['mean_fit_time', 'std_fit_time', 'mean_score_time', 'std_score_time', 'param_alpha', 'param_gamma', 'params', 'split0_test_score', 'split1_test_score', 'split2_test_score', 'split3_test_score', 'split4_test_score', 'split5_test_score', 'split6_test_score', 'split7_test_score', 'split8_test_score', 'split9_test_score', 'mean_test_score', 'std_test_score', 'rank_test_score’]) Enjoy print(reg_cv.cv_results_)
例4 レポジトリ内のファイル 010.regression/ 010.050.text.linear_regression.ipynb 010.055.text.linear_regression-CV.ipynb 010.060.text.RETM-KR.ipynb 010.110.answer.linear_regression.ipynb … • • • • トイモデル Z-score Normalization Ln罰則項線形回帰モデルの比較 交差検定
010.110 予測モデルを学習す る プログラム組み合わ せ方式 ハイパーパラメタを 幾つか選ぶ 観測データ分割を行 う 既存関数方式 モデル当てはめを行 う 一組の訓練・テスト データ 交差検定 train_test_split KFold 線形回帰モデル LinearRegression Lasso モデル評価を行う モデルを選択する カーネル法 Ridge KernelRidge 目的:共線性がある場合の回帰係 数を比較する。 交差検定で線形回帰 モデルを作る LassoCV 交差検定で一般的な 回帰モデルを作る RidgeCV GridSearchCV 回帰モデルの指定 KernelRidge その他の指定
共線性について 𝑥 𝑥3 𝑥5 sin 𝑥 = − + +⋯ 1 3! 5! であり、yには観測誤差を入れており、観測データ“x5_sin.csv”は線形回帰では係数に 任意性がある多重共線性を持つデータです。 小さいハイパーパラメタを入れた線形回帰でモデル学習すると回帰係数はどうなるで しょうか? DATA_NAME = "x5_sin" NORMALIZATIONTYPE = "standard" REGTYPE = “linear” # “linear”, “lasso”, “ridge“ に変更可能 RANDOM_STATE = 1 # random state of train_test_split REGTYPEを“linear”, “lasso”, “ridge“ に変更することで、罰則項が無い線形回帰、 L1罰則項を持つLasso、L2罰則項があるRidge回帰の回帰係数を比較します。
罰則項による線形回帰の回帰係数の比較 スクリプトの最後の図 横軸:交差検定の各モデルインデックス 縦軸:訓練データで学習した回帰モデルの係数の値。 c1 c2 c3 c4 c5 c6 罰則項が無い線形回帰では非ゼロの(x, x 2 , x 3 , x 4 , 𝑥 5 , sin 𝑥 ) を持つ。 係数の値も大きい。符号も変わる。 LassoとRidge回帰では罰則項のおかげで回帰係数(回帰モデル)はほぼ固定される。 後ほど再び例が出てくる。
回帰・交差検定 予測モデルを学習す る プログラム組み合わ せ方式 ハイパーパラメタを 幾つか選ぶ 観測データ分割を行 う 既存関数方式 モデル当てはめを行 う 一組の訓練・テスト データ 交差検定 train_test_split KFold 線形回帰モデル LinearRegression Lasso モデル評価を行う カーネル法 Ridge KernelRidge モデルを選択する 交差検定で線形回帰 モデルを作る LassoCV 交差検定で一般的な 回帰モデルを作る RidgeCV GridSearchCV 回帰モデルの指定 KernelRidge その他の指定
以上です。