梯度下降
- 求梯度,实际上,就是求导数,函数在某一个点处求偏导。当函数是一维函数的时候,梯度就是导数。
- 梯度下降,实际上就是在比喻下山的过程。一个人被困在了山上,要下山,从山坡往山的最低点处走,但是山中的浓雾很大,路径无法确定,所以就必须利用自己周围的信息去找出下山的路径,这个时候,就可以利用梯度下降的知识来帮助自己下山。具体的说,就是以自己当前的路径为准,寻找位置最陡峭的地方,然后朝着山的高度下降的地方走,每走一段距离,就使用同样的方式,继续找位置,往下走,最终,抵达山谷。

- 个人理解,梯度下降,实际上就是不断地求偏导,求梯度,来企图找到一个极小值。这个极小值,就是最小的误差
- 我们通过梯度下降的方式,不断的调整w,来找到最优的权重w,来找最小的损失函数的值。
- 个人理解,如上所说,梯度下降实际上就是分段依次不断地往山下走,那么,每段走多少距离由w与每次跳跃的幅度决定,每段往哪个方向走由求导的正负决定。
- w的调整规则为 wj=wj−η∂wj∂J(w)
- 梯度下降可以分为三类:
- 随机梯度下降(每次随机选择一个样本更新权重),wj=wj+η(y(i)−y^(i))xj
- 批量梯度下降(使用所有的样本来更新权重),wj=wj+η∑i=1m(y(i)−y^(i))xj
- 小批量梯度下降(每次使用使用数量的样本来更新权重),wj=wj+η∑i=1k(y(i)−y^(i))xj
必备的库
- sklearn.linear_model 提供了很多回归的类
- SGDRegressor 提供了随机梯度下降的类,在linear_model包下
代码实现
# 得到随机梯度下降的对象,eta0指定学习率,就是每次跳跃的幅度
sgd = SGDRegressor(eta0=0.2)
# 训练
sgd.fit(X, y)
# 得出模型的效果
print(f"R^2值:{sgd.score(X, y)}")
数据标准化
- 数据标准化的产生与样本不均衡很容易搞混
- 数据标准化是由于训练集中的特征之间的大小差距特别的大,比如说,一个特征为人的身高,一个特征为人的资产,这俩个特征中的值的差距会异常的大,那么可以说俩个特征不是同一个数量级(量纲),数量级大的特征就会成为模型中主要的影响者,而评估器就无法在数量级小的特征中学习到信息,导致模型的不准确。
- 故而,我们需要进行数据的标准化,将所有的特征的数量浓缩到同一个区间,数量级中。
- 有俩种进行数据标准化化的方式
- StandardScaler 将数据转换为标准正态分布的形式(均值为0,标准差为1)
- MinMaxScaler 将数据等比例压缩到指定的一个区间,默认为[0, 1]。
必要的包
- StandardScaler, MinMaxScaler,在sklearn.preprocessing包下
代码实现
from sklearn.model_selection import train_test_split
from sklearn.linear_model import SGDRegressor
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler, MinMaxScaler
# 分裂数据集得到训练集与测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
# 使用流水线(我们的训练集和测试集都需要数据标准化,故而流水线更加的方便)
pipeline = Pipeline([("ss", StandardScaler()), ("sgd", SGDRegressor(eta0=0.01, max_iter=100))])
# 训练
pipeline.fit(X_train, y_train)
# 对于训练集和测试集进行评分
print(pipeline.score(X_train, y_train))
print(pipeline.score(X_test, y_test))
数据标准化的必要性
- 数据标准化不是对于所有的模型都是必要的。
- 线性回归算法底层使用最小二乘法进行求解w。该算法不受数据集量纲的影响。
- 使用随机梯度下降(配合给定的参数),如果数据的量纲差距大,那影响也大,故而需要使用数据标准化解决。
- 当然在使用随机梯度下降的时候,发生数据量纲特别大的情况,我们可以增加梯度下降的迭代次数(从山上往下走的步数)以及学习率(每步的幅度)来减弱这个影响。