机器学习笔记—线性模型(回归)算法介绍(4)—附完整代码
以下都是本人在学习机器学习过程中的一些心得和笔记,仅供参考。
线性模型是在实践中广泛使用的一类模型,被广泛研究。
线性模型利用输入特征的**线性函数(linear function
)**进行预测。
文章目录
1.用于回归的线性模型
- 对于回归问题,线性模型预测的一般公式如下:
其中的w[0]
是斜率,b
是y轴偏移。
- 下面在一维
wave
数据集上学习参数w[0]
和b
:
In
:
import matplotlib.pyplot as plt
import mglearn
mglearn.plots.plot_linear_regression_wave()
plt.show()
Out
:
w[0]: 0.393906 b: -0.031804
wave
数据集的预测结果
从w[0]
可以看出,斜率应该在0.4左右,在图像中也可以直观地确认这一点。
截距是指预测直线与y轴的交点:比0略小,也可以从图中确认。
用于回归的线性模型可以表示为这样的回归模型:对单一特征的预测结果是一条直线,两个特征的时候是一个平面,或者更高维度(即更多特征)时是一个超平面。
但是将直线的预测结果与KNeighborsRegressor
的预测结果进行比较,能够发现直线的预测能力非常受限。
似乎数据的细节都丢失了。
对一维数据得出的观点有些片面,对于有多个特征的数据集而言,线性模型可以非常强大。
2.线性回归(普通最小二乘法)
- 有许多不同的线性回归模型。这些模型之间的区别在于如何从训练数据中学习参数
w
和b
,以及如何控制模型的复杂度。 - 线性回归也就是普通最小二乘法(
OLS
),是回归问题最简单也是最经典的线性方法。 OLS
寻找参数w
和b
,使得对训练集的预测值与真实的回归目标值y之间的均方误差最小。- 均方误差是预测值与真实值之差的平方和除以样本数。
PS:线性回归没有参数,这是一个优点,但是也因此无法控制模型的复杂度。
import mglearn
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
X,y=mglearn.datasets.make_wave(n_samples=60)
#导入wave数据集
X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=42)
#random_state参数指定随机数生成器的种子,使每次拆分的数据集相同
lr = LinearRegression().fit(X_train, y_train)
斜率参数被保存在coef_
属性中,而偏移或截距被保存在intercept_
属性中:
In
:
print("lr.coef_:", lr.coef_)
#w(权重或系数)被保存在coef_属性中
print("lr.intercept_:", lr.intercept_)
#b(偏移或截距)被保存在intercept_属性中
Out
:
lr.coef_: [0.394]
lr.intercept_: -0.031804343026759746
coef_
属性和intercept_
属性的简单介绍:
coef_
和intercept_
结尾处都有着下划线。其实,在sklearn
中总是将从训练数据中得出的值保存在以下划线结尾的属性中。
- 这是为了将其与其他用户设置的参数区分开。
intercept_
属性是一个浮点数,而coef_
属性是一个NumPy
数组,每个元素对应一个输入特征。
接下来继续看模型在训练集和测试集上的性能:
In
:
print("Training set score: {:.2f}".format(lr.score(X_train, y_train)))
print("Test set score: {:.2f}".format(lr.score(X_test, y_test)))
Out
:
Training set score: 0.67
Test set score: 0.66
R²约为0.66,这个结果不算好,但是可以发现,训练集和测试集的分数非常接近,表明可能存在欠拟合。
接下来导入波士顿房价数据集,这个数据集有506个样本和105个导出特征:
In
:
import matplotlib.pyplot as plt
import mglearn
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
X,y=mglearn.datasets.load_extended_boston()
#导入波士顿房价数据集
X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=0)
#random_state参数指定随机数生成器的种子,使每次拆分的数据集相同
lr = LinearRegression().fit(X_train, y_train)
print