2018年3月12日
摘要: 在前面的两个例子中,我们将原始的数据集映射到新的特征空间。不过在实际应用中,我们常常需要将多个数据集转换,比如训练集和测试集,还有可能在训练好模型后,又收集到的新数据。在本节,你将学习如何将不属于训练集的数据进行映射。 还记得在标准PCA中,我们通过计算 转换矩阵*输入样本,得到映射后的数据。转换矩阵的每一列是我们从协方差矩阵中得到的k个特征向量。现在,如何将这种思路应用到核PCA?在核PCA中,我们得到的特征向量来自归一化的核矩阵(centered kernel matrix),而不是协方差矩阵,这意味着样本已经被映射到主成分轴Python机器学习:5.8 映射新的数据点.因此,如果我们要把一个新样本Python机器学习:5.8 映射新的数据点 映射到主成分轴,我们要按照下式: Python机器学习:5.8 映射新的数据点 上式怎么算?当然不好算,好在我们还有核技巧,所以可以避免直接计算Python机器学习:5.8 映射新的数据点。 和标准PCA不同的是,核PCA是一种基于内存的方法,这是什么意思呢?意思是每次对新样本进行映射时就要用到所有的训练集。因为要计算 阅读全文
posted @ 2018-03-12 12:25 aibbt_com 阅读(690) 评论(0) 推荐(0) 编辑
摘要: 机器学习算法中有两类参数:从训练集中学习到的参数,比如逻辑斯蒂回归中的权重参数,另一类是模型的超参数,也就是需要人工设定的参数,比如正则项系数或者决策树的深度。 前一节,我们使用验证曲线来提高模型的性能,实际上就是找最优参数。这一节我们学习另一种常用的超参数寻优算法:网格搜索(grid search)。 网格搜索听起来高大上,实际上简单的一笔,就是暴力搜索而已,我们事先为每个参数设定一组值,然后穷举各种参数组合,找到最好的那一组。 Python机器学习:6.4 通过网格搜索调参 GridSearchCV中param_grid参数是字典构成的列表。对于线性SVM,我们只评估参数C;对于RBF核SVM,我们评估C和gamma。 最后, 我们通过best_parmas_得到最优参数组合。 sklearn人性化的一点是,我们可以直接利用最优参数建模(best_estimator_): Python机器学习:6.4 通过网格搜索调参 Note 网格搜索虽然不错,但是穷举过于耗时,sklearn中还实现了随机搜索,使用 RandomizedSearc 阅读全文
posted @ 2018-03-12 11:48 aibbt_com 阅读(4735) 评论(1) 推荐(0) 编辑
摘要: 训练机器学习模型的关键一步是要评估模型的泛化能力。如果我们训练好模型后,还是用训练集取评估模型的性能,这显然是不符合逻辑的。一个模型如果性能不好,要么是因为模型过于复杂导致过拟合(高方差),要么是模型过于简单导致导致欠拟合(高偏差)。可是用什么方法评价模型的性能呢?这就是这一节要解决的问题,你会学习到两种交叉验证计数,holdout交叉验证和k折交叉验证, 来评估模型的泛化能力。 holdout method 评估模型泛化能力的典型方法是holdout交叉验证(holdout cross validation)。holdout方法很简单,我们只需要将原始数据集分割为训练集和测试集,前者用于训练模型,后者用于评估模型的性能。 不过,在训练模型这一步,我们非常关心如何选择参数来提高模型的预测能力,而选择参数这一步被称为模型选择(model selection,译者注:不少资料将选择何种模型算法称为模型选择),参数选择是非常重要的,因为对于同一种机器学习算法,如果选择不同的参数(超参数),模型的性能会有很大差别。 如果在模型选择的过程中,我们始终用测试集来评价模型性能,这 阅读全文
posted @ 2018-03-12 11:48 aibbt_com 阅读(15911) 评论(1) 推荐(0) 编辑
摘要: 结合k折交叉验证和网格搜索是调参的好手段。可是如果我们想从茫茫算法中选择最合适的算法,用什么方法呢?这就是本节要介绍的嵌套交叉验证(nested cross validation)。 Varma和Simon在论文Bias in Error Estimation When Using Cross-validation for Model Selection中指出使用嵌套交叉验证得到的测试集误差几乎就是真实误差。 + 嵌套交叉验证外层有一个k折交叉验证将数据分为训练集和测试集。还有一个内部交叉验证用于选择模型算法。下图演示了一个5折外层交叉沿则和2折内部交叉验证组成的嵌套交叉验证,也被称为5*2交叉验证: Python机器学习:6.5 通过嵌套交叉验证选择算法 sklearn中可以如下使用嵌套交叉验证: Python机器学习:6.5 通过嵌套交叉验证选择算法 我们使用嵌套交叉验证比较SVm和决策树分类器: Python机器学习:6.5 通过嵌套交叉验证选择算法 Python机器学习中文版目录(http://www.aibbt.com/a/2078 阅读全文
posted @ 2018-03-12 11:47 aibbt_com 阅读(1030) 评论(0) 推荐(0) 编辑
摘要: Python机器学习简介 第一章 让计算机从数据中学习 将数据转化为知识 三类机器学习算法 第二章 训练机器学习分类算法 透过人工神经元一窥早期机器学习历史 使用Python实现感知机算法 基于Iris数据集训练感知机模型 自适应线性神经元及收敛问题 Python实现自适应线性神经元 大规模机器学习和随机梯度下降 第三章 使用Scikit-learn进行分类器之旅 如何选择合适的分类器算法 scikit-learn之旅 逻辑斯蒂回归对类别概率建模 使用正则化解决过拟合 支持向量机 使用松弛变量解决非线性可分的情况 使用核SVM解决非线性问题 决策树学习 最大信息增益 构建一棵决策树 随机森林 k近邻 阅读全文
posted @ 2018-03-12 00:06 aibbt_com 阅读(1885) 评论(0) 推荐(0) 编辑
  2018年3月11日
摘要: Python机器学习介绍(Python Machine Learning 中文版) 机器学习,如今最令人振奋的计算机领域之一。看看那些大公司,Google、Facebook、Apple、Amazon早已展开了一场关于机器学习的军备竞赛。从手机上的语音助手、垃圾邮件过滤到逛淘宝时的物品推荐,无一不用到机器学习技术。 如果你对机器学习感兴趣,甚至是想从事相关职业,那么这本书非常适合作为你的第一本机器学习资料。市面上大部分的机器学习书籍要么是告诉你如何推导模型公式要么就是如何代码实现模型算法,这对于零基础的新手来说,阅读起来相当困难。而这本书,在介绍必要的基础概念后,着重从如何调用机器学习算法解决实际问题入手,一步一步带你入门。即使你已经对很多机器学习算法的理论很熟悉了,这本书仍能从实践方面带给你一些帮助。 具体到编程语言层面,本书选择的是Python,因为它简单易懂。我们不必在枯燥的语法细节上耗费时间,一旦有了想法,你能够快速实现算法并在真实数据集上进行验证。在整个数据科学领域,Python都可以说是稳坐语言榜头号交椅。 最后,我没有本书的翻译版权,请勿商用。转载请 阅读全文
posted @ 2018-03-11 22:43 aibbt_com 阅读(18098) 评论(0) 推荐(0) 编辑
  2018年3月10日
摘要: 15.14 传递Unicode字符串给C函数库¶ 问题¶ 你要写一个扩展模块,需要将一个Python字符串传递给C的某个库函数,但是这个函数不知道该怎么处理Unicode。 解决方案¶ 这里我们需要考虑很多的问题,但是最主要的问题是现存的C函数库并不理解Python的原生Unicode表示。 因此,你的挑战是将Python字符串转换为一个能被C理解的形式。 为了演示的目的,下面有两个C函数,用来操作字符串数据并输出它来调试和测试。 一个使用形式为 char *, int 形式的字节, 而另一个使用形式为 wchar_t *, int 的宽字符形式: void print_chars(char *s, int len) { int n = 0; while (n < len) { printf("%2x ", (unsigned char) s[n]); n++; } printf("\n"); } void print_wchars(wchar_t *s, int len) { int n = 0; while (n < 阅读全文
posted @ 2018-03-10 23:54 aibbt_com 阅读(658) 评论(0) 推荐(0) 编辑
摘要: 15.15 C字符串转换为Python字符串¶ 问题¶ 怎样将C中的字符串转换为Python字节或一个字符串对象? 解决方案¶ C字符串使用一对 char * 和 int 来表示, 你需要决定字符串到底是用一个原始字节字符串还是一个Unicode字符串来表示。 字节对象可以像下面这样使用 Py_BuildValue() 来构建: char *s; /* Pointer to C string data */ int len; /* Length of data */ /* Make a bytes object */ PyObject *obj = Py_BuildValue("y#", s, len); 如果你要创建一个Unicode字符串,并且你知道 s 指向了UTF-8编码的数据,可以使用下面的方式: PyObject *obj = Py_BuildValue("s#", s, len); 如果 s 使用其他编码方式,那么可以像下面使用 PyUnicode_Decode() 来构建一个字符串: PyObj 阅读全文
posted @ 2018-03-10 23:52 aibbt_com 阅读(441) 评论(0) 推荐(0) 编辑
摘要: 15.16 不确定编码格式的C字符串¶ 问题¶ 你要在C和Python直接来回转换字符串,但是C中的编码格式并不确定。 例如,可能C中的数据期望是UTF-8,但是并没有强制它必须是。 你想编写代码来以一种优雅的方式处理这些不合格数据,这样就不会让Python奔溃或者破坏进程中的字符串数据。 解决方案¶ 下面是一些C的数据和一个函数来演示这个问题: /* Some dubious string data (malformed UTF-8) */ const char *sdata = "Spicy Jalape\xc3\xb1o\xae"; int slen = 16; /* Output character data */ void print_chars(char *s, int len) { int n = 0; while (n < len) { printf("%2x ", (unsigned char) s[n]); n++; } printf("\n"); } 在这个代码中,字符串 sdata 包含了UTF-8和不合格数据。 阅读全文
posted @ 2018-03-10 23:51 aibbt_com 阅读(374) 评论(0) 推荐(0) 编辑
摘要: 15.17 传递文件名给C扩展¶ 问题¶ 你需要向C库函数传递文件名,但是需要确保文件名根据系统期望的文件名编码方式编码过。 解决方案¶ 写一个接受一个文件名为参数的扩展函数,如下这样: static PyObject *py_get_filename(PyObject *self, PyObject *args) { PyObject *bytes; char *filename; Py_ssize_t len; if (!PyArg_ParseTuple(args,"O&", PyUnicode_FSConverter, &bytes)) { return NULL; } PyBytes_AsStringAndSize(bytes, &filename, &len); /* Use filename */ ... /* Cleanup and return */ Py_DECREF(bytes) Py_RETURN_NONE; } 如果你已经有了一个 PyObject * 阅读全文
posted @ 2018-03-10 23:46 aibbt_com 阅读(200) 评论(0) 推荐(0) 编辑