最近在自学图灵教材《Python机器学习基础教程》,在csdn以博客的形式做些笔记。
对于回归问题,线性模型预测的一般公式如下:
ŷ = w[0] * x[0] + w[1] * x[1] + … + w[p] * x[p] + b
这里 x[0] 到 x[p] 表示单个数据点的特征(本例中特征个数为 p+1),w 和 b 是学习模型的 参数,ŷ 是模型的预测结果。对于单一特征的数据集,公式如下: ŷ = w[0] * x[0] + b
线性回归
线性回归,或者普通最小二乘法(ordinary least squares,OLS),是回归问题最简单也最经 典的线性方法。线性回归寻找参数 w 和 b,使得对训练集的预测值与真实的回归目标值 y 之间的均方误差最小。均方误差(mean squared error)是预测值与真实值之差的平方和除 以样本数。线性回归没有参数,这是一个优点,但也因此无法控制模型的复杂度。
首先我们用书中给的一维数据集mglearn.datasets(需要预先导入mglearn库)举一个例子
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
X, y = mglearn.datasets.make_wave(n_samples=60)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
lr = LinearRegression().fit(X_train, y_train)
print("lr.coef_: {}".format(lr.coef_))
print("lr.intercept_: {}".format(lr.intercept_))
print("Training set score:{:.2f} ".format(lr.score(X_train, y_train)))
print("Test set score: {:.2f}".format(lr.score(X_test, y_test)))
其中lr.coef_表示斜率(权重)w,lr.intercept_表示截距b.
测试的分数为0.66,分数不高,而且测试集与训练集的分数非常接近,这说明很可能存在欠拟合,而不是过拟合;对于线性回归而言,一维数据存在过拟合的情况较少,而多维数据过拟合的可能性会变大。接下来我们来看一个复杂的多维数据集(同为书中给出的波士顿房价数据集,这个数据集有 506 个样本和 105 个导出特征)
X, y = mglearn.datasets.load_extended_boston()
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
lr = LinearRegression().fit(X_train, y_train)
print("Training set score: {:.2f}".format(lr.score(X_train, y_train)))
print("Test set score: {:.2f}".format(lr.score(X_test, y_test)))
对比一下训练集和测试集的分数可知,该模型存在过拟合,并且过拟合十分明显。