(算法必会流程和必备知识)
一、损失函数,目标函数,代价函数
图片.png二、算法的流程:
算法是核心,数据和计算是基础
定位:
1、分析数据
2、分析业务
3、应用常见算法进行对比校验
4、特征工程、调参、优化
数据类型
离散型数据:由记录不同类别个体的数目所得到的数据,又称计数数据,所以数据全是整数
连续型数据:变量可以在某一范围内任取一数,即变量的取值是可以连续的,通常是小数
注意:离散型是区间内不可分,连续型区间内可分
算法分类:
监督学习:特征值和目标值
分类(目标值是离散型):K近邻,贝叶斯、决策树、随机森林、逻辑回归、神经网络
回归(目标值是连续型):线性回归、岭回归
非监督学习:特征值
聚类:K均值(K-means)
算法开发流程:
1、准备数据
公司本身数据
kaggle
购买数据
2、明确问题(分类还是回归)
建立算法数据:根据数据类型划分应用种类
3、数据基本处理
pd去处理数据(缺失值,合并表....)
4、特征工程
特征进行处理(训练集,测试集、验证集)
5、找寻合适的算法进行分析
1、估计器选择
2、调用fit(x_train,y_train)
3、调用 a)预测:y_predict=predict(x_test) b)预测的准确率:score(x_test,y_test)
6、模型的评估 ---->评估不合格,则考虑:1、换算法 2、调参数 3、特征工程再进一步处理
7、模型实现预测,以API形式提供
数据集划分
训练集:70% 75%(建议) 80%
测试集:30% 25%(建议) 20%
验证集
API: Sklearn.model_selection.train_test_split(*arrays, **options)
x 数据集的特征值
y 数据集的标签值
test_size 测试集的大小,一般为float
random_state 随机数种子,不同的种子会造成不同的随机
采样结果。相同的种子采样结果相同。
return 训练集特征值,测试集特征值,训练标签,测试标签
(默认随机取)
Sklearn数据集Api
datasets.load_() #获取小规模数据集
datasets.fetch_(data_home=None) #获取大的数据集
小数据集:
load*和fetch*返回的数据类型datasets.base.Bunch(字典格式)
data:特征数据数组,是 [n_samples * n_features] 的二维
numpy.ndarray 数组
target:标签数组,是 n_samples 的一维 numpy.ndarray 数组
DESCR:数据描述
feature_names:特征名,新闻数据,手写数字、回归数据集没有
target_names:标签名,回归数据集没有
大数据集:
sklearn.datasets.fetch_20newsgroups(data_home=None,subset=‘train’)
subset: 'train'或者'test','all',可选,选择要加载的数据集.
训练集的“训练”,测试集的“测试”,两者的“全部”
清除数据:
datasets.clear_data_home(data_home=None)
清除目录下的数据
转换器:
fit_transform():输入数据直接转换
fit():输入数据,不做转换,但会计算一些平均值,方差等
transform():进行数据的转换
注意:fit_transform = fit + transform
估计器:是一类实现了算法的API
1、用于分类的估计器:
sklearn.neighbors k-近邻算法
sklearn.naive_bayes 贝叶斯
sklearn.linear_model.LogisticRegression 逻辑回归
2、用于回归的估计器:
sklearn.linear_model.LinearRegression 线性回归
sklearn.linear_model.Ridge 岭回归
三、损失函数
-
(1)什么是损失函数?
-
损失函数就是用来表现预测与实际数据的差距程度--就是来衡量模型预测的好坏的函数
-
(2)具体的关系图
关系图.png -
损失函数(loss function)是用来估量你模型的预测值f(x)与真实值Y的不一致程度,它是一个非负实值函数,通常使用L(Y, f(x))来表示,损失函数越小,模型的鲁棒性就越好。
三、L1正则和L2正则的区别:
一、作用
L1和L2是正则化项,又叫做罚项,是为了限制模型的参数,防止模型过拟合而加在损失函数后面的一项。
二、区别:
1.L1是模型各个参数的绝对值之和。
L2是模型各个参数的平方和的开方值。
2.L1会趋向于产生少量的特征,而其他的特征都是0.
因为最优的参数值很大概率出现在坐标轴上,这样就会导致某一维的权重为0 ,产生稀疏权重矩阵
L2会选择更多的特征,这些特征都会接近于0。
最优的参数值很小概率出现在坐标轴上,因此每一维的参数都不会是0。当最小化||w||时,就会使每一项趋近于0
三、几个具体的疑问?
1.为什么参数越小代表模型越简单?
越是复杂的模型,越是尝试对所有样本进行拟合,包括异常点。这就会造成在较小的区间中产生较大的波动,这个较大的波动也会反映在这个区间的导数比较大。
只有越大的参数才可能产生较大的导数。因此参数越小,模型就越简单。
2.实现参数的稀疏有什么好处?
因为参数的稀疏,在一定程度上实现了特征的选择。一般而言,大部分特征对模型是没有贡献的。这些没有用的特征虽然可以减少训练集上的误差,但是对测试集的样本,反而会产生干扰。稀疏参数的引入,可以将那些无用的特征的权重置为0.
3.L1范数和L2范数为什么可以避免过拟合?
加入正则化项就是在原来目标函数的基础上加入了约束。当目标函数的等高线和L1,L2范数函数第一次相交时,得到最优解。
L1范数:
L1范数符合拉普拉斯分布,是不完全可微的。表现在图像上会有很多角出现。这些角和目标函数的接触机会远大于其他部分。就会造成最优值出现在坐标轴上,因此就会导致某一维的权重为0 ,产生稀疏权重矩阵,进而防止过拟合。
L2范数:
L2范数符合高斯分布,是完全可微的。和L1相比,图像上的棱角被圆滑了很多。一般最优值不会在坐标轴上出现。在最小化正则项时,可以是参数不断趋向于0.最后活的很小的参数。
假设要求的参数为θθ,hθ(x)hθ(x)是我们的假设函数,那么线性回归的代价函数如下:
image那么在梯度下降法中,最终用于迭代计算参数θθ的迭代式为:
image如果在原始代价函数之后添加L2正则化,则迭代公式会变成下面的样子:
image每一次迭代,θj都要先乘以一个小于1的因子,从而使得θj不断减小,因此总得来看,θ是不断减小的。