day8-机器学习模型评估

​1、准确率,是指分类正确的样本占总样本个数的比例,其缺点是不同类别的样本比例非常不均衡时,占比大的类别往往成为影响准确率的最主要因素。

2、精确率,是指分类正确的正样本个数占分类器判定为正样本的样本个数的比例。

3、召回率,是指分类正确的正样本个数占真正的正样本个数的比例。

4、P-R(Precision-Recall)曲线,横轴是召回率,纵轴是精确率,对于一个排序模型来说,其P-R曲线上的一个点代表着,在某一阈值下,模型将大于该阈值的结果判定为正样本,小于该阈值的结果判定为负样本,此时返回结果对应的召回率和精确率。整条P-R曲线是通过将阈值从高到低移动生成的。

5、F1 score和ROC曲线也能综合地反映一个排序模型的性能

  • F1 score是精确率和召回率的调和平均值
  • ROC曲线经常作为评估二值分类器最重要的指标之一

6、RMSE指标一般能很好地反映回归模型预测值与真实值的偏离程度。但在实际问题中,如果存在个别偏离程度非常大的离群点时,即使离群点数量非常少,也会让RMSE指标变得很差。

  • 平均绝对百分比误差(Mean Absolute Percent Error, MAPE)相当于把每个点的误差进行了归一化,降低了离群点带来的绝对误差的影响

7、ROC曲线的横坐标为假阳性率(False Positive Rate, FPR),纵坐标为真阳性率(True Positive Rate, TPR)

8、 F P R = F P N FPR = \frac{FP}{N} FPR=NFP
T P R = T P P , TPR = \frac{TP}{P}, TPR=PTP
其中P是真实的正样本数量,N是真实的负样本数量,TP是P个正样本中被分类器预测为正样本的个数,FP是N个负样本中被分类器预测为正样本的个数。

9、如何绘制ROC曲线,ROC曲线是通过不断移动分类器的“截断点”来生成曲线上的一组关键点的。有一种直观绘制ROC曲线的方法:

  • 首先根据样本标签统计出正负样本的数量,假设正样本数量为P,负样本数量为N;
  • 接下来,把横轴的刻度间隔设置为1/N,纵轴的刻度间隔设置为1/P;
  • 依照模型预测概率的大小排列样本,从大到小遍历样本,同时从零点开始绘制ROC曲线;
  • 每遇到一个正样本就沿纵轴方向绘制一个刻度间隔的曲线,没遇到一个负样本就沿横轴方向绘制一个刻度的曲线
  • 直到遍历完所有样本.

10、如何计算AUC

  • AUC指的是ROC曲线下的面积大小,该值能够量化地反映基于ROC曲线衡量出的模型性能。
  • 计算AUC值,只需要沿着ROC横轴做积分就可以了
  • ROC曲线一般都处于y=x这条直线的上方(如果不是的话,只要把模型预测的概率反转成1-p就可以得到一个更好的分类器)
  • AUC的取值一般在0.5-1之间,AUC越大,说明分类器越可能把真正的正样本排在前面,分类性能越好
  • 相比于P-R曲线,ROC曲线有一个特点,当正负样本的分布发生变化时,ROC曲线的形状能够基本保持不变,而P-R曲线的形状一般会发生较剧烈的变化。

11、欧式距离体现数值上的绝对差异,而余弦距离体现方向上的相对差异。

12、k-fold交叉验证

  • 首先将全部样本划分为k个大小相等的样本子集
  • 依次遍历这k个子集,每次把当前子集作为验证集,其余所有子集作为训练集,进行模型的训练和评估
  • 最后把k次评估指标的平均值作为最终的评估指标。实际实验中,k经常取10。
# k-fold示例代码,数据需要自己准备
from sklearn.model_selection import KFold, StratifiedKFold
import lightgbm as lgb


model = lgb.LGBMClassifier(objective='binary',
                           boosting_type='goss',
                           tree_learner='serial',
                           num_leaves=2 ** 8,
                           max_depth=16,
                           learning_rate=0.2,
                           n_estimators=10000,
                           subsample=0.75,
                           feature_fraction=0.55,
                           reg_alpha=0.2,
                           reg_lambda=0.2,
                           random_state=1983,
                           is_unbalance=True,
                           # scale_pos_weight=130,
                           metric='auc')

kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=1983)
for fold_id, (trn_idx, val_idx) in enumerate(kfold.split(train[feature_names], train[ycol])):
    X_train = train.iloc[trn_idx][feature_names]
    Y_train = train.iloc[trn_idx][ycol]

    X_val = train.iloc[val_idx][feature_names]
    Y_val = train.iloc[val_idx][ycol]

    print('\nFold_{} Training ================================\n'.format(fold_id + 1))

    lgb_model = model.fit(X_train,
                          Y_train,
                          eval_names=['train', 'valid'],
                          eval_set=[(X_train, Y_train), (X_val, Y_val)],
                          verbose=500,
                          eval_metric='auc',
                          early_stopping_rounds=50)

    pred_val = lgb_model.predict_proba(
        X_val, num_iteration=lgb_model.best_iteration_)
    df_oof = train.iloc[val_idx][['session_id', ycol]].copy()
    df_oof['pred'] = pred_val[:, 1]
    oof.append(df_oof)

    pred_test = lgb_model.predict_proba(
        test[feature_names], num_iteration=lgb_model.best_iteration_)
    prediction[ycol] += pred_test[:, 1] / kfold.n_splits

13、降低过拟合风险的方法

  • 获得更多训练数据
  • 降低模型复杂度
  • 正则化方法,给模型的参数加上一定的正则约束
  • 集成学习方法,把多个模型集成在一起,来降低单一模型的过拟合风险,如Bagging方法。

14、降低欠拟合风险的方法

  • 添加新特征
  • 增加模型的复杂度
  • 减小正则化系数

活动地址:CSDN21天学习挑战赛

你可能感兴趣的:(机器学习,机器学习,人工智能,python)