经常会遇到对回归问题的评估问题,如何评估回归问题优劣本文整理了sklearn中关于回归问题的评估方法。
简称MSE,即均方误差,计算公式为:
M S E = 1 n ∑ i = 1 n ( y i − y i ^ ) 2 M S E =\frac{1}{n}\sum_{i=1}^{n}{(y_i-\hat{y_i})^2} MSE=n1i=1∑n(yi−yi^)2
一般使用RMSE进行评估(这个回归分析模型中最常用的评估方法):
M S E = 1 n ∑ i = 1 n ( y i − y i ^ ) 2 M S E =\sqrt{\frac{1}{n}\sum_{i=1}^{n}{(y_i-\hat{y_i})^2}} MSE=n1i=1∑n(yi−yi^)2
计算公式为:
M S L E = 1 n ∑ i = 1 n ( l o g ( y i + 1 ) − l o g ( y i ^ + 1 ) ) 2 M S L E =\frac{1}{n}\sum_{i=1}^{n}\left( log(y_i+1)-log(\hat{y_i}+1) \right)^2 MSLE=n1i=1∑n(log(yi+1)−log(yi^+1))2
计算公式为:
m e d i a n ( ∣ y i − y i ^ ∣ ) median({|y_i-\hat{y_i}|}) median(∣yi−yi^∣)
计算公式为:
1 n ∑ i = 1 n ∣ y i − y i ^ ∣ \frac{1}{n}\sum_{i=1}^{n}{|y_i-\hat{y_i}|} n1i=1∑n∣yi−yi^∣
解释方差的得分,计算公式为:
1 − v a r ( y − y ^ ) v a r ( y ) 1-\frac{var(y-\hat{y})}{var(y)} 1−var(y)var(y−y^)
计算公式为:
R 2 ( y , y ^ ) = 1 − ∑ i = 0 n ( y i − y i ^ ) 2 ∑ i = 1 n ( y i − y ˉ ) 2 R^2(y,\hat{y})=1-\frac{\sum_{i=0}^{n}{(y_i-\hat{y_i})^2}}{\sum_{i=1}^{n}{(y_i-\bar{y})^2}} R2(y,y^)=1−∑i=1n(yi−yˉ)2∑i=0n(yi−yi^)2
其中 y ˉ = 1 n ∑ i = 1 n y i 其中\bar{y}=\frac{1}{n}\sum_{i=1}^{n}y_i 其中yˉ=n1i=1∑nyi
Scikit-learn中的每个估计器或模型在对数据进行训练后都有一个方法,通常是 .score(X_train, y_train)
当您调用逻辑递归,随机森林分类器等分类器时,该方法默认计算准确性评分(准确性为#correct_preds/#all_preds)。默认情况下,该方法不需要实际的预测。因此,当您call时:score
score
clf.score(X_test, y_test)
它使用引擎盖下进行预测,并使用这些预测来计算准确性分数。可以将其视为计算准确性的简写,因为它是一个如此常见的指标。它还被实现以避免像这样涉及更多步骤的计算准确性:X_test
score
from sklearn.metrics import accuracy score
preds = clf.predict(X_test)
accuracy_score(y_test, preds)
使用时,您需要现成的预测,即该函数不会使用引擎盖下的测试集生成预测。accuracy_score
对于分类器,两者都是相同的 - 它们只是计算相同事物的不同方式。
accuracy_scorescore
当在回归量上调用时,默认情况下计算决定系数 - R2。与分类器一样,该方法只是计算R2的简写,因为它通常用于评估回归量的性能。score
score
reg.score(X_test, y_test)
如您所见,您只需将测试集传递给即可完成。但是,还有另一种计算R2的方法,即:score
from sklearn.metrics import r2_score
preds = reg.predict(X_test)
r2_score(y_test, preds)
与简单的 不同,它需要现成的预测 - 它不会在引擎盖下计算它们。score
r2_score
所以,结论是和回归量是相同的 - 它们只是计算决定系数的不同方法。
r2_score
score
import numpy as np
import pandas as pd
from deepforest import CascadeForestRegressor
from sklearn import datasets # 导入库
from sklearn.metrics import explained_variance_score
from sklearn.metrics import mean_absolute_error
from sklearn.metrics import mean_squared_error
from sklearn.metrics import mean_squared_log_error
from sklearn.metrics import median_absolute_error
from sklearn.metrics import r2_score
# 1、抽取训练集合测试集
from sklearn.model_selection import train_test_split
data_diabetes = datasets.load_diabetes() # 导入糖尿病数据
data = data_diabetes['data']
target = data_diabetes['target']
feature_names = data_diabetes['feature_names']
# 现在三个数据都是numpy的一维数据形式,将她们组合成dataframe,可以更直观地观察数据
df = pd.DataFrame(data, columns=feature_names)
df.head() # 查看前几行数据
X_train, X_test, y_train, y_test = train_test_split(data, target, train_size=0.8)
model = CascadeForestRegressor(random_state=1)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
score = model.score(X_train, y_train)
msle = mean_squared_log_error(y_test, y_pred)
mdae = median_absolute_error(y_test, y_pred)
mae = mean_absolute_error(y_test, y_pred)
evs = explained_variance_score(y_test, y_pred)
r2__score = r2_score(y_test, y_pred)
print("\nscore: ", score)
print('\nMSE为:', mse)
print('\nMSE为(直接计算):', np.mean((y_test - y_pred) ** 2))
print('\nRMSE为:', np.sqrt(mean_squared_error(y_test, y_pred)))
print("\nMSLE为:", msle)
print("\nMSLE为(直接计算):", np.mean((np.log(y_test + 1) - np.log(y_pred + 1)) ** 2))
print("\nMDAE为:", mdae)
print("\nMDAE为(直接计算):", np.median(np.abs(y_test - y_pred)))
print("\nMAE为:", mae)
print("\nMAE为(直接计算):", np.mean(np.abs(y_test - y_pred)))
print("\nEVS为:", evs)
print("\nEVS为(直接计算):", 1 - np.var(y_test - y_pred) / np.var(y_test))
print("\nR方_socre为:", r2__score)
print("\nR方_socre为(直接计算):", 1 - (np.sum((y_test - y_pred) ** 2)) / np.sum((y_test - np.mean(y_test)) ** 2))