classification_reportがあるのに対してregression_reportが無いのが不便なので作ってみました。
なお補正R2についてはこちらの記事を参考にしました。
関数
from sklearn.metrics import mean_absolute_error
from sklearn.metrics import r2_score
from sklearn.metrics import mean_squared_error
from sklearn.metrics import mean_squared_log_error
import numpy as np
def adjr2_score(y_test, y_pred, x):
return 1 - (1 - r2_score(y_test, y_pred)) * (len(y_test) - 1) / (len(y_test) - len(x.columns) - 1)
def regression_report(y_test, y_pred, x):
print("R2 : %f"%(r2_score(y_test, y_pred)))
print("adjR2 : %f"%(adjr2_score(y_test, y_pred, x)))
print("MSE : %f"%(mean_squared_error(y_test, y_pred)))
print("RMSE : %f"%(np.sqrt(mean_squared_error(y_test, y_pred))))
try:
print("RMSLE : %f"%(np.sqrt(mean_squared_log_error(y_test, y_pred, squared=False))))
except:
_ = 0
print("MAE : %f"%(mean_absolute_error(y_test, y_pred)))
pass
使用例
import pandas as pd
import statsmodels.api as sm
df = pd.read_csv("boston.csv")
y = df["PRICE"]
x = sm.add_constant(df.drop("PRICE", axis=1))
model1 = sm.OLS(y, x).fit()
y_pred1 = model1.predict(x)
regression_report(y, y_pred1, x)
model1.summary()
R2 : 0.740643
adjR2 : 0.733248
MSE : 21.894831
RMSE : 4.679191
MAE : 3.270863
ここで対数RMSEについては非負値のみしか扱えないためtry文を使っております。