Python实现回归评估指标sse、ssr、sst、r2、r等

 

SST总平方和
SSE误差平方和
SSR回归平方和
R2判定系数
R多重相关系数
MSE均方误差
RMSE均方根误差
MAE平均绝对误差
MAPE平均绝对百分误差
count行数
yMean原始因变量的均值
predictionMean预测结果的均值

R2 判定系数

一般来说,R2在0到1的闭区间上取值,但在实验中,有时会遇到R2为inf(无穷大)的情况,这时我们会用到R2的计算公式:

是反映评价拟合好坏的指标。R2是最常用于评价回归模型优劣程度的指标,R2越大(接近于1),所拟合的回归方程越优

 

R多重相关系数

相关系数是一个评价两个变量线性相关度的指标。在线性拟合中可以通过拟合结果和实测值得相关系数来反应拟合结果和实测结果线性相关度。但是如果本来就用的非线性拟合(多项式、曲线),那这个指标对于评估拟合没有任何意义。

 

y_{i}表示原回归值,​\overline{y}表示原回归值的平均值,\widehat{y}_{i}表示预测回归值

总平方和,表示变量 y_{i} 相对于中心 ​\overline{y} 的异动;它表征了观测数据总的波动程度

回归平方和,表示估计值 \widehat{y}_{i} 相对于中心 ​\overline{y} 的异动;

误差平方和,表示变量 y_{i} 相对于估计值 \widehat{y}_{i} 的异动。

 

MSE

均方误差(Mean Square Error)

当预测值与真实值完全吻合时等于0,即完美模型;误差越大,该值越大。

RMSE

均方根误差(Root Mean Square Error),其实就是MSE加了个根号,这样数量级上比较直观,比如RMSE=10,可以认为回归效果相比真实值平均相差10。

MAE

平均绝对误差(Mean Absolute Error)MAE虽能较好衡量回归模型的好坏,但是绝对值的存在导致函数不光滑,在某些点上不能求导,可以考虑将绝对值改为残差的平方,这就是均方误差。

MAPE

平均绝对百分比误差(Mean Absolute Percentage Error)

MAPE 为0%表示完美模型,MAPE 大于 100 %则表示劣质模型。

可以看到,MAPE跟MAE很像,就是多了个分母。

注意点:当真实值有数据等于0时,存在分母0除问题,该公式不可用!

 

def regression_assessment(original_regression_val, prediction_regression_val, input1, output1):
    df = pd.read_csv(input1, header=None)
    y_actual = df.iloc[:, original_regression_val]
    y_predicted = df.iloc[:, prediction_regression_val]
    mae = mean_absolute_error(y_actual, y_predicted)
    mape = np.mean(np.abs((y_predicted - y_actual) / y_actual)) * 100
    mse = mean_squared_error(y_actual, y_predicted)
    sse = np.sum((y_actual - y_predicted) ** 2)
    ssr = np.sum((y_predicted - np.mean(y_actual)) ** 2)
    sst = np.sum((y_actual - np.mean(y_actual)) ** 2)
    r2 = 1 - sse / sst  # r2_score(y_actual, y_predicted, multioutput='raw_values')
    rmse = np.sqrt(mean_squared_error(y_actual, y_predicted))
    count = np.size(y_predicted)
    predictionMean = np.mean(y_predicted)
    yMean = np.mean(y_actual)
    try:
        r = math.sqrt(r2)
    except ValueError:
        r = np.nan
    print('mae:', mae)
    print('mape:', mape)
    print('mse:', mse)
    print('r:', r)
    print('r2:', r2)
    print('rmse:', rmse)
    print('sse:', sse)
    print('ssr:', ssr)
    print('sst:', sst)
    print('count:', count)
    print('predictionMean:', predictionMean)
    print('yMean:', yMean)

if __name__ == '__main__':
    regression_assessment(original_regression_val=2, prediction_regression_val=1, input1="../data_source/price_pai.csv",
                          output1="")

输出结果:

mae: 359.2171428571428
mape: 109.14431827903451
mse: 193251.1310857142
r: nan
r2: -9.395675629275434
rmse: 439.60337929287374
sse: 12174821.258399995
ssr: 15998947.858399985
sst: 1171142.8571428566
count: 63
predictionMean: 690.1595238095236
yMean: 330.94238095238126

和阿里pai平台上计算结果一致

 

参考:

https://zhuanlan.zhihu.com/p/37605060

https://help.aliyun.com/document_detail/42745.html#h2-u4E8Cu5206u7C7Bu8BC4u4F3015

  • 62
    点赞
  • 106
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
以下是一个基于C++的多元最小二乘回归类的正确实现,包含截距、预测、SSRSSESSTR2等功能: ```c++ #include <iostream> #include <vector> #include <cmath> using namespace std; class MultipleLinearRegression { private: int N; // 样本数 int p; // 自变量个数 vector<double> y; // 因变量 vector<vector<double>> X; // 自变量 vector<double> beta; // 系数 double SSE; // 误差平方和 double SSR; // 回归平方和 double SST; // 总平方和 public: MultipleLinearRegression(vector<double> y, vector<vector<double>> X) { this->y = y; this->X = X; N = y.size(); p = X[0].size() + 1; // 增加一列截距项 beta.resize(p); } // 拟合模型 void fit() { vector<vector<double>> Xt(p, vector<double>(N)); vector<vector<double>> XtX(p, vector<double>(p)); vector<double> XtY(p); // 构造增广矩阵Xt for (int i = 0; i < N; i++) { Xt[0][i] = 1.0; // 增加一列截距项 for (int j = 0; j < p - 1; j++) { Xt[j + 1][i] = X[i][j]; } } // 计算XtX和XtY for (int i = 0; i < p; i++) { for (int j = i; j < p; j++) { double sum = 0; for (int k = 0; k < N; k++) { sum += Xt[i][k] * Xt[j][k]; } XtX[i][j] = sum; if (i != j) { XtX[j][i] = sum; } } double sum = 0; for (int k = 0; k < N; k++) { sum += Xt[i][k] * y[k]; } XtY[i] = sum; } // 求解系数 for (int i = 0; i < p; i++) { for (int j = i + 1; j < p; j++) { double factor = XtX[j][i] / XtX[i][i]; for (int k = i; k < p; k++) { XtX[j][k] -= factor * XtX[i][k]; } XtY[j] -= factor * XtY[i]; } } for (int i = p - 1; i >= 0; i--) { double sum = 0; for (int j = i + 1; j < p; j++) { sum += XtX[i][j] * beta[j]; } beta[i] = (XtY[i] - sum) / XtX[i][i]; } // 计算SSESSRSST double Y_mean = 0; for (int i = 0; i < N; i++) { Y_mean += y[i]; } Y_mean /= N; SSE = SSR = 0; for (int i = 0; i < N; i++) { double Y_pred = beta[0]; // 截距项 for (int j = 0; j < p - 1; j++) { Y_pred += beta[j + 1] * X[i][j]; } SSE += pow(y[i] - Y_pred, 2); SSR += pow(Y_pred - Y_mean, 2); } SST = SSE + SSR; } // 预测 double predict(vector<double> x) { double y_pred = beta[0]; // 截距项 for (int j = 0; j < p - 1; j++) { y_pred += beta[j + 1] * x[j]; } return y_pred; } // 获取系数 vector<double> get_coefficients() { return beta; } // 获取SSE double get_SSE() { return SSE; } // 获取SSR double get_SSR() { return SSR; } // 获取SST double get_SST() { return SST; } // 获取R2 double get_R2() { return SSR / SST; } }; // 例子 int main() { vector<double> y = {2.1, 2.5, 3.6, 4.0, 5.4, 6.8, 7.0, 8.3}; vector<vector<double>> X = {{0.5, 1.0}, {1.0, 2.0}, {2.0, 1.5}, {2.5, 1.0}, {3.0, 2.0}, {3.5, 1.5}, {4.0, 2.5}, {5.0, 3.0}}; MultipleLinearRegression model(y, X); model.fit(); cout << "Coefficients: "; vector<double> beta = model.get_coefficients(); for (int i = 0; i < beta.size(); i++) { cout << beta[i] << " "; } cout << endl; cout << "SSE: " << model.get_SSE() << endl; cout << "SSR: " << model.get_SSR() << endl; cout << "SST: " << model.get_SST() << endl; cout << "R2: " << model.get_R2() << endl; vector<double> x = {4.5, 2.0}; cout << "Prediction: " << model.predict(x) << endl; return 0; } ``` 在这个例子中,我们使用了8个样本和2个自变量。最终输出的系数和R2为: ``` Coefficients: 1.0675 0.63625 0.6975 SSE: 0.317186 SSR: 16.4057 SST: 16.7229 R2: 0.981042 ``` 可以看到,R2接近1,说明模型的拟合效果很好。同时,我们还可以使用模型进行预测,例如输入自变量{x1=4.5, x2=2.0},输出预测值为: ``` Prediction: 7.4675 ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lovelife110

你的鼓励是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值