测试数据

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