R でモデルのパフォーマンスを相互検証する方法
統計では、次の 2 つの理由からモデルを構築することがよくあります。
- 1 つ以上の予測変数と応答変数の間の関係を理解します。
- モデルを使用して将来の観測を予測します。
相互検証は、モデルが将来の観測をどの程度正確に予測できるかを推定するのに役立ちます。
たとえば、年齢と収入を予測変数として使用し、デフォルトのステータスを応答変数として使用する重線形回帰モデルを構築できます。この場合、モデルをデータセットに適合させ、そのモデルを使用して、新規申込者の収入と年齢に基づいて、ローンを滞納する可能性を予測することができます。
モデルに強力な予測能力があるかどうかを判断するには、モデルを使用して、これまでに見たことのないデータに対して予測を行う必要があります。これにより、モデルの予測誤差を推定できるようになります。
相互検証を使用した予測誤差の推定
相互検証は、予測誤差を推定できるさまざまな方法を指します。相互検証の一般的なアプローチは次のとおりです。
1.データセット内の特定の数の観測値 (通常はすべての観測値の 15 ~ 25%) を確保します。
2.データセットに保存した観測値にモデルを適合 (または「トレーニング」) します。
3.モデルのトレーニングに使用しなかった観測値についてモデルがどの程度正確に予測できるかをテストします。
モデルの品質を測定する
適合モデルを使用して新しい観測値についての予測を行う場合、次のようないくつかの異なる指標を使用してモデルの品質を測定できます。
多重 R 二乗:これは、予測変数と応答変数の間の線形関係の強さを測定します。 R 二乗の 1 の倍数は完全な線形関係を示し、 R 二乗の 0 の倍数は線形関係がないことを示します。 R 二乗倍数が大きいほど、予測変数が応答変数を予測する可能性が高くなります。
二乗平均平方根誤差 (RMSE):新しい観測値を予測するときにモデルによって生じる平均予測誤差を測定します。これは、観測値の真の値とモデルによって予測された値の間の平均距離です。 RMSE の値が低いほど、モデルの適合性が高いことを示します。
平均絶対誤差 (MAE):これは、観測値の真の値とモデルによって予測された値の間の平均絶対差です。このメトリクスは通常、RMSE よりも外れ値の影響を受けにくいです。 MAE の値が低いほど、モデルの適合性が高いことを示します。
R での 4 つの異なる相互検証手法の実装
次に、R で次の相互検証手法を実装する方法を説明します。
1.検証セットのアプローチ
2. k 分割交差検証
3.相互検証は脇に置きます
4. k 分割交差検証の繰り返し
これらのさまざまな手法の使用方法を説明するために、 mtcars組み込み R データセットのサブセットを使用します。
#define dataset data <- mtcars[, c("mpg", "disp", "hp", "drat")] #view first six rows of new data head(data) # mpg disp hp drat #Mazda RX4 21.0 160 110 3.90 #Mazda RX4 Wag 21.0 160 110 3.90 #Datsun 710 22.8 108 93 3.85 #Hornet 4 Drive 21.4 258 110 3.08 #Hornet Sportabout 18.7 360 175 3.15 #Valiant 18.1 225 105 2.76
disp 、 hp 、 drat を予測変数として、 mpgを応答変数として使用して重線形回帰モデルを構築します。
検証セットのアプローチ
検証セットのアプローチは次のように機能します。
1.データを 2 つのセットに分割します。1 つのセットはモデルのトレーニング (つまり、モデル パラメーターの推定) に使用され、もう 1 つのセットはモデルのテストに使用されます。一般に、トレーニング セットはデータの 70 ~ 80% をランダムに選択して生成され、データの残りの 20 ~ 30% がテスト セットとして使用されます。
2.トレーニング データセットを使用してモデルを作成します。
3.モデルを使用して、テスト セット データについての予測を行います。
4. R 二乗、RMSE、MAE などの指標を使用してモデルの品質を測定します。
例:
次の例では、上で定義したデータセットを使用します。まず、データを次のように分割します。
トレーニング セットとテスト セット。データの 80% をトレーニング セットとして使用し、データの残りの 20% をテスト セットとして使用します。次に、トレーニング セットを使用してモデルを構築します。次に、モデルを使用してテスト セットに関する予測を行います。最後に、 R 二乗、RMSE、MAE を使用してモデルの品質を測定します。
#load dplyr library used for data manipulation library(dplyr) #load caret library used for partitioning data into training and test set library(caret) #make this example reproducible set.seed(0) #define the dataset data <- mtcars[, c("mpg", "disp", "hp", "drat")] #split the dataset into a training set (80%) and test set (20%). training_obs <- data$mpg %>% createDataPartition(p = 0.8, list = FALSE) train <- data[training_obs, ] test <- data[-training_obs, ] # Build the linear regression model on the training set model <- lm(mpg ~ ., data = train) # Use the model to make predictions on the test set predictions <- model %>% predict(test) #Examine R-squared, RMSE, and MAE of predictions data.frame(R_squared = R2(predictions, test$mpg), RMSE = RMSE(predictions, test$mpg), MAE = MAE(predictions, test$mpg)) #R_squared RMSE MAE #1 0.9213066 1.876038 1.66614
異なるモデルを比較する場合、テスト セットで最も低い RMSE を生成するモデルが優先モデルとなります。
このアプローチの長所と短所
検証セットアプローチの利点は、シンプルで計算効率が高いことです。欠点は、モデルが全データの一部のみを使用して構築されることです。トレーニング セットから除外したデータに興味深い情報や貴重な情報が含まれている場合、モデルはそれを考慮しません。
k 分割交差検証アプローチ
k 分割相互検証アプローチは次のように機能します。
1.データを k 個の「分割」またはサブセット (たとえば、5 または 10 個のサブセット) にランダムに分割します。
2. 1 つのサブセットのみを除いて、すべてのデータでモデルをトレーニングします。
3.モデルを使用して、除外されたサブセットのデータについて予測を行います。
4. k 個のサブセットのそれぞれがテスト セットとして使用されるまで、このプロセスを繰り返します。
5 . k 個のテストエラーを平均することでモデルの品質を測定します。これは知られています
相互検証エラーとして。
例
この例では、まずデータを5 つのサブセットに分割します。次に、データのサブセットを除くすべてを使用してモデルを適合させます。次に、モデルを使用して、除外されたサブセットについて予測し、テスト誤差を記録します (R 二乗、RMSE、MAE を使用)。各サブセットがテスト セットとして使用されるまで、このプロセスを繰り返します。次に、5 つのテストエラーの平均を単純に計算します。
#load dplyr library used for data manipulation library(dplyr) #load caret library used for partitioning data into training and test set library(caret) #make this example reproducible set.seed(0) #define the dataset data <- mtcars[, c("mpg", "disp", "hp", "drat")] #define the number of subsets (or "folds") to use train_control <- trainControl(method = "cv", number = 5) #train the model model <- train(mpg ~ ., data = data, method = "lm", trControl = train_control) #Summarize the results print(model) #Linear Regression # #32 samples #3 predictor # #No pre-processing #Resampling: Cross-Validated (5 fold) #Summary of sample sizes: 26, 25, 26, 25, 26 #Resampling results: # # RMSE Rsquared MAE #3.095501 0.7661981 2.467427 # #Tuning parameter 'intercept' was held constant at a value of TRUE
このアプローチの長所と短所
検証セットアプローチに対する k 分割相互検証アプローチの利点は、毎回異なるデータを使用してモデルを複数回構築するため、モデルの構築時に重要なデータを省略する可能性がなくなることです。
このアプローチの主観的な部分は、k に使用する値、つまりデータを分割するサブセットの数を選択することです。一般に、k 値が低いほどバイアスは高くなりますが、変動は低くなります。一方、k 値が高いと、バイアスは低くなりますが、変動は高くなります。
実際には、このサブセット数により過度の偏りと過度の変動を同時に回避する傾向があるため、一般に k は 5 または 10 に等しくなるように選択されます。
Leave One Out 相互検証 (LOOCV) アプローチ
LOOCV アプローチは次のように機能します。
1.データセット内の 1 つを除くすべての観測値を使用してモデルを構築します。
2.モデルを使用して、欠落している観測値の値を予測します。この予測をテストした際のエラーを記録します。
3.データセット内の観測ごとにこのプロセスを繰り返します。
4.すべての予測誤差を平均してモデルの品質を測定します。
例
次の例は、前の例で使用したのと同じデータセットに対して LOOCV を実行する方法を示しています。
#load dplyr library used for data manipulation library(dplyr) #load caret library used for partitioning data into training and test set library(caret) #make this example reproducible set.seed(0) #define the dataset data <- mtcars[, c("mpg", "disp", "hp", "drat")] #specify that we want to use LOOCV train_control <- trainControl( method = "LOOCV" ) #train the model model <- train(mpg ~ ., data = data, method = "lm", trControl = train_control) #summarize the results print(model) #Linear Regression # #32 samples #3 predictor # #No pre-processing #Resampling: Leave-One-Out Cross-Validation #Summary of sample sizes: 31, 31, 31, 31, 31, 31, ... #Resampling results: # # RMSE Rsquared MAE #3.168763 0.7170704 2.503544 # #Tuning parameter 'intercept' was held constant at a value of TRUE
このアプローチの長所と短所
LOOCV の利点は、すべてのデータ ポイントを使用するため、一般に潜在的なバイアスが軽減されることです。ただし、モデルを使用して各観測値の値を予測するため、予測誤差の変動が大きくなる可能性があります。
このアプローチのもう 1 つの欠点は、非常に多くのモデルに適合させる必要があるため、非効率的で計算量が多くなる可能性があることです。
k 分割交差検証アプローチを繰り返す
k 分割交差検証を複数回実行するだけで、k 分割交差検証を繰り返し実行できます。最終誤差は、繰り返し回数の平均誤差です。
次の例では、5 分割相互検証を 4 回繰り返します。
#load dplyr library used for data manipulation library(dplyr) #load caret library used for partitioning data into training and test set library(caret) #make this example reproducible set.seed(0) #define the dataset data <- mtcars[, c("mpg", "disp", "hp", "drat")] #define the number of subsets to use and number of times to repeat k-fold CV train_control <- trainControl(method = "repeatedcv", number = 5, repeats = 4 ) #train the model model <- train(mpg ~ ., data = data, method = "lm", trControl = train_control) #summarize the results print(model) #Linear Regression # #32 samples #3 predictor # #No pre-processing #Resampling: Cross-Validated (5 fold, repeated 4 times) #Summary of sample sizes: 26, 25, 26, 25, 26, 25, ... #Resampling results: # # RMSE Rsquared MAE #3.176339 0.7909337 2.559131 # #Tuning parameter 'intercept' was held constant at a value of TRUE
このアプローチの長所と短所
k 分割交差検証アプローチを繰り返す利点は、繰り返しごとにデータがわずかに異なるサブセットに分割されるため、モデルの予測誤差のさらに公平な推定値が得られることです。このアプローチの欠点は、モデル フィッティング プロセスを数回繰り返す必要があるため、計算量が多くなる可能性があることです。
相互検証でフォールド数を選択する方法
相互検証の最も主観的な部分は、使用するフォールド (つまりサブセット) の数を決定することです。一般に、フォールドの数が少ないほど、誤差推定値の偏りは大きくなりますが、誤差は小さくなります。逆に、フォールド数が多いほど、誤差推定の偏りは少なくなりますが、ばらつきが大きくなります。
計算時間に留意することも重要です。折り目ごとに新しいパターンをトレーニングする必要があります。これは時間のかかるプロセスですが、折り目の数を多く選択すると、時間がかかる可能性があります。
実際には、相互検証は通常 5 または 10 回の分割で実行されます。これにより、変動性と偏りのバランスが取れ、計算効率も向上します。
相互検証を実行した後にモデルを選択する方法
相互検証は、モデルの予測誤差を評価するために使用されます。これは、(RMSE、R 二乗などに基づいて) 予測誤差が最も低いモデルを強調表示することで、2 つ以上の異なるモデルから選択するのに役立ちます。
相互検証を使用して最適なモデルを選択したら、利用可能なすべてのデータを使用して、選択したモデルを適合させます。最終モデルの相互検証中にトレーニングした実際のモデル インスタンスは使用しません。
たとえば、5 分割相互検証を使用して、2 つの異なる回帰モデルの間でどちらのモデルを使用するのがより適切かを判断できます。ただし、どのモデルを使用するのが最適かを特定したら、すべてのデータを使用して最終モデルを適合させます。言い換えれば、最終モデルを構築するときに折り目を忘れることはありません。