机器学习各类算法思路总结二(梯度下降与数据标准化)

梯度下降

  • 求梯度,实际上,就是求导数,函数在某一个点处求偏导。当函数是一维函数的时候,梯度就是导数。
  • 梯度下降,实际上就是在比喻下山的过程。一个人被困在了山上,要下山,从山坡往山的最低点处走,但是山中的浓雾很大,路径无法确定,所以就必须利用自己周围的信息去找出下山的路径,这个时候,就可以利用梯度下降的知识来帮助自己下山。具体的说,就是以自己当前的路径为准,寻找位置最陡峭的地方,然后朝着山的高度下降的地方走,每走一段距离,就使用同样的方式,继续找位置,往下走,最终,抵达山谷。
  • 机器学习各类算法思路总结二(梯度下降与数据标准化)_第1张图片
  • 个人理解,梯度下降,实际上就是不断地求偏导,求梯度,来企图找到一个极小值。这个极小值,就是最小的误差
  • 我们通过梯度下降的方式,不断的调整w,来找到最优的权重w,来找最小的损失函数的值。
  • 个人理解,如上所说,梯度下降实际上就是分段依次不断地往山下走,那么,每段走多少距离由w与每次跳跃的幅度决定,每段往哪个方向走由求导的正负决定。
  • w的调整规则为 w j = w j − η ∂ J ( w ) ∂ w j w_j = w_j - \eta\frac{\partial J(w)}{\partial w_j} wj=wjηwjJ(w)
  • 梯度下降可以分为三类:
    • 随机梯度下降(每次随机选择一个样本更新权重), w j = w j + η ( y ( i ) − y ^ ( i ) ) x j w_j = w_j + \eta(y ^ {(i)} - \hat y ^ {(i)})x_j wj=wj+η(y(i)y^(i))xj
    • 批量梯度下降(使用所有的样本来更新权重), w j = w j + η ∑ i = 1 m ( y ( i ) − y ^ ( i ) ) x j w_j = w_j + \eta\sum_{i=1}^{m}(y ^ {(i)} - \hat y ^ {(i)})x_j wj=wj+ηi=1m(y(i)y^(i))xj
    • 小批量梯度下降(每次使用指定数量的样本来更新权重), w j = w j + η ∑ i = 1 k ( y ( i ) − y ^ ( i ) ) x j w_j = w_j + \eta\sum_{i=1}^{k}(y ^ {(i)} - \hat y ^ {(i)})x_j 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。该算法不受数据集量纲的影响。
  • 使用随机梯度下降(配合给定的参数),如果数据的量纲差距大,那影响也大,故而需要使用数据标准化解决。
  • 当然在使用随机梯度下降的时候,发生数据量纲特别大的情况,我们可以增加梯度下降的迭代次数(从山上往下走的步数)以及减少学习率(每步的幅度)达到近似数据标准化的效果。

你可能感兴趣的:(机器学习)