2

时间

延迟的开学,其实多多少少给了我更多自由的时间,人生经历了21个春秋,大学也已经是即将过半。和我曾经一起奋斗的伙伴们不同,他们现在有着明确的技术路线,也有专业的老师和学长知道,而我只能朝着一个模糊的方向探索。

教程

首先可以确定的一点是,我准备做机器学习中的机器视觉,但是网上其实并没有什么详细的保姆教程,恰巧有一次在中国大学mooc上找到了一个名叫“python机器学习应用”的课程,下面附上课程的连接:https://www.icourse163.org/co...
这个课和别的课程相比,最好的一点就在于他在每个章节的后面,给出了我们实例代码,而且这些代码很多都是可以运行的(前提是你得排除各种各样的bug,配置许多的环境)

之前在梦云智打下的基础真的非常重要
在梦云智培训的时间里,我虽然没有掌握过硬的技术,但是在面对各种报错和bug时,我已经养成了将报错翻译成中文并且上网检索的习惯,并且搜索资料的能力也得到了前所未有的提升,有时想想,离开那里真的挺遗憾的。

为什么要写这个博客

闲,不知道接下来该干啥,那就先巩固一下之前学的知识吧。尝试使用一下费曼技巧,也许能掌握的更好,所以这是一个没啥技术含量的博客,如果你也在做机器学习并且遇到了和我类似的bug可以参考一下。
总是感觉虽然之前学习了numpy和pandas,但是没有实际项目,那些东西并没有真正的掌握,也不知道那些知识才是重点,这次有了这个教程,对于之前的2个库的学习又是一个提升

教程整体思路

image.png
图画的不是很好,主要就是理一理整个流程,但是教程大概是这个思路,最让我喜欢这个教程的一点,是针对每一个算法,教程都会给出相应的应用实例和代码,当然这些代码很多copy下来是不能用的,下面我就再来回顾一下运行这些代码遇到的各种问题以及解决办法

run and debug

首先,需要到官方给出的链接下载对应的数据集,https://pan.baidu.com/s/1eR7doh8
这里顺便说一下,我用的IDE是pycharm,当缺少库的时候,直接在对应的名字上alt+enter安装对应库即可,感觉没有教程中安装那些库那么的麻烦。

正式开始运行代码了

这里我学习的方法是按照视频中的讲解敲出代码,然后先不看实例代码,直接运行,成功了就继续,失败了先改bug,如果再不行就去看示例代码,如果示例代码也不能运行就在去找解决办法。为什么示例代码不能成功运行呢?这里我感觉应该是一些库,一些函数的用法更新了,毕竟这个教程是2017年的,而现在已经0202年了,出现这种情况也很正常,还能顺带提高我们的排错能力,也挺好的。
言归正传,在k-means的示例代码运行时,就会有如下报错:
image.png
很明显,就是下载到的数据集和给出的代码中的文件名不一致,改一下名就好了,而且可以看到
image.png
官方把文件改名,也是为了让我们更好的辨别这个文件。
DBSCAN的文件有同样的情况,更改文件名x2
image.png

主成分分析(PCA)

没有问题,可直接运行

非负矩阵分解(NMF)

无问题

基于聚类的整图分割实例

image.png
更改文件目录名,运行后正确,需要我们手动打开新生成的图片
image.png
可以看到图片已经被转化成了黑白

改进

当然,如果你不想手动打开图片,也可以修改源代码,只需要在最底下加上一行

pic_new.show()

就可以用电脑自带的图片浏览器打开图片了
但是这个时候,你不想用你电脑自带的图片浏览器打开这个图片,你想在pycharm内部打开这个图片,该怎么办?
我们需要一个新的库和一个新的函数,当然这里的方法肯定不唯一,有兴趣的可以自己去找找其他更好的方法
我是在开头引入:

from skimage import io

在结尾:

img2 = io.imread("result-bull-4.jpg")
io.imshow(img2)
io.show()

这样成功在pycharm内部打开了图片,
image.png
当然,这个图片默认被数轴包裹,我估计这个函数应该有去掉这个数轴的办法,这里就不去找了。

上证指数涨跌预测(用svm实现)

image.png
可以看到,这里的实例代码出现了问题,翻译一下,就是这个“cross_validation”无法被引用
image.png
用google搜索关键字,基本就打开第一条,直接会有结果,
image.png
这里外国的大佬说,这个corss_validation已经从v0.18开始不推荐使用了,而这个模组在0.20版本被移除,使用

from sklearn.model_selection import cross_validate

来代替。那我们就按照人家说的做,基本问题解决的八九不离十
然后IDE 会给出新的 报错
image.png
慌了吗?其实完全没事,他这里给出你什么新报错,你就接着该,哪里不会查哪里,so easy,不过这里我们其实都可以不查,翻译一下,他这里说.ix被废弃了,让我们用.loc和.iloc来代替即可。那我们就换。
image.png
这里换成.loc仍旧会报错,而且说实话这个报错难度超出了我现在的水平,我们尝试.iloc
接着IDE给出了我们新的报错
image.png
解决:
image.png
然后将之前的image.png
改为:image.png
说白了,就是cross_validate中已经么有train_test_split了,我们需要用image.png来导入这个方法。
顺便可以删掉corss_validate的import
运行时间有点长,不过最后会得出我们想要的结论。打印出分类的正确率。
image.png

运动状态预测(比较svm,knn,决策树)

这里遇到的问题与上一个大同小异,无非就是函数有了新名字,或者换到了别的库中
image.png
首先,Imputer函数已经被拆分了,使用SimpleImputer()来代替此处的Imputer,并且取消axis=0这一项。
image.png
train_test_split()则与之前一样的改法。
然后就会成这个样子:
image.png
输入包含NaN,无穷或过大的数字类型!
这其实是由于我们之前的投机取巧,只改了Imputer的名字,内置的参数并没有改,去官方文档查找,发现:人家用的是np.nan
image.png
我们也照着改一下,仍旧会报错:
image.png
很明显,这里是说test_size的大小不合适,而我又记得,教程中这里是要打乱训练集的顺序的,因此才把test_size调整成0,
这里再次看看官方文档,
image.png
可以看到,这里多出了一项参数叫shuffle,也就是说,现在的shuffle=True,代替了原来的test_size=0.0
故此处修改源代码为:
image.png
然后即可正常运行,运行时间比较长,请耐心等待
最后附上运行结果:
image.png

线性回归

源代码没有问题
image.png

多项式回归

源码无问题
image.png

岭回归

岭回归这里感觉是老师忘记给源代码了,有点可惜,不过其实感觉照着视频或者ppt应该也是可以做出来的,但是我也想不起来当时做的时候遇到什么报错了,想了想决定在按着ppt重新写一遍,于是我们遇到了第一个问题:image.png
到了这里,提示数组索引过多?别慌,先仔细看看实例ppt中的示例,你会发现,这里给的数据文件名字是data.txt
image.png
但是很遗憾,这个data.txt其中的数据并不是和岭回归的交通流量相关的,真正的数据文件叫做“岭回归.csv”,不光改变了名字,连格式都变了,我印象中.xlsx和.csv文件貌似互通,然而这里的.csv和.txt是不行的,当时也尝试了很多次,但是我注意到,我尝试的时候只是改变了文件路径的名字,实际上用numpy中读取txt的方法是可以读取csv格式的文件的,那这里为什么还会报错呢?
image.png
如图,那这时候怎么办呢?其实很多时候,排错考验的是我们的信息搜索能力,对于这个问题的答案,远在天边,尽在眼前。我们可以直接在这个课程的讨论区搜索“岭回归”
image.png
可以看到竟然又大神分享了他的岭回归代码,赶紧点开看一下,
image.png
很明显可以看到,这里在读取数据的时候需要跳过第一行
image.png
仔细看一下数据文件的内部,第一行是数据名,确实应该
跳过,按照大神的方法修改代码,我们也可以成功得出示例的结果
image.png
继续进行,遇到了之前出现过的交叉验证
image.png
我们一定要记得把它改成现在版本中的规范
image.png
然后按照教程一路进行到底,运行文件
image.png
这是什么情况?我明明在之前已经注释掉了plt.show()
其实出现这种情况还是在于我们对于matplotlib.pyplot.plot()函数不了解,我的理解是,每当我们调用一次plot(),我们就都绘制了一个图像,即使我们在后面作了其他的绘制操作,之前的这个图像依然存在,于是最后出现了2个图像重叠在一起的情况(仔细看会有不同颜色的蓝线和红线,由于x轴数字太大,而被“挤扁了”),因为我们只需要一并注释掉之前的plt.plot(data[:,4])即可
image.png
可惜效果没有ppt中给出的那么好,我猜测官方老师在做的时候改了一些参数使得回归的拟合效果更好,至于是那些参数呢。。。恕我现在还太菜。。。

神经网络(MLP)实现手写数字识别

示例代码可运行
image.png

K近邻(KNN)实现手写数字识别

可直接运行
image.png

自主学习Flappy Bird游戏

这里我感觉是所有教程中最难的地方,除了代码思路本身很难,TensorFlow本身调用使用很难,更难的是2020年2月时TensorFlow已经更新到了2.0版本,而示例代码的则是0.7版本的,直接运行根本运行不了。我一开始想把TensorFlow的版本降回0.7,结果最低也只能降到1.1,于是只好想别的办法。如图
image.png
我后来查到,TensorFlow其实还是挺良心的,他们已经想到,在升级了版本后你写的代码会无法运行,它们官方有一段代码,在cmd中输入后可以直接升级你的代码适配到新版本。附上官方文档链接:https://www.tensorflow.org/gu...
然后我们按照官方教程,在cmd中进入我们的文件目录,然后输入相应的升级代码,image.png
然而运行文件仍然会报错
image.png
重点的报错在这里:
image.png
我们查找问题的相应关键字
image.png
打开前2个解释image.png
附上前2个解释的链接https://stackoverflow.com/que...


https://cloud.tencent.com/dev...


总结一下就是这里的代码使用了placeholder函数用来创建占位符,但是从TensorFlow2.0开始我们的操作是立即执行的,没有占位符的概念,TensorFlow默认开启了Eager Execution,我知道我上述没有讲清楚,但是没有关系,我们在这里先知道怎么修正代码,至于具体原因我们后面再去深究,解决方法很简单,就是在代码前面加上tf.compat.v1.disable_eager_execution(),如图,到这里时,我们终于可以成功运行代码,当时还是挺激动的。
image.png
至此全部的示例代码我们都已经成功运行,但是我也明白,很多代码的原理其实我都还不是很理解,连TensorFlow的使用其实我也不会,后面就是理解一下之前写的这些代码了。

pytorch版本的自主学习flappy bird

在成功使用TensorFlow2.0自主学习flappy bird后,我也去github上找了找,还有一个大神使用了pytorch来完成,于是当时赶紧激动的下载下来运行,附上git地址:https://github.com/nevenp/dqn...
博客地址:https://www.toptal.com/deep-l...

image.png
然而遗憾的是,我在执行第二条指令后疯狂的报错,
image.png
而关于这个报错我google了很多次也没有找到解决办法,曾经想过安装torch1.0.0,但是安装了之后仍然报错,后来解决可以说是瞎猫碰死耗子,去requirements.txt中把torch给删除了,
image.png

然后运行成功
image.png
在目录下运行cmd输入python dqn.py test
成功:(我这里忘记当时为什么给dqn.py文件改名了,改名应该不影响最终结果)
image.png

总结

随着那只红色小鸟欢脱的蹦跳,这次的写作也就到此结束了。这是一篇么有什么技术含量的博客,但是我还是觉得,程序员的“深厚”功底必将为后面的机器学习打下坚实基础,排错的能力真的非常的重要,去理解一段无法运行的代码,总还是让人无法接受。

迷茫

我现在仍然不清楚的是,我的未来就业,对于机器学习这些算法的掌握到底是需要在什么程度?是需要我详细的掌握每种算法的构成?还是只是需要知道那种算法适合什么场景?需要用到的时候会调用即可?

后记

写这篇的时候本来想分2天完成,结果第二天停电了整个白天,凌晨1:58来的电,由于无聊从中午睡到下午6点30,然后玩手机玩到2点的我如是说道。咕了那么久总算完成了,后面想学习一下读论文的技巧,研究一下dqn的论文。也就是这篇论文,之前从来没读过外国的论文(中国的也没)https://www.cs.toronto.edu/~v...
这次看来是有需求了。当然还想趁着疫情学学爬虫,哈哈哈


奇天大郑
70 声望10 粉丝