快速入门机器学习系列(1)--线性回归及代码
线性回归: 目标值预期是输入变量的线性组合。 简单来说, 就是选择一条线性函数来很好的拟合已知数据并预测未知数据。经典的线性回归模型主要用来预测一些存在着线性关系的数据集。 回归模型可以理解为: 存在一个点集, 用一条曲线去拟合它分布的过程。 如果拟合曲线是一条直线, 则称为线性回归。 如果是一条二次曲线, 则被称为二次回归。 如果包括两个或两个以上的自变量, 且因变量和自变量之间是线性关系, 则称为多元线性回归。 线性回归是回归模型中最简单的一种。
例如下图:
很容易从直觉中得出,估算出y=2*x+1就是一条可以拟合的不错的直线。
那么怎么确定什么直线是拟合的最好的直线?
我们引入平方差损失函数,对于一条直线,我们目标是让所有点到预测的直线的距离的平方和最小,这样就能得到一条尽可能穿过或者靠近所有点的一条直线。公式如下:
h(x)就是对x拟合的直线的函数,h(x)=w*x+b,就是线性回归的常用形式。此处的x不光可以代表大家常见的理解的在x轴上的离散值,也可以是多个特征维度的样本。例如经典的波士顿房价预测数据集中,共506条样本,每个样本有13种特征信息。此时x是一个506*13的特征矩阵,w也对应的是1*13的行向量,b是506*1的列向量(所以实际上是用X*W的转置的矩阵乘法,得到506*1的Y矩阵)
那么机器是怎么得到正确的W和b呢,
在运行过程中,w和b随机初始化,然后采用梯度下降的方法更新。什么是梯度下降?
在微积分里面,对多元函数的参数求∂偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度。比如函数f(x,y), 分别对x,y求偏导数,求得的梯度向量就是(∂f/∂x, ∂f/∂y)T,简称grad f(x,y)或者▽f(x,y)。对于在点(x0,y0)的具体梯度向量就是(∂f/∂x0, ∂f/∂y0)T.或者▽f(x0,y0),如果是3个参数的向量梯度,就是(∂f/∂x, ∂f/∂y,∂f/∂z)T,以此类推。
梯度下降就是令
沿着梯度的逆方向,可以令函数陷入局部的最小点,而对于线性回归,二阶导数非负,是一个凸函数。局部最优解就是全局最优解,所以用梯度下降一定能得到使得损失函数最小化的参数。
使用sklearn完成线性回归的代码案例如下:
import numpy as np #导入numpy库
import pandas as pd #导入pandas库
from sklearn.datasets import load_boston #从sklearn数据集库导入boston数据
boston=load_boston() #从读取的房价数据存储在boston变量中
print(boston.keys()) #打印boston包含元素
print(boston.feature_names) #打印boston变量名
bos = pd.DataFrame(boston.data) #将data转换为DataFrame格式以方便展示
print (bos[5].head()) #data的第6列数据为RM
bos_target = pd.DataFrame(boston.target) #将target转换为DataFrame格式以方便展示
print(bos_target.head())
from sklearn.model_selection import train_test_split #导入数据划分包
# 以25%的数据构建测试样本,剩余作为训练样本
X_train,X_test,y_train,y_test=train_test_split(bos,bos_target,test_size=0.25)
print(X_train.shape)
print(X_test.shape)
print(y_train.shape)
print(y_test.shape)
from sklearn.linear_model import LinearRegression #使用LinearRegression库
lr=LinearRegression() #设定回归算法
lr.fit(X_train,y_train) #使用训练数据进行参数求解
print ('求解截距项为:',lr.intercept_) #打印截距的值
w=lr.coef_
print(w.shape)
print ('求解系数为:',lr.coef_) #打印权重向量的值
y_hat = lr.predict(X_test) #对测试集的预测
print(y_hat[0:9] )
from sklearn import metrics
from sklearn.metrics import r2_score
# 拟合优度R2的输出方法一
print ("r2:",lr.score(X_test, y_test)) #基于Linear-Regression()的回归算法得分函数,来对预测集的拟合优度进行评价
# 拟合优度R2的输出方法二
print ("r2_score:",r2_score(y_test, y_hat)) #使用metrics的r2_score来对预测集的拟合优度进行评价
# 用scikit-learn计算MAE
print ("MAE:", metrics.mean_absolute_error(y_test, y_hat)) #计算平均绝对误差
# 用scikit-learn计算MSE
print ("MSE:", metrics.mean_squared_error(y_test, y_hat)) #计算均方误差
# # 用scikit-learn计算RMSE
print ("RMSE:", np.sqrt(metrics.mean_squared_error(y_test, y_hat))) #计算均方根误差