目录
一、交叉验证
在机器学习中,我们通过训练数据集来训练模型,然后通过验证数据集来调整超参数使模型达到最优,最后通过测试数据集直接对模型进行预测,衡量模型的性能好坏。
但是验证数据集是从原来的数据集中随机切分出来的,因此训练模型有可能过拟合这个验证数据集,一旦这个验证数据集有极端的数据就可能会导致模型的不准确。
基于此,我们可以借助交叉验证来调整模型的参数,能够最大程度遏制模型欠拟合和过拟合。
通过这种方式,相比于只设定一个验证数据集更为可靠。
代码示例:
import numpy as np
from sklearn import datasets
digits = datasets.load_digits()
X = digits.data
y = digits.target
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.4,random_state = 666)
#交叉验证
from sklearn.model_selection import cross_val_score
from sklearn.neighbors import KNeighborsClassifier
best_score, best_p, best_k = 0, 0, 0
for k in range(2,11):
for p in range(1,6):
knn_clf = KNeighborsClassifier(n_neighbors=k,p=p)
scores = cross_val_score(knn_clf,X_train,y_train) #默认cv=3,分成三份
score = np.mean(scores.astype(float))
if score > best_score:
best_score, best_p, best_k = score, p, k
print("Best K = ",best_k)
print("Best P = ",best_p)
print("Best Score = ",best_score)
运行结果:
补充:
留一法(Leave-One-Out Cross Validation),就是将数据集分成m分,完全不收随机的影响,最接近模型真正的性能指标,缺点就是计算量巨大。
二、偏差方差平衡
如下图所示,根据左下角这个圆圈可以看出所有的点全都完全偏离了中心位置,这种情况就叫做偏差。右上角这个圆圈可以看出大部分点都围绕中心周围,即没有大的偏差,但是它整体过于分散了不集中,因此具有非常高的方差,这就是方差和偏差非常直观的意思。
在机器学习中,模型误差包含了偏差、方差以及不可避免的误差。其中导致偏差的主要原因是对问题本身假设不正确,比如非线性数据使用线性回归,欠拟合。方差产生的原因主要是使用的模型太复杂,如高阶多项式回归,过拟合。不可避免的误差主要是采集的数据本身具有噪音。
非参数学习算法通常是高方差算法,如KNN,因为不对数据进行任何假设;参数学习算法通常是高偏差算法,如线性回归,因为堆数据具有极强的假设。大多数算法具有相应的参数可以用来调整偏差和方差,并且偏差和方差通常是矛盾的,一般来说,降低偏差会提高方差,降低方差会提高偏差。因此,我们要注意模型偏差与方差的平衡。
机器学习的主要挑战是来自方差,解决高方差的通常手段有:
- 降低模型复杂度
- 减少数据维度;降噪
- 增加样本数
- 使用验证集
- 模型正则化