支持我的工作 🎉
📃亲爱的朋友们,感谢你们一直以来对我的关注和支持!
💪🏻 为了提供更优质的内容和更有趣的创作,我付出了大量的时间和精力。如果你觉得我的内容对你有帮助或带来了欢乐,欢迎你通过打赏支持我的工作!🫰🏻你的一份打赏不仅是对我工作的认可,更是对我持续创作的巨大动力。无论金额多少,每一份支持都让我倍感鼓舞和感激。
📝有关此篇文章的更多详情请见:2022吴恩达机器学习Deeplearning.ai课程作业,给我一杯咖啡的支持吧!☕️
🔥再次感谢你们的支持和陪伴!
可选实验:使用 Scikit-Learn 进行线性回归
目标
在本实验中,您将:
- 利用 scikit-learn 通过梯度下降实现线性回归
import numpy as np
np.set_printoptions(precision=2) # 使其输出的浮点数精度为小数点后两位
# 这两个类分别用于实现**普通线性回归**和**使用随机梯度下降法的线性回归**
from sklearn.linear_model import LinearRegression, SGDRegressor
# 这个类用于**标准化数据**,使其均值为0,标准差为1。
from sklearn.preprocessing import StandardScaler
from lab_utils_multi import load_house_data
import matplotlib.pyplot as plt
dlblue = '#0096ff'; dlorange = '#FF9300'; dldarkred='#C00000'; dlmagenta='#FF40FF'; dlpurple='#7030A0';
plt.style.use('./deeplearning.mplstyle')
梯度下降
Scikit-learn 有一个梯度下降回归模型 sklearn.linear_model.SGDRegressor。与您之前的梯度下降实现类似,该模型在标准化输入下表现最佳。sklearn.preprocessing.StandardScaler 将执行 z-score 标准化,如之前的实验中所示。在这里,它被称为“标准分数”。
加载数据集
X_train, y_train = load_house_data()
X_features = ['size(sqft)','bedrooms','floors','age']
标准化/归一化训练数据
scaler = StandardScaler()
X_norm = scaler.fit_transform(X_train)
print(f"Peak to Peak range by column in Raw X:{np.ptp(X_train,axis=0)}")
print(f"Peak to Peak range by column in Normalized X:{np.ptp(X_norm,axis=0)}")
## print
Peak to Peak range by column in Raw X:[2.41e+03 4.00e+00 1.00e+00 9.50e+01]
Peak to Peak range by column in Normalized X:[5.85 6.14 2.06 3.69]
scaler = StandardScaler()
- 创建一个
StandardScaler
实例 StandardScaler
是scikit-learn
提供的一个类,用于数据标准化。标准化的目的是使数据具有零均值和单位方差
- 创建一个
X_norm = scaler.fit_transform(X_train)
- 使用
StandardScaler
实例对X_train
数据进行标准化。 fit_transform
方法首先计算数据的均值和标准差,然后对数据进行标准化。- 返回的
X_norm
是标准化后的数据。
- 使用
print(f"Peak to Peak range by column in Raw X:{np.ptp(X_train,axis=0)}")
- 计算并打印原始数据
X_train
每一列的峰值范围(最大值减去最小值)。 np.ptp
函数用于计算沿指定轴的峰值范围,这里使用axis=0
表示按列计算。
- 计算并打印原始数据
print(f"Peak to Peak range by column in Normalized X:{np.ptp(X_norm,axis=0)}")
- 计算并打印标准化后数据
X_norm
每一列的峰值范围。 - 标准化后的数据通常会有较小且相似的范围,因为它们被缩放到相同的尺度。
- 计算并打印标准化后数据
创建并拟合回归模型
## 创建 SGDRegressor 实例
sgdr = SGDRegressor(max_iter=1000)
## 训练模型
sgdr.fit(X_norm, y_train)
print(sgdr). # 打印 SGDRegressor 模型的**概述信息**,显示**模型的主要参数和设置**
## 打印迭代次数和权重更新次数
print(f"number of iterations completed: {sgdr.n_iter_}, number of weight updates: {sgdr.t_}")
## print
SGDRegressor()
number of iterations completed: 117, number of weight updates: 11584.0
-
sgdr = SGDRegressor(max_iter=1000)
创建一个
SGDRegressor
实例,并将最大迭代次数设置为 1000。SGDRegressor
是scikit-learn
提供的一种使用随机梯度下降法训练线性模型的回归器。 -
sgdr.fit(X_norm, y_train)
- 使用标准化后的训练数据
X_norm
和目标变量y_train
来训练SGDRegressor
模型。 fit
方法用于拟合模型。
- 使用标准化后的训练数据
查看参数
请注意,这些参数与标准化输入数据相关。拟合参数与之前实验中使用该数据找到的参数非常接近。
# 获取 SGDRegressor 模型的截距(偏置项)。intercept_ 属性包含模型的截距
b_norm = sgdr.intercept_
# 获取 SGDRegressor 模型的系数(权重)。coef_ 属性包含模型的系数
w_norm = sgdr.coef_
print(f"model parameters: w: {w_norm}, b:{b_norm}")
print(f"model parameters from previous lab: w: [110.56 -21.27 -32.71 -37.97], b: 363.16")
## print
model parameters: w: [110.08 -21.05 -32.46 -38.04], b:[363.15]
model parameters from previous lab: w: [110.56 -21.27 -32.71 -37.97], b: 363.16
进行预测
预测训练数据的目标值。使用 predict
例程,并使用
w
w
w 和
b
b
b 进行计算。
# 使用 sgdr.predict() 进行预测
y_pred_sgd = sgdr.predict(X_norm)
# 使用权重和截距进行预测
y_pred = np.dot(X_norm, w_norm) + b_norm
# 检查所有预测值是否都相同,如果相同则返回 True,否则返回 False。
print(f"prediction using np.dot() and sgdr.predict match: {(y_pred == y_pred_sgd).all()}")
# 打印前四个样本的预测值和目标值进行对比
print(f"Prediction on training set:\n{y_pred[:4]}" )
print(f"Target values \n{y_train[:4]}")
## print
prediction using np.dot() and sgdr.predict match: True
Prediction on training set:[295.2 485.82 389.56 491.98]
Target values [300. 509.8 394. 540. ]
y_pred_sgd = sgdr.predict(X_norm)
- 使用训练好的
SGDRegressor
模型对标准化后的数据X_norm
进行预测。 predict
方法会根据模型的系数和截距计算预测值。
- 使用训练好的
y_pred = np.dot(X_norm, w_norm) + b_norm
- 直接使用之前获取的权重
w_norm
和截距b_norm
对标- 准化后的数据X_norm
进行预测。 np.dot(X_norm, w_norm)
计算每个样本的线性组合,加上截距b_norm
得到预测值。
- 直接使用之前获取的权重
绘制结果
让我们绘制预测值与目标值的对比图。
# plot predictions and targets vs original features
fig,ax=plt.subplots(1,4,figsize=(12,3),sharey=True)
for i in range(len(ax)):
ax[i].scatter(X_train[:,i],y_train, label = 'target') # 绘制实际值的散点图
ax[i].set_xlabel(X_features[i])
ax[i].scatter(X_train[:,i],y_pred,color=dlorange, label = 'predict') # 绘制预测值的散点图
ax[0].set_ylabel("Price");
ax[0].legend();
fig.suptitle("target versus prediction using z-score normalized model")
plt.show()
小结
- 使用开源机器学习工具包 scikit-learn:
- scikit-learn 是一个使用的机器学习库,提供了各种算法和工具,用于数据预处理、模型训练和评估。
- 实现了线性回归模型:
- 通过使用梯度下降算法(SGDRegressor),我们训练了一个线性回归模型来预测房价。
- 我们还使用了**标准化技术(StandardScaler)**对特征数据进行了归一化处理,从而加快了模型的收敛速度并提高了模型的性能。