終于把機(jī)器學(xué)習(xí)中的評估指標(biāo)搞懂了!!
今天給大家分享機(jī)器學(xué)習(xí)中常用的評估指標(biāo)。
評估指標(biāo)是用來衡量機(jī)器學(xué)習(xí)模型性能的量化標(biāo)準(zhǔn),它們幫助我們理解模型在特定任務(wù)中的表現(xiàn)。
不同的機(jī)器學(xué)習(xí)任務(wù)(如分類、回歸)需要不同的評估指標(biāo)。通過這些指標(biāo),我們可以判斷模型的優(yōu)劣,優(yōu)化模型的性能,并在不同模型之間進(jìn)行比較。
分類任務(wù)中的評估指標(biāo)
1.混淆矩陣
混淆矩陣(Confusion Matrix)是用于評估分類模型性能的工具,特別是在二分類和多分類任務(wù)中廣泛使用。
它能夠顯示模型的分類結(jié)果與實(shí)際情況的詳細(xì)對比,幫助我們更清晰地理解模型的錯(cuò)誤類型和分類的準(zhǔn)確性。
混淆矩陣是一個(gè) n×n 的矩陣,n 是類別的數(shù)量。對于二分類問題,混淆矩陣是一個(gè) 的矩陣,表示模型在不同分類結(jié)果上的表現(xiàn)。
- 真陽類(True Positive, TP):模型正確預(yù)測為正類的數(shù)量。
- 真陰類(True Negative, TN):模型正確預(yù)測為負(fù)類的數(shù)量。
- 假陽性 (False Positive, FP):模型錯(cuò)誤預(yù)測為正類的負(fù)類樣本數(shù)量(也稱為Type I錯(cuò)誤)。
- 假陰性(False Negative, FN):模型錯(cuò)誤預(yù)測為負(fù)類的正類樣本數(shù)量(也稱為Type II錯(cuò)誤)。
from sklearn.datasets import fetch_openml
from sklearn.model_selection import cross_val_predict
from sklearn.linear_model import SGDClassifier
from sklearn.metrics import confusion_matrix
mnist = fetch_openml('mnist_784', as_frame=False, parser = "auto")
X, y = mnist.data, mnist.target
X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:]
y_train_5 = (y_train == '5') # True for 5s, False for all other digits
y_test_5 = (y_test == '5')
sgd_clf = SGDClassifier(random_state=42, verbose=True)
y_train_pred = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3)
cm = confusion_matrix(y_train_5, y_train_pred)
print(cm)
#[[53892 687]
# [ 1891 3530]]
2.準(zhǔn)確率(Accuracy)
準(zhǔn)確率是正確分類的樣本數(shù)占總樣本數(shù)的比例。
其公式為
適用場景:適用于類別分布平衡的情況。但對于類別不平衡的問題,準(zhǔn)確率可能不夠準(zhǔn)確。
3.精確率(Precision)
精確率表示模型預(yù)測為正例的樣本中,實(shí)際為正例的比例。
其公式為:
適用場景:當(dāng)關(guān)注假正例(FP)影響時(shí),精確率是一個(gè)重要的評估指標(biāo),如在垃圾郵件過濾中。
from sklearn.metrics import precision_score, recall_score
precision_score(y_train_5, y_train_pred)
4.召回率(Recall)
召回率表示所有實(shí)際為正例的樣本中,模型正確識別出來的比例。
其公式為
適用場景:當(dāng)需要盡可能找到所有的正例時(shí)(如疾病檢測),召回率是關(guān)鍵指標(biāo)。
recall_score(y_train_5, y_train_pred)
5.F1 值(F1-Score)
F1 值是精確率和召回率的調(diào)和平均數(shù),用于權(quán)衡精確率和召回率之間的關(guān)系。
其公式為:
適用場景:當(dāng)精確率和召回率同等重要時(shí),F(xiàn)1 值是很好的評估標(biāo)準(zhǔn)。
from sklearn.metrics import f1_score
f1_score(y_train_5, y_train_pred)
6.ROC 曲線和 AUC 值
ROC 曲線展示了分類器的假陽性率(FPR)與真陽性率(TPR)之間的關(guān)系。
AUC 值表示 ROC 曲線下面積,AUC 值越大,模型性能越好。AUC 值在0.5到1之間,接近1表示模型性能優(yōu)異。
適用場景:適用于類別不平衡的分類任務(wù)。
from sklearn.metrics import roc_auc_score
roc_auc_score(y_train_5, y_scores)
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix, roc_auc_score
# 生成樣本數(shù)據(jù)
X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
model = LogisticRegression()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
y_prob = model.predict_proba(X_test)[:, 1]
# 計(jì)算評估指標(biāo)
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)
roc_auc = roc_auc_score(y_test, y_prob)
conf_matrix = confusion_matrix(y_test, y_pred)
print(f"Accuracy: {accuracy}")
print(f"Precision: {precision}")
print(f"Recall: {recall}")
print(f"F1 Score: {f1}")
print(f"ROC AUC Score: {roc_auc}")
print(f"Confusion Matrix:\n{conf_matrix}")
回歸問題中的評估指標(biāo)
1.均方誤差(MSE)
MSE 是模型預(yù)測值與真實(shí)值差的平方的平均值。它強(qiáng)調(diào)大的誤差。
公式:
適用場景:適用于回歸任務(wù)中,尤其是對大的預(yù)測誤差更加敏感的場景。
2.均方根誤差(RMSE)
RMSE 是 MSE 的平方根,用于將誤差帶回與原始目標(biāo)變量相同的量綱。
公式:
適用場景:與 MSE 類似,但 RMSE 更直觀,誤差與目標(biāo)變量的尺度一致。
3.平均絕對誤差(MAE)
MAE 是預(yù)測值與真實(shí)值的絕對差的平均值,較少受大誤差的影響。
公式:
適用場景:當(dāng)對所有誤差的權(quán)重一致,且不希望夸大大誤差影響時(shí),MAE 是較好的指標(biāo)。
4.R 方值(R2)
R2 衡量模型解釋了多少比例的目標(biāo)變量方差,其值介于0到1之間。
公式:
其中, 是目標(biāo)變量的平均值。
適用場景:用于評估回歸模型的解釋能力。
5.調(diào)整 R 方值(Adjusted R2)
在考慮特征數(shù)量時(shí),調(diào)整后的 R2 對多特征模型的評價(jià)更加準(zhǔn)確。
公式:
其中, 是模型中的特征數(shù)量。
適用場景:在特征數(shù)較多時(shí),調(diào)整 R2 比普通 R2 更合理。
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
# 生成樣本數(shù)據(jù)
X, y = make_regression(n_samples=1000, n_features=20, noise=0.1, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
model = LinearRegression()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
# 計(jì)算評估指標(biāo)
mse = mean_squared_error(y_test, y_pred)
rmse = mean_squared_error(y_test, y_pred, squared=False) # RMSE is the square root of MSE
mae = mean_absolute_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f"MSE: {mse}")
print(f"RMSE: {rmse}")
print(f"MAE: {mae}")
print(f"R2: {r2}")