# ml-blog **Repository Path**: xiwanggit/blog_ml ## Basic Information - **Project Name**: ml-blog - **Description**: 机器学习、数据挖掘算法自己实现+工具包多种方法(目前仅lr) - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2019-05-20 - **Last Updated**: 2021-05-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README * 基础环境 * python3.6 * scikit-learn==0.20.3 * tensorflow==2.0.0-alpha0 * pyspark==2.3.2(spark==2.3.1, scala==2.11.8) * tensorflowonspark==1.4.3 * code * 完全手写 * 最小二乘:Train.my_code_scalar() * BGD(批量梯度下降:效果好,速度慢,全局最优): Train.bgd() * SGD(随机梯度下降:速度快,效果比BGD差,非全局最优): Train.sgd() * MBGD(小批量梯度下降:介于BGD与SGD之间): Train.mbgd() * adagrad(自适应梯度算法:增加分母为梯度平方累计和平方根,等效learning动态。稀疏矩阵收敛):Train.adagrad() * RMSprop(自适应:分母为历史平方和的指数移动平均数,克服Adagrad梯度急剧减少的问题, learning自适应强,尤其是目标函数不稳定的情况下表现良好):Train.RMSprop() * Adam(自适应,结合Adagrad与RMSprop的优点):Train.Adam() * L1正则(参数稀疏规则化,自动特征选择,模型可解释性变强):Train.Adam_l1() * L2正则(防止过拟合(正则项极小,抗干扰);有助于处理condition number不好情况下的矩阵求逆困难的问题(病态可信度)):Train.Adam_l2() * sklearn * LinearRegression(普通最小二乘): Train.sklearn_lr() * Lasso(L1正则,估计稀疏矩阵系数):Train.sklearn_lr_l1() * LassoCV(通过内置的 Alpha 参数的交叉验证的索套回归):Train.sklearn_lr_l1_corss_1() * LassoLarsCV(交叉验证,基于最小角回归算法): Train.sklearn_lr_l1_corss_2() * LassoLarsIC(有多种选择时,估计器 LassoLarsIC 建议使用 Akaike information criterion (Akaike 信息准则)(AIC) 和 Bayes Information criterion (贝叶斯信息准则)(BIC)。 当使用 k-fold 交叉验证时, 正则化路径只计算一次而不是 k + 1 次,所以找到 α 的最优值是一种计算上更便宜的替代方法): Train.sklearn_lr_l1_corss_3() * Ridge(L2正则):Train.sklearn_lr_l2() * RidgeCV(通过内置的 Alpha 参数的交叉验证来实现岭回归): Train.sklearn_lr_l2_corss() * ElasticNet(使用 L1, L2 范数作为先验正则项训练的线性回归模型):train.sklearn_lr_elasticnet() 异常 * ElasticNetCV(弹性网络交叉验证):train.sklearn_lr_elasticnet_cross() * BayesianRidge(贝叶斯回归的L2正则:先验参数w是由球面高斯公式得出,先验参数alpha和lamda一般服从gamma分布):train.sklearn_lr_bayesianridge() * 逻辑回归(分类模型) * SGD:train.sklearn_lr_sgdregressor() * 感知器:train.sklearn_lr_perceptron() * 稳健回归预测器 * RANSAC(随机抽样一致性算法):train.sklearn_lr_ransacregressor() # 预测+评估 * Theil Sen预估器:广义中值估计器:train.sklearn_lr_theilsenregressor() * HuberRegressor:train.sklearn_lr_hubregressor() * tensorflow * TensorTrain.grad_train * TensorTrain.lstsq_train * pyspark * mllib-lr(): pyspark_code.spark_mllib_lr() * ml-lr(): pyspark_code.spark_ml_lr() * 说明:线性回归模型对异常值非常敏感 * OLS最小二乘假设前提: * 自变量与因变量存在线性关系:相关系数 * 自变量之间不存在多重共线性 * 回归模型的残差服从高斯分布 * 回归模型的残差满足方差齐性(方差为固定值) * 回归模型的残差之间互相独立 * 线性检验 * 散点图 * Pearson相关系数(0.4,0.6) * 多重共线性检验:(OLS估计量失效;增大OLS估计量方差;变量的显著性检验失去意义;模型稳定性差) * 方差膨胀因子(VIF)--> (VIF > 10,存在多重共线性,降维/岭回归等) ``` from statsmodels.stats.outliers_influence import variance_inflation_factor data = pd.DataFrane() X = data[[1,2,3]] # 增加常数项 X[4] = 1 variance_inflation_factor(X[[1,2,3,4]].values,1) ``` * 特征之间的相关系数(0.8,相关系数低,并不能表示不存在多重共线性) * L2岭回归,系数权重参数的精度,解决了共线性带来的不稳定 * 增大样本 * 异常点检测 * 高杠杆值点(帽子矩阵): > 2 * (p + 1) / n时,样本可能存在异常(p:自变量个数,n为观测的个数) * DFFITS值:> 2 * sqrt((p + 1) / n)时,样本可能异常 * 学生化残差: > 2(包含帽子矩阵和DFFITS的信息) * cook距离: 没有明确的判断标准,一般来说,值越大则为异常点的可能性就越高 * covratio值: 离数值1越远,则认为该样本越可能是异常值 * 异常值处理 * 小比例(如5%):直接删除 * 比例较高:可以将异常值衍生为哑变量:异常值为1,非异常值为0 * 将异常值单独建模 * 正态性检验 * 定性图形法:直方图,PP图和QQ图 * 定量非参数法:Shapiro检验和K-S检验 * Shapiro检验: 样本 <= 5000 * K-S检验:如果检验p值拒绝了正态分布的假设,建议对Y变量进行box-cox变量处理 ``` from scipy import stats stats.ks_2samp() # two side ``` * 模型评估 * R^2:越大模型越精确(1 - 误差平方和/总波动) * 算法说明 * BGD(批量梯度下降):每次的参数更新使用了全量训练集数据。 特点:速度慢,效果好,全局最优。凸函数可以收敛至全局极小值,非凸函数局部极小值 * SGD(随机梯度下降):对大训练集的BGD改进,如果训练集过大,全量训练迭代速度太慢,故该算法在每次训练时, 随机抽取一个训练样本进行一次迭代,直至触发break条件 特点:速度快,但并非全局最优,往往追求局部最优,效果往往没有BGD好。由于更新频繁,会造成损失函数震荡 * MBGD/MSGD(小批量梯度下降):集成BGD和SGD的优点,每次训练即不使用全量训练集,也不只是随机抽取一个, 而是随机抽取比例个训练集,然后将抽取的全部训练集数据计算梯度进行一次迭代,直至触发break条件 特点:速度介于BGD与SGD之间,效果也介于二者之间。learning rate过大:震荡甚至偏离,过小收敛慢。 * 自适应梯度:https://www.jianshu.com/p/aebcaf8af76e * AdaGrad(自适应梯度):与MBGD的重要区别:以上三种算法的learning * error相对来对learning是固定的,而自适应增加了分母: 梯度平方累积和的平方根。通过累计各个参数的历史梯度平方,频繁更新的梯度,则累计分母大,则learning会相对变小, 反之稀疏矩阵,learning相对变大。 特点:稀疏矩阵的收敛;历史梯度平方过大,造成learning太小而无法有效更新 * RMSprop(root mean squared):与AdaGrad相对,该算法的分母使用了历史平方和的指数移动平均数 特点:克服了AdaGrad梯度急剧减小的问题,learning自适应能力强,尤其在不稳定(Non-Stationary)的目标函数下,表现良好 * Adam:结合AdaGrad和RMSProp两种优化算法的优点。对梯度的一阶矩估计(First Moment Estimation,即梯度的均值) 和二阶矩估计(Second Moment Estimation,即梯度的未中心化的方差)进行综合考虑,计算出更新步长 * ml:https://spark.apache.org/docs/2.3.2/ml-classification-regression.html#linear-regression * spark error:https://blog.csdn.net/qq0719/article/details/86003435 * spark ml all: https://blog.csdn.net/Jinlong_Xu/article/details/71437074 * 逻辑回归(分类模型):https://cloud.tencent.com/developer/article/1395692 * tensorflow api:https://www.tensorflow.org/versions/r2.0/api_docs * kera中文: https://keras.io/zh/ * sklearn: https://sklearn.apachecn.org/#/docs/2 以下内容,详细请参考 https://blog.csdn.net/zouxy09/article/details/24971995 * L1正则:Lasso回归 * L0范数:向量中非0的元素的个数(L0规则化参数矩阵,希望大部分元素为0) * L1范数:向量中各个元素绝对值之和。是L0的最优凸近似,比L0容易优化求解 * 表达式:min(sum((pre_y - y)^2)) + lamda * ||W1|| * 目的:使得参数稀疏化,用于特征选择。 * ||W1||的图像,二维为菱形,顶点与min接触的可能性远远大于其它点(平方和为圆),同时接触点为最优解,这些顶点在坐标上 会出现大量的0,故参数稀疏化用于特征选择,lamda控制图像大小 * 参数稀疏规则化:特征自动选择,模型可解释性变强 * L2正则:Ridge回归 * L2范数:向量各元素的平方和然后求平方根 * 表达式:min(sum((pre_y - y)^2)) + lamda * ||W2||^2 * 目的: * 防止overfitting: 原因:让L2范数的规则项||W||2最小,可以使得W的每个元素都很小,都接近于0,越小的参数说明模型越简单, 越简单的模型则越不容易产生过拟合现象(抗干扰能力强) * 有助于处理condition number不好情况下的矩阵求逆困难的问题 ill-condition病态:对于AX = b,求解X时,若A或b稍微的改变,则解X会发送很大的改变。否则就是well-condition condition number衡量ill-condition系统的可信度。condition number小则well,否则ill 如果一个矩阵的condition number在1附近,那么它就是well-conditioned的,如果远大于1,那么它就是ill-conditioned的 * ||W2||^2的图像为圆,lamda越大,theta衰减越快,圆半径越小,最优解及参数也就越小(回归的结果抗干扰能力越强);太大欠拟合 * 参数调节方法:lamda 从0开始逐渐增大,通过交叉验证,找到误分类最小的位置后,固定learning rate,让lamda从1到10增加/减少10呗, 获取较为合适数量级的lamda,然后再微调 loss函数:square loss(最小二乘) Hinge loss(SVM) exp loss(Boosting) log loss(logistic regression) * 范数 * L0 * 向量:向量中非0的元素的个数 * 矩阵:矩阵的非0元素的个数 * L1 * 向量:向量中各个元素绝对值之和 * 矩阵:矩阵的每一列上的元素绝对值先求和,再从中取个最大的,(列绝对值和最大) * L2 * 向量:向量各元素的平方和然后求平方根 * 矩阵(F范数):矩阵A的转置*A 的最大特征值开平方根 * 特征值/特征向量:A * v = lamda * v: lamda:特征值,v:特征向量 * 计算特征值/特征向量: * 矩阵的无穷范数: * 向量:正无穷:绝对值最大;负无穷:绝对值最小 * 矩阵:(行绝对值和最大) * 矩阵核范数:矩阵的奇异值(将矩阵svd分解)之和,这个范数可以用来低秩表示(因为最小化核范数,相当于最小化矩阵的秩——低秩) 约束低秩就是约束rank(),rank()时非凸,核范数就是rank()的凸近似 应用常见:1)矩阵填充(推荐系统); 2)robust pca(pca假设噪音高斯,大噪音或离群点会造成pca无法工作), 鲁棒性pca是稀疏噪音矩阵 + 低秩(内部结构信息)矩阵:同一人脸的不同曝光度/遮挡等 3)背景建模:背景像素组成的矩阵是低秩,前景移动物体像素占比低,具有稀疏性,两个叠加,即背景建模为低秩矩阵恢复的过程 4)变换不变低秩纹理(TILT):图像矫正 * sklearn ![输入图片说明](https://images.gitee.com/uploads/images/2020/0715/084549_1cb083e8_379161.jpeg "v2-9ebf3653df2622aa02c7f8b4ec6daf4f_r.jpg")