封面
读后感
问题:
结论:
数据连接:https://s3.amazonaws.com/openrecipes/20170107-061401-recipeitems.json.gz
下载方法:右键另存为就完事儿了。。。(链接都有了,再不会我就没辙了。。。)下完了然后右键解压缩。。。如图。。。
抄作业
在做Python Data Science Handbook的实例学习,4.16.3 案例:探索马拉松比赛成绩里,有提示将时分秒的时间化为秒的总数,以方便画图。书里给出的指令是:
data['split_sec']=data['split'].astype(int)/1E9
data['final_sec']=data['final'].astype(int)/1E9
我用这种方式会出现以下错误:
TypeError: cannot astype a timedelta from [timedelta64[ns]] to [int32]
结论
描述的连接里面给出了一种解决办法,可是这种解决办法太复杂了,我想了一个更简单的
先写一个将Timedelta格式的时间数据转化为总秒数的函数:
data['split_sec'] = data['split'].apply(transfor_time) data['final_sec'] = data['final'].apply(transfor_time)
然后对我们需要的列广播这个函数:
data['split_sec'] = data['split'].apply(transfor_time) data['final_sec'] = data['final'].apply(transfor_time)
查看结果:
data.head()
OK!完美解决。。。
问题:
结论:
直接下载MNIST数据集
把数据集保存到mldata文件夹中:
参考链接:Error Downloading MNIST #143
问题:
在P438页,5.13.4 示例:不是很朴素的贝叶斯中的2. 使用自定义评估器小节中有这样一行代码:scores = [val.mean_validation_score for val in grid.grid_scores_]
运行之后报错:AttributeError: 'GridSearchCV' object has no attribute 'grid_scores_'
经过百度了之后,可以知道grid_scores_
在最新的sklearn中已经被弃用了,换成了cv_results_
,参考链接
那么,更改这个参数后,依然报错:AttributeError: 'str' object has no attribute 'mean_validation_score'
这个问题就再也没有搜到好的解决方案了,所以我去查了GridSearchCV的文档
然后发现,关于cv_results_
的内容如下:
这就很尴尬了,所以没有一个参数是包含validation关键字的,我的理解是,验证集和测试集在某种情况下可以认为是等价的。所以我猜测mean_validation_score对应的应该就是mean_test_score
这样,原来的代码就改成了scores = grid.cv_results_['mean_test_score']
为了证明我的猜想是正确的,所以,按照得到的scores结果,顺着其他的代码,知道最后绘图:
事实证明,跟书上得到图一毛一样,所以证明我对源代码修改的猜想是正确的
即证明了:
scores = [val.mean_validation_score for val in grid.grid_scores_]
scores = grid.cv_results_['mean_test_score']
问题:
我在使用jupyter lab的时候,想要把我的代码和结果导出成pdf格式的(由于里面有图片,所以不想导出成html)。然后报错:
然后我用pip安装了pandoc,发现并没有什么luan用。并且好像跟报错所指的pandoc不一样。反正就是绝望就完事儿了
方案:
下载安装windows开发环境包的管理器,Chocolatey。参考官网了连接,用cmd粘代码就能装:官网
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"
然后呢,就可以用这个管理工具安装pandoc了,参考pandoc官网
choco install pandoc
安装完事儿!
然后导出pdf的时候发现,竟然对pandoc的版本有要求,也是佛了,那就重新搞一下把。。。
安装固定版本的pandoc,根据官网发布的版本list,我选择安装1.19版本的。choco install pandoc --version 1.19
安装时安装完毕了,不知道为啥,一副好像报错了的样子,下的我赶紧去看一下到底是安装好了没。。。
应该是完事儿了,然后试试导出pdf。
pandoc好像是没有问题了,可是另一个包好像又除了问题:
所以现在又要安装这个:
choco install miktex
完。。。做完这一步,电脑自动重启了,然后jupyter lab打不开了,报错:
ImportError: cannot import name 'constants' from 'zmq.backend.cython’
然后没办法,用pip升级了一下pyzmq包,总算是能打开了。。。
然后,告诉我,我下载的插件不能用了,要重新“build”,所以就重新安装了插件。。。(像显示目录啊之类的插件。。。)
我真的很绝望。。。
然后依然报同样的错误。。。于是我怀疑,是不是MikTex有错,于是在官网上下了一个exe安装的那种,一路确认下去。。。参考链接、下载链接
果然,在点了导出pdf的时候,报错缺少的文件就弹出来安装程序了。。。
然后就成功保存pdf啦!
另辟蹊径
说实话,这样导出来的pdf并不好看,还有一种方法,直接导出html,里面保留了插入的图片的那种,更能还原jupyter原来的排版。参考链接
定义
判定系数(coefficient of determination),也叫可决系数或决定系数,是指在线性回归中,回归平方和与总离差平方和之比值,其数值等于相关系数的平方。它是对估计的回归方程拟合优度的度量。(参考:百度百科)
判定系数(记为R$^2$)在统计学中用于度量因变量的变异中可由自变量解释部分所占的比例,以此来判断统计模型的解释力。对于简单线性回归而言,判定系数为样本相关系数的平方。
假设一数据集包括$y_1, y_2, ..., y_n$共n个观察值,相对应的模型预测值分别为$f_1, f_2, ..., f_n$。定义残差$e_i = y_i - f_i$,
平均观察值为:$\bar{y} = \cfrac{1}{n} \sum\limits_{i=1}^n y_i$
于是可以得到总平方和:$SS_{tot} = \sum\limits_{i=1} (y_i - \bar{y})^2$
回归平方和:$SS_{reg} = \sum\limits_{i=1} (f_i - \bar{y})^2$
残差平方和:$SS_{res} = \sum\limits_{i=1} (y_i - f_i)^2 = \sum\limits_{i=1} e_i^2$
由此,判定系数可定义为:$R^2 = 1 - \cfrac{SS_{res}}{SS_{tot}}$
总结
R$^2$ = 1:表示模型与数据完全吻合。
R$^2$ = 0:表示模型不比简单取均值好。
R$^2$ < 0:表示模型性能很差。
系数标准
判定系数只是说明列入模型的所有解释变量对因变量的联合的影响程度,不说明模型中单个解释变量的影响程度。
判定系数达到多少为宜?没有一个统一的明确界限值;若建模的目的是预测因变量值,一般需考虑有较高的判定系数。若建模的目的是结构分析,就不能只追求高的判定系数,而是要得到总体回归系数的可信任的估计量。判定系数高并不一定说明每个回归系数都可信任。
贝叶斯定理
我们在生活中经常遇到这种情况:我们可以很容易直接得出P(A|B),P(B|A)则很难直接得出,但我们更关心P(B|A),贝叶斯定理就为我们打通从P(A|B)求得P(B|A)的道路。
$P(B|A) = \cfrac{P(A|B)P(B)}{P(A)}$
推导:$P(A, B) = P(B|A) * P(A) = P(A|B) * P(B)$
参考:机器学习之贝叶斯(贝叶斯定理、贝叶斯网络、朴素贝叶斯)
朴素贝叶斯分类是一种十分简单的分类算法,叫它朴素贝叶斯分类是因为这种方法的思想真的很朴素。
朴素贝叶斯的思想基础是这样的:对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,哪个最大,就认为此待分类项属于哪个类别。通俗来说,就好比这么个道理,你在街上看到一个黑人,我问你你猜这哥们哪里来的,你十有八九猜非洲。为什么呢?因为黑人中非洲人的比率最高,当然人家也可能是美洲人或亚洲人,但在没有其它可用信息下,我们会选择条件概率最大的类别,这就是朴素贝叶斯的思想基础。
朴素贝叶斯的应用场景
由于朴素贝叶斯分类器对数据有严格的假设,因此它的训练效果通常比复杂模型的差。其优点主要体现在以下四个方面。
朴素贝叶斯分类器非常适合用于以下应用场景:
白化的目的是去除输入数据的冗余信息。假设训练数据是图像,由于图像中相邻像素之间具有很强的相关性,所以用于训练时输入是冗余的;白化的目的就是降低输入的冗余性。
输入数据集X,经过白化处理后,新的数据X'满足两个性质:
(1) 特征之间相关性较低;
(2) 所有特征具有相同的方差。
其实我们之前学的PCA算法中,可能PCA给我们的印象是一般用于降维操作。然而其实PCA如果不降维,而是仅仅使用PCA求出特征向量,然后把数据X映射到新的特征空间,这样的一个映射过程,其实就是满足了我们白化的第一个性质:除去特征之间的相关性。因此白化算法的实现过程,第一步操作就是PCA,求出新特征空间中X的新坐标,然后再对新的坐标进行方差归一化操作。
参考链接:机器学习(七)白化whitening,PCA 和 白化区别
有监督学习
predict_proba
方法计算样本属于某个标签的概率。缺点:由于分类结果只能依赖于一开始的模型假设,因此高斯朴素贝叶斯经常得不到非常好的结果。无监督学习
RandomizedPCA
:使用了一个非确定算法,快速地近似计算出一个维度非常高的数据的前几个主成分。SparsePCA
:引入了一个正则项来保证成分的稀疏性。sklearn.cluster.SpectralClustering
评估器中实现,它使用最邻近来计算数据的高维表示,然后用k-means算法分配标签); d. 当数据量较大时,k-means会很慢。这时就需要将“每次迭代都必须使用所有数据点”这个条件放宽,例如每一步仅使用数据集的一个子集来更新簇中心点。这恰恰就是批处理(batch-based)k-means算法的核心思想,该算法在sklearn.cluster.MiniBatchKMeans
中实现。还可以使用k-means用于色彩压缩。缺点:在实际应用中,k-means的非概率性和它仅根据到簇中心点的距离来指派簇的特点将导致性能低下。由于k-means本身没有度量簇的分配概率或不确定性的方法,k-means可以理解为在每个簇的中心放置了一个圆,在这个圆圈之外的任何点都不是该簇的成员。所有k-means的这两个缺点——类的形状缺少灵活性、缺少簇分配的概率——使得它对许多数据集(特别是低维数据集)的拟合效果不尽人意。验证模型(根据书上的例子,分为分类和回归,当然部分函数是可以混用的)
留出集和特征工程
sklearn.model_selection.train_test_split
:留出集。X1, X2, y1, y2 = train_test_split(X, y, random_state, train_size)
sklearn.feature_extraction.DictVectorizer
:独热编码。解决常见的非数值类型的分类特征。vec = DictVectorizer(sparse, dtype)
sklearn.feature_extraction.text.CountVectorizer
:单词统计。将文字编码成数字的技术手段。vec = CountVectorizer()
sklearn.feature_extraction.text.TfidVectorizer
:TF-IDF(term frequency-inverse document frequency,词频逆文档频率)。通过单词在文档中出现的频率来衡量其权重,IDF的大小与一个词的常见程度成反比。vec = TfidVectorizer()
sklearn.preprocessing.PolynomialFeatures
:多项式特征,输入特征经过数学变换衍生出来的新特征,这种特征叫做衍生特征,这种处理方式被称为基函数回归(basis function regression)。poly = PolynomialFeatures(degree, include_bias)
sklearn.preprocessing.Imputer
:缺失值补充。用均值、中位数、众数等填充方法补充缺失值。imp = Imputer(strategy)
sklearn.pipeline.make_pipeline
:特征管道。将多个步骤串起来。model = make_pipeline(*steps)
skimage.feature.hog
:HOG特征(方向梯度直方图,Histogram of Oriented Gradients)。它可以将图像像素转换为向量形式,与图像具体内容有关,与图像合成因素无关。它是一个简单的特征提取程序,专门用来识别行人(pedestrians)的图像内容。分类(Classification)
sklearn.metrics.accuracy_score
:验证模型越策结果的准确率(预测的所有结果中,正确结果占总预测样本数的比例)。accuracy_score(y_true, y_pred)
sklearn.metrics.confusion_matrix
:混淆矩阵,分类结果和原始标签的一个表。confusion_matrix(y_true, y_pred)
sklearn.model_selection.cross_val_score
:交叉验证。cross_val_score(model, X, y, cv)
sklearn.model_selection.LeaveOneOut
:留一(LOO)交叉验证。cross_val_score(model, X, y, cv=LeaveOneOut())
回归(Regression)
sklearn.model_selection.validation_curve
:验证曲线。计算验证范围内的训练得分和验证得分。train_score, val_score = validation_curve(model, X, y, param_name, param_range, cv)
sklearn.model_selection.learning_curve
:学习曲线。反映训练集规模的训练得分 / 验证得分曲线。learning_curve(model, X, y, cv, training_sizes)
sklearn.model_selection.GridSearchCV
:网格搜索。寻找模型的最优参数。GridSearchCV(model, param_grid, cv)
参考链接:透彻理解高斯过程Gaussian Process (GP)
- 高斯过程模型属于无参数模型,相对解决的问题复杂度及与其它算法比较减少了算法计算量。
- 高斯模型可以解决高维空间(实际上是无限维)的数学问题,可以面对负杂的数学问题。
- 结合贝叶斯概率算法,可以实现通过先验概率,推导未知后验输入变量的后验概率。由果推因的概率。
- 高斯过程观测变量空间是连续域,时间或空间。
- 高斯过程观测变量空间是实数域的时候,我们就可以进行回归而实现预测。
- 高斯过程观测变量空间是整数域的时候(观测点是离散的),我们就可以进行分类。结合贝叶斯算法甚至可以实现单类分类学习(训练),面对小样本就可以实现半监督学习而后完成分类。面对异常检测领域很有用,降低打标签成本(小样本且单类即可训练模型)。
所以说,我们快点进入高斯过程-贝叶斯概率算法模型吧,功能非凡。