吃瓜学习第一天(1,2章)
1、绪论
1.1 基本术语
二分类:对只涉及两个类别的‘’二分类“任务,通常称其中一个类为”正类“,另一个为’‘反类”。
回归任务:是通过对训练集进行学习,建立一个从输入空间x到输出空间y的映射f: x→y,y=R(R为实数集)
二分类任务:通常令y={0,1};
多分类任务:|y|>2;
“泛化”能力:学到的模型适用于新样本(测试样本)能力
通常假设样本空间中全体样本服从一个**“未知”分布**,我们获得的每个样本都是独立从这个分布上采样得到的,即“独立同分布”;一般而言,训练样本越多,我们得到关于“未知”分布的信息越多,这样越可能通过学习获得具有强泛化能力的模型。
1.2假设空间
任务一:
通过表1数据集学习模型,
学习目标是:是否“好瓜”
学习过程(训练模型过程):可以看作一个在所有假设空间中进行搜索的过程。
搜索目标:找到与训练集“匹配”的假设
假设空间:如下图
由于假设空间太大,特意提出版本空间
版本空间:训练过程是基于有限样本训练集进行的,故存在着一个与训练集一致的“假设集合”
1.4归纳偏好
上述版本空间三个假设,通过已有数据集无法判断哪个“更好”,对于一个具体算法来讲,它必须产生一个模型(学习算法本身的“偏好”会起到关键作用)
归纳偏好:机器学习算法在训练过程中对某种类型假设的偏好。
“奥卡姆剃刀”:若有多个假设与观察一致,则选择最简单的哪个。
“没有免费午餐”:无论聪明算法还是笨算法,他们的期望性能一致;(也就是说没有好算法与坏算法,只能说在不同情况下,算法取得的效果不同。)
结论:学习算法自身的归纳偏好与实际问题是否匹配,往往对预测结果起到重要作用
2、模型评估与选择
2.1 经验误差与过拟合
错误率:分类错误样本占样本总数比例
精度:(1-错误率)*100%
训练误差(经验误差):学习器在训练集上的误差
验证误差:学习器在验证集上的误差
泛化误差:新样本(测试样本)上的误差
目标:实际上由于不知道泛化误差,所以我们都是努力降低验证误差
过拟合:验证误差低,精度高,泛化能力弱。
欠拟合:训练样本的一般性质没学好。(学习能力太弱)
2.2评估方法
2.2.1留出法
将数据集(100)划分为训练集(70)和验证集(30)
2.2.2交叉验证
将数据集划分为k个大小相似的互斥子集。然后取其中的(k-1)个自己当训练集,剩下的一个当验证集。从而获得了k组训练集/验证集,即进行k次训练和验证,最终返回k个测试结果的均值。
from sklearn.model_selection import KFold
"""
catboost十折验证
"""
kfolder = KFold(n_splits=10, shuffle=True, random_state=2018) #实例化
oof_cb = np.zeros(len(X_data)) # 预测验证集占位
predictions_test_cb = np.zeros(len(X_test)) # 预测测试集占位
predictions_train_cb = np.zeros(len(X_data)) # 预测训练集占位
kfold = kfolder.split(X_data, Y_data) #split(X,Y) 返回分类后训练集的index,验证集的index
for fold_, (train_index, vali_index) in enumerate(kfold):
print("fold n°{}".format(fold_+1))
k_x_train, k_y_train = X_data[train_index], Y_data[train_index]
k_x_vali,k_y_vali = X_data[vali_index],Y_data[vali_index]
cb_params = {
'n_estimators': 1000000,
'loss_function': 'MAE',
'eval_metric': 'MAE',
'learning_rate': 0.02,
'depth': 6,
'use_best_model': True,
'subsample': 0.6,
'bootstrap_type': 'Bernoulli',
'reg_lambda': 3,
'one_hot_max_size': 2,
}
model_cb = CatBoostRegressor(**cb_params)
# train the model
model_cb.fit(k_x_train, k_y_train, eval_set=[(k_x_vali, k_y_vali)], verbose=300, early_stopping_rounds=300)
oof_cb[vali_index] = model_cb.predict(k_x_vali, ntree_end=model_cb.best_iteration_)
predictions_test_cb += model_cb.predict(X_test, ntree_end=model_cb.best_iteration_) / kfolder.n_splits #多少折
predictions_train_cb += model_cb.predict(X_data, ntree_end=model_cb.best_iteration_) / kfolder.n_splits #多少折
2.3性能度量
回归任务,常使用的性能度量“均方误差”(MSE)
w
i
w_i
wi权重一般为1
2.3.1 错误率与精度
分类任务中最常用的两种性能度量
2.3.2查准率P、查全率R与F1
如果关心的是“挑出西瓜中有多少比例是好瓜”错误率就无法衡量
查准率: P = T P T P + F P P=\frac{TP}{TP+FP} P=TP+FPTP
查全率: R = T P T P + F N R=\frac{TP}{TP+FN} R=TP+FNTP
查准率与查全率是一对矛盾的度量,一般查准率高的时候查全率就会低,反之亦然。
P-R图:
由图可知性能A>性能B>性能C
若一个学习器的P-R曲线被另外一个学习器的曲线完全“包住”——则可断言面积大P-R的曲线的性能好
“平衡点”(BEP)——查准率=查全率的取值
若无法直接看出大小的P-R曲线,则谁的**‘平衡点’**大,谁性能好.
由于BEP的度量过于简化,故采用F1度量:
F
1
=
2
∗
P
∗
R
P
+
R
F1=\frac{2*P*R}{P+R}
F1=P+R2∗P∗R