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

梯度下降法的向量化

在之前的学习中我们知道利用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个特征,用随机方法生成它真实的系数并加入噪音得到输出结果,下面分别测试正规解和梯度下降的性能:

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

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

你可能感兴趣的:(机器学习系列(十五)——梯度下降法的优势)