机器学习系列(十五)——梯度下降法的优势
梯度下降法的向量化
在之前的学习中我们知道利用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个特征,用随机方法生成它真实的系数并加入噪音得到输出结果,下面分别测试正规解和梯度下降的性能:
正规解和梯度下降性能比较可见梯度下降的性能要远优于正规解方法,实际上如果数据规模更大,梯度下降法的优势会更加明显,这也是为什么大数据集上梯度下降法如此重要的原因。