测试数据

import numpy as np import matplotlib.pyplot as plt np.random.seed(666) x = 2 * np.random.random(size=100) y = x * 3. + 4. + np.random.normal(size=100) X = x.reshape(-1, 1) plt.scatter(x, y) plt.show()

向量化计算dJ

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

使用真实数据测试模型

真实数据 + 正规化方程解

from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=666) lin_reg1 = LinearRegression() lin_reg1.fit_normal(X_train, y_train) # 见5-4 lin_reg1.score(X_test, y_test)

输出结果:
0.8129794056212832

真实数据 + 梯度下降法

lin_reg2 = LinearRegression() lin_reg2.fit_gd(X_train, y_train) lin_reg2.score(X_test, y_test)

输出结果:
eta太大导致搜索过程不收敛

真实数据 + 梯度下降法 + eta=0.000001

lin_reg2 = LinearRegression() lin_reg2.fit_gd(X_train, y_train, eta = 0.000001) lin_reg2.score(X_test, y_test)

输出结果:
0.27586818724477247

训练次数不够,没有达到最优值

真实数据 + 梯度下降法 + eta=0.000001 + n_iters=1e6

lin_reg2 = LinearRegression() lin_reg2.fit_gd(X_train, y_train, eta = 0.000001, n_iters=1e6) lin_reg2.score(X_test, y_test)

输出结果:
0.7542932581943915

训练次数太多,导致训练时间太长,但次数又不足以找到最优解
解决方法:数据归一化

梯度下降法与数据归一化

多元线性回归问题中,不同特征的规格一样,导致eta很难选。同一个eta可能会导致某些无法收敛而另一特征又收敛太慢。
因此使用梯度下降法之前,最好对数据进行归一化

from sklearn.preprocessing import StandardScaler standardScaler = StandardScaler() standardScaler.fit(X_train) X_train_standard = standardScaler.transform(X_train) X_test_standard = standardScaler.transform(X_test) lin_reg3 = LinearRegression() lin_reg3.fit_gd(X_train_standard, y_train) lin_reg3.score(X_test_standard, y_test)

输出结果:
0.8129873310487505