分类问题可以划分为两类:二分类问题及多分类问题,
误差和精度
误差和精度是性能评估的两个最基本的指标。这两个指标具有很好的普适性,同时适⽤于⼆分类和多分类问题。
误差是指分类错误的样本数占样本总数的⽐例,精度是指分类正确的样本数占样本总数的⽐例。
f
(
x
)
f(x)
f(x)表⽰模型的预测值,
s
i
g
n
sign
sign函数当其内部条件满⾜是为
1
1
1 不满⾜时为
0
0
0。
准确率,召回率和 F Score
准确率,召回率和 F Score 是评价⼆分类问题的重要评价指标。
准确率(Precision)和召回率(Recall)
准确率和召回率是两个互相⽭盾的评价指标,⼀个值越⼤往往另⼀个值就越小。
对分类问题,我们往往会构建⼀个概率模型,即对样本产⽣⼀个数值型的概率预测,同时我们会设置⼀个阈值
θ
\theta
θ,如果预测值⼤于阈值
θ
\theta
θ,则属于正类,如果预测值小于阈值
θ
\theta
θ,则属于负类。将所有的样本按照属于属于正样本的概率从⼤到小进⾏排序,逐步改变阈值
θ
\theta
θ,则可以绘制出⼀张准确率和召回率的关系曲线,简称“P-R 曲线”。
当准确率等于召回率时,我们称这个点为“平衡点”(Break-Even Point,BEP),平衡点的值越大,对应的分类器性能越优。
使用示例:
准确率
sklearn.metrics.precision_score(y_true, y_pred, labels=None, pos_label=1, average='binary',
sample_weight=None, zero_division='warn')
from sklearn.metrics import precision_score
y_true = [0, 1, 2, 0, 1, 2]
y_pred = [0, 2, 1, 0, 0, 1]
precision_score(y_true, y_pred, average='macro')
precision_score(y_true, y_pred, average='micro')
precision_score(y_true, y_pred, average='weighted')
print(precision_score(y_true, y_pred, average=None))
y_pred = [0, 0, 0, 0, 0, 0]
precision_score(y_true, y_pred, average=None)
precision_score(y_true, y_pred, average=None, zero_division=1)
召回率
sklearn.metrics.recall_score(y_true, y_pred, labels=None, pos_label=1, average='binary',
sample_weight=None, zero_division='warn')
from sklearn.metrics import recall_score
y_true = [0, 1, 2, 0, 1, 2]
y_pred = [0, 2, 1, 0, 0, 1]
recall_score(y_true, y_pred, average='macro')
recall_score(y_true, y_pred, average='micro')
recall_score(y_true, y_pred, average='weighted')
recall_score(y_true, y_pred, average=None)
y_pred = [0, 0, 0, 0, 0, 0]
recall_score(y_true, y_pred, average=None)
recall_score(y_true, y_pred, average=None, zero_division=1)
F Score
综合考虑了准确率和召回率两个评价指标。
β
\beta
β⽤于控制准确率和召回率的相对重要程度。
β
=
1
\beta = 1
β=1即标准F1-Score;
0
<
β
<
1
0<\beta<1
0<β<1即准确率更重要;
β
>
1
\beta>1
β>1即召回率更重要。
sklearn.metrics.f1_score(y_true, y_pred, labels=None, pos_label=1, average='binary',
sample_weight=None, zero_division='warn')
sklearn.metrics.fbeta_score(y_true, y_pred, beta, labels=None, pos_label=1, average='binary',
sample_weight=None, zero_division='warn')
from sklearn.metrics import f1_score, fbeta_score
y_true = [0, 1, 2, 0, 1, 2]
y_pred = [0, 2, 1, 0, 0, 1]
f1_score(y_true, y_pred, average='macro')
f1_score(y_true, y_pred, average='micro')
fbeta_score(y_true, y_pred, average='weighted', beta=0.5)
fbeta_score(y_true, y_pred, average=None, beta=0.5)
ROC(Receiver Operation Characteristic,接收者操作特征)曲线
横轴为“假正例率”(False Positive Rate, FPR),纵轴为“真正例率”(True Positive Rate,TPR)。
sklearn.metrics.roc_curve(y_true, y_score, pos_label=None, sample_weight=None,
drop_intermediate=True)
from sklearn.metrics import roc_auc_score, roc_curve, auc
import numpy as np
y_true = np.array([0, 0, 1, 1])
y_scores = np.array([0.1, 0.4, 0.35, 0.8])
fpr, tpr, thresholds = roc_curve(y_true, y_scores, pos_label=1)
print('fpr:', fpr)
print('tpr:', tpr)
AUC(Area Under ROC Curve)
ROC 曲线下的⾯积。
若⼀个学习器的 ROC 曲线被另⼀个学习器的曲线完全“包住”,则可断⾔后者的性能优于前者,若两个学习器的 ROC 曲线发⽣交叉,则难以⼀般性地断⾔两者孰优孰劣。
sklearn.metrics.auc(x, y)
from sklearn.metrics import roc_auc_score, roc_curve, auc
import numpy as np
y_true = np.array([0, 0, 1, 1])
y_scores = np.array([0.1, 0.4, 0.35, 0.8])
auc(fpr, tpr)
多分类 Log Loss
其中,
n
n
n为数据集个数;
m
m
m为标签类个数; 如果样本
i
i
i的分类为
j
j
j,则
y
i
,
j
y_{i,j}
yi,j为
1
1
1,否则为
0
0
0;
p
i
,
j
p_{i,j}
pi,j为样本
i
i
i为类型
j
j
j的概率。
超参数优化
- ⼈⼯调参:炼丹术
- 搜索算法:⽹格搜索,随机搜索等
- 启发式算法:遗传算法,粒⼦群算法等
- ⻉叶斯优化:⾼斯过程,TPE 等
网格搜索
Grid Search 是⼀个暴⼒解法,通过所有需要测试的超参
数,找出所有可能的超参数组合,最根据验证集的损失
找出最好的⼀组超参数。
sklearn.model_selection.GridSearchCV(
estimator, param_grid, scoring=None,
n_jobs=None, refit=True, cv=None,
verbose=0, pre_dispatch='2*n_jobs',
error_score=nan,
return_train_score=False)
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV
iris = load_iris()
parameters = {
'C': [0, 1, 2, 3, 4],
'penalty': ['l2', 'l1']
}
lr = LogisticRegression(solver='saga', tol=1e-2,
max_iter=200, random_state=0)
clf = GridSearchCV(lr, parameters).fit(
iris.data, iris.target)
(clf.best_params_, clf.best_score_)
随机搜索
Random Search 的使⽤⽅法 Grid Search 基本⼀致,区别
在于 Random Search 会在超参数的组合空间内随机采样
搜索,其搜索能⼒取决于设定的抽样次数,最重要的是
收敛更快。
sklearn.model_selection.RandomizedSearchCV(estimator, param_distributions, n_iter=10, scoring=None, n_jobs=None, refit=True, cv=None, verbose=0, pre_dispatch='2*n_jobs', random_state=None, error_score=nan, return_train_score=False)
from scipy.stats import uniform
from sklearn.model_selection import RandomizedSearchCV
distributions = {
'C': uniform(loc=0, scale=4),
'penalty': ['l2', 'l1']
}
lr = LogisticRegression(solver='saga', tol=1e-2,
max_iter=200, random_state=0)
clf = RandomizedSearchCV(lr, distributions,
random_state=0).fit(
iris.data, iris.target)
(clf.best_params_, clf.best_score_)
启发式算法
⼀个基于直观或 经验构造的算法,在可接受的花费(指计算时间、占⽤
空间等)下给出待解决组合优化问题每⼀个实例的⼀个可⾏解,该可⾏解与最优解的偏离程度不⼀定事先可以预计。
⻉叶斯优化
Grid Search 和 Randomized Search 可以让整个调参过程⾃动化,但它们⽆法从之前的调参结果中获取信息,可能会尝试很多⽆效的参数空间。而⻉叶斯优化,会对上⼀次的评估结果进⾏追踪,建⽴⼀个概率模型,反应超参数在⽬标函数上表现的概率分布⽤于指导下⼀次的参数选择。⻉叶斯优化适⽤于随机、⾮凸、不连续⽅程的优化