《机器学习》二,梯度下降

Q:梯度下降法是干嘛的?
A:梯度下降法是一种以最快的速度找到最优解的方法!

梯度下降法流程:

1,初始化theta,w0…wn
2,接着求梯度gradient
3,theta_t+1 = theta_t - grad * learning_rate
learning_rate是个超参数,太大容易来回振荡,太小步子太短,需要走很长时间,不管太大还是太小,
都会迭代次数很多,耗时很长
4,等待grad < threshold,迭代停止,收敛,threshold是个超参数

推导线性回归的loss function的导函数,目的是可以更快的求解梯度!
grad_j = (1/m) * (Xj)^Transpose * (Xtheta - y)
grads = (1/m) * X^Transpose * (X
theta - y)

上面就是批量梯度下降的时候,去求解gradients梯度的公式!
不管是批量梯度下降,还是随机梯度下降,流程里面的1,3,4都是一样的,只有第二步求梯度稍有不同!

代码自己实现批量梯度下降:
batch_gradient_descent.py

Q:随机梯度下降,怎么随机的呢?
A:其实就是在求梯度的时候,不再用所有的m个样本数据来计算,而是随机的选择一条数据来计算梯度!

Q:随机梯度下降的好处是什么?缺点是什么?
A:在求梯度的时候快,迭代次数有可能更多,最终可能落不到全局最优解上

Q:Mini-Batch GD是什么?
A:就是在求梯度的时候做了一个折中,不用所有的数据,而是随机选择一部分数据来求梯度!

代码实现随机梯度下降:
stochastic_gradient_descent.py
上面代码里面除了随机抽取一条数据来求解梯度,还随着迭代次数的增多,不断减小步长!learning_rate

Q:为什么要不断的调整步长?
A:就是为了让越接近最优解的时候,调整的幅度越小,避免来回震荡!

Q:如果我们不人为的调小步长,会不会随着迭代的次数增多,调整的幅度自动减小?
A:调整的幅度取决于谁?却决于学习率和梯度,梯度事实上越接近最优解,梯度的绝对值越小

Q:为什么要做归一化?
A:只要是基于梯度来进行下降求解最优解,都需要归一化,目的是各个维度梯度可以同时收敛

Q:不做归一化,产生的问题是什么?
A:如果X1<<X2,那么W1>>W2,那么我们W1初始化之后要到达最优解的位置走的距离就远大于
W1初始化之后要到达最优解的位置走的距离!
因为X1<<X2,那么g1 = (y_hat-y)*x1 ,g2 = (y_hat-y) * x2,那么g1<<g2
因为g1<<g2,那么W调整的幅度等于W_t+1 - W_t = - alpha * g
所以g越小,调整的幅度就越小
总结一下上面的推导:
X1<<X2,W1调整的幅度<<W2调整的幅度,但是W1需要调整的距离>>W2需要调整的距离
矛盾就产生了,如果此时不做归一化,去使用梯度下降求解最优解的话,
产生的效果,即会是同样的迭代次数下,W2已经调整好了,W1还在慢慢的往前挪,
整体看起来,就比先做归一化,再做梯度下降,需要的迭代次数要多了!!!

Q:怎么让多个维度对应的W基本上在同一时刻收敛?
A:对多个维度X来进行统一的归一化,比如说,最大值最小值归一化的方法

Q:何为最大值最小值归一化呢?
A:(X-Xmin)/(Xmax-Xmin),最大值最小值归一化的特点是一定可以把一列数据归到0到1之间

Q:什么是过拟合与欠拟合?
A:模型对训练集合拟合的非常好,对测试集合拟合的非常差。模型有可能发生了过拟合。
模型对训练集合拟合的非常不好,对测试集合拟合的也不好。模型有可能发生了欠拟合。

无论模型是过拟合还是欠拟合,都会导致模型的准确率下降,导致模型的泛化推广能力差

Q:如何防止过拟合呢?
A:防止过拟合,等价于提高模型的泛化能力,或者推广能力,或者说白了就是举一反三的能力!
提高了模型的容错能力!
学霸:有监督的机器学习!
学神:有很强的学习能力,能自己找到学习的方法!无监督的机器学习!
学渣:你的算法压根就没选对,数据预处理也没对,学习方法不对!
学痴:做练习题都会,考试稍微一变化,就挂!过拟合了!没有泛化能力!

Q:如何在机器学习里面防止过拟合呢?
A:模型参数W个数越少越好,无招胜有招
模型参数W的值越小越好,这样如果X输入有误差,也不会太影响y预测结果

通过正则化惩罚项人为的修改已有的损失函数,比如使用L1、L2正则添加到loss func里面去
L1 = n个维度的w绝对值加和
L2 = n个维度的w平方和
让我们的SGD(随机梯度下降),在找最优解的过程中,考虑惩罚项的影响

Q:当使用惩罚项,会产生什么影响?
A:使用惩罚项,会提高模型的泛化能力,但是因为人为的改变了损失函数,所有在一定程度上牺牲了正确率,即对训练集已有数据的拟合效果,但是没关系,因为我们的模型目的是对未来新的数据进行预测
在惩罚项里面,会有个alpha,即惩罚项的权重,我们可以通过调整alpha超参数,根据需求来决定是更看重模型的正确率还是模型的泛化能力!
在这里插入图片描述

代码展示

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 文件名: ridge_regression.py

import numpy as np
from sklearn.linear_model import Ridge
from sklearn.linear_model import SGDRegressor


X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)
"""
ridge_reg = Ridge(alpha=1, solver='sag')  # 此处sag等于SGD
ridge_reg.fit(X, y)
print(ridge_reg.predict(1.5))
print(ridge_reg.intercept_)
print(ridge_reg.coef_)
"""
sgd_reg = SGDRegressor(penalty='l2', n_iter=1000)
sgd_reg.fit(X, y.ravel())
print(sgd_reg.predict(1.5))
print("W0=", sgd_reg.intercept_)
print("W1=", sgd_reg.coef_)

运行结果
在这里插入图片描述

线性回归:

算法选择顺序,Ridge Regression (L2正则化) --> ElasticNet (即包含L1又包含L2)
–> Lasso Regression (L1正则化)

Q:正则化L1和L2有什么区别?
A:L1是w绝对值加和,L2是w平方加和。L1的有趣的现象是会使得w有的接近于0,有的接近于1,
L1更多的会用在降维上面,因为有的是0有的是1,我们也称之为稀疏编码。
L2是更常用的正则化手段,它会使得w整体变小

超参数alpha 在Rideg类里面就直接是L2正则的权重
超参数alpha 在Lasso类里面就直接是L1正则的权重
超参数alpha 在ElasticNet和SGDRegressor里面是损失函数里面的alpha
超参数l1_ration 在ElasticNet和SGDRegressor里面是损失函数的p

多项式回归:叫回归但并不是去做拟合的算法
PolynomialFeatures是来做预处理的,来转换我们的数据,把数据进行升维!

Q:升维有什么用?
A:升维就是增加更多的影响Y结果的因素,这样考虑的更全面,最终是要增加准确率!
还有时候,就像PolynomialFeatures去做升维,是为了让线性模型去拟合非线性的数据!

Q:PolynomialFeatures是怎么升维的?
A:可以传入degree超参数,如果等于2,那么就会在原有维度基础之上增加二阶的数据变化!
更高阶的以此类推

Q:如果数据是非线性的变化,但是就想用线性的模型去拟合这个非线性的数据,怎么办?
A:1,非线性的数据去找非线性的算法生成的模型去拟合
2,可以把非线性的数据进行变化,变成类似线性的变化,然后使用线性的模型去拟合
PolynomialFeatures类其实就是这里说的第二种方式

polynomial_regression.py
上面代码里面其实通过画图让同学们理解,更高阶的数据变化,可以让线性模型拟合的更好,
但是也容易过拟合!

保险的案例:
目的:未来来个新的人,可以通过模型来预测他的医疗花销
所以,就把charges列作为y,其他列作为X维度

Q:为什么每行没有人名?
A:人名不会对最终的Y结果产生影响,所以可以不用

Q:为什么要观测注意数据多样性,采样要均匀?
A:就是因为你要的模型的功能是对任何年龄段的人都有一个好的预测,那么你的模型在训练的时候
读取的数据集,就得包含各个年龄段得数据,而且各个年龄段也得数据均匀,防止过拟合!

Q:什么是Pearson相关系数?
A:Pearson相关系数是来测量两组变量之间的线性相关性的!Pearson相关系数的区间范围是-1到1之间
如果越接近于-1,说明两组变量越负相关,一个变大,另一个变小,反之如果越接近于1,说明两组
变量越正相关,一个变大,另一个也跟着变大,如果越接近于0,说明越不相关,即一个变大或变小,
另一个没什么影响!
通过Pearson相关系数,如果发现两个维度之间,相关系数接近于1,可以把其中一个去掉,做到降维!
通过Pearson相关系数,如果发现某个维度和结果Y之间的相关系数接近于0,可以把这个维度去掉,降维!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值