线性回归,又叫普通最小二乘法,是回归问题最简单也是最经典的线性方法。线性回归寻找参数w和b,使得对训练集的预测值与真实的回归目标值y之间的均方误差最小。
均方误差是预测值与真实值之差的平方和除以样本差。线性回归没有参数,是一个优点,但是也因此无法控制模型的复杂度。
一维数据集:
import mglearn.datasets
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('斜率:{}'.format(lr.coef_))
print('截距:{}'.format(lr.intercept_))
print('训练集score:{:.2f}'.format(lr.score(X_train,y_train)))
print('测试集score:{:.2f}'.format(lr.score(X_test,y_test)))
score约为0.66,结果不是很好,但训练集和测试集的分数非常相近,说明模型存在欠拟合,而不是过拟合
多维数据集:
mglearn包有个现成数据集,为波士顿房价数据集,有506个样本和105个导出特征。
import mglearn.datasets
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.neighbors import KNeighborsRegressor
import matplotlib.pyplot as plt
import numpy as np
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('训练集score:{:.2f}'.format(lr.score(X_train,y_train)))
print('测试集score:{:.2f}'.format(lr.score(X_test,y_test)))
比较训练集饿测试集的分数,可以发现在训练集上的预测非常准确,但测试集上就要低很多,说明存在过拟合。