概要

本文是用Python编程语言来进行机器学习小实验的第一篇。主要内容如下:

  1. 读入数据并清洗数据
  2. 探索理解输入数据的特点
  3. 分析如何为学习算法呈现数据
  4. 选择正确的模型和学习算法
  5. 评估程序表现的准确性

读入数据 Reading the data

当读入数据时,你将面临处理无效或丢失数据的问题,好的处理方式相比于精确的科学来说,更像是一种艺术。因为这部分处理适当可以适用于更多的机器学习算法并因此提高成功的概率。

用NumPy有效地咀嚼数据,用SciPy智能地吸收数据

Python是一个高度优化的解释性语言,在处理数值繁重的算法方面要比C等语言慢很多,那为什么依然有很多科学家和公司在计算密集的领域将赌注下在Python上呢?因为Python可以很容易地将数值计算任务分配给C或Fortran这些底层扩展。其中NumPy和SciPy就是其中代表。
NumPy提供了很多有效的数据结构,比如array,而SciPy提供了很多算法来处理这些arrays。无论是矩阵操作、线性代数、最优化问题、聚类,甚至快速傅里叶变换,该工具箱都可以满足需求。

读入数据操作

这里我们以网页点击数据为例,第一维属性是小时,第二维数据是点击个数。

import scipy as sp
data = sp.genfromtxt('web_traffic.tsv', delimiter='\t')

预处理和清洗数据

当你准备好了你的数据结构用于存储处理数据后,你可能需要更多的数据来确保预测活动,或者拥有了很多数据,你需要去思考如何更好的进行数据采样。
在将原始数据(raw data)进行训练之前,对数据进行提炼可以起到很好的作用,有时,一个用提炼的数据的简单的算法要比使用原始数据的高级算法的表现效果要好。这个工作流程被称作特征工程(feature engineering)。Creative and intelligent that you are, you will immediately see the results。

由于数据集中可能还有无效数值(nan),我们可以事先看一下无效值的个数:

hours = data[:,0]
hits = data[:,1]
sp.sum(sp.isnan(hits))

用下面的方法将其过滤掉:

#cleaning the data
hours = hours[~sp.isnan(hits)]
hits = hits[~sp.isnan(hits)]

为了将数据给出一个直观的认识,用Matplotlib的pyplot包来将数据呈现出来。

import matplotlib.pyplot as plt
plt.scatter(hours,hits)
plt.title("Web traffic over the last month")
plt.xlabel("Time")
plt.ylabel("Hits/hour")
plt.xticks([w*7*24 for w in range(10)],['week %i'%w for w in range(10)])
plt.autoscale(tight=True)
plt.grid()
plt.show()

其显示效果如下:

选择合适的学习算法

选择一个好的学习算法并不是从你的工具箱中的三四个算法中挑选这么简单,实际上有更多的算法你可能没有见过。所以这是一个权衡不同的性能和功能需求的深思熟虑的过程,比如执行速度和准确率的权衡,,可扩展性和易用性的平衡。

现在,我们已经对数据有了一个直观的认识,我们接下来要做的是找到一个真实的模型,并且能推断未来的数据走势。

用逼近误差(approximation error)来选择模型

在很多模型中选择一个正确的模型,我们需要用逼近误差来衡量模型预测性能,并用来选择模型。这里,我们用预测值和真实值差值的平方来定义度量误差:

def error(f, x, y):return sp.sum((f(x)-y)**2)

其中f表示预测函数。

用简单直线来拟合数据

我们现在假设该数据的隐含模型是一条直线,那么我们还如何去拟合这些数据来使得逼近误差最小呢?
SciPy的polyfit()函数可以解决这个问题,给出x和y轴的数据,还有参数order(直线的order是1),该函数给出最小化逼近误差的模型的参数。

fp1, residuals, rank, sv, rcond = sp.polyfit(hours, hits, 1, full=True)

fp1是polyfit函数返回模型参数,对于直线来说,它是直线的斜率和截距。
如果polyfit的参数full为True的话,将得到拟合过程中更多有用的信息,这里只有residuals是我们感兴趣的,它正是该拟合直线的逼近误差。
然后将该线在图中画出来:

#fit straight line model
fp1, residuals, rank, sv, rcond = sp.polyfit(hours, hits, 1, full=True)
fStraight = sp.poly1d(fp1)#draw fitting straight line
fx = sp.linspace(0,hours[-1], 1000) # generate X-values for plotting
plt.plot(fx, fStraight(fx), linewidth=4)
plt.legend(["d=%i" % fStraight.order], loc="upper left")

用更高阶的曲线来拟合数据

用直线的拟合是不是很好呢?用直线拟合的误差是317,389,767.34,这说明我们的预测结果是好还是坏呢?
我们不妨用更高阶的曲线来拟合数据,看是不是能得到更好的效果。

fCurve3p = sp.polyfit(hours, hits, 3)
fCurve3 = sp.poly1d(fCurve3p)
print "Error of Curve3 line:",error(fCurve3,hours,hits)fCurve10p = sp.polyfit(hours, hits, 10)
fCurve10 = sp.poly1d(fCurve10p)
print "Error of Curve10 line:",error(fCurve10,hours,hits)fCurve50p = sp.polyfit(hours, hits, 50)
fCurve50 = sp.poly1d(fCurve50p)
print "Error of Curve50 line:",error(fCurve50,hours,hits)

其逼近误差为:

Error of straight line: 317389767.34
Error of Curve2 line: 179983507.878
Error of Curve3 line: 139350144.032
Error of Curve10 line: 121942326.364
Error of Curve50 line: 109504587.153


这里我们进一步看一下实验结果,看看我们的预测曲线是不是很好的拟合数据了呢?尤其是看一下多项式的阶数从10到50的过程中,模型与数据贴合太紧,这样模型不但是去拟合数据背后的模型,还去拟合了噪声数据,导致曲线震荡剧烈,这种现象叫做过拟合

小结

从上面的小实验中,我们可以看出,如果是直线拟合的话就太简单了,但多项式的阶数从10到50的拟合又太过了,那么是不是2、3阶的多项式就是最好的答案呢?但我们同时发现,如果我们以它们作为预测的话,那它们又会无限制增长下去。所以,我们最后反省一下,看来我们还是没有真正地理解数据。

衡量性能指标

作为一个ML的初学者,在衡量学习器性能方面会遇到很多问题或错误。如果是拿你的训练数据来进行测试的话,这可能是一个很简单的问题;而当你遇到的不平衡的训练数据时,数据就决定了预测的成功与否。

回看数据

我们再仔细分析一下数据,看一下再week3到week4之间,好像是有一个明显的拐点,所以我们把week3.5之后的数据分离出来,训练一条新的曲线。

inflection = 3.5*7*24 #the time of week3.5 is an inflection
time1 = hours[:inflection]
value1 = hits[:inflection]
time2 = hours[inflection:]
value2 = hits[inflection:]fStraight1p = sp.polyfit(time1,value1,1)
fStraight1 = sp.poly1d(fStraight1p)
fStraight2p = sp.polyfit(time2,value2,1)
fStraight2 = sp.poly1d(fStraight2p)

显然,这两条直线更好的描述了数据的特征,虽然其逼近误差还是比那些高阶多项式曲线的误差要大,但是这种方式的拟合可以更好的获取数据的发展趋势。相对于高阶多项式曲线的过拟合现象,对于低阶的曲线,由于没有很好的描述数据,而导致欠拟合的情形。所以为了更好的描述数据特征,使用2阶曲线来拟合数据,来避免过拟合和欠拟合现象的发生。

训练与测试

我们训练得到了一个模型,这里就是我们拟合的两个曲线。为了验证我们训练的模型是否准确,我们可以在最初训练时将一部分训练数据拿出来,当做测试数据来使用,而不仅仅通过逼近误差来判别模型好坏。

总结

这一小节作为机器学习小实验的引入,主要传递两点意思:
1、要训练一个学习器,必须理解和提炼数据,将注意力从算法转移到数据上
2、学习如何进行机器学习实验,不要混淆训练和测试数据
未来,我将加快速度,学习并实践。

参考文献

Building Machine Learning Systems with Python. Richert,W . Coelho,L P

转载请注明作者Jason Ding及其出处
Github主页(http://jasonding1354.github.io/)
CSDN博客(http://blog.csdn.net/jasonding1354)
简书主页(http://www.jianshu.com/users/2bd9b48f6ea8/latest_articles)

【机器学习实验】用Python进行机器学习实验相关推荐

  1. 《Python程序设计》实验四 Python综合实践实验报告

    <Python程序设计>实验四 Python综合实践实验报告 1.实验内容 Python综合应用:爬虫.数据处理.可视化.机器学习.神经网络.游戏.网络安全等. 在华为ECS服务器(Ope ...

  2. python实验目的_实验五 Python文件操作实验

    实验五 Python文件操作实验 一.实验目的与要求 1.掌握文件的打开和关闭. 2.掌握文件的不同操作,如读写.重命名.删除. 3.熟悉闭包.装饰器以及常见内置函数的使用. 二.实验原理 在pyth ...

  3. python 机器学习_使用Python启动机器学习

    Python被认为是机器学习爱好者中最喜欢的编程语言.在之前的文章中我们讨论了造成这种现象的一些原因.牢记Python语言对机器学习的积极影响,我们开始了一系列有关使用Python启动机器学习的文章. ...

  4. 实验报告-python文库_Python实验报告

    目 录 次序 1 2 3 4 5 实验项目名称 实验一.熟悉Python环境及及基本数据类型的使用实验 实验二.程序控制结构编程设计实验 实验三.函数和代码复用实验 实验四.组合数据类型的使用实验 实 ...

  5. 1.2机器学习基础下--python深度机器学习

    1. 机器学习更多应用举例: 人脸识别 2. 机器学习就业需求: LinkedIn所有职业技能需求量第一:机器学习,数据挖掘和统计分析人才      http://blog.linkedin.com/ ...

  6. 数据可视化实验:python数据可视化-柱状图,条形图,直方图,饼图,棒图,散点图,气泡图,雷达图,箱线图,折线图

    数据可视化实验:python数据可视化 实验8-12:大数据可视化工具-python 目录 1柱状图 2条形图 3直方图 4饼图 5棒图 6散点图 7气泡图 8雷达图 9箱线图 10折线图 1柱状图 ...

  7. 新闻上的文本分类:机器学习大乱斗 王岳王院长 王岳王院长 5 个月前 目标 从头开始实践中文短文本分类,记录一下实验流程与遇到的坑 运用多种机器学习(深度学习 + 传统机器学习)方法比较短文本分类处

    新闻上的文本分类:机器学习大乱斗 王岳王院长 5 个月前 目标 从头开始实践中文短文本分类,记录一下实验流程与遇到的坑 运用多种机器学习(深度学习 + 传统机器学习)方法比较短文本分类处理过程与结果差 ...

  8. 让机器学习手把手指导你的下一步实验-基于贝叶斯优化的序贯实验

    在企业的日常研发工作中, 工程师可能会面对众多潜在影响因子及这些因子间的复杂组合而无所适从,不知道如何通过实验构建这些因子与最终响应间的数学模型.类似困扰常出现在锂电池行业对于电解液配方的研究.医药行 ...

  9. 机器学习概论 SMO算法实现(实验三)

    一.实验目的 1.熟悉SMO算法的求解过程: 2.掌握SMO算法的代码实现: 3.掌握SVM的分类方法: 4.熟悉numpy的使用. 二.实验设备 计算机:CPU四核i7 6700处理器:内存8G: ...

  10. 7月Python和机器学习最佳开源项目Top 10!

    [导读]七月就要结束了,在即将到来的 7 月最后一个周末,人工智能头条为大家整理了本月 ML 和 Python 最受欢迎的十大开源项目.就算放假在家也可以知道大家现在都在学些什么,学习放假两不误.这个 ...

最新文章

  1. nlohmann/json使用笔记
  2. ICRA 2021自动驾驶相关论文汇总 | 科研党看过来,全文干货
  3. 《LeetCode力扣练习》剑指 Offer 05. 替换空格 Java
  4. ie网络集合代理无法启动_网络故障诊断70例!经典老文了!
  5. 10.18 nslookup:域名查询工具
  6. mysql绿色版安装
  7. android wifi 通讯录,通过wifi和gmail从symbian手机中将名片夹(通讯录)导入到android手机 | 古意人...
  8. 文本或代码中 \n 和 \r 的区别
  9. java隋唐演义游戏下载_JAVA多线程
  10. Docker生态技术链
  11. 如何解决inline-block元素的空白间距
  12. c语言内部超链接,HTML5中文本元素超链接的属性
  13. c c++ 宏定义中#, ##, #@的含义
  14. 2021全国计算机二级知识点,2021年度Dlypeq全国计算机等级考试二级公共基础知识点总结.doc...
  15. 什么是狭义人工智能、通用人工智能和超级人工智能?
  16. 【重磅干货整理】机器学习(Machine Learning)与深度学习(Deep Learning)资料汇总
  17. 二阶无源低通滤波器幅频特性曲线_二阶无源滤波器.doc
  18. 市场研究中的数据分析知识整理 (七)-结构方程模型
  19. linux查看系统版本
  20. 德纳:Mecha《机甲变形》NFT元宇宙链游开发技术详情

热门文章

  1. [bzoj 2302--HAOI2011]Problem c
  2. 微信小程序应用”腾讯位置服务路线规划“插件
  3. 曾鸣:区块链走向成熟的真正困难是什么?
  4. python学习的第二十五天:对PDF文件的读写操作
  5. 【华为OD机试真题 JAVA】欢乐的周末
  6. 不租服务器,自建个人商业网站(5)
  7. 安卓 元素渲染(类似v-for)
  8. 软件测试工程师笔试题面试 考到的网络基础知识-题目和答案
  9. 北邮水题 90. 字符串转换
  10. 系统集成商业务发展的几点认识