当要预测的目标值是连续型的数据时,这一问题被称为回归问题。线性回归是利用回归方程对一个或多个自变量(特征值)和因变量(目标值)之间的关系进行建模的一种分析方式。
只有一个自变量的情况成为单变量回归,多于一个自变量的情况叫多元回归。
那该怎么理解呢?我们来看几个小例子
线性回归中的线性模型有两种,一是线性关系,二是非线性关系。线性模型是说,要么自变量是一次方(如:y = w1x1+w2x2+...+wnxn+b),要么参数是一次方(如:y = w1x1+w2x2^2 + w3x3^3+b)。
那么回到我们之前的问题,假如刚才的房价的真是数据之间存在这样的关系:
我们的预测值是这样一种关系:
那么房价的真实结果和预测结果就会存在一定的误差。用图示表达的话,如下图:误差就是所有圆点点到我们预测的直线的那个距离之和
既然存在这些误差,那么就用损失函数把这些误差给衡量出来。
如何去求模型中的参数,是的损失最小?(目的就是找到最小损失对应的w值)可以用线性回归经常使用的两种优化算法。
1 正规方程法
直接计算出参数值。
2 梯度下降法
通过计算梯度,使梯度逐渐减小而使梯度下降来找到loss的最小值
那么我自己也写了一下梯度下降算法(字迹太丑,,,),上图:
就是分别让loss对k,b求偏导数,之后来一个循环,循环的结束条件是梯度小于某一值,循环体的内容是计算梯度,然后,梯度等于梯度减去梯度乘学习率(相当于步长)
我们用均方误差来实现回归性评估。其公式为:
下面分别用正规方程和梯度下降来对波士顿房价进行预估:
#导入波士顿房价的数据集模块 from sklearn.datasets import load_boston #导入划分数据集的模块 from sklearn.model_selection import train_test_split #导入数据集标准化的模块 from sklearn.preprocessing import StandardScaler #导入正规方程,梯度下降和岭回归的优化模块 from sklearn.linear_model import LinearRegression,SGDRegressor,Ridge #导入模型评估的模块 from sklearn.metrics import mean_squared_error
#用正规方程来对放假进行预测 def linear1(): ''' 正规方程的优化方法来对波士顿的房价进行预测 :return: ''' #1 获取数据 boston = load_boston() #2 划分数据集 x_train,x_test,y_train,y_test = train_test_split(boston.data,boston.target,random_state=22) #3 标准化 transfer = StandardScaler() x_train = transfer.fit_transform(x_train) x_test = transfer.transform(x_test) #4 预估器 estimator = LinearRegression() estimator.fit(x_train,y_train) #5 得出模型,特征有几个,权重系数就有几个。 print("正规方程权重系数为:\n",estimator.coef_) print("正规方程偏执为:\n",estimator.intercept_) #6 模型评估 y_predict = estimator.predict(x_test) print("预测房价:\n",y_predict) error = mean_squared_error(y_test,y_predict) print("正规方程均方误差为:\n",error) return None #用梯度下降来对放假进行预测 def linear2(): ''' 梯度下降的优化方法来对波士顿的房价进行预测 :return: ''' #1 获取数据 boston = load_boston() print("特征数量\n",boston.data.shape) #2 划分数据集 x_train,x_test,y_train,y_test = train_test_split(boston.data,boston.target,random_state=22) #3 标准化 transfer = StandardScaler() x_train = transfer.fit_transform(x_train) x_test = transfer.transform(x_test) #4 预估器.eta0为学习率,max_iter为迭代次数,learning_rate为学习率的算法 estimator = SGDRegressor(learning_rate="constant", eta0=0.007,max_iter=10000) estimator.fit(x_train,y_train) #5 得出模型 print("梯度下降权重系数为:\n",estimator.coef_) print("梯度下降偏执为:\n",estimator.intercept_) #6 模型评估 y_predict = estimator.predict(x_test) print("预测房价:\n",y_predict) error = mean_squared_error(y_test,y_predict) #均方误差越小越好 print("梯度下降均方误差为:\n",error) return None
输出