模型評估是機器學習流程中不可或缺的環節,有效評估模型泛化能力對於實際應用至關重要。本文將探討數種交叉驗證方法,如 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 進行評估。下面是一個範例資料集:
| x1 | x2 | target |
|---|---|---|
| 58 | 50 | 12 |
| 37 | 95 | 27 |
| 29 | 137 | 39 |
| 19 | 150 | 45 |
使用 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-squared | R 平方值,越高越好 |
| 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 方法對資料進行預測,生成預測結果。混淆矩陣的建立有助於進一步分析模型的分類別效能。