①课程介绍
课程名称:Python3入门机器学习 经典算法与应用 入行人工智能
课程章节:6-5,6-6
主讲老师:liuyubobobo
内容导读
- 第一部分 真实数据上使用梯度下降法
- 第二部分 对梯度下降法参数进行调解测试
- 第三部分 对于参数调解得出的结论
②课程详细
第一部分 真实数据上使用梯度下降法
这一部分我将会使用真实数据来使用梯度下降法,这样讲更加的符合实际生产环境中的使用梯度下降法可能会出现的情况
导入函数
import numpy as np
from sklearn import datasets
导入数据,并进行小部分筛选
boston = datasets.load_boston()
X = boston.data
y = boston.target
X = X[y < 50]
y = y[y < 50]
分割数据,因为要测试数据的准确度,
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=666)
带入使用梯度下降法
from nike.LinearRegression import LinearRegression
lin_reg1 = LinearRegression()
%time lin_reg1.fit_normal(X_train, y_train)
lin_reg1.score(X_test, y_test)
CPU times: total: 15.6 ms
Wall time: 18 ms
0.7788559306186865
可以从数据看出题梯度下降法的效率很高,但是效果却差强人意,可以试着调节一下超参数看看会不会又更好的效果。
第二部分 对梯度下降法参数进行调解测试
这里使用我自己编写的代码,方便调节参数
导入对象
from nike.LinearRegression import LinearRegression
创建对象,调节参数为如下
lin_reg2 = LinearRegression()
%time lin_reg2.fit_gd(X_train, y_train, eta=0.000001, n_iters=1e6)
CPU times: total: 1min 34s
Wall time: 1min 39s
系数
lin_reg2.coef_
array([ 7.81069909e-02, -1.69149563e-01, 1.51689717e-02, 6.38843670e+01,
1.35082358e+01, 3.87310133e-01, -5.81883150e-03, 5.10478889e+00,
-1.30662360e-01, 1.47027648e-02, -2.23254603e+00, -6.62022296e-03])
截距
lin_reg2.intercept_
28.85400384450442
由于多次调节参数的代码过于冗杂,仅仅展示一次调节的过程。
第三部分 对于参数调解得出的结论
多次实验eta学习率和n_iters循环次数,都不能得到一个好的准确率,但是看到了趋势,也就是学习率足够地小,循环次数足够地大,就能够得到较高准确率,但是需要很耗时,这似乎还不如正规方程?
所以这里将使用归一化,看看数据预处理对于程序效率的影响。
数据归一化过程
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,eta=0.01)
CPU times: total: 297 ms
Wall time: 306 ms
可以看到数据归一化之后梯度下降地非常快
③课程思考
- 数据归一化的重要性,就批量梯度下降法和波士顿房价数据而言,数据进行归一化,效率提升至少300倍
- 线性回归最开始假设数据是线性的,但是波士顿房价数据似乎实现下来准确度不高,这说明可能是一开始的假设错误了,波士顿房价的数据是非线性的。
- 在数据X特征与特征之间差距大地情况下会影响运行效率和准确率,所以需要特征缩放,也就是数据预处理中的数据归一化