Datawhale 算法实践第2期 Task 2 - 模型评估

文章目录

  • 任务描述
    • 1. 代码优化 - 数据集加载
    • 2. 数据未归一化情况下,LR和SVM求出的precision和recall为0?
    • 3. 关于SVM的decision_function和predict_proba?
    • 4. 评分表格怎么画?
    • 5. 关于metrics.recall_score里的average参数
    • 6. 其他
    • More

任务描述

记录7个模型(逻辑回归、SVM、决策树、随机森林、GBDT、XGBoost和LightGBM)关于accuracy、precision,recall和F1-score、auc值的评分表格,并画出Roc曲线。

1. 代码优化 - 数据集加载

由于train_test_split 支持输入为Dataframes格式的数据。所以对于数据的读取代码,建议修正如下:(比较简洁)

data = pd.read_csv("data_all.csv")
# train_test_split支持dataframes格式的数据, 无需将数据转为矩阵
X = data.drop(labels=["status"], axis=1)
y = data[["status"]]

略冗余的代码用到了以下方法:

.values.ravel()、.values 或 .as_matrix()

2. 数据未归一化情况下,LR和SVM求出的precision和recall为0?

@007 同学写的很有道理,可参照一下他的博客:
“如果你不用正则,那么,标准化并不是必须的,如果你用正则,那么标准化是必须的。”(LogisticRegression的默认参数是使用C=1.0, penalty=‘l2’)

因为不用正则时,我们的损失函数只是仅仅在度量预测与真实的差距,加上正则后,我们的损失函数除了要度量上面的差距外,还要度量参数值是否足够小。而参数值的大小程度或者说大小的级别是与特征的数值范围相关的。

此外,测试了一下,如果选用L2正则化,无论惩罚因子C的取值如何变化,最终的precision和recall仍为0。选用L1正则时,precision和recall不为0(或许是因为L1正则只是对系数取绝对值,木有取平方导致差异那么大?)

3. 关于SVM的decision_function和predict_proba?

经典的SVM获得的是距离,不是严格意义的概率。所以计算auc值时,建议使用decision_function。

【decision_function方法】:
是对每个样本都会给出在各个类别上的分数(在二元分类问题中,是对每个样本给出一个分数)。

【predict_proba方法】:
如果构造函数的probability被设为True,则可以得到属于每个类别的概率估计(通过predict_proba和predict_log_proba方法)。

在二元分类中,概率使用Platt缩放进行调整:通过在训练机上做额外的交叉检验来拟合一个在SVM分数上的Logistic回归。在多元分类中,这种方法被Wu et al. (2004)扩展了。显而易见的是,Platt缩放中的交叉检验在大数据集上是一个代价很高的操作。此外,概率估计与实际得分可能会不一致,即使得分取得了最大值,概率并不一定也能取到最大值。
(例如在二元分类中,某个样本经由predict方法得到的分类标签,如果使用predict_proba计算可能概率小于1/2。)Platt的方法在理论上也有一些问题。

如果需要拿到置信分数,而这些分数又不一定非得是概率,则建议把probability置为False,并且使用decision_function,而不是predict_proba。

参考文献:
Wu, Lin and Weng, “Probability estimates for multi-class classification by pairwise coupling”. JMLR 5:975-1005, 2004.

4. 评分表格怎么画?

看好多同学没有画评分表格,下面介绍两种画表格的方法~

法1 - 代码实现
可参照@010的如下代码:

table_1 = pd.DataFrame(index = ['acc','auc'],columns = [['lr','sm','tr','rfc','gbdtc','xgbc','lgbc']])
for i in ['lr','sm','tr','rfc','gbdtc','xgbc','lgbc']:
    table_1.loc['acc',i] = eval('{}_acc'.format(i))
    table_1.loc['auc',i] = eval('auc_{}'.format(i))

法2 - 利用markdown的表格

| 模型 | 准确率 | 精准率 | 召回率 | F1-score | AUC值 | ROC曲线 |
|----|----|----|----|----|----|----|
| LR | xx| xx |xx | xx | xx |(插入图片)|

效果如下:

模型 准确率 精准率 召回率 F1-score AUC值 ROC曲线
LR xx xx xx xx xx (插入图片)

5. 关于metrics.recall_score里的average参数

@014 同学代码如下:

train_precision = metrics.precision_score(y_train, y_train_pred, average='micro') 
train_recall = metrics.recall_score(y_train, y_train_pred, average='micro')
train_F1score = metrics.f1_score(y_train, y_train_pred, average='micro')  

遇到的问题是:求出来accuracy、precision,recall和F1-score值一样,而将设定的参数average='micro’去掉的话,每个值就不一样了。

二分类问题时,取默认的average=‘binary’。当average='micro’时,precison、recall和F1-score的取值都变成了accuracy。具体看一下,下述网址里的公式就清楚了:
micro和macro F1 score分别是什么意思?
Another供参考
sklearn中 F1-micro 与 F1-macro区别和计算原理

6. 其他

@006模型评估的函数中两句话冗余了,fit了两次

    clf = model.fit(x_train_standard, y_train)
    clf.fit(x_train_standard, y_train)

可改为

    clf = model.fit(x_train_standard, y_train)

More

任务1.1 - 模型构建的总结
任务1.2 - 模型构建之集成模型的总结

你可能感兴趣的:(Machine,Learning)