视频作者:菜菜TsaiTsai 链接:【技术干货】菜菜的机器学习sklearn【全85集】Python进阶_哔哩哔哩_bilibili
均方误差mean squared error(MSE) $$ MSE=\frac{1}{N}\sum\limits_{i=1}^{N}(f_{i}-y_{i})^{2} $$ 其中$N$是样本数量,$i$是每个数据样本,$f_{i}$是模型回归出来的数值,$y_{i}$是样本点$i$实际的数值标签 所以MES的本质,其实是样本正是数据与回归结果的差异。因此在回归中,我们追求的是MSE越小越好
其实前面【十分钟机器学习系列笔记】决策树-CART算法中有提到 最小化平方误差就可以表示为 $$\begin{aligned}\mathop{\text{min }}\limits_{j,s}\left[\mathop{\text{min }}\limits_{c_{1}}\sum\limits_{x_{i}\in R_{1}(j,s)}^{}(y_{i}-c_{1})^{2}+\mathop{\text{min }}\limits_{c_{2}}\sum\limits_{x_{i}\in R_{2}(j,s)}^{}(y_{i}-c_{2})^{2}\right]\end{aligned}$$
然而,回归树的接口score返回的是R平方,并不是MSE,R平方被定义如下 $$ R^{2}=1- \frac{u}{v}=1- \frac{\sum\limits_{i=1}^{N}(f_{i}-y_{i})^{2}}{\sum\limits_{i=1}^{N}(y_{i}-\hat{y})^{2}} $$ 其中$N$是样本数量,$i$是每个数据样本,$f_{i}$是模型回归出来的数值,$y_{i}$是样本点$i$实际的数值标签,$\hat{y}$是正是数值标签的平均数。显然$u$就是残差平方和,$v$就是总平方和
R平方可以为正为负,如果模型的残差平方和远远大于模型的总平方和,模型非常糟糕,R平方就会为负),而均方误差永远为正
值得一提的是,虽然均方误差永远为正,但是sklearn当中使用均方误差作为评判标准时,却是计算”负均方误差“(neg_mean_squared_error)
交叉验证就是,我们将数据划为n份,依次使用其中一份作为数据集,其他n-1份作为训练集,多次计算模型的精确性来评估模型的平均准确程度 训练集和测试集的划分会干扰模型的结果,因此,用交叉验证n次结果求出的平均值,是对模型效果的一个更好的度量
对于交叉验证,在sklearn中指的是cross_val_score
cross_val_score(
['estimator', 'X', 'y=None', 'groups=None', 'scoring=None', "cv='warn'", 'n_jobs=None', 'verbose=0', 'fit_params=None', "pre_dispatch='2*n_jobs'", "error_score='raise-deprecating'"],
)
# estimator:估计器,也就是模型
# X:整个特征数据集
# y:整个结果数据集
# cv:测试次数,这也决定着训练集与测试集的划分
# scoring:评判标准,默认是R平方,这是使用负MSE
代码实现
from sklearn.datasets import load_boston # 波士顿房价数据集
from sklearn.model_selection import cross_val_score # 交叉验证
from sklearn.tree import DecisionTreeRegressor # 回归树
boston = load_boston()
regressor = DecisionTreeRegressor(random_state=0)
cross_val_score(regressor, boston.data, boston.target, cv=10
,scoring="neg_mean_squared_error"
)
---
array([-16.41568627, -10.61843137, -18.30176471, -55.36803922, -16.01470588, -44.70117647, -12.2148 , -91.3888 , -57.764 , -36.8134 ])