机器学习系列(十五)——梯度下降法的优势

作者: Ice_spring | 来源:发表于2019-07-10 11:31 被阅读9次

    梯度下降法的向量化

    在之前的学习中我们知道利用numpy模块的特性,将运算向量化能一定程度上加快运算速度,这里使用boston房产数据集,向量化后的梯度运算函数只有一行代码:

    def dJ(theta, X_b, y):
        return X_b.T.dot(X_b.dot(theta)-y)*2/len(X_b)
    

    测试性能,首先是正规解:

    '''使用boston房产数据的所有特征'''
    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn import datasets
    boston = datasets.load_boston()
    
    X = boston.data
    y = boston.target
    
    X = X[y < 50.0]
    y = y[y < 50.0]
    '''使用自己的模型'''
    from play_Ml.model_selection import train_test_split
    X_train,X_test,y_train,y_test = train_test_split(X,y,seed=666)
    from play_Ml.LinearRegression import LinearRegression
    lin_reg1 = LinearRegression()
    %time lin_reg1.fit_normal(X_train,y_train)
    lin_reg1.score(X_test,y_test)
    
    正规解时间测试

    对比向量化的梯度下降:

    '''对比向量化的梯度下降法'''
    lin_reg2 = LinearRegression()
    lin_reg2.fit_gd(X_train,y_train)
    '''eta默认0.02,而boston数据规模差异大'''
    lin_reg2.coef_
    

    实际上这时训练得到的模型并不好:

    系数向量

    可以发现系数都是无穷,这是因为boston数据不同特征之间量的规模差异巨大,在默认学习率0.02下,对于数字大的特征变化很小,而对于数字小的特征变化很大,这样很可能无法收敛到最优解。不过可以通过调小学习率来解决,虽然不是最好的办法:

    调整学习率

    可见调整学习率之后,虽然得到的系数不再为无穷大,但是R方值却不太理想,这是因为此时学习率太小了,而默认训练次数上限仅为10000次,10000次还不足以让模型训练得到最优解,修改训练次数上限:

    调整训练次数上限

    此时得到的效果和学习率默认时相比要好很多,不过还是没有达到正规解的0.8R方值的效果,实际上也是由于训练次数限制,继续增加训练次数最终是可以得到和正规解效果一样好的模型的。但...这时训练的开销已太过巨大,就像这里1000000次训练次数时间消耗已经远远超过正规解了。本来要说明梯度下降法是优于正规解方法的,现在仿佛被打脸。


    归一化使用梯度下降

    问题出在哪儿呢?上面我们提到,boston数据不同特征之间量的规模差异巨大,所以使用梯度下降法前,最好先进行数据归一化。而正规解由于是表达式,不用进行归一化。接下来试一试归一化后梯度下降法的表现:

    '''导入预处理模块进行数据归一化'''
    from sklearn.preprocessing import StandardScaler
    standardScaler = StandardScaler()
    standardScaler.fit(X_train)
    
    X_train_standard = standardScaler.transform(X_train)
    lin_reg3 = LinearRegression()
    %time lin_reg3.fit_gd(X_train_standard,y_train)
    
    X_test_standard = standardScaler.transform(X_test)
    lin_reg3.score(X_test_standard,y_test)
    

    测试结果:

    归一化的梯度下降

    可以发现R方值已经达到最优的0.8了,不过性能上好像还是和正规解相差无几,这主要是因为当前数据集规模太小。下模拟一个大规模数据集来比较梯度下降法和正规解方法:

    m = 1000
    n = 5000
    '''1000个样本,每个样本5000特征'''
    big_X = np.random.normal(size=(m,n))
    
    true_theta = np.random.uniform(0.0,100.0,size=n+1)
    
    big_y = big_X.dot(true_theta[1:])+true_theta[0]+np.random.normal(0.,10.,size=m)
    

    模拟数剧集有1000个样本,每个样本5000个特征,用随机方法生成它真实的系数并加入噪音得到输出结果,下面分别测试正规解和梯度下降的性能:

    正规解和梯度下降性能比较

    可见梯度下降的性能要远优于正规解方法,实际上如果数据规模更大,梯度下降法的优势会更加明显,这也是为什么大数据集上梯度下降法如此重要的原因。

    相关文章

      网友评论

        本文标题:机器学习系列(十五)——梯度下降法的优势

        本文链接:https://www.haomeiwen.com/subject/lylckctx.html