模型训练
信息
2023年12月4日 · · · 阅读需 33 分钟
在训练不同机器学习算法模型时,遇到的各类训练算法大多对用户都是一个黑匣子,而理解它们实际怎么工作,对用户是很有帮助的;
- 快速定位到合适的模型与正确的训练算法,找到一套适当的超参数等;
- 更高效的执行错误调试、错误分析等;
- 有助于理解、构建和训练神经网络等;
训练方法
- 线性回归模型
- 闭式方程,直接计算出最拟合训练集的模型参数(使训练集上的成本函数最小化的模型参数);
- 迭代优化(GD、梯度下降、梯度下降变体、小批量梯度下降、随机梯度下降),逐渐调整模型参数直至训练集上的成本函数调至最低;
- 多项式回归模型
- 学习曲线评估过拟合情况
- 正则化技巧(降低过拟合风险)
- 分类模型
- Logistic 回归
- Softmax 回归
1. 线性回归
线性模型可以当做是对输入特征做加权求和,再加上一个偏置项(截距项)常数;
线性回归模型预测
- ,预测值;
n
,特征数量;- ,第 i 个特征值;
- ,第 j 个模型参数(包括偏差项 和特征权重 、、...、);
线性回归模型预测(向量化形式)
- ,模型的参数向量,其中包含偏差项 和特征权重 至
x
,实例的特征向量,包含从 到 , 始终等于 1;- ,向量 和 X 的点积,它相当于 ;
- ,假设函数,使用模型参数 ;
特征向量
(feature vector
),一个样本对应在样本空间中坐标轴上的坐标向量;
向量
,在机器学习中通常表示列向量,表示单一列的二维数组;
线性回归模型的 MSE 成本函数
- ,其中的 表示模型 h 是被向量 参数化的;
1. 标准方程
闭式解方法
,直接得出使成本函数最小的 值的数据方程,也称标准方程;
- ,使成本函数最小的 值;
- y,包含 到 的目标值向量;
使用线性数据测试标准方程
import numpy as np
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)
plt.plot(X, y, "b.")
plt.xlabel("$x_1$", fontsize=18)
plt.ylabel("$y$", rotation=0, fontsize=18)
plt.axis([0, 2, 0, 15])
plt.show()
使用标准方程计算
inv()
,对矩阵求逆;dot()
,计算矩阵的内积;
>>> X_b = np.c_[np.ones((100, 1)), X] # add x0 = 1 to each instance
>>> theta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)
>>>
array([[4.21509616],
[2.77011339]])
原本的 =4,=3,这里算出的 =4.215,=2.770,已经比较接近;
使用 做预测
>>> X_new = np.array([[0], [2]])
>>> X_new_b = np.c_[np.ones((2, 1)), X_new] # add x0 = 1 to each instance
>>> y_predict = X_new_b.dot(theta_best)
>>> y_predict
array([[4.21509616],
[9.75532293]])
绘制模型的预测结果
plt.plot(X_new, y_predict, "r-", linewidth=2, label="Predictions")
plt.plot(X, y, "b.")
plt.xlabel("$x_1$", fontsize=18)
plt.ylabel("$y$", rotation=0, fontsize=18)
plt.legend(loc="upper left", fontsize=14)
plt.axis([0, 2, 0, 15])
plt.show()
2. 奇异值分解
回顾使用 Scikit-Learn 的 LinearRegression
>>> from sklearn.linear_model import LinearRegression
>>> lin_reg = LinearRegression()
>>> lin_reg.fit(X, y)
>>> lin_reg.intercept_, lin_reg.coef_
(array([4.21509616]), array([[2.77011339]]))
>>> lin_reg.predict(X_new)
array([[4.21509616],
[9.75532293]])
intercept_
,偏差项;coef_
,特征权重;
LinearRegression 的 是基于 scipy.linalg.lstsq() 函数(最小二乘
)计算的;
- ,X 的伪逆;
>>> theta_best_svd, residuals, rank, s = np.linalg.lstsq(X_b, y, rcond=1e-6)
>>> theta_best_svd
array([[4.21509616],
[2.77011339]])