《Python数据分析与挖掘实战》学习笔记(三)

2019.3.3开始学习-2019.3.结束学习()

**·**2019.3.3_第五章P83-P89
P84页提到‘分类模型建立在已有类标记的数据集上,模型在已有样本上的准确率可以方便地计算,所以分类属于有监督的学习。’看到这里,我这个一窍不通的小胖又开始对有监督学习和无监督学习产生疑问了,于是找了一篇写的不错的博文补了补常识,见 https://blog.csdn.net/u010947534/article/details/82025794 。为作学习参考,我摘录其中一些话如下:

  1. ‘监督学习就是从给定的训练数据集中学习出一个函数(模型参数),当新的数据到来时,可以根据这个函数预测结果,其目标往往是让计算机去学习我们已经创建好的分类系统’
  2. ‘而无监督学习的输入数据没有被标记,也没有确定的结果。样本数据类别未知,需要根据样本间的相似性对样本集进行分类(聚类,clustering)试图使类内差距最小化,类间差距最大化。通俗点将就是实际应用中,不少情况下无法预先知道样本的标签,也就是说没有训练样本对应的类别,因而只能从原先没有样本标签的样本集开始学习分类器设计。’

在我输入P88页的代码清单5-1时,出现了错误
[Errno 22] Invalid argument: 'D:\\Learning\\Python_data_code\x08ankloan.xls'
很奇怪的是,之前没有出现过这样的错误啊,仔细查看了一下我的源代码

import pandas as pd
filename = 'D:\Learning\Python_data_code\bankloan.xls

好的,我想我知道问题所在了,修改如下:

import pandas as pd
filename = 'D:/Learning/Python_data_code/bankloan.xls'`

问题解决了。

关于P88的代码清单5-1,若原封不动按照书中写上去,会出现错误:
IndexError: boolean index did not match indexed array along dimension 0; dimension is 9 but corresponding boolean dimension is 8
自己尝试改了无效,网上很多方法页无效(包括将 x = data.iloc[:,:8].as_matrix() 改为 x = data.iloc[:,:9].as_matrix() 也无济于事),但是!当我看到 https://bbs.pinggu.org/thread-6167241-1-1.html 这篇问答时,问题就解决了,虽然不是说该回答完全解决了这个问题,但提供了非常好的思路!我将原来的代码

print(u'有效特征为:%s' % ','.join(data.columns[rlr.get_support()]))
x = data[data.columns[rlr.get_support()]].as_matrix()

改为

print(u'有效特征为:%s' % ','.join(data.iloc[:,:8].columns[rlr.get_support()]))
x = data[data.iloc[:,:8].columns[rlr.get_support()]].as_matrix()

就可以正常运行代码啦!(虽然还是有一堆警告,但是不管他0.0)
由于这里可以学习的基本代码较多,我将原代码贴上,并作一些学习笔记
《Python数据分析与挖掘实战》学习笔记(三)_第1张图片
其中,iloc的用法可参见 https://blog.csdn.net/w_weiying/article/details/81411257 。
(???)但对于代码 ‘ lr = LR() lr.fit(x,y) ’ 是如何在没有给定y的情况下进行训练的还不懂。

**·**2019.3.4_第五章P89-P100
关于P90中提到ID3算法是基于信息熵来选择最佳测试属性,好吧我又了解了一下什么是信息熵:

  1. 通常,一个信源发送出什么符号是不确定的,衡量它可以根据其出现的概率来度量。概率大,出现机会多,不确定性小;反之不确定性就大。信息论之父 C. E. Shannon 在 1948 年发表的论文“通信的数学理论( A Mathematical Theory of Communication )”中指出,任何信息都存在冗余,冗余大小与信息中每个符号(数字、字母或单词)的出现概率或者说不确定性有关。Shannon 借鉴了热力学的概念,把信息中排除了冗余后的平均信息量称为“信息熵”,并给出了计算信息熵的数学表达式。(来自百度百科)
  2. 通俗理解与实际应用可参见 https://blog.csdn.net/qq_39521554/article/details/79078917

关于P93页决策树分支节点的信息增益计算,我手动算了一个 ‘是否周末 - 是 - ’ 下的促销和天气增益,得出结果确实应该是选择 ‘ 是否促销 ’ 作为下一给分支节点。中途我还遇到一个非常恶心巴拉的事,那就是微软的计算器貌似不能便捷计算以2为底的分数对数(过程很麻烦还需要换底公式),所以我直接用python进行信息熵的期望计算了,写在此处只是想记录一下log()函数的用法:

import math
I = -math.log(5/8,2)*(5/8)-math.log(3/8,2)*(3/8) # math.log(b,a) 是计算以a为底,b的对数
print(I)

关于P94页的代码清单5-2,原封不动写上会报错‘AttributeError: ‘numpy.ndarray’ object has no attribute ‘columns’ ’,我想有可能是因为我没有安装Graphviz,有可能是别的原因,在此先不深究,留作以后再看,附报错图:《Python数据分析与挖掘实战》学习笔记(三)_第2张图片
关于P99页的代码清单5-3,我一开始是没有装keras的,所以自然而然要报错,于是在网上找到如下安装方法,非常全面也很感谢(包括了pip的指令安装过程):https://blog.csdn.net/ShaneneD/article/details/79516459
但运行代码仍然报错,且不知错误原因,另外,如下代码即使有注释,我依然不是很懂:

yp=model.predict_classes(x).reshape(len(y)) #分类预测

from cm_plot import * #导入自行编写的混淆矩阵可视化函数
cm_plot(y,yp).show() #显示混淆矩阵可视化结果

《Python数据分析与挖掘实战》学习笔记(三)_第3张图片
2019.3.5_第五章P100-P108
(???)关于P102页的混淆矩阵,其平均正确识别率(式5-20)和平均错误识别率(式5-22)我没有明白为什么要乘(Ti/T0)

2019.3.9_第五章P108-P113
好吧我前两天懒了,上完游泳课就放纵自我去了,今天开始继续学习。
(???)关于P108页的代码清单5-4,我不知道为什么输入之后并没有出来图像,并且没有把代码看得很懂(我觉得主要还是kmeans算法没整透,等到看西瓜书时再细究),于此同时,表5-15的聚类算法输出结果第三行“样本个数占比”我也没明白啊,难道不是(分群样本个数/总样本个数)?
关于P112页的代码清单5-5,直接输入代码之后,出现

,要两次运行才能出图,按照网络上的方法,在导入库之后加上%matplotlib inline问题就解决了

2019.3.10_第五章P113-P119
关于P114页的Apriori关联算法,我看了作者给的函数编码,对生疏的函数作如下笔记:

 1. map() 会根据提供的函数对指定序列做映射。第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。用法:map(function, iterable, ...)
 2. sort() 函数用于对原列表进行排序,如果指定参数,则使用比较函数指定的比较函数。用法:list.sort(cmp=None, key=None, reverse=False)
 3. append() 方法用于在列表末尾添加新的对象。用法:list.append(obj)
 4. lambda 创建匿名函数

还有一些没有作细致研究,当然这段函数代码也不是完全懂了,第一遍想要先了解一下大概意思,等到后面实战部分或以后阅读第二遍,有的问题可能就迎刃而解了。
(???)关于P119的输出关联规则,我不理解第四行和第五行:a→c(support:50%,confidence:71.4826%
)而 c→a(support:30%,confidence:71.4826%),置信度不管,按理说关联规则的支持度与事务顺序无关啊!

2019.3.15-3.16_第五章_第六章P119-P154
(???)关于P129代码清单5-7,由于缺乏数理统计知识,对其中的模型一知半解,对于模型如何定阶也存在疑问。希望在之后的学习中能够融汇贯通将这部分知识看懂。
(???)关于P138混合模型的离群点检测原理也没有看的很懂(概率论的知识早忘干净了,后期补)
关于P153代码清单6-1,我不明白为什么#非空即插值的写法是if (data[i].isnull())[j]): 按照道理说,i为列标,应该有横标j共同作用才能判断该位置是否为空值啊。查阅了一下 isnull() 的用法,发现其存在如下用法:

df.isnull().any()  #列级别的判断,只要该列有为空或者NA的元素,就为True,否则False

这样就能解释上述代码了。

2019.3.17_第六章P154-
关于P159代码清单6-4有使用保存模型的函数,在此就作一下笔记以免以后忘记:joblib.dump(tree,treefile) #保存模型,tree为模型,treefile为训练好的模型名称 与之像对应的,调用保存好的模型时,使用:joblib.load(treefile)

你可能感兴趣的:(《Python数据分析与挖掘实战》学习笔记(三))