手写实现岭回归,要求有均方根误差和准确率
时间: 2024-03-21 16:42:26 浏览: 72
好的,我来给你讲一下手写实现岭回归的过程。岭回归是一种常见的线性回归正则化方法,可以有效避免过拟合问题。
1. 数据准备
首先,需要准备一些数据来进行训练和测试。这里以波士顿房价数据集为例,可以使用sklearn库中的load_boston函数来加载数据集:
```
from sklearn.datasets import load_boston
data = load_boston()
X = data['data']
y = data['target']
```
其中,X是一个$n\times p$的矩阵,表示$n$个样本的$p$个特征,y是一个长度为$n$的向量,表示每个样本对应的房价。
2. 模型训练
接下来,需要用岭回归模型来拟合数据。岭回归的目标函数是:
$$
\min_{w} ||Xw-y||_2^2 + \alpha ||w||_2^2
$$
其中,$||w||_2^2$表示$L_2$正则化项,$\alpha$是正则化参数。我们可以使用最小二乘法来求解该优化问题:
$$
w = (X^TX+\alpha I)^{-1}X^Ty
$$
其中,$I$是一个$p\times p$的单位矩阵。
下面是实现岭回归的代码:
```
import numpy as np
def ridge_regression(X, y, alpha):
I = np.eye(X.shape[1])
w = np.linalg.inv(X.T @ X + alpha * I) @ X.T @ y
return w
```
3. 模型评估
最后,需要对模型进行评估。这里使用均方根误差(RMSE)和准确率来评估模型。
RMSE表示预测值与真实值之间的差异,计算公式为:
$$
RMSE = \sqrt{\frac{1}{n}\sum_{i=1}^{n}(y_i-\hat{y_i})^2}
$$
其中,$y_i$表示真实值,$\hat{y_i}$表示预测值。
准确率表示模型预测正确的样本数占总样本数的比例。对于回归问题,可以定义准确率为误差小于某个阈值的样本数占总样本数的比例。这里取阈值为1。
下面是计算RMSE和准确率的代码:
```
def evaluate(X, y, w):
y_pred = X @ w
rmse = np.sqrt(np.mean((y - y_pred) ** 2))
accuracy = np.mean(np.abs(y - y_pred) < 1)
return rmse, accuracy
```
注意,这里需要将测试数据集的特征矩阵和标签向量传入,以及训练好的模型参数$w$。
完整代码如下:
```
from sklearn.datasets import load_boston
import numpy as np
def ridge_regression(X, y, alpha):
I = np.eye(X.shape[1])
w = np.linalg.inv(X.T @ X + alpha * I) @ X.T @ y
return w
def evaluate(X, y, w):
y_pred = X @ w
rmse = np.sqrt(np.mean((y - y_pred) ** 2))
accuracy = np.mean(np.abs(y - y_pred) < 1)
return rmse, accuracy
if __name__ == '__main__':
data = load_boston()
X = data['data']
y = data['target']
# 划分训练集和测试集
n_train = int(0.8 * len(X))
X_train, y_train = X[:n_train], y[:n_train]
X_test, y_test = X[n_train:], y[n_train:]
# 训练模型
alpha = 0.1
w = ridge_regression(X_train, y_train, alpha)
# 评估模型
rmse, accuracy = evaluate(X_test, y_test, w)
print('RMSE:', rmse)
print('Accuracy:', accuracy)
```
你可以调整正则化参数$\alpha$的大小来观察模型的表现。
阅读全文