精华内容
下载资源
问答
  • python分类模型评估.doc

    2020-06-06 00:24:17
    Python 数据科学实战 作者常国珍 赵仁乾 张秋剑 模型评估与模型监控 1. 模型评估 模型评估指标是对模型的...1.1 混淆矩阵 在二分类模型预测中混淆矩阵是评估模型好坏的一种基本方法其通过模型预测 值与实际值的一致性来
  • python 分类模型评估 介绍 (Introduction) Picking the right machine learning algorithm is decisive, where it decides the performance of the model. The most dominating factor in choosing a model is the ...

    python 分类模型评估

    介绍 (Introduction)

    Picking the right machine learning algorithm is decisive, where it decides the performance of the model. The most dominating factor in choosing a model is the performance, which employs the KFold-cross-validation technique to achieve independence.

    选择正确的机器学习算法至关重要,它决定了模型的性能。 选择模型中最主要的因素是性能,该性能采用KFold交叉验证技术来实现独立性。

    The chosen model usually has a higher mean performance. Nevertheless, sometimes it originated through a statistical fluke. There are many statistical hypothesis-testing approaches to evaluate the mean performance difference resulting from the cross-validation to address this concern. If the difference is above the significance level `p-value` we can reject the null hypothesis that the two algorithms are the same, and the difference is not significant.

    所选模型通常具有较高的平均性能。 然而,有时它是由于统计fl幸而产生的。 有许多统计假设检验方法可以评估交叉验证产生的平均性能差异,以解决此问题。 如果差异高于显着性水平“ p值 ”,我们可以拒绝两种算法相同且差异不显着的原假设。

    I usually include such a step in my pipeline either when developing a new classification model or competing in one of Kaggle’s competitions.

    在开发新的分类模型或参加Kaggle的一项竞赛时,我通常会将这样的步骤包括在我的计划中。

    教程目标 (Tutorial Objectives)

    1. Understanding the difference between statistical hypothesis tests.

      了解统计假设检验之间的差异。
    2. Model selection based on the mean performance score could be misleading.

      基于平均性能得分的模型选择可能会产生误导。
    3. Why using the Paired Student’s t-test over the original Student’s t-test.

      为什么要使用配对学生的t检验代替原始学生的t检验。
    4. Applying the advance technique of 5X2 fold by utilizing the MLxtend library for comparing the algorithms based on p-value

      利用MLxtend库将5X2倍进阶技术应用于基于p值的算法比较

    表中的内容 (Table of content)

    1. What does the statistical significance testing mean?

      统计显着性检验是什么意思?
    2. Types of commonly used statistical hypothesis testings

      常用统计假设检验的类型
    3. Extract the best two models based on performance.

      根据性能提取最佳的两个模型。
    4. Steps to conduct hypothesis testing on the best two

      对最好的两个进行假设检验的步骤
    5. Steps to apply the 5X2 fold

      应用5X2折页的步骤
    6. Comparing Classifier algorithms

      比较分类器算法
    7. Summary

      摘要

    统计假设检验是什么意思? (What does the statistical hypothesis testing mean?)

    A statistical hypothesis test quantifies how plausible it is to witness two data samples, considering that they have the same distribution. That describes the null hypothesis. We can test this null hypothesis by applying some statistical calculations.

    统计假设检验可量化见证两个数据样本(假设它们具有相同的分布)是多么合理。 这描述了原假设。 我们可以通过应用一些统计计算来检验这种零假设。

    • If the test result infers insufficient proof to reject the null hypothesis, then any observed difference in the model scores is a happened by chance.

      如果测试结果推断出不足以拒绝无效假设的证据,则模型分数的任何观察到的差异都是偶然发生的。

    • If the test result infers sufficient evidence to reject the null hypothesis, then any observed difference in model scores is real.

      如果测试结果推断出足够的证据来否定原假设,那么模型分数中观察到的任何差异都是真实的。

    统计假设检验的类型 (Types of statistical hypothesis testings)

    Examining machine learning models via statistical significance tests requires some expectations that will influence the statistical tests used. The most robust way to such comparisons is called paired designs, which compare both models (or algorithms) performance on the same data. That way, both models (or algorithms) have to deal with the same difficulty.

    通过统计显着性检验检查机器学习模型需要一些期望,这些期望会影响所使用的统计测验。 进行此类比较的最可靠方法称为成对设计 ,该设计可以对同一数据的两个模型(或算法)的性能进行比较。 这样,两个模型(或算法)都必须处理相同的困难。

    In the following, each test has some pros and cons that you should consider during the selection.

    在下面的内容中,每个测试在选择时都应考虑一些利弊。

    P.N: There are other statistical tests used to compare classifiers, but those are the most recommended one.

    PN:还有其他统计测试可用于比较分类器,但最推荐使用这些测试。

    1. Independent data samples: used when having an unlimited dataset. You collect n samples for the train, and test dataset. Then calculate ten independent model scores for each method. Finally, apply the t-test to compare models. However, this approach isn’t practical because there is no unlimited data in real.

      独立数据样本 :用于无限数据集时使用。 您收集了n个 样本 训练和测试数据集。 然后为每种方法计算十个独立的模型得分。 最后,应用t检验比较模型。 但是,这种方法不切实际,因为实际上没有无限的数据。

    2. Ten-fold cross-validation: It uses the ordinary paired t-test. This method has good repeatability relative to other ways as well as a decent type II error. However, it has a high type I error; that’s why it is not recommended.

    2.十重交叉验证 :它使用普通的配对t检验。 该方法相对于其他方法具有良好的可重复性,并且具有不错的II型误差 。 但是,它具有很高的I型错误 ; 这就是为什么不建议这样做的原因。

    Comparing training algorithms via cross-validation makes stronger assumptions than comparing specific (fully trained) models’ predictive performance. Where the resampling validation (to which cross-validation belongs) cannot fully estimate the algorithm comparison’s variance uncertainty.

    通过交叉验证比较训练算法比比较特定的(经过充分训练的)模型的预测性能做出更强的假设。 重采样验证(交叉验证所属的)不能完全估计算法比较的方差不确定性的地方。

    3. McNemar’s test:

    3. McNemar的测试

    In statistics, McNemar’s test is a statistical test used on paired nominal data. It is applied to 2 × 2 contingency tables with a dichotomous trait, with matched pairs of subjects, to determine whether the row and column marginal frequencies are equal (that is, whether there is “marginal homogeneity”). — Wikipedia

    在统计中, 麦克尼马尔检验是对成对名义数据的统计检验。 将其应用于具有两分性状且匹配对象对的2×2列联表中,以确定行和列的边际频率是否相等(即是否存在“边际同质性”)。 — 维基百科

    It is recommended for the last twenty years. However, this method’s challenge is that you either need to build your functions to implement it or use a third party library where it is not commonly packed up for you in the tools you use.

    建议最近二十年使用。 但是,此方法的挑战在于,您要么需要构建函数来实现它,要么使用第三方库,而在使用的工具中通常不打包第三方库。

    4. Non-parametric Paired test: this method involves making a few assumptions. For example, assuming the distribution of model accuracies has a normal distribution(Gaussian).

    4.非参数配对检验 :此方法涉及一些假设。 例如,假设模型精度的分布具有正态分布(高斯)。

    The Wilcoxon signed-rank test is a non-parametric version of the paired Student’s t-test. Although the test is non-parametric, it still assumes the independency for observations inside each sample. Although using the k-fold cross-validation would break that assumption.

    Wilcoxon带符号秩检验是配对的学生t检验的非参数版本。 尽管测试是非参数的,但仍假定每个样本内部观察的独立性。 尽管使用k折交叉验证会打破这一假设。

    5. Estimation statistics: A data analysis framework that uses a combination of effect sizes, confidence intervals, precision planning, and meta-analysis to plan experiments, analyze data, and interpret results — Wikipedia. Nevertheless, when evaluating the model using the resampling method, the assumption of independence is broken. As an alternative, other statistical resampling methods like bootstrapping. Bootstrapping could estimate a robust non-parametric confidence interval. Hence, we can interpret the results and compare classifiers.

    5.估计统计量 :一种数据分析框架,结合了效应量,置信区间,精确计划和元分析来计划实验,分析数据和解释结果-Wikipedia 。 然而,当使用重采样方法评估模型时,独立性的假设被打破了。 作为替代,其他统计重采样方法(如引导程序)。 自举可以估计鲁棒的非参数置信区间。 因此,我们可以解释结果并比较分类器。

    5X2折页方法背后的直觉 (The intuition behind the 5X2 fold approach)

    An approach to evaluate each model on the same k-fold cross-validation split of the data and calculates each split score. That would give a sample of ten scores for ten-fold cross-validation. Then, we can compare those scores using the paired statistical test.

    一种在数据的相同k倍交叉验证拆分上评估每个模型并计算每个拆分得分的方法。 这将给出十倍交叉验证的十个分数样本。 然后,我们可以使用配对统计检验比较那些分数。

    Due to using the same data rows to train the model more than once, the assumption of independence is violated; hence, the test would be biased.

    由于多次使用相同的数据行来训练模型,因此违反了独立性的假设; 因此,测试会产生偏差。

    This statistical test could be adjusted to overcome the lack of independence. Also, the number of folds and repeats of the method can be configured to achieve a better sampling of model performance.

    可以调整此统计测试以克服缺乏独立性的问题。 同样,可以配置该方法的折叠次数和重复次数,以实现对模型性能的更好采样。

    Thomas Dietterich proposed this approach in the “Approximate Statistical Tests for Comparing Supervised Classification Learning Algorithms.” — 1998

    Thomas Dietterich在“用于比较监督分类学习算法的近似统计测试”中提出了这种方法 -1998年

    加载数据集 (Loading dataset)

    For this tutorials, I will make use of the load_iris dataset within the sklearn library. However, the steps are the same for any ML problem.

    在本教程中,我将利用sklearn库中的load_iris数据集。 但是,对于任何ML问题,步骤都是相同的。

    Image for post
    peek into the iris dataset
    窥视虹膜数据集

    提取最佳两种模型的步骤 (Steps to extract the best two models)

    In this steps, I will conduct a comparison between four different algorithms based on performance accuracy score. Then will select the two models with the highest score to conduct hypothesis testing between them.

    在此步骤中,我将基于性能准确性得分对四种不同算法进行比较。 然后将选择得分最高的两个模型在它们之间进行假设检验。

    # Spot-Check Algorithms
    models = []
    models.append(('LR', LogisticRegression(max_iter=1000)))
    models.append(('LDA', LinearDiscriminantAnalysis()))
    models.append(('KNN', KNeighborsClassifier()))
    models.append(('DSC', DecisionTreeClassifier(random_state = 1, max_depth=2)))
    models.append(('SVM', SVC()))
    # evaluate each model in turn
    results = []
    names = []
    for name, model in models:
    kfold = RepeatedStratifiedKFold(n_splits=10, n_repeats = 3, random_state=1)
    cv_results = cross_val_score(model, X, y, cv=kfold, scoring='accuracy')
    results.append(cv_results)
    names.append(name)
    msg = "%s: %.2f (%.3f)" % (name, cv_results.mean(), cv_results.std())
    print(msg)

    Results:

    结果:

    LR: 0.96 (0.041)
    LDA: 0.98 (0.031)
    KNN: 0.96 (0.037)
    DSC: 0.94 (0.051)
    SVM: 0.96 (0.045)

    It seems that LR, KNN and SVM has same mean with slightly different standard deviation. However, LDA shows a higher performance, in the other hands, DTC shows the lowest performance over the rest of algorithms. Let's build a boxplot betweeen KNN , DTC,and LDA as a visualization for more interpretation.

    似乎LR, KNNSVM具有相同的平均值,但标准偏差略有不同。 但是, LDA表现出更高的性能,而DTC在其余算法中表现出最低的性能。 让我们在KNNDTC,LDA之间构建一个箱形图,以可视化的方式进行更多的解释。

    import matplotlib.pyplot as pltplt.figure(figsize = (15, 10))
    plt.grid(False)
    plt.title("Mean accuracies between the best two selected algorithms", fontsize = 25, fontweight = 'bold')
    Image for post
    mean accuracies between algorithms
    算法之间的平均精度

    It seems that LDA and DTC perform the same, so Let’s pick those two.

    LDA和DTC似乎执行相同的操作,因此让我们选择两者。

    For this classification problem, you could implement logistic regression. However, I went for more complex classification algorithms to show the idea of hypothesis testing.

    对于此分类问题,您可以实施逻辑回归。 但是,我选择了更复杂的分类算法来展示假设检验的思想。

    假设检验的步骤 (Steps to hypothesis testing)

    The first step would be to to state the null hypothesis statement.

    第一步将是陈述原假设假设。

    H0: Both models have the same performance on the dataset.

    H0:两种模型在数据集上的性能相同。

    H1: Both models doesn’t have the same performance on the dataset.

    假设1:两个模型在数据集上的性能都不相同。

    Significance level is 0.05

    显着性水平是0.05

    let’s assume a significance threshold of α=0.05 for rejecting the null hypothesis that both algorithms perform equally well on the dataset and conduct the 5x2_cv _t_test.

    我们假设α= 0.05的显着性阈值用于拒绝零假设,即两种算法在数据集上的性能均相同,并执行5x2_cv _t_test。

    # evaluate model 1
    model1 = LinearDiscriminantAnalysis()
    cv1 = RepeatedStratifiedKFold(n_splits = 10, n_repeats = 3, random_state = 1)
    scores1 = cross_val_score(model1, X, y, scoring = 'accuracy', cv = cv1, n_jobs = -1)
    print('LDA Mean Accuracy: %.1f%% +/-(%.3f)' % (mean(scores1*100), std(scores1)))# evaluate model 2
    model3 = DecisionTreeClassifier(random_state = 1, max_depth=2)
    cv2 = RepeatedStratifiedKFold(n_splits = 10, n_repeats = 3, random_state = 1)
    scores3 = cross_val_score(model2, X, y, scoring = 'accuracy', cv = cv2, n_jobs = -1)
    print('DecisionTreeClassifier Mean Accuracy: %.1f%% +/-(%.3f)' % (mean(scores3*100), std(scores3)))# plot the results
    plt.boxplot([scores1, scores2], labels=['LDA', 'DTC'], showmeans=True)
    plt.show()

    Results

    结果

    LDA Mean Accuracy: 98.0% +/-(0.031)
    DecisionTreeClassifier Mean Accuracy: 96.4% +/-(0.037)

    Seems that LDA has a better performance over the DTCwhere LDAhas a higher accuracy.

    似乎LDA具有比DTC更高的性能,在DTCLDA具有更高的精度。

    使用MLxtend封装的5 x 2 CV (5 by 2 CV using MLxtend package)

    You can implement the 5X2 CV fold from scratch; however, there is a nice package that saves you much time called MLxtend. I will use the paired_ttest_5x2cv function from the evaluation module to calculate the t and p value for both models.

    您可以从头开始实现5X2 CV折叠; 但是,有一个名为MLxtend的不错的程序包可以为您节省很多时间。 我将使用评估模块中的paired_ttest_5x2cv函数来计算两个模型的t和p值。

    from mlxtend.evaluate import paired_ttest_5x2cv
    # check if difference between algorithms is real
    t, p = paired_ttest_5x2cv(estimator1=model1,
    estimator2=model2,
    X=X,
    y=y,
    scoring='accuracy',
    random_seed=1)
    # summarize
    print(f'The P-value is = {p:.3f}')
    print(f'The t-statistics is = {t:.3f}')
    # interpret the result
    if p <= 0.05:
    print('Since p<0.05, We can reject the null-hypothesis that both models perform equally well on this dataset. We may conclude that the two algorithms are significantly different.')
    else:
    print('Since p>0.05, we cannot reject the null hypothesis and may conclude that the performance of the two algorithms is not significantly different.')

    Results:

    结果:

    The P-value is = 0.027
    The t-statistics is = 3.101
    Since p<0.05, We can reject the null-hypothesis that both models perform equally well on this dataset. We may conclude that the two algorithms are significantly different

    Now you have a strong argument about why picking LDA over the DTC.

    现在,您对为什么要在DTC上选择LDA提出了强烈的质疑。

    摘要 (Summary)

    Finally, I hope this tutorial gave you a nice illustration of how to use hypothesis testing to develop a more makes sense model. My suggestion is to include algorithms comparison in your classification pipeline. Try to iterate as well as trying different algorithm performance comparisons.

    最后,我希望本教程为您提供一个很好的说明,说明如何使用假设检验来开发更有意义的模型。 我的建议是在分类管道中包括算法比较。 尝试迭代以及尝试不同的算法性能比较。

    Thanks for reading!

    谢谢阅读!

    翻译自: https://towardsdatascience.com/evaluate-ml-classifier-performance-using-statistical-hypothesis-testing-in-python-e4b90eb27dce

    python 分类模型评估

    展开全文
  • 原标题:Python 线性分类模型简介编译:伯乐在线 - bound在过去几周中,我们开始对机器学习有了更多的了解,也认识到机器学习在机器视觉、图像分类和深度学习领域的重要作用。我们已经看到卷积神经网络,如LetNet,...

    原标题:Python 线性分类模型简介

    编译:伯乐在线 - bound

    在过去几周中,我们开始对机器学习有了更多的了解,也认识到机器学习在机器视觉、图像分类和深度学习领域的重要作用。

    我们已经看到卷积神经网络,如LetNet,可以用于对MNIST数据集的手写字迹进行分类。我们使用了k-NN算法来识别一张图片中是否含有猫或狗,并且我们也已经学习了如何调参来优化模型,进而提高分类精度。

    然而,还有一个重要的机器学习的算法我们尚未涉及:这个算法非常容易构建,并能很自然地扩展到神经网络和卷积神经网络中。

    是什么算法呢?

    它是一个简单的线性分类器,并且由于其算法很直观,被认为是更多高级的机器学习和深度学习算法的基石。

    继续阅读来加深你对线性分类器的认识,以及如何使用它们进行图像分类。

    Python线性分类模型简介

    本教程的前半部分主要关注线性分类有关的基本原理和数学知识。总的来说,线性分类指的是那些真正从训练数据中“学习”的有参分类算法。

    在这里,我提供了一个真正的线性分类实现代码,以及一个用scikit-learn对一张图片中的内容分类的例子。

    4大参数化学习和线性分类的组件

    我已经多次使用“参数化”,但它到底是什么意思?

    简而言之:参数化是确定模型必要参数的过程。

    在机器学习的任务中,参数化根据以下几个方面来确定面对的问题:

    数据:这是我们将要学习的输入数据。这些数据包括了数据点(例如,特征向量,颜色矩阵,原始像素特征等)和它们对应的标签。

    评分函数:一个函数接收输入数据,然后将数据匹配到类标签上。例如,我们输入特征向量后,评分函数就开始处理这些数据,调用某个函数f(比如我们的评分函数),最后返回预测的分类标签。

    损失函数:损失函数可以量化预测的类标签与真实的类标签之间的匹配程度。这两个标签集合之间的相似度越高,损失就越小(即分类精度越高)。我们的目标是最小化损失函数,相应就能提高分类精度。

    权重矩阵:权重矩阵,通常标记为W,它是分类器实际优化的权重或参数。我们根据评分函数的输出以及损失函数,调整并优化权重矩阵,提高分类精度。

    注意:取决于你使用的模型的种类,参数可能会多的多。但是在最底层,你会经常遇到4个参数化学习的基本模块。

    一旦确定了这4个关键组件,我们就可以使用优化方法来找到评分函数的一组参数W,使得损失函数达到最小值(同时提升对数据的分类准确度)

    接下来,我们就将看到如何利用这些组件,搭建一个将输入数据转化为真实预测值的分类器。

    线性分类器:从图片到标签

    在这部分中,我们将更多的从数学角度研究参数模型到机器学习。

    首先,我们需要数据。假设训练数据集(图片或者压缩后的特征向量)标记为,每个图或特征向量都有对应的类标签 。我们用 和表示有N个D维(特征向量的长度)的数据点,划分到K个唯一的类别中。

    为了这些表达式更具体点,参考我们以前的教程:基于提取后的颜色矩阵,使用knn分类器识别图片中的猫和狗。

    这份数据集中,总共有N=25,000张图片,每张图片的特征都是一个3D颜色直方图,其中每个管道有8个桶。这样产出的特征向量有D=8 x 8 x 8 = 512个元素。最后,我们有k=2个类别标签,一个是“狗”,另一个是“猫”。

    有了这些变量后,我们必须定义一个评分函数f,将特征向量映射到类标签的打分上。正如本篇博客标题所说,我们将使用一个简单的线性映射:

    我们假设每个都由一个形状为[D x 1]的单列向量所表示。我们在本例中要再次使用颜色直方图,不过如果我们使用的是原始像素粒度,那可以直接把图片中的像素压扁到一个单列向量中。

    我们的权重矩阵W形状为[K x D](类别标签数乘以特征向量的维数)

    最后,偏置矩阵b,大小为[K x 1]。实质上,偏置矩阵可以让我们的评分函数向着一个或另一个方向“提升”,而不会真正影响权重矩阵W,这点往往对学习的成功与否非常关键。

    回到Kaggle的猫和狗例子中, 每个都表示为512维颜色直方图,因此的形状是[512 x 1]。权重矩阵W的形状为[2 x 512],而偏置矩阵b为[2 x 1]。

    下面展示的是线性分类的评分函数f

    在上图的左侧是原始输入图片,我们将从中提取特征。在本例中,我们计算的是一个512维的颜色直方图,也可以用其他一些特征表示方式(包括原始像素密度),但是对于这个例子,我们就只用颜色分布,即直方图来表示xi。

    然后我们有了权重矩阵W,有2行(每个类标签一行)和512列(每一列都是特征向量中的条目)

    将W和xi点乘后,再加上大小为[2 x 1]的偏置矩阵bi。

    最后就得到了右边的两个值:猫和狗标签各自的分数。

    看着上面的公式,你可以确信输入xi和yi都是固定的,没法修改。我们当然可以通过不同的特征提取技术来得到不同的xi,但是一旦特征抽取后,这些值就不会再改变了。

    实际上,我们唯一能控制的参数就是权重矩阵W以及偏置向量b。因此,我们的目标是利用评分函数和损失函数去优化权重和偏置向量,来提升分类的准确度。

    如何优化权重矩阵则取决于我们的损失函数,但通常会涉及梯度下降的某种形式。我们会在以后的博客中重温优化和损失函数的概念,不过现在只要简单理解为给定了一个评分函数后,我们还需要定义一个损失函数,来告诉我们对于输入数据的预测有多“好”。

    参数学习和线性分类的优点

    利用参数学习有两个主要的优点,正如我上面详述的方法:

    一旦我们训练完了模型,就可以丢掉输入数据而只保留权重矩阵W和偏置向量b。这大大减少了模型的大小,因为我们只需要存储两个向量集合(而非整个训练集)。

    对新的测试数据分类很快。为了执行分类,我们要做的只是点乘W和xi,然后再加上偏置b。这样做远比将每个测试点和整个训练集比较(比如像knn算法那样)快的多。

    既然我们理解了线性分类的原理,就一起看下如何在python,opencv和scikit-learn中实现。

    使用python,opencv和scikit-learn对图片线性分类

    就像在之前的例子Kaggle 猫vs狗数据集和knn算法中,我们将从数据集中提取颜色直方图,不过和前面例子不同的是,我们将用一个线性分类器,而非knn。

    准确地说,我们将使用线性支持向量机(SVM),即在n维空间中的数据之间构造一个最大间隔分离超平面。这个分离超平面的目标是将类别为i的所有(或者在给定的容忍度下,尽可能多)的样本分到超平面的一边,而所有类别非i的样本分到另一边。

    关于支持向量机的具体描述已经超出本博客的范围。(不过在PyImageSearch Gurus course有详细描述)

    同时,只需知道我们的线性SVM使用了和本博客“线性分类器:从图片到标签”部分中相似的评分函数,然后使用损失函数,用于确定最大分离超平面来对数据点分类(同样,我们将在以后的博客中讲述损失函数)。

    我们从打开一个新文件开始,命名为linear_classifier.py,然后插入以下代码:

    # import the necessary packages

    fromsklearn.preprocessingimportLabelEncoder

    fromsklearn.svmimportLinearSVC

    fromsklearn.metricsimportclassification_report

    fromsklearn.cross_validationimporttrain_test_split

    fromimutilsimportpaths

    importnumpyasnp

    importargparse

    importimutils

    importcv2

    importos

    从第2行至11行导入了必须的python包。我们要使用scikit-learn库,因此如果你还没安装的话,跟着这些步骤,确保将其安装到你机器上。

    我们还将使用我的imutils包,用于方便处理图像的一系列函数。如果你还没有安装imutils,那就让pip安装。

    $ pip install imutils

    现在我们定义extract_color_histogram 函数,用于提取和量化输入图片的内容:

    defextract_color_histogram(image,bins=(8,8,8)):

    # extract a 3D color histogram from the HSV color space using

    # the supplied number of `bins` per channel

    hsv=cv2.cvtColor(image,cv2.COLOR_BGR2HSV)

    hist=cv2.calcHist([hsv],[0,1,2],None,bins,

    [0,180,0,256,0,256])

    # handle normalizing the histogram if we are using OpenCV 2.4.X

    ifimutils.is_cv2():

    hist=cv2.normalize(hist)

    # otherwise, perform "in place" normalization in OpenCV 3 (I

    # personally hate the way this is done

    else:

    cv2.normalize(hist,hist)

    # return the flattened histogram as the feature vector

    returnhist.flatten()

    这个函数接收一个输入image ,将其转化为HSV颜色空间,然后利用为每个通道提供的bins,计算3D颜色直方图。

    利用cv2.calcHist函数计算出颜色直方图后,将其归一化后返回给调用函数。

    有关extract_color_histogram方法更详细的描述,参阅这篇博客(http://www.pyimagesearch.com/2016/08/08/k-nn-classifier-for-image-classification/)。

    接着,我们从命令行解析参数,并初始化几个变量:

    # import the necessary packages

    fromsklearn.preprocessingimportLabelEncoder

    fromsklearn.svmimportLinearSVC

    fromsklearn.metricsimportclassification_report

    fromsklearn.cross_validationimporttrain_test_split

    fromimutilsimportpaths

    importnumpyasnp

    importargparse

    importimutils

    importcv2

    importos

    defextract_color_histogram(image,bins=(8,8,8)):

    # extract a 3D color histogram from the HSV color space using

    # the supplied number of `bins` per channel

    hsv=cv2.cvtColor(image,cv2.COLOR_BGR2HSV)

    hist=cv2.calcHist([hsv],[0,1,2],None,bins,

    [0,180,0,256,0,256])

    # handle normalizing the histogram if we are using OpenCV 2.4.X

    ifimutils.is_cv2():

    hist=cv2.normalize(hist)

    # otherwise, perform "in place" normalization in OpenCV 3 (I

    # personally hate the way this is done

    else:

    cv2.normalize(hist,hist)

    # return the flattened histogram as the feature vector

    returnhist.flatten()

    # construct the argument parse and parse the arguments

    ap=argparse.ArgumentParser()

    ap.add_argument("-d","--dataset",required=True,

    help="path to input dataset")

    args=vars(ap.parse_args())

    # grab the list of images that we'll be describing

    print("[INFO] describing images...")

    imagePaths=list(paths.list_images(args["dataset"]))

    # initialize the data matrix and labels list

    data=[]

    labels=[]

    33行到36行解析命令行参数。我们这里只需要一个简单的开关,—dataset是kaggle 猫vs狗数据集的路径。

    然后我们将25000张图片保存的磁盘位置赋值给imagePaths,跟着初始化一个data矩阵,存储提取后的特征向量和类别labels。

    说到提取特征,我们接着这样做:

    # loop over the input images

    for(i,imagePath)inenumerate(imagePaths):

    # load the image and extract the class label (assuming that our

    # path as the format: /path/to/dataset/{class}.{image_num}.jpg

    image=cv2.imread(imagePath)

    label=imagePath.split(os.path.sep)[-1].split(".")[0]

    # extract a color histogram from the image, then update the

    # data matrix and labels list

    hist=extract_color_histogram(image)

    data.append(hist)

    labels.append(label)

    # show an update every 1,000 images

    ifi>0andi%1000==0:

    print("[INFO] processed {}/{}".format(i,len(imagePaths)))

    在47行,我们开始对输入的imagePaths进行遍历,对于每个imagePath,我们从磁盘中加载image,提取类别label,然后通过计算颜色直方图来量化图片。然后我们更新data和labels各自的列表。

    目前,我们的labels是一个字符串列表,如“狗”或者“猫”。但是,很多scikit-learn中的机器学习算法倾向于将labels编码为整数,每个标签有一个唯一的数字。

    使用LabelEncoder类可以很方便的将类别标签从字符串转变为整数:

    # import the necessary packages

    fromsklearn.preprocessingimportLabelEncoder

    fromsklearn.svmimportLinearSVC

    调用了 .fit_transform方法后,现在我们的labels表示为整数列表。

    代码的最后一部分将数据划分为训练和测试两组、训练线性SVM、评估模型。

    # partition the data into training and testing splits, using 75%

    # of the data for training and the remaining 25% for testing

    print("[INFO] constructing training/testing split...")

    (trainData,testData,trainLabels,testLabels)=train_test_split(

    np.array(data),labels,test_size=0.25,random_state=42)

    # train the linear regression clasifier

    print("[INFO] training Linear SVM classifier...")

    model=LinearSVC()

    model.fit(trainData,trainLabels)

    # evaluate the classifier

    print("[INFO] evaluating classifier...")

    predictions=model.predict(testData)

    print(classification_report(testLabels,predictions,

    target_names=le.classes_))

    70和71行构造了训练集和测试集。我们将75%的数据用于训练,剩下的25%用于测试。

    我们将使用scikit-learn库实现的LinearSVC(75和76行)来训练线性SVM。

    最后,80到82行评估我们的模型,显示一个格式整齐的报告,来说明模型的执行情况。

    需要注意的一点是,我故意没有进行调参,只是为了让这个例子简单,容易理解。不过,既然提到了,我就把LinearSVC 分类器的调参作为练习留个读者。可以参考我以前的k-NN分类器调参博客。

    评估线性分类器

    为了测试我们的线性分类器,确保你已经下载了:

    1. 本博客中的源代码,可以使用教程底部的“下载”部分。

    2. kaggle 猫vs狗数据集

    有了代码和数据集之后,你可以执行如下命令:

    $ python linear_classifier.py --dataset kaggle_dogs_vs_cats

    特征提取过程大约要花费1-3分钟不等,具体时间根据机器的速度。

    之后,训练并评估我们的线性SVM:

    正如上图所示,我们的分类精度有64%,大致接近本教程中调参后的knn算法精度。

    注意:对线性SVM调参可以得到更高的分类精度,为了使教程稍微短一点,而且不至于太复杂,我简单地省略了这个步骤。

    此外,我们不仅得到了和knn相同的分类精度,模型的测试时间也快的多,只需要将权重矩阵和数据集进行点乘(高度优化后),然后是一个简单的加法。

    我们也可以在训练完成后丢弃训练集,只保留权重矩阵W和偏置向量b,从而大大精简了模型表示。

    总结

    在今天的博客中,我讨论了参数学习和线性分类的基础概念。虽然线性分类器比较简单, 但它被视为更多高级的机器学习和深度学习算法的基石,并能很自然地扩展到神经网络和卷积神经网络中。

    你看,卷积神经网络可以将原始像素映射到类别标签,类似于我们在本教程中所作的那些,只是评分函数f更复杂,并且参数更多。

    参数学习的一大好处就是可以在训练完毕之后,丢弃原训练数据。我们可以只用从数据中学到的参数(比如,权重矩阵和偏置向量)来进行分类。

    这使得分类变得非常高效,因为(1)我们不需要像knn那样在模型中存储一份训练数据的拷贝(2)我们不用将测试图片一个一个的和训练图片进行比较(一个O(N)的操作,并且当数据集很大时就变得非常麻烦)

    简而言之,这个方法明显更快,只需一个简单的点乘和加法。非常简洁,不是吗?

    最后,我们在kaggle 狗vs猫的数据集上,利用Python, OpenCV, 和 scikit-learn进行线性分类。从数据集提取出颜色直方图之后,我们在特征向量上训练一个线性支持向量机,并且得到64%的分类精度,这已经很不错了,因为(1)颜色直方图并非狗和猫特征化的最佳选择(2)我们没有对线性SVM进行调参。

    到这里,我们开始理解了构建神经网络、卷积神经网络和深度学习模型的基本模块,但还有很长一段路要走。

    首先,我们需要更详细地了解损失函数,特别是如何使用损失函数来优化权重矩阵以获得更准确的预测。 未来的博客文章将更详细地介绍这些概念。

    关注「大数据与机器学习文摘」,成为Top 1%返回搜狐,查看更多

    责任编辑:

    展开全文
  • python分类预测模型总结

    千次阅读 2018-08-27 14:15:57
    线性分类模型 sklearn.linear_model SVM 用来回归、预测、分类等。模型可以是线性的/非线性的 sklearn.svm 决策树 基于“分类讨论、逐步细化”思想的分类模型,直观易解释 sklearn.tree ...
    常见的模型评价和在Python中的实现
    模型 模型特点 所属库
    逻辑回归 线性分类模型 sklearn.linear_model
    SVM 用来回归、预测、分类等。模型可以是线性的/非线性的 sklearn.svm
    决策树 基于“分类讨论、逐步细化”思想的分类模型,直观易解释 sklearn.tree
    随机森林 思想跟决策树类似,精度通常比决策树高,缺点是由于其随机性,丧失了决策树的可解释性 sklearn.ensemble
    朴素贝叶斯 基于概率思想的简单有效的分类模型 sklearn.naive_bayes
    神经网络 具有强大的拟合能力,可以用于拟合、分类等,是深度学习的模型基础 Keras

    python数据挖掘建模中,

    第一个步骤是建立一个对象,这个对象是空白的,需要进一步训练的;

    然后,设置模型的参数;

    接着,通过fit()方法对模型进行训练;

    最后,通过predict()方法预测结果。也可以通过其他方法对模型评估,如score()等。

    展开全文
  • 比较基础的线性分类模型,很多时候是简单有效的选择 sklearn.linear_model SVM 强大的模型,可以用来回归、预测、分类等,而根据选取不同的核函数。模型可以是线性的/非线性的 sklearn.svm 决策树 基于“分类...

    读《Python数据分析与挖掘实战》笔记
    常见的模型评价和在Python中的实现——

    模型 模型特点 位于
    逻辑回归 比较基础的线性分类模型,很多时候是简单有效的选择 sklearn.linear_model
    SVM 强大的模型,可以用来回归、预测、分类等,而根据选取不同的核函数。模型可以是线性的/非线性的 sklearn.svm
    决策树 基于“分类讨论,逐步细化”思想的分类模型,模型直观,易解释 sklearn.tree
    随机森林 思想跟决策树类似,精度通常比决策树高,缺点是由于其随机性,丧失了决策树的可解释性 sklearn.ensemble
    朴素贝叶斯 基于概念思想的简单有效的分类模型,能够给出容易理解的概率解释 sklearn.naive_bayes
    神经网络 具有强大的拟合能力,可以用于拟合、分类等 Keras
    展开全文
  • K临近分类算法是数据挖掘中较为简单的一种分类方法,通过计算不同数据点...本篇文章将介绍在python中使用机器学习库sklearn建立K临近模型(k-NearestNeighbor)的过程并使用模型对数据进行预测。准备工作首先是开始前...
  • 本文实例为大家分享了python sklearn分类算法模型调用的具体代码,供大家参考,具体内容如下实现对'NB','KNN','LR','RF','DT','SVM','SVMCV','GBDT'模型的简单调用。# coding=gbkimport timefrom sklearn import ...
  • 本文主要向大家介绍了Python语言线性分类模型简介,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助。在过去几周中,我们开始对机器学习有了更多的了解,也认识到机器学习在机器视觉、图像分类和深度...
  • 项目环境:Python3.6Anaconda+Pipenv管理使用# 下载代码git clone https://github.com/howie6879/char_cnn_text_classification.git# 利用anaconda建立Python3.6环境conda create -n python36 python=3.6# 进入项目...
  • 作者:Jason Brownlee翻译:候博学前言机器学习是一个从训练集中学习出算法的研究领域。...你可能会在机器学习中遇到许多不同类型的分类任务,但是其实每种模型都会使用与之相对应的建模方法。因此在...
  • python:分类模型基础

    2020-09-14 09:55:58
    1.分类模型基础 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200914093749911.png#pic_center) 针对的是类别型变量![在这里插入图片描述]...
  • 构建并评价分类模型分类是指构造一个分类模型,输入样本的特征值,输出对应的类别,将每个样本映射到预先定义好的类别。分类模型建立在已有类标记的数据集上,属于有监督学习。在实际应用场景中,分类算法被用于行为...
  • python里的分类模型

    2020-05-07 10:11:09
    python里有两个包可以做分类模型,一个是sm.logit,另外一个是sklearn里的logisticRegression。 sm.logit能给出p value,但只针对于二分类。 logisticRegression可以做多分类,但是不能给出p value 要想做多分类...
  • 主要介绍了python SVM 线性分类模型的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 常见分类模型python实现

    千次阅读 2019-09-03 23:17:06
    1.常用分类模型 SVM MLP Bayes GBDT Logistic Regressor 2.python实现 sklearn上已经有现成的包。 SVC: import numpy as np X = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]]) y = np.array([1, 1, 2...
  • python机器学习分类模型评估1、混淆矩阵在分类任务下,预测结果(Predicted Condition)与正确标记(True Condition)之间存在四种不同的组合,构成混淆矩阵(适用于多分类)2、准确率、精确率、召回率、F1-score准确率:...
  • 随着人工智能热潮的发展,图像识别已经成为了其中非常重要...该项目分为三部分:第一部分:系统驱动的安装与环境的搭建第二部分:利用VGG16网络进行模型训练与预测第三部分:通过模型算法的部署,实现模型预测的页面...
  • python SVM 线性分类模型

    千次阅读 2018-07-08 10:42:57
    运行环境:win10 64位 py 3.6 pycharm 2018.1.1 导入对应的包和数据 import matplotlib.pyplot as plt import numpy as np from sklearn import datasets,linear_model,cross_validation,svm ...
  • #coding:utf-8 import numpy as np from PIL import Image,ImageDraw,ImageFile import cv2 import imagehash import time import os import pytesseract from collections import defaultdict ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,954
精华内容 1,981
关键字:

python分类模型

python 订阅