返回文章列表

機器學習模型交叉驗證技術與評估指標詳解

本文探討機器學習模型評估中的交叉驗證技術,涵蓋保持資料集、K 折交叉驗證、留一法交叉驗證以及留一組交叉驗證等方法。此外,文章還詳細介紹了 PSI 值計算以及如何使用 PySpark 進行模型評估,包含迴歸模型的 MSE、RMSE、MAE、

機器學習 資料科學

模型評估是機器學習流程中不可或缺的環節,有效評估模型泛化能力對於實際應用至關重要。本文將探討數種交叉驗證方法,如 K 折交叉驗證、留一法交叉驗證以及留一組交叉驗證,並輔以 PySpark 程式碼示範。此外,文章也將介紹如何使用 PSI 值檢驗資料集穩定性,並深入剖析迴歸模型評估指標,包含 MSE、RMSE、MAE、R² 與調整後的 R²,同時也將探討分類別模型的混淆矩陣等評估方法,提供開發者全面的模型評估策略。

模型評估中的交叉驗證技術

在機器學習模型的開發過程中,評估模型的效能是一項至關重要的任務。為了確保模型具有良好的泛化能力,需要採用適當的驗證技術。本文將探討幾種常見的交叉驗證方法,包括保持資料集(Holdout Dataset)、K折交叉驗證(K-fold Cross-Validation)、留一法交叉驗證(Leave-One-Out Cross-Validation)以及留一組交叉驗證(Leave-One-Group-Out Cross-Validation)。

PSI 值與資料穩定性檢查

在進行模型評估之前,首先需要檢查訓練資料集和測試資料集之間的穩定性。這可以透過計算 PSI(Population Stability Index)值來實作。PSI 值可用於衡量兩個資料集之間的分佈差異。

# 計算 PSI 值的範例
psi_value = calculate_psi(training_data, testing_data)
print(f"PSI 值:{psi_value}")

內容解密:

  • calculate_psi 函式用於計算 PSI 值,輸入為訓練資料集和測試資料集。
  • PSI 值越低,表示兩個資料集之間的分佈越相似。

K 折交叉驗證

當只有一個資料集可用時,K 折交叉驗證是一種有效的模型評估方法。其基本思想是將資料集隨機分成 K 個子集,然後進行 K 次訓練和測試,每次使用不同的子集作為測試集。

from pyspark.ml.evaluation import BinaryClassificationEvaluator
from pyspark.ml.classification import LogisticRegression
from pyspark.ml.tuning import ParamGridBuilder, CrossValidator

# 初始化邏輯迴歸模型
lr = LogisticRegression(maxIter=10, featuresCol='features', labelCol='label')

# 定義引數網格
paramGrid = ParamGridBuilder().addGrid(lr.regParam, [0.1, 0.01]).addGrid(lr.elasticNetParam, [0.0, 0.5, 1.0]).build()

# 初始化交叉驗證物件
crossval_clf = CrossValidator(estimator=lr, estimatorParamMaps=paramGrid, evaluator=BinaryClassificationEvaluator(), numFolds=3)

# 進行 K 折交叉驗證
model = crossval_clf.fit(assembled_df)

內容解密:

  • LogisticRegression 用於初始化邏輯迴歸模型。
  • ParamGridBuilder 用於定義模型的超引數網格。
  • CrossValidator 用於進行 K 折交叉驗證,numFolds 引數指定了 K 的值。

留一法交叉驗證

留一法交叉驗證是 K 折交叉驗證的一種特殊情況,即 K 等於樣本數。這種方法計算成本較高,但可以提供更準確的模型評估結果。

# 留一法交叉驗證範例
n = assembled_df.count()
leave_one_out_cv = CrossValidator(estimator=lr, estimatorParamMaps=paramGrid, evaluator=BinaryClassificationEvaluator(), numFolds=n)
model = leave_one_out_cv.fit(assembled_df)

內容解密:

  • numFolds 設定為樣本數 n,即可進行留一法交叉驗證。

留一組交叉驗證

當資料集中存在特定的分組結構時,留一組交叉驗證是一種有效的評估方法。這種方法可以確保模型在不同的組別上進行評估,從而更好地反映模型的泛化能力。

# 留一組交叉驗證範例
groups = list(joined_df.select('education').toPandas()['education'].unique())

def leave_one_group_out_validator(df, var_name, groups):
    train_metric_score = []
    test_metric_score = []
    for i in groups:
        train = df.filter(df[var_name]!=i)
        test = df.filter(df[var_name]==i)
        # 訓練模型並評估
        lrModel = lr.fit(train)
        predict_train = lrModel.transform(train)
        # ...

內容解密:

  • leave_one_group_out_validator 函式用於進行留一組交叉驗證。
  • 該函式遍歷不同的組別,每次使用一個組別作為測試集,其餘組別作為訓練集。

模型評估指標詳解

在機器學習領域中,模型評估是至關重要的一環。根據不同的模型型別,PySpark 提供了多種評估指標,如圖 6-10 所示。

連續型目標變數評估

對於連續型目標變數,可以使用 PySpark ML Tuning 套件中的 RegressionEvaluator 進行評估。下面是一個範例資料集:

x1x2target
585012
379527
2913739
1915045

使用 PySpark 複製輸出結果的程式碼

from pyspark.sql.types import IntegerType
from pyspark.sql.types import StructField, StructType

# 定義資料結構
cSchema = StructType([
    StructField("x1", IntegerType()),
    StructField("x2", IntegerType()),
    StructField("y", IntegerType())
])

# 建立資料框
df_list = [[58, 50, 12], [37, 95, 27], [29, 137, 39], [19, 150, 45]]
df = spark.createDataFrame(df_list, schema=cSchema)

# 使用向量彙編器
assembled_df = assemble_vectors(df, ['x1'], 'y')

# 建立迴歸模型
from pyspark.ml.regression import LinearRegression
reg = LinearRegression(featuresCol='features', labelCol='y')
reg_model = reg.fit(assembled_df)  # 配適模型

# 列印係數和截距
print(reg_model.coefficients[0], reg_model.intercept)
# 輸出:-0.8705560619872369 61.87237921604372

# 預測結果
pred_result = reg_model.transform(assembled_df)

# 模型摘要
reg_summary = reg_model.summary

模型方程

y-hat = -0.8706 * x1 + 61.8723

誤差計算

誤差定義為預測值與實際目標值之間的差異。我們使用以下公式計算 y-hat 值:

Obs1 = -0.8706 * 58.0 + 61.8723 = 11.38 Obs2 = -0.8706 * 37.0 + 61.8723 = 29.66 Obs3 = -0.8706 * 29.0 + 61.8723 = 36.63 Obs4 = -0.8706 * 19.0 + 61.8723 = 45.33

現在我們有了預測值,接下來計算每個預測值的誤差:

Error1 = 12 – 11.38 = 0.62 Error2 = 27 – 29.66 = -2.66 Error3 = 39 – 36.62 = 2.37 Error4 = 45 – 45.33 = -0.33

總誤差計算

Total error = 0.62 – 2.66 + 2.37 – 0.33 = 0.0078

這個結果並不合理,因為正負誤差相互抵消,使得總誤差值非常小。為了更好地量化模型的預測結果,我們需要使用其他評估指標。

評估指標

評估指標描述
Mean squared error (MSE)平均平方誤差,越低越好
Root mean square error (RMSE)平均平方根誤差,越低越好
Mean absolute error平均絕對誤差,越低越好
R-squaredR 平方值,越高越好
Adjusted R-squared調整後的 R 平方值,越高越好
Explained variance可解釋變異數,越高越好

平均平方誤差(MSE)計算

首先計算平方誤差:

Sum Squared Error (SSE) = (0.62)^2 + (-2.66)^2 + (2.37)^2 + (-0.33)^2

詳細內容解密:

在上述程式碼中,我們首先定義了資料結構並建立了資料框。接著,我們使用向量彙編器將特徵欄位轉換為向量形式,以便輸入到迴歸模型中。然後,我們建立了一個線性迴歸模型並對資料進行配適。最後,我們列印了模型的係數和截距,並計算了預測結果和模型摘要。

在誤差計算部分,我們使用了模型方程來計算預測值,並進一步計算了每個預測值的誤差。總誤差的計算顯示了簡單地將誤差相加的侷限性,因此我們需要使用其他評估指標來更好地量化模型的效能。

圖表翻譯:

此圖示展示了迴歸分析的結果,其中包含了實際資料點和擬合的迴歸線。透過這個圖表,我們可以直觀地瞭解模型的擬合程度以及資料的分佈情況。

圖表翻譯: 該圖展示了 x1 與 y 之間的關係以及線性迴歸模型的擬合結果。從圖中可以看出,模型的擬合線能夠較好地反映資料的趨勢。

詳細內容解密:

在圖表中,我們可以看到實際的資料點和模型的擬合線。透過觀察這些資料點的分佈和擬合線的位置,我們可以評估模型的擬合優度。如果擬合線能夠較好地穿過大多數資料點,則表明模型的擬合效果較好。反之,如果擬合線偏離資料點較遠,則可能需要調整模型的引數或嘗試其他型別的模型。

模型評估指標詳解與實作

在機器學習與資料科學領域中,模型評估是至關重要的環節。本章將探討多種評估指標,包括迴歸與分類別模型的評估方法,並透過 PySpark 進行實作演練。

迴歸模型評估指標

迴歸模型主要用於預測連續型變數,其評估指標包括:

平均平方誤差(Mean Squared Error, MSE)

平均平方誤差是預測值與實際值之間差異的平方平均值,可衡量模型的預測準確度。

計算範例:

from pyspark.ml.evaluation import RegressionEvaluator

evaluator = RegressionEvaluator(labelCol='y', predictionCol='prediction', metricName='mse')
mse = evaluator.evaluate(pred_result)
print('平均平方誤差:', mse)

均方根誤差(Root Mean Squared Error, RMSE)

均方根誤差是 MSE 的平方根,能更直觀地反映預測誤差的大小。

計算範例:

evaluator = RegressionEvaluator(labelCol='y', predictionCol='prediction', metricName='rmse')
rmse = evaluator.evaluate(pred_result)
print('均方根誤差:', rmse)

平均絕對誤差(Mean Absolute Error, MAE)

平均絕對誤差是預測誤差的絕對值平均,能反映實際預測誤差的大小。

計算範例:

evaluator = RegressionEvaluator(labelCol='y', predictionCol='prediction', metricName='mae')
mae = evaluator.evaluate(pred_result)
print('平均絕對誤差:', mae)

判定係數(R-squared, R²)

R² 用於衡量模型對資料的解釋能力,數值越接近 1 表示模型擬合度越佳。

計算範例:

evaluator = RegressionEvaluator(labelCol='y', predictionCol='prediction', metricName='r2')
r2 = evaluator.evaluate(pred_result)
print('判定係數:', r2)

分類別模型評估指標

在處理二元分類別問題時,PySpark 提供了 BinaryClassificationEvaluator 來評估模型效能。

混淆矩陣(Confusion Matrix)

混淆矩陣用於呈現模型的預測結果與實際標籤之間的對應關係,是評估分類別模型的重要工具。

計算範例:

from pyspark.ml.classification import LogisticRegression

# 建立邏輯迴歸模型並進行訓練
clf = LogisticRegression(featuresCol='features', labelCol='target')
clf_model = clf.fit(assembled_df)

# 進行預測並生成混淆矩陣
pred_result = clf_model.transform(assembled_df)

評估指標的實務應用

在實際應用中,不同的業務場景需要選擇適當的評估指標。例如,在金融風險控制中,精確率和召回率可能比準確率更為重要;而在某些醫療診斷場景中,模型的召回率可能是首要考量。

調整後的 R²(Adjusted R-squared)

當模型包含多個引數時,調整後的 R² 能更準確地評估模型的擬合優度。

計算範例:

print('調整後的 R²:', reg_summary.r2adj)
圖表翻譯:

此圖示展示了樣本資料的分佈情況,其中橫軸代表特徵 x1,縱軸代表目標變數。從圖中可觀察到資料點的分佈與目標變數之間的關係,有助於理解模型的預測能力。

內容解密:

上述程式碼使用 PySpark 建立邏輯迴歸模型並進行訓練,其中 LogisticRegression 類別用於建立分類別器,fit 方法用於訓練模型。訓練完成後,透過 transform 方法對資料進行預測,生成預測結果。混淆矩陣的建立有助於進一步分析模型的分類別效能。