阿里云天池 金融风控训练营 · Task 4 建模与调参学习笔记
本学习笔记为阿里云天池金融风控训练营的学习内容,学习链接为:https://tianchi.aliyun.com/specials/activity/promotion/aicampdocker
1、学习知识点概要
2、学习内容1
2.1逻辑回归模型
这里呢我只讲一个我认识比较多的模型,相较于其他模型,逻辑回归模型是我们很早就开始认识,也是比较容易的,对一个模型的认识还得去用过你才会知道,所以实践才是检验真理的唯一标准。
总述:逻辑回归是应用非常广泛的一个分类机器学习算法,它将数据拟合到一个logit函数(或者叫做logistic函数)中,从而能够完成对事件发生的概率进行预测。
比较浅显的说法就是说根据离散的点分布拟合出的直线进行预测下一个点在直线上
但是真正的比较科学的说法的逻辑回归还是有很多种模式的
其中包括判定边界,代价函数与梯度下降2
2.1.1判定边界
边界的种类:
面对这种较为复杂的点分布,不是一般的拟合直线而是包括各种曲线。
这种时候需要用到Andrew Ng教授的课程例子
参考:机器学习系列(1)_逻辑回归初步
2.1.2代价函数与梯度下降
所谓的代价函数Cost Function,其实是一种衡量我们在这组参数下预估的结果和实际结果差距的函数,比如说线性回归的代价函数定义为:
但是这会引发代价函数为“非凸”函数的问题,简单一点说就是这个函数有很多个局部最低点
上述的Cost Function对于逻辑回归是不可行的,需要其他形式的Cost Function来保证逻辑回归的成本函数是凸函数。
以下是一个适合逻辑回归的代价函数
参考:机器学习系列(1)_逻辑回归初步
:
2.1.3代码顺序
导入数据——数据处理——梯度下降——判定边界
代码部分
参考:机器学习系列(1)_逻辑回归初步
from numpy import loadtxt, where
from pylab import scatter, show, legend, xlabel, ylabel
#load the dataset
data = loadtxt('/home/HanXiaoyang/data/data1.txt', delimiter=',')
X = data[:, 0:2]
y = data[:, 2]
pos = where(y == 1)
neg = where(y == 0)
scatter(X[pos, 0], X[pos, 1], marker='o', c='b')
scatter(X[neg, 0], X[neg, 1], marker='x', c='r')
xlabel('Feature1/Exam 1 score')
ylabel('Feature2/Exam 2 score')
legend(['Fail', 'Pass'])
show()
def sigmoid(X):
'''Compute sigmoid function '''
den =1.0+ e **(-1.0* X)
gz =1.0/ den
return gz
def compute_cost(theta,X,y):
'''computes cost given predicted and actual values'''
m = X.shape[0]#number of training examples
theta = reshape(theta,(len(theta),1))
J =(1./m)*(-transpose(y).dot(log(sigmoid(X.dot(theta))))- transpose(1-y).dot(log(1-sigmoid(X.dot(theta)))))
grad = transpose((1./m)*transpose(sigmoid(X.dot(theta))- y).dot(X))
#optimize.fmin expects a single value, so cannot return grad
return J[0][0]#,grad
def compute_grad(theta, X, y):
'''compute gradient'''
theta.shape =(1,3)
grad = zeros(3)
h = sigmoid(X.dot(theta.T))
delta = h - y
l = grad.size
for i in range(l):
sumdelta = delta.T.dot(X[:, i])
grad[i]=(1.0/ m)* sumdelta *-1
theta.shape =(3,)
return grad
def predict(theta, X):
'''Predict label using learned logistic regression parameters'''
m, n = X.shape
p = zeros(shape=(m,1))
h = sigmoid(X.dot(theta.T))
for it in range(0, h.shape[0]):
if h[it]>0.5:
p[it,0]=1
else:
p[it,0]=0
return p
#Compute accuracy on our training set
p = predict(array(theta), it)
print'Train Accuracy: %f'%((y[where(p == y)].size / float(y.size))*100.0)
2.2模型评估方法
数据集的划分条件
- 训练集和测试集的分布要与样本真实分布一致,即训练集和测试集都要保证是从样本真实分布中独立同分布采样而得
- 训练集和测试集要互斥
数据集的划分方法
留出法,交叉验证法和自助法
留出法
留出法是直接将数据集D划分为两个互斥的集合,其中一个集合作为训练集S,另一个作为测试集T。需要注意的是在划分的时候要尽可能保证数据分布的一致性,即避免因数据划分过程引入额外的偏差而对最终结果产生影响。为了保证数据分布的一致性,通常我们采用分层采样的方式来对数据进行采样。
Tips: 通常,会将数据集D中大约2/3~4/5的样本作为训练集,其余的作为测试集。
②交叉验证法
k折交叉验证通常将数据集D分为k份,其中k-1份作为训练集,剩余的一份作为测试集,这样就可以获得k组训练/测试集,可以进行k次训练与测试,最终返回的是k个测试结果的均值。交叉验证中数据集的划分依然是依据分层采样的方式来进行。
对于交叉验证法,其k值的选取往往决定了评估结果的稳定性和保真性,通常k值选取10。
当k=1的时候,我们称之为留一法
③自助法
我们每次从数据集D中取一个样本作为训练集中的元素,然后把该样本放回,重复该行为m次,这样我们就可以得到大小为m的训练集,在这里面有的样本重复出现,有的样本则没有出现过,我们把那些没有出现过的样本作为测试集。
进行这样采样的原因是因为在D中约有36.8%的数据没有在训练集中出现过。留出法与交叉验证法都是使用分层采样的方式进行数据采样与划分,而自助法则是使用有放回重复采样的方式进行数据采样
【重要】数据集划分总结
对于数据量充足的时候,通常采用留出法或者k折交叉验证法来进行训练/测试集的划分;
对于数据集小且难以有效划分训练/测试集时使用自助法;
对于数据集小且可有效划分的时候最好使用留一法来进行划分,因为这种方法最为准确
2.3模型评价标准
具体可参见Task1笔记
3、学习问题与解答
3.1 模型的选择上
- 根据数据的类型
- 根据训练模型的速度和对算法的要求
- 根据训练模型对数据的敏感情况
总结:
可以通过记录模型的优缺点,然后根据自己的数据进行比对两到三个模型,再通过将数据代入模型,通过最终结果选择最终的模型,这是我作为机器学习小白的模型选择方法,大神可以忽略。当然最终结果可以参考模型的评价-auc。
3.2 调参方法
有贪心调参、网格搜索调参、贝叶斯调参共三种调参手段,
本项目重点使用贝叶斯调参进行简单优化,在实际操作的过程中可以参考调参思路进行优化,不必拘泥于以上教程所写的具体实例。
3.3 时间问题
- 机器学习的调参部分是非常耗时且耐磨的一个阶段,需要非常有耐心,因为关系到结果
- 不要因为调参调不好就放弃
4、学习思考与总结(三点)
一、在调参那个部分真的很容易出bug,还是要坚持去调参才能有一个好结果,特别是当调参结果是你想要的结果的时候你会觉得一切都是值得的,所以时间很重要,调参也很重要,不要因为害怕时间太重要而不调参~
二、模型选择上的话还是要多看看论文,毕竟别人用过的模型会将结果写在论文上,你可以直接参考结果,从而省去了运行的时间。
三、不管是模型也好还是调参也好,最终都是要奔着模型评价也就是AUC的结果好,所以理解好AUC也是十分重要的。