分类模型评估指标
- 召回率(覆盖率/查全率)和精准率(查准率):召回率指的是你预测正确的正样例占样本中正样例的个数,所以可以理解为你在样本的正样例中预测对的有多少。精准率指的是你预测为正的样本中有多少是预测对的。分母不一样,导致他们两个的侧重点不一样。比如举例一个场景,在癌症病人预测问题中,我们要用召回率还是准确率。我们把一个有病的人预测为没病和把一个没病的人预测为有病哪一个后果更严重。显然是有病的人预测为没病,所以在这个场景中我们就要努力提高我们预测正确的正例在样本正例的比例。那么准确率适用于什么场景中?比如电商识别恶意用户的问题。如果用召回率,那么就会有部分用户也就是B被识别为恶意用户,造成损失。所以这个场景更适合准确率,我只要预测为恶意用户的就都是恶意用户,虽然我有可能没有将恶意用户全部预测出来。总结一下,我们希望预测的全面,哪怕有一些预测错误的但是正样本我们能够全部预测出来,这样的我们就用查全率。相反,我们允许有漏网之鱼,但是要求预测出来的就一定是正样本,我们就用准确率。
- 召回率和覆盖率是互逆的,一个高另一个就低。所以就用F值来进行调和(需要进一步理解)
- TPR:等于召回率。
- FPR:预测错误的正例/真是的负例(C/D+C)
- ROC:横轴是假正例(FPR),纵轴是真正例(TPR).ROC之下的面积就是AUC。ROC本身反应的就是TPR和FPR之间增长速度的问题,可以理解为假正例上升的同时,我们是不是可以提升更多的真正例。这里有一个预测男女的例子。
- AUC:.ROC之下的面积就是AUC。在上面ROC图中可以看出来,AUC最大就是1。中间的斜线就是代表0.5,也就是随机猜测的曲线,所以模型的AUC最起码要大于0.5否则就是不如随机猜测,实际生产可能最低0.8甚至更高。AUC代表的就是不论样本真实是正例还是负例,我把它预测为正例的概率,横轴表示真实是负例我预测为正例的概率,纵轴是真实是正例我预测正例的概率,所以我们希望AUC曲线是高于斜线的曲线。
回归模型评估指标
- 平均方差
- 绝对误差
- R^2
线性回归极大似然估计求解
- 构造似然函数。根据极大似然估计,所以我们最大化这个误差出现的概率。也就是将每个误差出现的概率进行连乘且得到最大(这里每个误差出现的概率因为是服从均值为0的分布所以可以如上图书写,每个概率是独立同分布的所以连乘的公式可以如上图所示)。
- 取对数,将连乘换为连加,将连加的常数提出来,得到上图中的结果。要取最大值,只需要等式减号后面最小即可。
- 求最小值。用向量表示原先得方程。然后求导得到解析式
- 但是这个方法已经不用了。因为伴随矩阵,求逆得过程比较耗费资源。
正则惩罚项
加入惩罚项防止过拟合。
L1和L2的比较:
- L1容易产生稀疏解,求解速度快。
- L2不容易产生稀疏解,但是具有较高的准确性。
- 为什么L1容易产生稀疏矩阵。L1正则在坐标抽上是一个菱形,他和我们椭圆等高线相切的点就是最优的解,这样就很容易在菱形的顶点处相切。而L2是一个圆形。除非最优解在轴上,也就是说最优解本身就有0,才会出现稀疏解。
1 LASSO回归
加绝对值得符号,防止正负抵消掉。
2 Ridge回归
3 Elasitc NET弹性网络
p用来分配L1和L2得权重,λ是惩罚项系数,控制惩罚得力度大小
梯度下降求解线性回归(后面单独写)
梯度:空间中增加最快的方向导数的方向就是梯度。这里求最小值,所以要减小最快就是梯度的负方向。
α: 控制下降的步长。
- BGD
- SGD
- MBGD
。
局部加权回归
局部加权回归会根据要预测点和训练集样本点的距离来加一个权重
代码部分
1 LinearRegression
# algo = LinearRegression(fit_intercept=True)
#
# """
# fit_intercept=True, 是否设置截距项
# normalize=False, 是否对数据进行均值规划化处理
# copy_X=True, 对于训练数据是否copy 一份 可以进行再训练 默认是
# n_jobs=None 使用多少个线程来训练模型
# """
# print("各个特征属性的权重系数,也就是x对应的theta值:{}".format(algo.coef_))
# print("截距项,也就是theta0值:{}".format(algo.intercept_))
# print("模型在训练数据上的R2 也就是拟合优度:{}".format(algo.score(x_train,y_train)))
# joblib.dump(scaler,"./model/scaler.pkl")
#
# joblib.dump(algo,"./model/algo.pkl")
# 线上调用
# scaler = joblib.load("./model/scaler.pkl")
# algo = joblib.load("./model/algo.pkl")
#
# x_test = scaler.transform(x_test) # 要对模型的测试集也进行均值归一化操作
# 调用预测方法
# y_predict=algo.predict(x_test)
#
# print(y_predict)
2 多项式拓展
poly = PolynomialFeatures(degree=3)
x_train=poly.fit_transform(x_train)
x_test=poly.fit_transform(x_test)
3 管道流以及网格验证
models=[
Pipeline(
steps=[
('poly',PolynomialFeatures()),
('linear',Lasso())
]
),
Pipeline(
[
('poly',PolynomialFeatures()),
('linear',Ridge())
]
),
]
parameters={
'poly__degree':[1,2,3],
'linear__alpha':[0.05,0.1,0.5]
}
# 迭代管道模型
for t in range(2):
model=GridSearchCV(estimator=models[t],param_grid=parameters,cv=5)
model.fit(x_trian,y_trian)
print(model.score(x_trian, y_trian))
print(model.score(x_test, y_test))
print(model.best_params_)
print(model.best_estimator_)
print('多项式拓展之后')
models=[
Pipeline(
steps=[
('poly',PolynomialFeatures()),
('linear',Lasso())
]
),
Pipeline(
steps=[
('poly',PolynomialFeatures()),
('linear',Ridge())
]
),
]
parameters={
'poly__degree':[1,2,3],
'linear__alpha':[0.05,0.1,0.5]
}
# 迭代管道模型
for t in range(2):
algo=models[t]
algo.fit(x_trian,y_trian)
print('=================')
print(algo.score(x_trian,y_trian))
print(algo.get_params()['linear'].coef_)
print(algo.steps[1][-1].coef_)
4 LASSO、Ridge、弹性网络
algo = Pipeline(steps=[("poly",PolynomialFeatures(degree=3)),("lasso",Lasso())])
"""
alpha=1.0, 惩罚项系数 也就是ppt上的lambda 如果这个值给的越大 惩罚力度越大
fit_intercept=True, 是否训练截距项
normalize=False, 是否对数据对象进行均值归一化处理
copy_X=True, 是否拷贝训练数据
max_iter=None, 训练中的最大迭代次数
tol=1e-3, 训练时候损失函数值小于给定的阈值时 意味着收敛了
solver="auto", 给定模型的训练方式
random_state=None 随机数种子
precompute=False, 是否对模型进行与训练
warm_start=False, 是否保留之前训练的结果做为初始化的系数
positive=False, 是否让模型系数设置为theta正数
selection='cyclic' 是否进行对系数进行循环训练 默认cyclic 还可以选择random
"""
algo = Pipeline(steps=[("poly",PolynomialFeatures(degree=3)),("ridge",Ridge())])
"""
alpha=1.0, 惩罚项系数 也就是lambda 如果这个值给的越大 惩罚力度越大
fit_intercept=True, 是否训练截距项
normalize=False, 是否对数据对象进行均值归一化处理
copy_X=True, 是否拷贝训练数据
max_iter=None, 训练中的最大迭代次数
tol=1e-3, 训练时候损失函数值小于给定的阈值时 意味着收敛了
solver="auto", 给定模型的训练方式
random_state=None 随机数种子
"""
algo = Pipeline(steps=[("poly",PolynomialFeatures(degree=3)),("elasticnet",ElasticNet())])
"""
alpha=1.0, 惩罚项系数 也就是ppt上的lambda 如果这个值给的越大 惩罚力度越大
fit_intercept=True, 是否训练截距项
normalize=False, 是否对数据对象进行均值归一化处理
copy_X=True, 是否拷贝训练数据
max_iter=None, 训练中的最大迭代次数
tol=1e-3, 训练时候损失函数值小于给定的阈值时 意味着收敛了
solver="auto", 给定模型的训练方式
random_state=None 随机数种子
precompute=False, 是否对模型进行与训练
warm_start=False, 是否保留之前训练的结果做为初始化的系数
positive=False, 是否让模型系数设置为theta正数
selection='cyclic' 是否进行对系数进行循环训练 默认cyclic 还可以选择random
l1_ratio: 设定弹性网络中l1的比例 1-l1_ratio 就是l2 惩罚项的比例
"""
K折交叉验证
将数据分为K份,依次作为验证集,其余的作为训练集,对数据进行训练和验证。将k个结果取平均数作为最终结果。在数据集较小的时候我们往往选择较大的K值,而交叉验证往往用于数据集较小的时候,如果数据集较大的时候我们可以选择较小的K值。
algo = Pipeline(steps=[("poly",PolynomialFeatures(degree=3)),("ridgeCV",RidgeCV(alphas=[0.01,0.1,1,10],cv=5))])
"""
cv : 进行几折交叉验证
"""