快速入门机器学习系列(1)--线性回归及代码

快速入门机器学习系列(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,以此类推。

梯度下降就是令

w=w-\alpha *{\frac{\partial L}{\partial w}}

b=b-\alpha *{\frac{\partial L}{\partial b}}

沿着梯度的逆方向,可以令函数陷入局部的最小点,而对于线性回归,二阶导数非负,是一个凸函数。局部最优解就是全局最优解,所以用梯度下降一定能得到使得损失函数最小化的参数。

 

 

使用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))) #计算均方根误差

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值