编程语言
首页 > 编程语言> > 《Python数据科学手册》学习笔记及书评

《Python数据科学手册》学习笔记及书评

作者:互联网

《Python数据科学手册》学习笔记

目录

写在前面

1. 食谱数据库数据找不到的问题

2.Seaborn马拉松可视化里时分秒转化为秒数的问题

3. scikit-learn使用fetch_mldata无法下载MNIST数据集的问题

4. GridSearchCV.grid_scores_和mean_validation_score报错

5. Jupyter导出PDF从入门到绝望

6. 机器学习部分笔记

6.1 判定系数

  1. 定义

    判定系数(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}}$

  2. 总结

    R$^2$ = 1:表示模型与数据完全吻合。

    R$^2$ = 0:表示模型不比简单取均值好。

    R$^2$ < 0:表示模型性能很差。

  3. 系数标准

    判定系数只是说明列入模型的所有解释变量对因变量的联合的影响程度,不说明模型中单个解释变量的影响程度。
    判定系数达到多少为宜?没有一个统一的明确界限值;若建模的目的是预测因变量值,一般需考虑有较高的判定系数。若建模的目的是结构分析,就不能只追求高的判定系数,而是要得到总体回归系数的可信任的估计量。判定系数高并不一定说明每个回归系数都可信任。

6.2 朴素贝叶斯

  1. 贝叶斯定理

    我们在生活中经常遇到这种情况:我们可以很容易直接得出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)$

    参考:机器学习之贝叶斯(贝叶斯定理、贝叶斯网络、朴素贝叶斯)

    朴素贝叶斯分类是一种十分简单的分类算法,叫它朴素贝叶斯分类是因为这种方法的思想真的很朴素。

    朴素贝叶斯的思想基础是这样的:对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,哪个最大,就认为此待分类项属于哪个类别。通俗来说,就好比这么个道理,你在街上看到一个黑人,我问你你猜这哥们哪里来的,你十有八九猜非洲。为什么呢?因为黑人中非洲人的比率最高,当然人家也可能是美洲人或亚洲人,但在没有其它可用信息下,我们会选择条件概率最大的类别,这就是朴素贝叶斯的思想基础。

  2. 朴素贝叶斯的应用场景

    由于朴素贝叶斯分类器对数据有严格的假设,因此它的训练效果通常比复杂模型的差。其优点主要体现在以下四个方面。

    • 训练和预测的速度非常快
    • 直接使用概率预测
    • 通常很容易理解
    • 可调参数(如果有的话)非常少。

    朴素贝叶斯分类器非常适合用于以下应用场景:

    • 假设分布函数与数据匹配(实际中很少见)。
    • 各种类型的区分度很高,模型复杂度不重要。
    • 非常高维度的数据,模型复杂度不重要。

6.3 自举重采样方法

6.4 白化

6.5 机器学习章节总结

  1. 有监督学习

    • 高斯朴素贝叶斯(Gaussian naive Bayes):速度快,不需要选择超参数,所以通常很适合作为初步分类手段,在借助更复杂的模型进行优化之前使用。这个方法假设每个特征中属于一类的观测值都符合高斯分布,且变量无协方差(即线性无关)。椭圆曲线表示每个标签的高斯生成模型,越靠近椭圆中心的可能性越大。通过这种类似的生成模型,可以计算出任意数据点的似然估计(likelihood)P(特征|$L_1$),然后根据贝叶斯定理计算出后验概率比值,从而确定每个数据点可能性最大的标签。贝叶斯主义(Bayesian formalism)的一个优质特性是它天生支持概率分类,我们可以用predict_proba方法计算样本属于某个标签的概率。缺点:由于分类结果只能依赖于一开始的模型假设,因此高斯朴素贝叶斯经常得不到非常好的结果。
    • 多项式朴素贝叶斯(multinomial naive Bayes)它假设特征是由一个简单多项式分布生成的。优点:多项分布可以描述各种类型样本出现次数的概率,因此多项式朴素贝叶斯非常适用于描述出现次数或者出现次数比例的特征。
    • 简单线性回归(Linear Regression):将数据拟合成一条直线。除了简单的线性拟合,它还可以处理多维度的线性回归模型。
    • 基函数回归(basis function regression):通过基函数对原始数据进行变换,从而将变量间的线性回归模型转换为非线性回归模型。有多项式基函数高斯基函数等。
    • 正则化(regularization):虽然在线性回归模型中引入基函数会让模型变得更加灵活,但是也很容易造成过拟合。当基函数重叠的时候,通常就表明出现了过拟合:相邻基函数的系数想相互抵消。对较大的模型参数进行惩罚(penalize),从而抑制模型的剧烈波动,这个惩罚机制被称为正则化。有岭回归(ridge regression,$L_2$范数正则化):$P = \alpha \sum_{n=1}^N \theta_n^2$、Lasso正则化($L_1$范数):$P = \alpha \sum_{n=1}^N |\theta|$。Lasso正则化倾向于构建稀疏矩阵,即它更喜欢将模型系数设置为0。
    • 支持向量机(support vector machine, SVM):不同于贝叶斯分类器,首先对每个类进行了随机分布的假设,然后用生成的模型估计新数据点的标签。——生成分类方法;支持向量机是判别分类方法:不再为每类数据建模、而是用一条分割线(二维空间中的直线或曲线)或者流体形(多维空间中的曲线、曲面等概念的推广)将各种类型分割开。边界最大化评估器。核变换核函数技巧处理非线性问题。SVM实现了一些修正因子来软化边界
    • 决策树:采用非常直观的方式对事物进行分类或打标签,二叉树分支方法缺点:决策树非常容易陷得很深(过拟合)。
    • 随机森林:通过组合多个过拟合评估器来降低过拟合程度的想法,其实是一种集成学习方法,称为装袋算法优点:无参数的随机森林模型非常适合处理多周期数据,不需要我们配置多周期模型!训练和预测速度都非常快。多任务可以直接并行计算。多棵树可以进行概率分类。无参数模型很灵活,在其他评估器都欠拟合的任务中表现突出。缺点:结果不太容易解释。
  2. 无监督学习

    • 主成分分析技术(principal component analysis, PCA):这是一种快速线性降维技术。沿着最不重要的主轴的信息都被去除了,仅留下含有最高方差值的数据成分。降维原理:发现一组比原始的像素基向量更能有效表示输入数据的基函数。用PCA作噪音过滤:建模->逆变换重构。缺点:经常受数据集的异常点影响。RandomizedPCA:使用了一个非确定算法,快速地近似计算出一个维度非常高的数据的前几个主成分。SparsePCA:引入了一个正则项来保证成分的稀疏性。
    • 流形学习它试图将一个低维度流形嵌入到一个高维度空间来描述数据集。多维度标度法(multidimensional scaling,MDS):它可以将一个数据集的距离矩阵还原成一个D维坐标来表示数据集。缺点:无法展示数据非线性嵌入的特征。当MDS失败时,局部线性嵌入法(locally linear embedding,LLE):该方法不保留所有的距离,而是只保留邻节点间的距离。通常情况下,modified LLE的效果比用其他算法还原实现定义好的流形数据的效果好。保距映射法(isometric mapping,Isomap):虽然LLE通常对现实世界的高维数据源的学习效果比较差,但是Isomap算法往往会获得比较好的嵌入效果。t-分布邻域嵌入算法(t-distributed stochastic neighbor embedding, t-SNE):将它用于高度聚类的数据效果比较好,但是该方法比其他方法学习速度慢。
    • k-means聚类:在不带标签的多维数据集中寻找确定数量的簇,最优的聚类结果需要符合以下两个假设:a. “簇中心点”是属于该簇的所有数据点坐标的算术平均值。b. 一个簇的每个点到该簇中心点的距离比其他簇中心点的距离短。k-means方法使用了一种容易理解、便于重复的期望最大化算法(E-M算法)取代了穷举搜索。使用E-M算法时的注意事项:a. 可能不会达到全局最优结果;b. 簇数量必须事先定好;c. k-means算法只能确定线性聚类边界。但是我们可以通过一个核变换将数据投影到更高维的空间,投影后的数据使线性分离称为可能。(这种核k-means算法可以在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的这两个缺点——类的形状缺少灵活性缺少簇分配的概率——使得它对许多数据集(特别是低维数据集)的拟合效果不尽人意。
    • 高斯混合模型(Gaussian mixture model, GMM):该模型可以被看作是k-means思想的一个扩展,一个聚类和密度评估器的混合体。GMM模型试图将数据构造成若干服从高斯分布的概率密度函数簇,即用不同高斯分布的加权汇总来表示概率分布估计。高斯混合模型本质上与k-means模型非常类似,它们都是用了期望最大化(E-M)方法。但高斯混合模型的每个簇的结果并不与硬边缘的空间有关,而是通过高斯平滑模型实现。GMM算法的本质是一个密度估计算法,即GMM拟合的结果并不是一个聚类模型,而是描述数据分布的生成概率模型。GMM可以利用改模型来评估数据的似然估计,并利用交叉验证来防止过拟合,还有一些纠正过拟合的标准分析方法,例如赤池信息准则(Akaike information criterion,AIC)贝叶斯信息准则(Bayesian information criterion,BIC)调整模型的似然估计。类的最优数量出现在AIC或BIC曲线最小值的位置。生成模型是贝叶斯生成分类器的一个非常有用的成分。
    • 核密度估计(kernel density estimation,KDE):该算法将高斯混合理念扩展到了逻辑极限(logical extreme)。它通过对每个点生成高斯分布的混合成分,获得本质上是无参数的密度估计器。核密度估计的自有参数是:a. 核类型(kernel),它可以指定每个点核密度分布的形状;b. 核带宽(kernel bandwidth),它控制每个点的核的大小。
  3. 验证模型(根据书上的例子,分为分类和回归,当然部分函数是可以混用的)

    1. 留出集和特征工程

      • 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.TfidVectorizerTF-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.hogHOG特征(方向梯度直方图,Histogram of Oriented Gradients)。它可以将图像像素转换为向量形式,与图像具体内容有关,与图像合成因素无关。它是一个简单的特征提取程序,专门用来识别行人(pedestrians)的图像内容。
    2. 分类(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())
    3. 回归(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)

7. 高斯过程学习笔记 / Gaussion Process