《机器学习实战》8.2 线性回归基础篇之预测鲍鱼年龄

搜索微信公众号:‘AI-ming3526’或者’计算机视觉这件小事’ 获取更多人工智能、机器学习干货
csdn:https://blog.csdn.net/baidu_31657889/
github:https://github.com/aimi-cn/AILearners

本文出现的所有代码,均可在github上下载,不妨来个Star把谢谢~:Github代码地址

一、引言

前面讲述了回归的基础概念,现在我们要把回归应用于真实数据。

二、线性回归基础篇之预测鲍鱼年龄

在abalone.txt文件中记录了鲍鱼(一种水生物→__→)的年龄,这个数据来自UCI数据集合的数据。鲍鱼年龄可以从鲍鱼壳的层数推算得到。

数据集下载地址:数据集下载

数据集的数据如下:

我们可以看出来数据集是多维的,所以我们是很难画出来他们的分布状态的,每个维度代表什么意思也没给出,不过没事,我们只知道最后一列代表的是y值就可以啦。最后一列代表的是鲍鱼的真实年龄,前面几列的数据是一些鲍鱼的特征,例如鲍鱼壳的层数等。我们不做数据清理,直接用上所有特征,测试下我们的局部加权回归。

新建一个abalone.py文件,添加rssError函数,用于评价最后回归结果。编写代码如下:

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@File    :   abalone.py
@Time    :   2019/07/08 14:50:05
@Author  :   xiao ming
@Version :   1.0
@Contact :   xiaoming3526@gmail.com
@Desc    :   线性回归基础篇之预测鲍鱼年龄
@github  :   https://github.com/aimi-cn/AILearners
'''# here put the import lib
from matplotlib.font_manager import FontProperties
import matplotlib.pyplot as plt
import numpy as np'''
@description: 加载数据
@param : fileName - 文件名
@return:  xArr - x数据集yArr - y数据集
'''
def loadDataSet(fileName):numFeat = len(open(fileName).readline().split('\t')) - 1xArr = []; yArr = []fr = open(fileName)for line in fr.readlines():lineArr =[]curLine = line.strip().split('\t')for i in range(numFeat):lineArr.append(float(curLine[i]))xArr.append(lineArr)yArr.append(float(curLine[-1]))return xArr, yArr'''
@description: 使用局部加权线性回归计算回归系数w
@param : testPoint - 测试样本点xArr - x数据集yArr - y数据集k - 高斯核的k,自定义参数
@return: testPoint * ws - 测试点*回归系数->预测结果
'''
def lwlr(testPoint, xArr, yArr, k = 1.0):xMat = np.mat(xArr); yMat = np.mat(yArr).Tm = np.shape(xMat)[0]#创建权重对角矩阵weights = np.mat(np.eye((m)))#遍历数据集计算每个样本的权重for j in range(m):diffMat = testPoint - xMat[j, :]                                 weights[j, j] = np.exp(diffMat * diffMat.T/(-2.0 * k**2))xTx = xMat.T * (weights * xMat)                                        if np.linalg.det(xTx) == 0.0:print("矩阵为奇异矩阵,不能求逆").decode('utf-8').encode('gb2312')return#计算回归系数ws = xTx.I * (xMat.T * (weights * yMat))                            return testPoint * ws'''
@description: 局部加权线性回归测试
@param : testArr - 测试数据集,测试集xArr - x数据集,训练集yArr - y数据集,训练集k - 高斯核的k,自定义参数
@return: ws - 回归系数
'''
def lwlrTest(testArr, xArr, yArr, k=1.0):#计算测试数据集大小m = np.shape(testArr)[0]                                           yHat = np.zeros(m)    #对每个样本点进行预测for i in range(m):                                                    yHat[i] = lwlr(testArr[i],xArr,yArr,k)return yHat
'''
@description: 计算回归系数w
@param : xArr - x数据集yArr - y数据集
@return: ws - 回归系数
'''
def standRegres(xArr,yArr):xMat = np.mat(xArr); yMat = np.mat(yArr).T#根据文中推导的公示计算简答回归系数xTx = xMat.T * xMat                           if np.linalg.det(xTx) == 0.0:print("矩阵为奇异矩阵,不能求逆")returnws = xTx.I * (xMat.T*yMat)return ws
'''
@description: 误差大小评测函数
@param : yArr - 真实数据yHatArr - 预测数据
@return: 误差大小
'''
def rssError(yArr, yHatArr):return ((yArr - yHatArr) **2).sum()if __name__ == "__main__":abX, abY = loadDataSet('C:/Users/Administrator/Desktop/blog/github/AILearners/data/ml/jqxxsz/8.Regression/abalone.txt')print('训练集与测试集相同:局部加权线性回归,核k的大小对预测的影响:')yHat01 = lwlrTest(abX[0:99], abX[0:99], abY[0:99], 0.1)yHat1 = lwlrTest(abX[0:99], abX[0:99], abY[0:99], 1)yHat10 = lwlrTest(abX[0:99], abX[0:99], abY[0:99], 10)print('k=0.1时,误差大小为:',rssError(abY[0:99], yHat01.T))print('k=1  时,误差大小为:',rssError(abY[0:99], yHat1.T))print('k=10 时,误差大小为:',rssError(abY[0:99], yHat10.T))print('')print('训练集与测试集不同:局部加权线性回归,核k的大小是越小越好吗?更换数据集,测试结果如下:')yHat01 = lwlrTest(abX[100:199], abX[0:99], abY[0:99], 0.1)yHat1 = lwlrTest(abX[100:199], abX[0:99], abY[0:99], 1)yHat10 = lwlrTest(abX[100:199], abX[0:99], abY[0:99], 10)print('k=0.1时,误差大小为:',rssError(abY[100:199], yHat01.T))print('k=1  时,误差大小为:',rssError(abY[100:199], yHat1.T))print('k=10 时,误差大小为:',rssError(abY[100:199], yHat10.T))print('')print(u"训练集与测试集不同:简单的线性归回与k=1时的局部加权线性回归对比:")print(u"k=1时,误差大小为:", rssError(abY[100:199], yHat1.T))ws = standRegres(abX[0:99], abY[0:99])yHat = np.mat(abX[100:199]) * wsprint(u'简单的线性回归误差大小:', rssError(abY[100:199], yHat.T.A))

运行结果如下:

可以看到,当k=0.1时,训练集误差小,但是应用于新的数据集之后,误差反而变大了。这就是经常说道的过拟合现象。我们训练的模型,我们要保证测试集准确率高,这样训练出的模型才可以应用于新的数据,也就是要加强模型的普适性。可以看到,当k=1时,局部加权线性回归和简单的线性回归得到的效果差不多。这也表明一点,必须在未知数据上比较效果才能选取到最佳模型。那么最佳的核大小是10吗?或许是,但如果想得到更好的效果,应该用10个不同的样本集做10次测试来比较结果。

本示例展示了如何使用局部加权线性回归来构建模型,可以得到比普通线性回归更好的效果。局部加权线性回归的问题在于,每次必须在整个数据集上运行。也就是说为了做出预测,必须保存所有的训练数据。

下篇文章将继续讲解回归,会介绍另一种提高预测精度的方法。

AIMI-CN AI学习交流群【1015286623】 获取更多AI资料
扫码加群:

分享技术,乐享生活:我们的公众号计算机视觉这件小事每周推送“AI”系列资讯类文章,欢迎您的关注!

《机器学习实战》8.2 线性回归基础篇之预测鲍鱼年龄相关推荐

  1. python自动化教程_Python自动化开发实战视频课程-全新基础篇_Python教程

    教程名称:Python自动化开发实战视频课程-全新基础篇 课程目录: 0001.51CTO学院-01Pythons10 day1 开课前言- _* N, R+ w/ T 0001.51CTO学院-01 ...

  2. 线性回归实例-----预测鲍鱼年龄

    预测鲍鱼年龄 前言   线性回归是监督学习的一个方向,用来预测连续的数值型数据.比如房价预测.销量预测等等. 优点:计算简单,易于理解 缺点:只使用与线性数据,对于非线性数据使用非线性回归模型 使用条 ...

  3. 机器学习实战--局部加权线性回归(LWR)

    一 概述 通常情况下的线性拟合不能很好地预测所有的值,因为它容易导致欠拟合(under fitting),比如数据集是 一个钟形的曲线.而多项式拟合能拟合所有数据,但是在预测新样本的时候又会变得很糟糕 ...

  4. 机器学习(三):基于线性回归对波士顿房价预测

    文章目录 专栏导读 1.线性回归原理 2.实战案例 2.1数据说明 2.2导入必要的库并加载数据集 2.3划分训练集和测试集 2.4创建线性回归模型 2.5模型预测评价 专栏导读 ✍ 作者简介:i阿极 ...

  5. 鲍鱼数据集案例分析-预测鲍鱼年龄(线性回归/梯度下降法实操)

    数据集来源UCI Machine Learning Repository: Abalone Data Set 目录 一.数据集探索性分析 二.鲍鱼数据预处理 1.对sex特征进行OneHot编码,便于 ...

  6. 从零开始掌握Python机器学习:七步教程 基础篇

    前言 「开始」往往是最难的,尤其是当选择太多的时候,一个人往往很难下定决定做出选择.本教程的目的是帮助几乎没有 Python 机器学习背景的新手成长为知识渊博的实践者,而且这个过程中仅需要使用免费的材 ...

  7. python arduino电子书_Arduino电子设计实战指南:零基础篇 PDF 高清版

    给大家带来的一篇关于Arduino相关的电子书资源,介绍了关于Arduino.电子设计.零基础方面的内容,本书是由机械工业出版社出版,格式为PDF,资源大小29.3 MB,程晨编写,目前豆瓣.亚马逊. ...

  8. 机器学习实战4-sklearn训练线性回归模型(鸢尾花iris数据集分类)

    不贴图都没人看系列.... 线性回归推导: 上图求导部分有误,少些一个转置符号,更正为: 逻辑回归推导: (公式中"ln"和"log"表示一个意思,都是以&qu ...

  9. 唐金州的Vue开发实战学习笔记(基础篇)

    Vue开发实战学习笔记 简易的Vue程序 组件 事件 插槽 单文件组件 双向绑定 虚拟DOM与key属性 组件更新 状态data与属性props vue的响应式更新 计算属性和侦听器 计算属性 com ...

最新文章

  1. java中的IO操作总结(一)
  2. windows10环境运用SSH和SwitchySharp自由翱翔
  3. 【转】简单的java缓存实现
  4. [专栏目录]-环境搭建安装问题笔记目录
  5. 家用计算机来源,美计算机专家称BBS才是博客真正起源
  6. 嵌入式学习步骤及方法(精典)
  7. spring 事务案例--转账
  8. 内存取证-volatility工具的使用
  9. 计算100以内奇数和偶数的数量
  10. codeforces 834-A. The Useless Toy
  11. 用变量定义数组的几个方法
  12. F1C100S电阻触摸屏驱动
  13. Silverlight的开发工具
  14. 如何在微信小程序中使用ECharts图表
  15. 头顶技术价格两座大山 OLED揠苗助长前景蒙忧
  16. Excel打开UTF-8编码CSV文件乱码的问题
  17. 正态分布/卡方分布/F分布/T分布
  18. 4款实用国产办公软件,工作效率提升必备,还不赶紧收藏
  19. 华为手机root以及搭建xposed框架的一点经验和教训
  20. java获取一个月的日历_java一个月日历

热门文章

  1. 读书笔记-Icepak网格划分控制面板
  2. 微信小程序 java汽车租赁公司管理系统python
  3. table标签去除默认边框
  4. 凤舞天骄服务器网络延迟,凤舞天骄新手教程
  5. 地理定位(高德地图官方文档)
  6. JVM经典垃圾回收器的运行机制和原理
  7. 优化大量图片加载recyclerview列表的滑动效果
  8. 汽车tbox是车联网系统
  9. (转)刚毕业的大学夫妻
  10. MATLAB匿名函数使用(含例子引用)