精华内容
下载资源
问答
  • 分类算法
    万次阅读 多人点赞
    2020-08-30 21:10:18

    时间序列分类算法

    A common task for time series machine learning is classification. Given a set of time series with class labels, can we train a model to accurately predict the class of new time series?

    时间序列机器学习的常见任务是分类。 给定一组带有类别标签的时间序列,我们可以训练模型来准确预测新时间序列的类别吗?

    Image for post
    Univariate time series classification with sktime sktime的单变量时间序列分类

    There are many algorithms dedicated to time series classification! This means you don’t have wrangle your data into a scikit-learn classifier or to turn to deep learning to solve every time series classification task.

    有许多专用于时间序列分类的算法! 这意味着您无需将数据纠缠到scikit-learn分类器中,也无需转向深度学习来解决每个时间序列分类任务。

    In this article, I will introduce five categories of time series classification algorithms with details of specific algorithms. These specific algorithms have been shown to perform better on average than a baseline classifier (KNN) over a large number of different datasets [1].

    在本文中,我将介绍五种时间序列分类算法,以及特定算法的详细信息。 在大量不同的数据集上,这些特定算法的平均表现优于基线分类器(KNN)[1]。

    1. Distance-based (KNN with dynamic time warping)

      基于距离(具有动态时间扭曲的KNN)
    2. Interval-based (TimeSeriesForest)

      基于时间间隔(TimeSeriesForest)
    3. Dictionary-based (BOSS, cBOSS)

      基于字典(BOSS,cBOSS)
    4. Frequency-based (RISE — like TimeSeriesForest but with other features)

      基于频率的(RISE-与TimeSeriesForest类似,但具有其他功能)
    5. Shapelet-based (Shapelet Transform Classifier)

      基于Shapelet(Shapelet变换分类器)

    I conclude with brief guidance on selecting an appropriate algorithm.

    最后,我将对选择合适的算法进行简要指导。

    The algorithms described in this article have been implemented in the sktime python package.

    本文介绍的算法已在sktime python软件包中实现。

    为什么要使用时间序列专用算法? (Why dedicated algorithms for time series?)

    Time series classification algorithms tend to perform better than tabular classifiers on time series classification problems.

    在时间序列分类问题上,时间序列分类算法的性能往往优于表格分类器。

    A common, but problematic solution to time series classification is to treat each time point as a separate feature and directly apply a standard learning algorithm (e.g. scikit-learn classifiers). In this approach, the algorithm ignores information contained in the time order of the data. If the feature order were scrambled, the predictions wouldn’t change.

    时间序列分类的一个常见但有问题的解决方案是将每个时间点视为一个单独的功能,并直接应用标准学习算法(例如scikit-learn分类器)。 在这种方法中,算法将忽略数据时间顺序中包含的信息。 如果功能顺序被打乱,则预测不会改变。

    It is also common to use deep learning to classify time series. LSTMs and CNNs are capable of mining dynamical characteristics of time series, hence their success. Yet neural networks have some challenges that make them unsuitable for many classification tasks:

    使用深度学习对时间序列进行分类也是很常见的。 LSTM和CNN能够挖掘时间序列的动态特征,因此很成功。 然而,神经网络面临一些挑战,使它们不适用于许多分类任务:

    • Selecting an efficient architecture

      选择高效的架构
    • Hyper-parameter tuning

      超参数调整
    • Limited data (neural networks need many examples)

      数据有限(神经网络需要很多示例)
    • Slow to train

      训练慢

    In spite of these challenges, there do exist specific neural network architectures for time series classification. These have been implemented in the sktime-dl python package.

    尽管存在这些挑战,但确实存在用于时间序列分类的特定神经网络体系结构。 这些已在sktime-dl python包中实现。

    时间序列分类的基本概念 (Foundational Concepts of Time Series Classification)

    时间序列转换(Time Series Transformations)

    Many time series specific algorithms are compositions of transformed time series and conventional classification algorithms, such as those in scikit-learn.

    许多特定于时间序列的算法是变换后的时间序列和常规分类算法(例如scikit-learn中的算法)的组合

    Feature extraction is very diverse and complex.

    特征提取非常多样化和复杂。

    Features can be extracted globally (over the entire time series) or locally (over regular intervals/bins, random intervals, sliding windows of intervals, and so on).

    可以全局(在整个时间序列上)或局部(在常规间隔/区间,随机间隔,间隔的滑动窗口等)上提取要素。

    Series can be transformed into primitive values (e.g. mean, standard deviation, slope) or into other series (e.g. Fourier transform, series of fitted auto-regressive coefficients).

    级数可以转换为原始值(例如,均值,标准差,斜率),也可以转换为其他级数(例如,傅立叶变换,拟合的自回归系数系列)。

    Last, transformations can one-dimensional or multi-dimensional.

    最后,转换可以是一维多维的

    承包 (Contracting)

    Contracting is a key concept used in most algorithms described in this article.

    合同是本文描述的大多数算法中使用的关键概念。

    Simply stated, contracting limits the run time of an algorithm. Until the allotted time expires, the algorithm continues iterating to learn the given task.

    简而言之,合同限制了算法的运行时间。 在分配的时间到期之前,算法将继续迭代以学习给定的任务。

    基于距离的分类 (Distance-Based Classification)

    These classifiers use distance metrics to determine class membership.

    这些分类器使用距离度量来确定类成员身份。

    时间序列的K最近邻(具有动态时间规整) (K-Nearest Neighbors (with Dynamic Time Warping) for Time Series)

    The popular k-nearest neighbors (KNN) algorithm can be adapted for time series by replacing the Euclidean distance metric with the dynamic time warping (DTW) metric. DTW measures similarity between two sequences that may not align exactly in time, speed, or length. (Click here for my explanation of DTW for time series clustering).

    通过用动态时间规整(DTW)度量代替欧几里得距离度量,可以将流行的k最近邻(KNN)算法应用于时间序列。 DTW测量可能在时间,速度或长度上未完全对齐的两个序列之间的相似性。 (单击此处可了解我对时间序列聚类的DTW的解释)。

    KNN with DTW is commonly used as a benchmark for evaluating time series classification algorithms because it is simple, robust, and does not require extensive hyperparameter tuning.

    具有DTW的KNN通常用作评估时间序列分类算法的基准,因为它简单,健壮并且不需要大量的超参数调整。

    While useful, KNN with DTW requires a lot of space and time to compute. During classification, the KNN-DTW compares each object with all the other objects in the training set. Further, KNN provides limited information about why a series was assigned to a certain class.

    虽然有用,但带有DTW的KNN需要大量空间和时间来进行计算。 在分类期间,KNN-DTW将每个对象与训练集中的所有其他对象进行比较。 此外,KNN提供了有关为什么将系列分配给某个类别的有限信息。

    KNN may also perform poorly with noisy series — the noise in a series may overpower subtle differences in shape that are useful for class discrimination [4].

    在嘈杂的序列中,KNN的性能也可能很差-序列中的噪声可能会克服形状上细微的差异,这对于分类识别很有用[4]。

    基于间隔的分类器 (Interval-based Classifiers)

    These classifiers base classification on information contained in various intervals of series.

    这些分类器基于各个系列间隔中包含的信息进行分类。

    时间序列森林分类器 (Time Series Forest Classifier)

    A time series forest (TSF) classifier adapts the random forest classifier to series data.

    时间序列森林(TSF)分类器使随机森林分类器适应序列数据。

    1. Split the series into random intervals, with random start positions and random lengths.

      将序列分为随机间隔,随机起始位置和随机长度。
    2. Extract summary features (mean, standard deviation, and slope) from each interval into a single feature vector.

      从每个间隔中提取摘要特征(均值,标准差和斜率)到单个特征向量中。
    3. Train a decision tree on the extracted features.

      在提取的特征上训练决策树。
    4. Repeat steps 1–3 until the required number of trees have been built or time runs out.

      重复步骤1-3,直到建立了所需的树数或时间耗尽为止。

    New series are classified according to a majority vote of all the trees in the forest. (In a majority vote, the prediction is the class that is predicted by the most trees is the prediction of the forest).

    新系列根据森林中所有树木的多数票进行分类。 (在多数表决中,预测是由最多树木预测的类别是森林的预测)。

    Experimental studies have demonstrated that time series forest can outperform baseline competitors, such as nearest neighbors with dynamic time warping [1, 7].

    实验研究表明,时间序列森林可以胜过基准竞争对手,例如具有动态时间扭曲的最近邻居[1,7]。

    Time series forest is also computationally efficient.

    时间序列林在计算上也很有效。

    Last, time series forest is an interpretable model. Time feature importance can be extracted from time series forest, as shown in the sktime univariate time series classification demo.

    最后,时间序列森林是一种可解释的模型。 可以从时间序列林中提取时间特征重要性,如sktime单变量时间序列分类演示中所示

    基于字典的分类 (Dictionary-Based Classification)

    Dictionary-based classifiers first transform real-valued time series into a sequence of discrete “words”. Classification is then based on the distribution of the extracted symbolic words.

    基于字典的分类器首先将实值时间序列转换为离散的“单词”序列。 然后基于提取的符号词的分布进行分类。

    Dictionary classifiers all use the same core process: A sliding window of length w is run across a series. For each window, the numeric series is transformed into a “word” of length l. This word consists of α possible letters.

    字典分类器都使用相同的核心过程:长度为w滑动窗口贯穿一系列序列。 对于每个窗口,数字序列被转换为长度为l的“单词”。 这个词由α可能的字母组成。

    袋SFA符号(BOSS) (Bag of SFA Symbols (BOSS))

    Word features for BOSS classifiers are extracted from series using the Symbolic Fourier Approximation (SFA) transformation:

    使用符号傅立叶近似(SFA)变换从系列中提取BOSS分类器的单词特征:

    1. Calculate the Fourier transform of the window (the first term is ignored if normalization occurs)

      计算窗口的傅立叶变换(如果发生规范化,则忽略第一项)

    2. Discretize the first l Fourier terms into symbols to form a “word” using Multiple Coefficient Binning (MCB). MCB is a supervised algorithm that bins continuous time series into a sequence of letters.

      使用多重系数合并(MCB)将前l傅立叶项离散化为符号,以形成一个“单词”。 MCB是一种监督算法,可将连续时间序列分为字母序列。

    Image for post
    As indicated by the green lines of varying position, MCB bins each time point independently of other time points. SAX, another series binning algorithm, bins each time series independently. Source: pyts documentation
    如位置变化的绿线所示,MCB将每个时间点独立于其他时间点进行分档。 SAX是另一种系列合并算法,可以对每个时间序列进行独立合并。 来源: pyts文档

    A dictionary of these words is constructed as the window slides, recording a count of each word’s frequency. If the same word is produced by two or more consecutive windows, the word will only be counted once. When the sliding window has completed, the series is transformed into a histogram based on the dictionary.

    当窗口滑动时,将构造这些单词的字典,记录每个单词的频率计数。 如果同一单词由两个或多个连续的窗口产生,则该单词将仅计数一次。 滑动窗口完成后,该序列将基于字典转换为直方图。

    Finally, any classifier can be trained on the word histograms extracted from the series.

    最后,可以对从该系列中提取的单词直方图进行任何分类器训练。

    BOSS合奏 (The BOSS Ensemble)

    The original BOSS algorithm is actually an ensemble of the BOSS classifiers previously described. The BOSS ensemble conducts grid-search across the parameters (l, α, w and p) of the individual BOSS classifier. (p controls whether the subseries is normalized.) The ensemble only retains the members whose accuracy is within 92% accuracy of the best classifier.

    原始的BOSS算法实际上是前面所述的BOSS分类器的集合。 BOSS集合对各个BOSS分类器的参数( lαwp )进行网格搜索。 ( p控制子系列是否被归一化。)集成仅保留其精度在最佳分类器的92%以内的成员。

    The BOSS ensemble uses a nearest-neighbor algorithm as its classifier. The classifier uses a custom non-symmetric distance function: a partial Euclidian distance that only includes words contained in the test instance’s histogram.

    BOSS集成使用最近邻算法作为其分类器。 分类器使用自定义的非对称距离函数:部分欧几里得距离,仅包括测试实例的直方图中包含的单词。

    Due to searching over a large pre-defined parameter space, BOSS carries time overhead and risks instability in memory usage.

    由于搜索了很大的预定义参数空间,因此BOSS会占用时间,并有可能导致内存使用不稳定。

    The BOSS ensemble was the most accurate dictionary-based classifier in the Great Time Series Classification Bake-off paper [1].

    BOSS集成是《大时间序列分类》 [1]中最准确的基于字典的分类器。

    可收缩的BOSS(cBOSS) (Contractable BOSS (cBOSS))

    The cBOSS algorithm is an order of magnitude faster than BOSS. Compared to BOSS, cBOSS had no significant difference in accuracy on datasets in the UCR Classification Archive.

    cBOSS算法比BOSS快一个数量级。 与BOSS相比,cBOSS在UCR分类存档中的数据集准确性上没有显着差异。

    Instead of doing grid search across the full parameter space like BOSS, cBOSS randomly samples from the parameter space without replacement. cBOSS then subsamples the data for each base classifier.

    cBOSS不会像BOSS这样在整个参数空间上进行网格搜索,而是从参数空间中随机采样而不进行替换。 然后,cBOSS对每个基本分类器的数据进行二次采样。

    cBOSS improves the memory requirements of BOSS by retaining a fixed number of base classifiers, instead of retaining all classifiers above a given performance threshold. Last, cBOSS exponentially weights the contribution of each base classifier according to train accuracy.

    cBOSS通过保留固定数量的基本分类器而不是保留高于给定性能阈值的所有分类器来改善BOSS的内存要求。 最后,cBOSS根据训练的准确性对每个基本分类器的贡献进行指数加权。

    基于频率 (Frequency-based)

    Frequency-based classifiers rely on frequency data extracted from series.

    基于频率的分类器依赖于从序列中提取的频率数据。

    随机间隔谱集合(RISE) (Random Interval Spectral Ensemble (RISE))

    Random Interval Spectral Ensemble, or RISE, is a popular variant of time series forest.

    随机间隔频谱合奏(RISE)是时间序列森林的一种流行变体。

    RISE differs from time series forest in two ways. First, it uses a single time series interval per tree. Second, it is trained using spectral features extracted from the series, instead of summary statistics.

    RISE与时间序列林有两个不同之处。 首先,它对每棵树使用单个时间序列间隔。 其次,使用从系列中提取的光谱特征而不是摘要统计信息对其进行训练。

    RISE use several series-to-series feature extraction transformers, including:

    RISE使用了几个串联到串联的特征提取变压器,包括:

    • Fitted auto-regressive coefficients

      拟合的自回归系数
    • Estimated autocorrelation coefficients

      估计的自相关系数
    • Power spectrum coefficients (the coefficients of the Fourier transform)

      功率谱系数(傅立叶变换的系数)

    The RISE algorithm is straightforward:

    RISE算法很简单:

    1. Select random interval of a series (length is a power of 2). (For the first tree, use the whole series)

      选择一系列随机间隔(长度为2的幂)。 (对于第一棵树,请使用整个系列)
    2. For the same interval on each series, apply the series-to-series feature extraction transformers (autoregressive coefficients, autocorrelation coefficients, and power spectrum coefficients)

      对于每个系列的相同间隔,应用系列到系列特征提取变压器(自回归系数,自相关系数和功率谱系数)
    3. Form a new training set by concatenating the extracted features

      通过串联提取的特征形成新的训练集
    4. Train a decision tree classifier

      训练决策树分类器
    5. Ensemble 1–4

      合奏1-4

    Class probabilities are calculated as a proportion of base classifier votes. RISE controls the run time by creating an adaptive model of the time to build a single tree. This is important for long series (such as audio), where very large intervals can mean very few trees.

    类别概率按基本分类器投票的比例计算。 RISE通过创建时间自适应模型来构建一棵树来控制运行时间。 这对于较长的系列(例如音频)很重要,在这种情况下,很大的间隔可能意味着很少的树木。

    基于Shapelet的分类器 (Shapelet-Based Classifiers)

    Shapelets are subsequences, or small sub-shapes of time series that are representative of a class. They can be used to detect “phase-independent localised similarity between series within the same class” [1].

    小形状是代表一个类的时间序列的子序列或小子形状。 它们可用于检测“同一类别内系列之间的相位无关的局部相似性” [1]。

    Image for post
    The blue line is the original time series. The red line is the shapelet extracted from it. Image modified from [4].
    蓝线是原始时间序列。 红线是从中提取的形状。 图像改写自[4]。

    A single shapelet is an interval in a time series. The intervals in any series can be enumerated. For example, [1,2,3,4] has 5 intervals: [1,2], [2,3], [3,4], [1,2,3], [2,3,4].

    单个小波是时间序列中的间隔。 可以列举任何系列的间隔。 例如, [1,2,3,4]具有5个间隔: [1,2][2,3][3,4][1,2,3][2,3,4]

    Shapelet-based classifiers search for shapelets with discriminatory power.

    基于Shapelet的分类器搜索具有判别力的Shapelet。

    These shapelet features can then be used to interpret a shapelet-based classifier — the presence of certain shapelets make one class more likely than another.

    然后,这些shapelet特征可用于解释基于shapelet的分类器-某些shapelet的存在使一类比另一类更有可能。

    Shapelet变换分类器 (Shapelet Transform Classifier)

    In the Shapelet Transform Classifier, the algorithm first identifies the top k shapelets in the dataset.

    在Shapelet变换分类器中,算法首先识别数据集中的前k个Shapelet。

    Next, k features for the new dataset are calculated. Each feature is computed as the distance of the series to each one of the k shapelets, with one column per shapelet.

    接下来,计算新数据集的k个特征。 将每个特征计算为系列与ks个小链中每个小链的距离,每个小形有一列。

    Finally, any vector-based classification algorithm can be applied to the shapelet-transformed dataset. In [1], a weighted ensemble classifier was used. In [2], the authors only used a Rotation Forest classifier, a tree-based ensemble that constructs each tree on a subset of features transformed by PCA [5]. On average, rotation forest is the best classifier for problems with continuous features, as shown in [6].

    最终,任何基于矢量的分类算法都可以应用于经过Shapelet转换的数据集。 在[1]中,使用了加权集成分类器。 在[2]中,作者仅使用了Rotation Forest分类器,这是一种基于树的集成,可在PCA转换后的特征子集上构建每棵树[5]。 平均而言,旋转林是连续特征问题的最佳分类器,如[6]所示

    In sktime, a Random Forest classifier (500 trees) is used by default because rotation forest is not yet available in python [8].

    sktime ,默认情况下使用随机森林分类器(500棵树),因为python中尚未提供旋转森林[8]。

    How does the algorithm identify and select shapelets?

    该算法如何识别和选择shapelet?

    In sktime, the shapelet search process does not fully enumerate and evaluate all possible shapelets. Instead, it randomly searches for shapelets to evaluate.

    sktime ,shapelet搜索过程无法完全枚举和评估所有可能的shapelet。 而是随机搜索shapelet进行评估。

    Each shapelet considered is evaluated according to information gain. The strongest non-overlapping shapelets are retained.

    根据信息增益评估考虑的每个形状。 保留最强的不重叠形状。

    You can specify the amount of time to search for shapelets before performing the shapelet transform. The default time in sktime is 300 minutes.

    您可以指定执行shapelet转换之前搜索shapelet的时间。 sktime的默认时间为300分钟。

    整体分类器 (Ensemble Classifiers)

    HIVE-COTE(HIVE-COTE)

    The Hierarchical Vote Collective of Transformation-based Ensembles (HIVE-COTE) is a meta ensemble built on the classifiers discussed previously.

    基于转换的集成的分层投票集合(HIVE-COTE)是建立在前面讨论的分类器上的元集合。

    Image for post
    “An overview of the ensemble structure of HIVE-COTE 1.0.”
    “ HIVE-COTE 1.0的整体结构概述。”

    HIVE-COTE predictions are a weighted average of predictions produced by its members: shapelet transform classifier, BOSS, Time Series Forest, and RISE.

    HIVE-COTE预测是其成员产生的预测的加权平均值:shapelet变换分类器,BOSS,时间序列森林和RISE。

    Each sub-classifier estimates the probability of each class. The control unit then combines these probabilities (CAPWE). The weights are assigned as the relative estimated quality of the classifier found on the training data.

    每个子分类器估计每个分类的概率。 然后,控制单元将这些概率(CAPWE)合并。 权重被分配为在训练数据上找到的分类器的相对估计质量。

    使用哪个分类器? (Which Classifier to Use?)

    There are three main considerations when selecting a time series classifier: predictive accuracy, time/memory complexity, and data representation.

    选择时间序列分类器时,主要考虑三个方面:预测准确性,时间/内存复杂度和数据表示形式。

    With no data-specific information, start with ROCKET or HIVE-COTE. (ROCKET is a simple linear classifier based on random convolutional kernels — random length, weights, bias, dilation, and padding). The authors of [2] argue that “with no expert knowledge to the contrary, the most accurate algorithm design is to ensemble classifiers built on different representations.” On average, ROCKET is not worse than HIVE-COTE and is much faster.

    没有特定于数据的信息,请从ROCKETHIVE-COTE开始。 (ROCKET是基于随机卷积核(随机长度,权重,偏差,膨胀和填充)的简单线性分类器)。 [2]的作者认为“没有相反的专业知识,最准确的算法设计就是对基于不同表示形式的分类器进行集成。” 平均而言,ROCKET不比HIVE-COTE差,并且速度要快得多。

    Shapelet-based classifiers will be better when the best feature might be the presence or absence of a phase-independent pattern in a series.

    当最好的功能可能是序列中是否存在与相位无关的模式时,基于Shapelet的分类器会更好。

    Dictionary-based (BOSS) or frequency-based (RISE) classifiers will be better when you can discriminate using the frequency of a pattern.

    当您可以使用模式的频率进行区分时,基于字典(BOSS)或基于频率(RISE)的分类器会更好。

    最后的话 (A Final Word)

    If you enjoyed this article, please follow me for more content on data science topics! I plan to continue writing about time series classification, clustering, and regression.

    如果您喜欢本文,请关注我以获取有关数据科学主题的更多内容! 我计划继续写有关时间序列分类,聚类和回归的文章。

    Thank you to Markus Loning for his feedback on this article and to Anthony Bagnall for guidance on model selection.

    感谢Markus Loning对本文的反馈以及Anthony Bagnall对模型选择的指导。

    翻译自: https://towardsdatascience.com/a-brief-introduction-to-time-series-classification-algorithms-7b4284d31b97

    时间序列分类算法

    更多相关内容
  • 分类算法

    千次阅读 2020-12-09 18:53:16
    逻辑回归(Logistic Regression)是机器学习中的一种分类模型,逻辑回归是一种分类算法,虽然名字中带有回归。 2. 应用场景 数据不均衡问题 广告点击率 是否为垃圾邮件 是否患病 金融诈骗 虚假账号 3. 原理 线性...

    1. 简介

    1.1 定义

    • 分类算法通过对已知类别训练集的计算和分析,从中发现类别规则并预测新数据的类别。

    1.2 应用场景

    • 分类算法是解决分类问题的方法,是数据挖掘、机器学习和模式识别中一个重要的研究领域。

    • 分类的主要用途和场景是“预测”,基于已有的样本预测新样本的所属类别,例如信用评级、风险等级、欺诈预测等。 分类算法也可以用于知识抽取,通过模型找到潜在的规律,帮助业务得到可执行的规则。

    1.3 地位

    • 分类和回归是解决实际运营问题中非常重要的两种分析和挖掘方法。

    1.4 分类

    • 常用的分类算法包括朴素贝叶斯、逻辑回归、决策树、随机森林、支持向量机等。

    2. 应用

    2.1 简介

    案例 电信客户流失预测

    • AT&T数据,用户个人,通话,上网等信息数据
    • 充分利用数据预测客户的流失情况
    • 帮助挽留用户,保证用户基数和活跃程度

    2.2 数据说明

    • CustomerID 客户ID
    • Gender 性别
    • partneratt 配偶是否也为att用户
    • dependents_att 家人是否也是att用户
    • landline 是否使用att固话服务
    • internet_att/internet_other 是否使用att的互联网服务
    • Paymentbank/creditcard/electroinc 付款方式
    • MonthlyCharges 每月话费
    • TotalCharges 累计话费
    • Contract_month/1year 用户使用月度/年度合约
    • StreamingTv/streamingMovies 是否使用在线视频或者电影app
    • Churn 客户转化的flag

    2.3 处理流程

    • 分析流程:数据概况分析->单变量分析->相关性分析与可视化->回归模型
    • 数据概况分析
      • 数据行/列数量
      • 缺失值分布
    • 单变量分析
      • 数字型变量的描述指标(平均值,最大最小值,标准差)
      • 类别型变量(多少个分类,各自占比)
      • 正负样本占比
    • 相关性分析与可视化
      • 按类别交叉对比
      • 变量之间的相关性分析
      • 散点图/热力图
    • 逻辑回归分析
      • 模型建立
      • 模型评估与优化

    2.4 实现

    步骤
    
    1 加载数据,查看churn.info()
    
    2 对churn列和gender列进行onehot编码
    
    3 churn的onehot编码中churn_yes作为标签列,churn_no丢弃
    
    gender_yes gender_no都保留
    
    **4 churn.flag.value_counts() churn.flag.value_counts(1)查看正负样本分布** 正负样本是人为定义的,关注哪个类别则定义该类别为正样本
    
    5 按照flag分组,计算平均值,查看相关特征
    
    6 围绕flag变量,分析其他变量与flag的相关关系
    
    7 选择相关性比较高的作为特征
    
    8 构建模型,训练评估
    
    9 如果评估结果不理想,则重新选择特征重新训练
    
    
    import pandas as pd
    import seaborn as sns
    import matplotlib.pyplot as plt
    %matplotlib inline 
    churn=pd.read_csv('churn.csv')
    churn.info()
    
      RangeIndex: 7043 entries, 0 to 7042
      Data columns (total 16 columns):
      Churn                7043 non-null object
      gender               7043 non-null object
      Partner_att          7043 non-null int64
      Dependents_att       7043 non-null int64
      landline             7043 non-null int64
      internet_att         7043 non-null int64
      internet_other       7043 non-null int64
      StreamingTV          7043 non-null int64
      StreamingMovies      7043 non-null int64
      Contract_Month       7043 non-null int64
      Contract_1YR         7043 non-null int64
      PaymentBank          7043 non-null int64
      PaymentCreditcard    7043 non-null int64
      PaymentElectronic    7043 non-null int64
      MonthlyCharges       7043 non-null float64
      TotalCharges         7043 non-null float64
      dtypes: float64(2), int64(12), object(2)
      memory usage: 880.5+ KB
    
    #预测目标是churn,是类别型变量  gender也是类别型变量 需要对类别型变量进行处理
    churn.head()
    
        Churn  gender  Partner_att  Dependents_att  landline  internet_att  
      0    No  Female            1               0         0             1   
      1    No    Male            0               0         1             1   
      2   Yes    Male            0               0         1             1   
      3    No    Male            0               0         0             1   
      4   Yes  Female            0               0         1             0   
    
         internet_other  StreamingTV  StreamingMovies  Contract_Month  Contract_1YR  
      0               0            0                0               1             0   
      1               0            0                0               0             1   
      2               0            0                0               1             0   
      3               0            0                0               0             1   
      4               1            0                0               1             0   
    
         PaymentBank  PaymentCreditcard  PaymentElectronic  MonthlyCharges  
      0            0                  0                  1           29.85   
      1            0                  0                  0           56.95   
      2            0                  0                  0           53.85   
      3            1                  0                  0           42.30   
      4            0                  0                  1           70.70   
    
         TotalCharges  
      0         29.85  
      1       1889.50  
      2        108.15  
      3       1840.75  
      4        151.65
    
    #需要把churn和gender转变为数字型变量,使用get_dummies
    churn=pd.get_dummies(churn)
    churn.head()
    
         Churn_No  Churn_Yes  gender_Female  gender_Male  
      0         1          0              1            0  
      1         1          0              0            1  
      2         0          1              0            1  
      3         1          0              0            1  
      4         0          1              1            0
    
    #数据整理,将churn_yes保留,将female保留,drop不需要的数据
    churn.drop(['Churn_No','gender_Male'],axis=1,inplace=True)
    #变量大小写不规则,统一变成小写
    churn.columns=churn.columns.str.lower()
    churn.head()
    
         churn_yes  gender_female  
      0          0              1  
      1          0              0  
      2          1              0  
      3          0              0  
      4          1              1
    
    #将churn_yes重命名,方便后续的变量编写
    churn=churn.rename(columns={'churn_yes':'flag'})
    #二分类模型,分析flag 1和0的占比
    churn.flag.value_counts()
    
    
      0    5174
      1    1869
      Name: flag, dtype: int64
    
    churn.flag.value_counts(1)
    
      0    0.73463
      1    0.26537
      Name: flag, dtype: float64
    
    summary=churn.groupby('flag')
    summary.mean()
    
            partner_att  dependents_att  landline  internet_att  internet_other  
      flag                                                                        
      0        0.528218        0.344801  0.901044      0.379204        0.347700   
      1        0.357945        0.174425  0.909042      0.245586        0.693954   
    
            streamingtv  streamingmovies  contract_month  contract_1yr  paymentbank  
      flag                                                                            
      0        0.365868         0.369927        0.429068      0.252609     0.248550   
      1        0.435527         0.437667        0.885500      0.088818     0.138042   
    
            paymentcreditcard  paymentelectronic  monthlycharges  totalcharges  
      flag                                                                       
      0              0.249324           0.250097       61.265124   2545.918081   
      1              0.124131           0.573034       74.441332   1528.514714   
    
            gender_female  
      flag                 
      0          0.492656  
      1          0.502408
    
    • 观察flag在0和1的情况下,所有自变量的差别 internet_other变量,在0的分组中,均值是0.35,在1的分组中,均值是0.69。数据显示如果使用别的公司的互联网,用户流失的概率就越高
    sns.countplot(y='contract_month',hue='flag',data=churn)
    

    plt_lr

    • 结论:contract_month为1的客户流失的概率更高,即与非按月付费客户相比,按月付费客户流失比例高
    • 相关性分析
    #围绕flag变量,分析其他变量与flag的相关关系
    churn.corr()[['flag']].sort_values('flag',ascending=False)
    
                           flag
    flag               1.000000
    contract_month     0.405103
    internet_other     0.308020
    paymentelectronic  0.301919
    monthlycharges     0.193356
    streamingtv        0.063228
    streamingmovies    0.061382
    landline           0.011942
    gender_female      0.008612
    paymentbank       -0.117937
    internet_att      -0.124214
    paymentcreditcard -0.134302
    partner_att       -0.150448
    dependents_att    -0.164221
    contract_1yr      -0.177820
    totalcharges      -0.198175
    
    # contract_month与internet_other与flag相关性高
    
    • 逻辑回归模型
    #设定因变量与自变量, y 是 flag, x 根据刚才的相关分析挑选contract_month,internet_other与streamingtv
    #自变量可以分为几类,partner/dependents,internet,streaming,contract,payment,charges,后续大家可以自己挑选进行建模
    y=churn['flag']
    x=churn[['contract_month','internet_other','streamingtv']]
    #模型优化,streamingtv调整为paymentelectronic
    y=churn['flag']
    x=churn[['contract_month','internet_other','paymentelectronic']]
    #调用sklearn模块,随机抽取训练集与测试集
    from sklearn.model_selection import train_test_split
    x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.3,random_state=100)
    #模型优化,测试集与训练集对半分,第三次也跑这里
    from sklearn.model_selection import train_test_split
    x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.5,random_state=100)
    #使用sklearn
    from sklearn import linear_model
    lr=linear_model.LogisticRegression()
    lr.fit(x_train,y_train)
    """
      LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
                intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,
                penalty='l2', random_state=None, solver='liblinear', tol=0.0001,
                verbose=0, warm_start=False)
    """
    
    • 模型的截距与系数
    #第一次
    lr.intercept_
    lr.coef_
    #array([-3.21761938])
    #array([[2.19790192, 1.14360005, 0.23641705]])
    #第二次,测试集与训练集对半分
    lr.intercept_
    array([-3.26144359])
    array([[2.23886897, 1.09248895, 0.32579547]])
    #第三次,变量调整
    array([-3.18770265])
    array([[2.0019671 , 1.02830763, 0.62165925]])
    
    • 模型的评估
    y_pred_train=lr.predict(x_train)
    y_pred_test=lr.predict(x_test)
    import sklearn.metrics as metrics
    metrics.accuracy_score(y_train,y_pred_train)
    from sklearn.metrics import roc_curve,auc
    fpr,tpr,threshold=roc_curve(y_train,y_pred_train)
    roc_auc=auc(fpr,tpr)
    
    • 用分类分析来提炼规则、提取变量、处理缺失值

      • 分类分析用于提炼应用规则 预测是分类分析的主要应用方向,但将分类用于提炼应用规则,为数据化运营提供规则支持也是其重点应用之一,这种应用相对于其他算法更加具有落地价值。常见的应用场景如下:

        • 要针对沉默会员做会员重新激活,应该挑选具有什么特征的会员?
        • 商品A库存积压严重,现在要通过促销活动清仓,选择哪些类型的促销活动更容易实现该目标?
        • 网站需要大流量广告位来满足VIP商家的精准广告投放,具有哪些特征的广告位更符合VIP商家的客户需求?
    • 从分类算法中提炼特征规则,利用的是在构建算法过程中的分类规则

      • 以决策树为例,决策树的分裂节点是表示局部最优值的显著特征值,每个节点下的特征变量以及对应的值的组合构成了规则。
    • 分类分析用于提取变量特征

      • 具体实现思路是:获取原始数据集并对数据做预处理,将预处理的数据集放到分类算法中进行训练,然后从算法模型中提取特征权重信息。
      • 分类分析用于处理缺失值

    3. 聚类和分类算法的区别

    • 学习方式不同聚类是一种非监督式学习算法,而分类是监督式学习算法。
    • 对源数据集要求不同,有无目标值
    • 应用场景不同
      • 聚类一般应用于数据探索性分析、数据降维、数据压缩等探索性、过程性分析和处理
      • 分类更多地用于预测性分析和使用。
    • 解读结果不同。聚类算法的结果是将不同的数据集按照各自的典型特征分成不同类别,不同人对聚类的结果解读可能不同;而分类的结果却是一个固定值(例如高、中、低、是、否等),不存在不同解读的情况。
    • 模型评估指标不同
      • 聚类分析没有所谓的“准确”与否,以及多么准确的相关度量,更多的是基于距离的度量。如果是对带有标签的数据集做聚类则可以做相似度、完整度等方面的评估
      • 而分类模型的指标例如准确率、混淆矩阵、提升率等都有明显的好与坏、提升程度等评估指标。例如准确率、混淆矩阵、提升率等都有明显的好与坏、提升程度等评估指标。
    • 假如原始数据集带有类别标签,那么选择分类或聚类算法都可以(标签列数据并不是一定要使用)。假如原始数据集不带有类别标签,那么只能选择使用聚类算法。
    • 有关分类和聚类的应用示例
      • 假如现在公司要对某新会员做促销活动,例如推荐商品、提供个性化信息、推荐最感兴趣的热榜等,并尽量提供该用户感兴趣的内容。
      • 分类:基于现有的会员及其特定类别标签(可选择有代表性或与实际运营场景最相关的类别标签)做分类模型训练,将该新用户的数据作为新的样本输入模型,预测得到该用户所属的目标类别。接着计算该类别下用户最经常购买的商品、经常浏览的信息等,并给出推荐内容。
      • 聚类:将新的会员和现有的会员作为一个整体做聚类分析,然后获得该会员所属的聚类类别,进而提取其所在类别下其他会员的经常购买商品、经常浏览信息等,并给出推荐内容。

    4. 分类分析算法选择

    • 文本分类:朴素贝叶斯,例如电子邮件中垃圾邮件的识别。
    • 训练集较小,选择高偏差且低方差的分类算法:朴素贝叶斯、支持向量机(不容易过拟合)
    • 算法模型的计算时间短和模型易用性,不要选支持向量机、人工神经网络
    • 重视算法的准确率:支持向量机或GBDT、XGBoost等基于Boosting的集成方法
    • 注重效果的稳定性或模型鲁棒性,那么应选择随机森林、组合投票模型等基于Bagging的集成方法。
    • 想得到有关预测结果的概率信息,基于预测概率做进一步的应用:逻辑回归
    • 担心离群点或数据不可分并且需要清晰的决策规则:决策树

    5. 分类评估

    • 准确率:(对不对)
      • (TP+TN)/(TP+TN+FN+FP)
    • 精确率 – 查的准不准
      • TP/(TP+FP)
    • 召回率 – 查的全不全
      • TP/(TP+FN)
    • F1-score
      • 反映模型的稳健性
    • 不同的场景关注的指标不一样

    5…1 混淆矩阵

    在分类任务下,预测结果(Predicted Condition)与正确标记(True Condition)之间存在四种不同的组合,构成混淆矩阵(适用于多分类)

    混淆矩阵
    TP True positive

    FN False nagative

    FP False positive

    TN True negative

    5.2. 精确率/查准率

    • 精确率(Precision):预测结果为正例样本中真实为正例的比例
    • TP/(TP+FP)

    精确率

    5.3. 召回率/查全率

    • 召回率(Recall):真实为正例的样本中预测结果为正例的比例(查得全,对正样本的区分能力)
    • TP/(TP+FN)

    召唤率

    5.4. F1-score

    反映了模型的稳健性

    F1-score

    5.5 ROC曲线与AUC指标

    1. TPR与FPR

    • 真阳性率
      • 所有真实类别为1的样本中,预测类别为1的比例

    正阳性率

    • 假阳性率
      • 所有真实类别为0的样本中,预测类别为1的比例

    2. ROC曲线

    多次调整阈值得到若干组TPR FPR的值,把这些值在同一个坐标系中表示出来,就得到了ROC曲线

    最极端,FPR=0,TPR=1,

    FPR=0时,即FP=0;TPR=1时,即FN=0,就是所有预测错了的样本都为0,也就是所有的样本预测结果都是正确的

    此时对应的曲线下面积是1,如果roc曲线和对角线重合,则面积是0.5,此时模型的预测结果和瞎猜是一样的

    AUC指标,area under curve

    AUC=1,完美分类器

    0.5<AUC<1,优于随机猜测

    from sklearn.metrics import roc_auc_score

    • 通过tpr和fpr来进行图形绘制,然后绘制之后,行成一个指标auc
    • ROC曲线的横轴就是FPRate,纵轴就是TPRate,当二者相等时,表示的意义则是:对于不论真实类别是1还是0的样本,分类器预测为1的概率是相等的,此时AUC为0.5。
    • 在一个二分类模型中,假设采用逻辑回归分类器,其给出针对每个实例为正例的概率。
    • 通过设定一个阈值如0.6,概率大于等于0.6的为正例,小于0.6的为负例。对应的就可以算出一组(FPR,TPR),在平面中得到对应坐标点。
    • 随着阈值的逐渐减小,越来越多的实例被划分为正例,但是这些正例中同样也掺杂着真正的负实例,即TPR和FPR会同时增大。
    • 阈值最大时,对应坐标点为(0,0),即把所有样本都预测为负例,TP和FP都为0,对应的TPR和FPR为0;
    • 阈值最小时,对应坐标点(1,1),即把所有样本都预测为正例,FN和TN都为0,对应的TPR和FPR为1。

    ROC

    3. AUC指标

    • 越接近1,效果越好
    • 越接近0,效果越差
    • 越接近0.5,效果就是胡说
    • AUC的概率意义是随机取一对正负样本,正样本得分大于负样本得分的概率
    • AUC的范围在[0, 1]之间,并且越接近1越好,越接近0.5属于随机猜测
    • AUC=1,完美分类器,采用这个预测模型时,不管设定什么阈值都能得出完美预测。绝大多数预测的场合,不存在完美分类器。
    • 0.5<AUC<1,优于随机猜测。这个分类器(模型)妥善设定阈值的话,能有预测价值。

    4. API

    from sklearn.metrics import roc_auc_score
    sklearn.metrics.roc_auc_score(y_true, y_score)
    
    • 计算ROC曲线面积,即AUC值
    • y_true:每个样本的真实类别,必须为0(反例),1(正例)标记
    • y_score:预测得分,可以是正例的估计概率、置信值或者分类器方法的返回值
    # 0.5~1之间,越接近于1约好
    y_test = np.where(y_test > 2.5, 1, 0)
    
    print("AUC指标:", roc_auc_score(y_test, y_predict)
    
    • AUC只能用来评价二分类
    • AUC非常适合评价样本不平衡中的分类器性能

    6. 分类评估报告api

    # y_true:真实目标值
    # y_pred:估计器预测目标值
    # labels:指定类别对应的数字
    # target_names:目标类别名称
    # return:每个类别精确率与召回率
    sklearn.metrics.classification_report(y_true, y_pred, labels=[], target_names=None )
    
    ret = classification_report(y_test, y_predict, labels=(2,4), target_names=("良性", "恶性"))
    print(ret)
    

    样本不均衡下的评估问题: 假设这样一个情况,如果99个样本癌症,1个样本非癌症,不管怎样全都预测正例(默认癌症为正例),准确率就为99%但是这样效果并不好

    展开全文
  • 机器学习中的七种分类算法

    千次阅读 2021-10-03 20:35:27
    目录 1 分类任务的类型 1.1 二元分类 1.2 多元分类 1.3 多标签分类 1.4 不平衡分类 2 分类算法如何工作 3 数据预处理 4 创建测试集和训练集 5 选择模型 6 分类算法的类型 6.1 朴素贝叶斯分类器 6.1.1 优点 6.1.2 ...

    c 机器学习中的 7 种分类算法https://www.projectpro.io/article/7-types-of-classification-algorithms-in-machine-learning/435https://www.projectpro.io/article/7-types-of-classification-algorithms-in-machine-learning/435icon-default.png?t=LA92https://www.projectpro.io/article/7-types-of-classification-algorithms-in-machine-learning/435以上为参考链接。


    目录

    1 分类任务的类型

    1.1 二元分类

    1.2 多元分类

    1.3 多标签分类

    1.4 不平衡分类

    2 分类算法如何工作

    3 数据预处理

    4 创建测试集和训练集

    5 选择模型

    6 分类算法的类型

    6.1 朴素贝叶斯分类器

    6.1.1 优点

    6.1.2 缺点

    6.1.3 应用

    6.2 逻辑回归

    6.2.1 优点

    6.2.2 缺点

    6.2.3 应用

    6.3 决策树分类算法

    6.3.1 优点

    6.3.2 缺点

    6.3.3 应用

    6.4 随机森林分类算法

    6.4.1 优点

    6.4.2 缺点

    6.4.3 应用

    6.5 支持向量机

     6.5.1 优点

    6.5.2 缺点

    6.5.3 应用

    6.6 K最近邻分类算法

     6.6.1 优点

    6.6.2 缺点

    6.6.3 应用

    6.7 K-Means聚类算法

    6.7.1 优点

    6.7.2 缺点

    6.7.3 应用

    7 如何决定选择哪种分类算法


    1 分类任务的类型

    1.1 二元分类

    主要将数据集分类两类,也意味着输出变量只有两个值。比如将邮件标记为“垃圾邮件”还是“非垃圾邮件”。

    1.2 多元分类

    数据集分为多个种类,输出变量也有多个值。比如经典的Iris数据集,根据花的花瓣长度、萼片长度、花瓣宽度和萼片宽度,分成三种花。

    1.3 多标签分类

    一种特殊类型的分类任务,对于数据集中的每个实例具有多个输出变量,也就是说,一个实例可以有多个标签。比如在图像分类中,单个的图像可能包含多个对象,这些对象可以通过算法进行标记,例如公共汽车、红绿灯、斑马线等。

    1.4 不平衡分类

    不平衡分类是指数据集的实例中具有偏向或者偏态分布的分类问题,也就是一类输入变量的频率高于其他输入变量。比如通过交易数据集中的信用卡检测欺诈交易。通常,此类交易的数量要少得多,因此这会使机器难以学习此类交易。

    2 分类算法如何工作

    为了解决分类问题,我们使用称为机器学习分类算法的数学模型。他们的任务是找出目标变量如何与输入特征 xi 和输出值 yi 相关联。在数学方面,估计函数 f(xi) 通过将相关特征作为输入来预测输出变量的值。我们可以这样写,

    {y}'_{i}= \text{f} \left ( x_{i} \right )

    其中 y'i 表示输出变量的预测响应。

    3 数据预处理

    在将任何统计算法应用于数据集之前,我们必须彻底了解输入变量和输出变量。在分类问题中,目标总是定性的,但有时,甚至输入值也可以是分类的,例如著名的 Mall Customer Dataset 中客户的性别。由于分类算法是从数学上推导出来的,因此必须将所有变量转换为数值。分类算法工作的第一步是确保变量,无论是输入还是输出,都已正确编码。

    4 创建测试集和训练集

    处理完数据集后,下一步是将数据集分为两部分:测试数据集和训练数据集。这一步允许使用训练数据集让我们的机器学习输入和输出值之间的模式。另一方面,测试数据集测试模型的准确性,我们将尝试将其放入我们的数据集中。

    5 选择模型

    一旦我们将数据集拆分为训练和测试,下一个任务就是选择最适合我们问题的模型。为此,我们需要了解流行的分类算法。因此,让我们深入研究不同类型的分类算法池并探索我们的选择。

    6 分类算法的类型

    以下是您将了解的不同类型分类算法的列表:

    1. 朴素贝叶斯分类器
    2. 逻辑回归
    3. 决策树
    4. 随机森林
    5. 支持向量机
    6. K-最近邻
    7. K-均值聚类

    6.1 朴素贝叶斯分类器

    朴素贝叶斯分类器,最简单有效的分类算法之一。它的基础是贝叶斯定理,它描述了如何根据可能与事件相关的条件的先验知识来评估事件的概率。在数学上,这个定理指出——

    \text{P}\left ( Y|X\right )=\frac{P\left ( X|Y\right )P\left ( Y\right )}{P\left ( X\right )}

    其中 P(Y|X) 是事件 Y 的概率,假设 X 已经发生。 

    P(X) 是事件 X 的概率,

    P(Y) 是事件 Y 的概率,

    P(X|Y) 是给定 Y 的固定值时事件 X 的可能性。

    如果 X 代表一个特征变量,Y 代表一个目标变量,那么贝叶斯分类器会将该标签分配给产生最高概率的特征。为简单起见,考虑一个二分类问题,其中特征变量只能有两个可能的值,Y=1 或 Y=0。然后,如果 Pr(Y=1|X=x0) > 0.5,贝叶斯分类器将预测类别 1,否则预测类别 2。

    在不止一个特征的情况下,我们可以使用以下公式来评估概率,

    P\left ( Y|X_{1}=x_{1},X_{2}=x_{2} \right )=\frac{P\left ( X_{1}=x_{1},X_{2} =x_{2}|Y \right )P\left ( Y \right )}{P\left ( X_{1}=x_{1},X_{2}=x_{2} \right )}

    我们假设两个特征 X1 和 X2 是相互独立的。事实上,由于这个假设,“朴素”这个词被附加到贝叶斯的分类器上。

    6.1.1 优点

    1. 它很简单,实现也很简单。
    2. 机器使用这个分类器学习模式所需的时间更少。
    3. 它在输入变量具有分类值的情况下表现良好。
    4. 它为复杂的现实世界问题提供了良好的结果。
    5. 它在多类分类的情况下表现良好。

    6.1.2 缺点

    1. 它假设特征变量之间的独立性,但情况并非总是如此。
    2. 我们经常将其称为坏估计,因此概率并不总是很重要。
    3. 如果在训练期间模型不知道任何分类变量并且该变量在测试期间通过,则模型分配 0(零)似然并因此替换称为“零频率”的零概率。可以通过使用平滑程序(例如拉普拉斯估计)来避免这种情况。

    6.1.3 应用

    1. 垃圾邮件分类: 根据电子邮件的内容识别电子邮件是否为垃圾邮件
    2. 实时预测系统: 该模型相对较快,因此可以实时预测目标变量。
    3. 情绪分析: 识别产品的反馈并将其分类为“正面”或“负面”。
    4. 多类预测: 朴素贝叶斯适用于多类分类问题。

    6.2 逻辑回归

    该算法类似于贝叶斯分类器,因为它也预测 Y 与输入变量 X 相关联的概率。它使用逻辑函数,

    \large P\left ( X \right )=\frac{e^{\beta _{0}+\beta _{1}X}}{1+e^{\beta _{0}+\beta _{ 1}X}}

    并使用最大似然技术拟合参数 ð??›ƒ0 和 ð??›ƒ1。该技术涉及最大化由下式给出的似然函数

    l\left ( \beta _{0},\beta _{1} \right )=\prod_{l:y_{i}=1}p\left ( x_{i} \right )\prod_{​{l} ':y_{​{i}'}=1}\left ( 1-p\left ( x_{i} \right ) \right )

    在评估这两个参数后,可以轻松地使用逻辑函数来预测给定输入 xi 的目标变量概率 p(xi)。 

    对于不止一个特征变量(X1, X2,..., XP),公式可以概括为

    P\left ( X \right )= \frac{e^{\beta _{0}+\beta _{1}X_{1}+\cdots+\beta _{p}X_{p}}}{1+ {e^{\beta _{0}+\beta _{1}X_{1}+\cdots+\beta _{p}X_{p}}}

    6.2.1 优点

    1. 这是一个简单的模型,因此训练所需的时间很少。
    2. 它可以处理大量的特征。

    6.2.2 缺点

    1. 虽然它的名字中有回归这个词,但我们只能将它用于分类问题,因为它的范围总是在 0 和 1 之间。
    2. 只能用于二分类问题,对多分类问题响应较差

    6.2.3 应用

    1. 信用评分: 根据年收入、账户余额等一些特征来预测个人的信用(偿还借入贷款的能力)。
    2. 预测用户行为: 许多网站使用逻辑回归来预测用户行为并引导他们点击可能感兴趣的链接。
    3. 离散选择分析:  逻辑回归是预测人们分类偏好的绝佳选择。这方面的例子可能是买哪辆车、上哪所学校或大学等,这取决于人们的属性和他们可用的各种选择。

    6.3 决策树分类算法

    该算法涉及根据数据集中的某些特征变量将数据集划分为多个段。这些划分的阈值通常是各自特征变量的平均值或众数(如果它们是数字)。由于树可以表示用于分割数据集的一组分割规则,因此该算法称为决策树。

    查看下面的示例以更好地理解它。

    多类分类算法

    红色文本表示如何根据输出变量将数据集拆分为多个段。结果是具有最高比例的班级。

    现在,很自然要问的问题是该算法使用什么标准来分割数据。有两种广泛使用的度量来测试分割的纯度(如果数据集的片段只有一个类的数据点,则它是纯的)。

    第一个是定义的基尼指数

    G= -\sum_{k=1}^{k}p_{mk}\left ( 1-p_{mk} \right )

    测量 N 个类别的总方差。另一种度量是交叉熵,定义为

    D= -\sum_{k=1}^{k}p_{mk}\log \left ( p_{mk} \right )

    在两个等式中,pmk 表示第 m 个片段中属于第 k 个类别的训练变量的比例。

    我们根据该特征将数据集拆分为多个段,从而产生熵或基尼指数的最小值。

    6.3.1 优点

    1. 该算法允许数据的简单表示。因此,更容易向高管解释和解释它。
    2. 决策树模仿人类在日常生活中做出决策的方式。
    3. 他们顺利处理定性目标变量。
    4. 它们有效地处理非线性数据。

    6.3.2 缺点

    1. 它们可能会创建有时变得无关紧要的复杂树。
    2. 与其他算法相比,它们的预测精度水平不同。

    6.3.3 应用

    1. 情感分析:它用作文本挖掘中的分类算法,以确定客户对产品的情感。
    2. 产品选择:公司可以使用决策树来了解哪种产品在推出时会给他们带来更高的利润。

    6.4 随机森林分类算法

    森林由大量的树木组成。同样,随机森林涉及处理许多决策树。每棵树预测目标变量的概率值。然后我们对产生最终输出的概率进行平均。 

    我们评估每棵树如下:

    1. 通过选择有替换的数据点来创建数据集的第一个样本。
    2. 接下来,我们不使用所有输入变量来创建决策树。我们只使用可用的一个子集。
    3. 每棵树都被允许长到尽可能大的长度,并且不涉及修剪。

    6.4.1 优点

    1. 对于大型数据集,它是有效的。
    2. 它允许估计输入变量在分类中的重要性。
    3. 它比决策树更准确。

    6.4.2 缺点

    1. 在实施方面更为复杂,因此需要更多时间进行评估。

    6.4.3 应用

    1. 信用卡违约: 信用卡公司使用随机森林来预测持卡人是否会违约。
    2. 股票市场预测: 股票投资者使用它来指示特定股票的趋势并分析其损失和利润。
    3. 产品推荐: 可以根据用户的喜好使用它向用户推荐产品。

    6.5 支持向量机

    该算法利用具有令人兴奋的变化的支持向量分类器,使其适用于评估非线性决策边界。通过使用称为kernels 的特殊函数扩大特征变量空间,这成为可能 。该算法考虑的决策边界允许将特征变量标记为目标变量。它用于评估边界的数学函数由下式给出

    f\left ( x \right )= \beta _{0}-\sum_{i \in s }\alpha _{i}K\left ( x,x_{i} \right )

    其中 K 代表核函数。

     6.5.1 优点

    1. 它使训练数据集变得容易。
    2. 当数据是高维时,它表现良好。

    6.5.2 缺点

    1. 当数据包含噪声元素时,它表现不佳。
    2. 它对核函数很敏感,因此必须明智地选择它们。

    6.5.3 应用

    1. 人脸检测: 用于读取图像(像素数数组)并根据通常的人类特征识别是否包含人脸。
    2. 图像分类:  SVM 是用于根据图像特征对图像进行分类的图像分类算法之一。
    3. 手写字符识别: 我们可以用它来识别手写字符。

    6.6 K最近邻分类算法

    KNN 算法通过识别给定观察点的 K 个最近邻居来工作。然后它使用 K 个点评估每种类型的目标变量的比例,然后预测具有最高比例的目标变量。例如,考虑以下情况,我们必须将目标值标记为点 X。然后,如果我们在它周围取四个邻居,该模型将预测该点属于粉红色的类。

     

     6.6.1 优点

    1. 可以将其应用于任何分布的数据集。
    2. 它很容易理解并且非常直观。

    6.6.2 缺点

    1. 它很容易受到异常值的影响。
    2. 它偏向于在数据集中具有更多实例的类。
    3. 有时很难找到 K 的最佳数字。

    6.6.3 应用

    1. 检测异常值: 由于该算法对异常值很敏感,因此可以检测异常值。
    2. 识别相似文档: 识别语义相似的文档。

    6.7 K-Means聚类算法

    K-Means Clustering 是一种将数据集划分为 K 个不重叠的组的聚类算法。该算法的第一步是指定预期的簇数 K。然后,任务是将数据集划分为 K 个簇,以使簇内变化尽可能小。算法过程如下:

    1. 为每个输入变量随机分配一个从 1 到 K 的数字。这些是变量的初始聚类标签。
    2. 重复该步骤,直到集群分配保持不变:
    3. 为 K 个集群中的每一个评估集群质心。 
    4. 将每个输入变量集分配给质心最近的簇(这里最接近可以用欧氏距离来定义)

    总之,该算法最小化输入点与相应聚类质心之间的偏差平方和。将其命名为 K 均值聚类的原因是步骤 2a) 将属于特定聚类的观测值的均值评估为聚类质心。 

    6.7.1 优点

    1. 我们可以将其应用于大型数据集。
    2. 实施起来毫不费力。
    3. 它保证了定位集群的收敛性。

    6.7.2 缺点

    1. 它有一个限制,因为必须首先提供 K 的值。
    2. 它对异常值很敏感。

    6.7.3 应用

    1. 添加推荐: 公司可以识别共享金钱消费习惯的客户群,并展示他们更有可能购买的广告。
    2. 识别城市中的犯罪区域: 使用 K 均值聚类,我们可以识别更容易发生犯罪案件的区域。
    3. 文档分类: 识别写在类似主题上的文档

    7 如何决定选择哪种分类算法

    下面我们有一个列表,可以帮助您了解应该使用哪些分类算法来解决业务问题。

    1. 问题识别: 首先要做的是彻底了解手头的任务。如果是有监督的分类案例,可以使用逻辑回归、随机森林、决策树等算法。另一方面,如果是无监督的分类案例,则应该使用聚类算法。
    2. 数据集  的大小:数据集的大小也是您在选择算法时应该考虑的一个参数。由于很少有算法相对较快,因此最好切换到那些算法。如果数据集的大小很小,您可以坚持使用像朴素贝叶斯这样的低偏差/高方差算法。相反,如果数据集很大,特征数量很多,那么你应该使用高偏差/低方差算法,如 KNN、决策树和 SVM。
    3. 预测准确度: 模型的准确度是测试分类器好坏的参数。它反映了预测输出值与正确输出值的匹配程度。当然,更高的精度是可取的,但还应检查模型是否过拟合。
    4. 训练时间: 有时,像 SVM 和随机森林这样的复杂算法可能会占用大量计算时间。此外,更高的准确性和大数据集无论如何需要更多时间来学习模式。像逻辑回归这样的简单算法更容易实现并节省时间。
    5. 数据集的线性: 输入变量和目标变量之间并不总是存在线性关系。因此,必须分析这种关系并仔细选择算法,因为其中一些仅限于线性数据集。检查线性的最佳方法是拟合线性线或运行逻辑回归或 SVM 并查找残差。较高的误差表明数据是非线性的,需要实施复杂的算法。
    6. 特征数量: 有时,数据集可能包含不必要的许多特征,并且并非所有特征都相关。然后可以使用最适合这种情况的 SVM 等算法,或者使用主成分分析来确定哪些特征是重要的。

    展开全文
  • 【机器学习原理】KNN分类算法

    千次阅读 2022-01-29 16:30:22
    上一篇:Logistic回归分类算法 文章目录一、KNN分类算法:用多数表决进行分类1. 用“同类相吸”的办法解决分类问题可视化下的分类问题2. KNN分类算法的基本方法:多数表决3. 表决权问题4. KNN的具体含义KNN分类算法...

    上一篇:Logistic回归分类算法

    一、KNN分类算法:用多数表决进行分类

    我们已经知道,Logistic回归模型虽然套着“马甲”,但核心算法仍然是线性模型,训练的方法与线性回归一样,都是首先计算出预测值与实际值的偏差,然后根据偏差来调整权值。在机器学习中,用这种通过不断减少偏差,从而实现逼近“神秘函数”的方法来训练模型的情况非常常见。但这种方法也存在一些问题,如使用梯度下降等优化方法减少偏差值时,可能出现陷入“局部最优解”的问题,导致这个问题的根本原因在于这种训练方法总是“走一步看一步”,也就是常说的“缺乏大局观”。
    想要有大局观也好办,只要设计一套机器学习算法,能够先获得某种全局性的统计值,然后在全局统计值的基础上完成分类等预测工作,就可以避免陷入局部最优解了。
    本章的主角KNN算法遵循这种思路,与其他分类算法相比,KNN算法的实现简单直接,与上一章的Logistic回归模型相比,第一个明显区别就在于KNN算法没有通过优化方法来不断减少偏差的显式学习过程,这意味着用不上损失函数和优化方法这套机制,在这一章可以暂且将数学放到一边。
    Logistic回归的核心机制就是用损失函数和优化方法来不断调整线性函数的权值,从而拟合“神秘函数”,而偏差可谓是这套机制的动力来源。KNN算法要避免局部最优解,当然不可能再沿用这套依赖偏差的机制,但KNN作为有监督学习算法,必须设计一套参考标尺,以让标注信息发挥作用。
    怎样解决这对矛盾呢?KNN算法给出的答案是“多数表决”。

    • 多数表决
    • 距离

    1. 用“同类相吸”的办法解决分类问题

    前面我们学习了用Logistic回归解决分类问题,核心思路有两条:

    • 一是使用线性方程勾画直线,
    • 二是通过Logistic函数把直线“掰弯”,从而拟合呈离散分布的分类问题数据点。
      相当于首先通过Logistic函数把分类问题映射成回归问题,然后使用可以解决回归问题的线性模型来解决分类问题。

    我们看到,有监督学习的数据集分为训练集和测试集,两种数据集的组织形式一样,但用法略有不同,训练模型一般只使用训练集,在训练集中,每条样本不但有各个维度方向对应的数值,还包括一一标注好了的分类结果。也就是说,假设当前要训练的是二元分类,那么,根据训练集“正类”和“负类”的标注结果,样本数据实际已经分成了两堆。
    接下来我们要从训练集中提取分类信息,可以直接利用数据集实际已经分成两堆这个条件。想象一下,如果我们要做的不是数据分类,而是整理衣物,现在衣物已经按上衣和裤子分成了两堆,接下来你要做的就是看到上衣就扔到上衣的那一堆,看到裤子就放到裤子的那一堆。这两堆衣物就像两块大磁铁,上衣来了,就被“吸”到上衣那堆,裤子来了,就被“吸”到裤子那堆,很简单地就能完成整理工作。

    分类问题的训练集是已经将样本按正负类分成了两堆,每个堆的样本都存在某种共同之处,那么,对于新输入的待分类样本究竟该归为哪一堆的问题,也就转化成新样本和哪一堆的样本共同点最多、最为相像。与哪一堆像,新样本就归为哪一堆,即分成哪一类。

    可视化下的分类问题

    上一章我们使用了鸢尾花的数据集演示分类,数据集中包含了三类鸢尾花,分别用三种颜色代表,取两个特征维度,绘制得到图5-1。
    在这里插入图片描述
    可以看出,同一类(即颜色相同)的鸢尾花样本点靠得很近,而不同类的鸢尾花样本显然离得要远一些。特征的差异形成了距离,构成了类的天然边界,客观上确实存在“同类相吸”的现象。抓住这个现象,我们就可以设置出一套新的分类方法:用已经分好类的样本作为参照,看看待分类的样本与哪一类更近,就归为哪一类。

    2. KNN分类算法的基本方法:多数表决

    “同类相吸”可以说是KNN分类算法的指导思想,从而机器学习模型可以脱离对偏差的依赖,而同样起到分类的效果。不过,这个想法只是KNN算法的起点,若要用来分类,许多细节问题就无法绕过。
    我们知道,实际的样本是有许多维度的,如鸢尾花数据集,虽然它是一个非常小的数据集,但每个鸢尾花样本也包含了花萼的长度、宽度和花瓣的长度、宽度4个维度,从不同维度看,样本数据点的分布情况不相同。假设每次任意取鸢尾花数据集4个维度中的2个,分别作为图像的X轴和Y轴坐标,将得到16张图像。除了图5-1,这里再另外选取4张不同维度所绘制的图像,可以比较观察不同维度下样本点的分布变化(见图5-2)。

    在这里插入图片描述
    可以看出,对于同样的样本,选取不同的维度之后,类与类之间呈现出了犬牙交错的更为复杂的关系,而同一类的“聚集”趋势也变得不太明显,类内样本的分布范围更广,与其他类的样本混杂在一起的可能性变得更大。

    如何选取维度是KNN算法乃至机器学习都需要重点关注的问题,选取合适的维度可以事半功倍。

    不同的维度选择可能导致样本呈现不同的分布情况。虽然我们可以人为挑选几个维度,让相同种类的鸢尾花数据点在分布上靠得更近,但这就成了“先有结论再找证据”,刻意成分太多,需要事先通过人工来分析究竟哪些维度能起到良好效果,而且相关维度超过3个之后还存在无法可视化的问题,所以需要想办法让模型能够自行完成这个过程。

    不同的机器学习算法对于维度的选取有着不同的办法,Logistic回归算法采用“加权”的办法,让做出正面贡献的维度输入增加权值,而KNN算法则选择了更为直接和“文艺”的方法:多数表决。

    物以类聚,人以群分,你是哪一类人,查查你的朋友圈也许就能知道答案。KNN分类算法所采用的方法同样也是“查朋友圈”。前面我们说过,训练集的样本已经按正负类分好了,现在过来一个待分类的新样本,只需要查一查“朋友圈”,也就是根据它各个维度的值,看看与它临近的点都是什么类,按多数表决原则,哪些类占大多数,这个新样本就属于哪一类。

    3. 表决权问题

    分类问题的训练集样本可没有什么朋友圈,需要我们设计一个方法来划定这个“圈”。对于KNN,这个圈就是由距离决定的。具体来说,根据样本各个维度的值可以作出一个个数据点,我们只需要度量点与点之间的距离,然后若想给某个点划分“朋友圈”,只需要以这个点为圆心,就可以找到与它临近的点有哪些,从而构成它的“朋友圈”。只有在圈子里的点才拥有对于这个点属于哪个类的表决权,而不是由全体样本进行表决。这是一个需要注意的细节。
    为什么不用全体样本表决呢?如果采用这种方法,那么新加入样本的类别一定就是原来在全体样本中占大多数的类别,这个类别是正类还是负类,主要受样本采集方法的影响,与分类的本身关系不大。随着新样本的不断加入,这个类别在全体样本中的占比也将不断扩大,使得新加入样本始终都是这个类别,从而形成“滚雪球”效应,也就无法起到分类的作用了。
    再说说距离度量。在二维平面上,我们习惯用直尺来测量距离,所以也没有觉得这有难度。但是,数据点常常有多个维度,如鸢尾花的数据点就有4个维度,这就没法直接用尺子量了。怎么办呢?数学家已经为我们准备好了多种衡量距离的数学工具,根据需要选取其中一种,同样可以确定点与点之间的距离,以及指定的点与谁临近。至于为什么用距离确定“朋友圈”,其实也好理解,走得近的当然才称得上朋友嘛!

    4. KNN的具体含义

    KNN是K-Nearest Neighbor的英文简写,中文直译就是K个最近邻,有人干脆称之为“最近邻算法”。字母“K”也许看着新鲜,不过作用其实早在中学就接触过。在学习排列组合时,教材都喜欢用字母“n”来指代多个,譬如“求n个数的和”,这里面也没有什么秘密,就是约定俗成的用法。而KNN算法的字母K扮演的就是与n同样的角色。K的值是多少,就代表使用了多少个最近邻。机器学习总要有自己的约定俗成,没来由地就是喜爱用“K”而不是“n”来指代多个,类似的命名方法还有后面将要提到的K-means算法。
    KNN的关键在于最近邻,光看名字似乎与分类没有什么关系,但前面我们介绍了, KNN的核心在于多数表决,而谁有投票表决权呢?就是这个“最近邻”,也就是以待分类样本点为中心,距离最近的K个点。这K个点中什么类别的占比最多,待分类样本点就属于什么类别。

    KNN分类算法原理

    1. KNN分类算法的基本思路

    作为一种分类算法,KNN最核心的功能“分类”是通过多数表决来完成的,具体方法是在待分类点的K个最近邻中查看哪个类别占比最多。哪个类别多,待分类点就属于哪个类别。
    KNN算法负责实现分类的部分简单直接,但容易让人产生疑惑的两点正出自它的名字:

    • 一是怎样确定“K”,
    • 二是怎样确定“NN”。
      投票表决的流程清晰明了,但谁拥有投票表决权却是使用KNN算法时首先需要解决的问题。
      在使用机器学习算法模型解决实际问题时,给模型调参数是继数据清洗之后的又一重要工作,需要时间和经验。调参工作所需要花费的时间和得到的效果,正是新手和老手的重要差别之一。在KNN算法中,将K值设置为多少没有具体的计算公式,只能根据各位的实战经验确定了。
      不同的算法模型可调的参数是不一样的。在KNN算法中,“KNN”中的这个“K”——也就是该选几个点,就是一个需要根据实际情况调节以便取得更好拟合效果的参数,可以根据交叉验证等实验方法,结合工作经验进行设置,一般情况下,K的值会在3~10之间
      “最近邻”初看已经把要求都说明白了,但仔细一想就能发现其中空间很大。KNN算法已经衍生出很多变种,用什么方法度量“最近”,正是KNN以及相关衍生算法需要解决的首要问题,是难点,也是创新点。
      前面我们在介绍L2范式时提到的欧几里得距离,就是KNN中常用的度量方法,但这不是唯一的度量方法。通过选择不同的距离度量方法,同样的KNN算法能够有完全不同的表现。如果你计划为KNN设计一种变种,“最近邻”就是你应该开始着手的地方。
      假设已经有5个样本点,用颜色代表类别,现在放入一个新的待分类样本,由于类别不明,颜色用白色表示(见图5-3)。
      在这里插入图片描述
      首先逐一确定待分类样本点和训练集样本点的距离,见图5-4。
      在这里插入图片描述根据距离圈定表决范围,见图5-5。
      在这里插入图片描述根据多数表决原则,决定待分类样本点的类别,由于黑色占大多数,所以待分类样本也为黑色,见图5-6。
      在这里插入图片描述

    2. 数学解析

    首先是上文提到的闵可夫斯基距离,虽然它的名字包含“距离”,但实际上是对一类距离的统一定义。闵可夫斯基距离的数学表达式如下:
    d p ( x , y ) = ( ∑ i = 1 n ∣ x i − y i ∣ p ) 1 / p (5-1) d_p(x,y)=\left(\sum^n_{i=1}|x_i-y_i|^p\right)^{1/p} \tag{5-1} dp(x,y)=(i=1nxiyip)1/p(5-1)
    闵可夫斯基距离是一组距离的定义,不妨把闵可夫斯基距离看作一个代数形式的母版,通过给P设置不同的值,就能用闵可夫斯基距离得到不同的距离表达式。

    • 当p=1时,称为曼哈顿距离
      d ( x , y ) = ∑ k = 1 n ∣ x k − y k ∣ (5-2) d(x,y)=\sum^n_{k=1}|x_k-y_k| \tag{5-2} d(x,y)=k=1nxkyk(5-2)
      据说曼哈顿距离最初是用于度量美国曼哈顿市出租车的行驶距离,不妨把曼哈顿市的地图看作围棋的棋盘,出租车只能沿着棋盘上的横线和纵线行驶,出租车从一个地点到另一个地点的行驶轨迹就是曼哈顿距离。

      也许光看曼哈顿距离的表达式不够直观,我们以计算图5-7中A点到坐标原点的曼哈顿距离为例进行说明。

      图5-7中A点坐标为(3,2),即x1为3,y1为2。原点坐标为(0,0),即x2为0, y2为0。根据曼哈顿距离计算公式:
      在这里插入图片描述其实可以看作A点到原点移动了两次,第一次是从(3,2)沿着直线移动到(0,2),第二次再从(0,2)沿着直线移动到(0,0)。两次移动距离的和就是曼哈顿距离。

    • 当p=2时,为欧几里得距离,最常用于度量两点之间的直线距离,表达式和L2范式是一样的,具体如下:
      d 2 ( x , y ) = ∑ i = 1 n ( x i − y i ) 2 (5-3) d_2(x,y)=\sqrt{\sum^n_{i=1}(x_i-y_i)^2} \tag{5-3} d2(x,y)=i=1n(xiyi)2 (5-3)

    距离的度量方法没有好坏,选择什么方法主要是根据当前情况而定。如果其他样本点呈圆形分布,而待分类点正好处于圆心,这种情况下由于到各个点的欧式距离都一样,也就无法使用欧式距离进行选择。曼哈顿距离相当于“数格子”,相比之下具有更高的稳定性,但同样存在丢失距离信息的问题,最终还是需要根据实际情况进行选择。

    3. KNN分类算法的具体步骤

    KNN算法是一种有监督的分类算法,输入同样为样本特征值向量以及对应的类标签,输出则为具有分类功能的模型,能够根据输入的特征值预测分类结果。具体如表5-1所示。
    在这里插入图片描述KNN分类算法的思路很简洁,实现也很简洁,具体分三步:

    1. 找K个最近邻。KNN分类算法的核心就是找最近的K个点,选定度量距离的方法之后,以待分类样本点为中心,分别测量它到其他点的距离,找出其中的距离最近的“TOP K”,这就是K个最近邻。
    2. 统计最近邻的类别占比。确定了最近邻之后,统计出每种类别在最近邻中的占比。
    3. 选取占比最多的类别作为待分类样本的类别。

    三、在Python中使用KNN分类算法

    neighbors类库:

    • KNeighborsClassifier类:最经典的KNN分类算法。
    • KNeighborsRegressor类:利用KNN算法解决回归问题。
    • RadiusNeighborsClassifier:基于固定半径来查找最近邻的分类算法。
    • NearestNeighbors类:基于无监督学习实现KNN算法。
    • KDTree类:无监督学习下基于KDTree来查找最近邻的分类算法。
    • BallTree类:无监督学习下基于BallTree来查找最近邻的分类算法。

    本章所介绍的KNN分类算法可以通过KNeighborsClassifier类调用,用法如下:

    from sklearn.datasets import load_iris
    # 从scikit-learn库导入近邻模型中的KNN分类算法
    from sklearn.neighbors import KNeighborsClassifier
    
    # 载入鸢尾花数据集
    X, y = load_iris(return_X_y=True)
    # 训练模型
    clf = KNeighborsClassifier().fit(X, y)
    # 使用模型进行分类预测
    print("array({})".format(clf.predict(X)))
    ==========================================
    array([0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
     0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 2 1
     1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 2 2 2 2
     2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
     2 2])
    

    使用默认的性能评估器评分:

    print("score: {}".format(clf.score(X, y)))
    ==============================
    score: 0.9666666666666667
    

    四、KNN分类算法的使用场景

    在这里插入图片描述
    算法使用案例

    OCR(Optical Character Recognition,光学字符识别)是一种常用的功能,如拍照搜题的原理就是首先对题目进行拍照,然后用OCR识别出照片中的符号和文字,最后才在题库中进行搜索和呈现结果。其他常见的OCR应用还包括手写数字识别和PDF转Word文档。如今OCR通常使用深度神经网络来实现,但在深度学习兴起之前,OCR一般是通过KNN和后面即将介绍的支持向量机两种算法实现。用KNN实现OCR主要分为三步:第一步确定文字所在位置区域,第二步提取特征,第三步通过KNN最近邻分类算法,判断所提取的相关特征属于哪个字符。

    展开全文
  • 分类算法】什么是分类算法

    千次阅读 2019-12-14 11:47:10
    分类算法的本意就是对我们的数据分进行分类。把它们分到已知的每一个类别。就像一个篮子里面有很多橙子和苹果,机器会通过我们训练出来的模型,对篮子里的水果进行分类。比如:红色 = 苹果,橙色 = 橙子。若要让机器...
  • 数据挖掘算法——常用分类算法总结

    万次阅读 多人点赞 2019-06-17 10:55:22
    常用分类算法总结分类算法总结NBC算法LR算法SVM算法ID3算法C4.5 算法C5.0算法KNN 算法ANN 算法 分类算法总结 分类是在一群已经知道类别标号的样本中,训练一种分类器,让其能够对某种未知的样本进行分类。分类算法...
  • 数据挖掘十大算法之分类算法(分类介绍及评价指标) 接上篇文章,接下来学习挖掘算法中的分类算法: 首先我们应该知道数据挖掘十大算法中可以简单的进行分类,分为分类算法,聚类算法和关联规则三大类 算法分类 连接...
  • 贝叶斯分类算法

    万次阅读 多人点赞 2018-07-31 16:09:12
    贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。而朴素朴素贝叶斯分类是贝叶斯分类中最简单,也是常见的一种分类方法。这篇文章我尽可能用直白的话语总结一下我们学习会上讲到...
  • 常见的五种分类算法

    千次阅读 2021-06-16 23:20:58
    k-近邻、决策树、朴素贝叶斯、神经网络、支持向量机分类算法(以iris为例) 所需安装包: ibrary(class)##knn library(C50)##决策树 library(e1071)##朴素贝叶斯and支持向量机 library(neuralnet)##神经网络 构造...
  • Weka平台实现分类算法 进一步理解分类算法(决策树、贝叶斯),利用weka实现数据集的分类处理,学会调整模型参数,以图或树的形式给出挖掘结果,并解释规则的含义。
  • 机器学习之KNN最邻近分类算法

    万次阅读 多人点赞 2018-09-15 13:13:33
    KNN(K-Nearest Neighbor)最邻近分类算法是数据挖掘分类(classification)技术中最简单的算法之一,其指导思想是”近朱者赤,近墨者黑“,即由你的邻居来推断出你的类别。 KNN最邻近分类算法的实现原理:为了...
  • 分类算法简介

    千次阅读 2019-06-06 22:15:36
    9 各种分类算法比较 根据这篇论文所得出的结论, Calibrated boosted trees的性能最好,随机森林第二,uncalibrated bagged trees第三,calibratedSVMs第四, uncalibrated neural nets第五。 性能较差的是朴素...
  • 聚类算法和分类算法

    千次阅读 2019-03-05 20:22:56
    常用的分类算法包括: 决策树分类法 朴素的贝叶斯分类算法(native Bayesian classifier) 基于支持向量机(SVM)的分类器 神经网络法 k-最近邻法(k-nearest neighbor,kNN) 模糊分类法 下文出处 常见的聚类算法...
  • 伯努利贝叶斯分类算法

    千次阅读 2022-03-21 19:21:01
    贝叶斯分类的核心概念: ...贝叶斯分类是一类分类算法的总称,它包括了高斯贝叶斯分类算法、伯努利贝叶斯分类算法以及多项式贝叶新分类算法。这类算法以贝叶斯定理为基础,故统称为贝叶斯分类。 下面介绍伯努利
  • 常见分类算法优缺点

    万次阅读 2018-10-21 21:36:54
    机器学习算法太多了,分类、回归、聚类、推荐、图像识别领域等等,要想找到一个合适算法真的不容易,所以在实际应用中,我们一般都是采用启发式学习方式来实验。通常最开始我们都会选择大家普遍认同的算法,诸如SVM...
  • 分类算法 -- 决策树ID3算法

    万次阅读 多人点赞 2019-02-17 01:27:43
    决策树算法是非常常用的分类算法,其分类的思路非常清晰,简单易懂。并且它也是一个很基础的算法,集成学习和随机森林算法是以其为基础的。 算法简介 对于决策树算法,其输入是带有标签的数据,输出是一颗决策树。...
  • 朴素贝叶斯分类算法简单实例

    千次阅读 2021-08-18 08:55:16
    贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。而朴素朴素贝叶斯分类是贝叶斯分类中最简单,也是常见的一种分类方法。这篇文章我尽可能用直白的话语总结一下我们学习会上讲到...
  • 分类算法-随机森林 (Classification Algorithms - Random Forest) Advertisements 广告 Previous Page 上一页 Next Page 下一页 介绍 (Introduction) Random forest is a supervised learning ...
  • 多分类及多标签分类算法

    万次阅读 多人点赞 2019-04-08 19:49:55
    1、单标签二分类算法原理 1、单标签二分类这种问题是我们最常见的算法问题,主要是指label 标签的取值只有两种,并且算法中只有一个需要预测的label标签; 直白来讲就是每个实例的可能类别只有两种(A or B);...
  • 【数据挖掘】14种分类算法展示

    千次阅读 2019-06-23 19:26:02
    本篇重视使用函数来提高代码复用率,同时使用高达14种涵盖sklearn、xgboost、lightgbm和Keras框架的分类算法进行文本分类,适合进阶和提高。 前言 本篇文本分类实战训练是以完整的文本分类项目流程来写的,比较...
  • 文本分类算法TextCNN原理详解

    千次阅读 2021-10-09 21:37:47
    【原创】文本分类算法TextCNN原理详解(一) - ModifyBlog - 博客园
  • 经典分类算法——SVM算法

    万次阅读 多人点赞 2021-03-19 16:35:46
    文章目录经典分类算法——SVM算法1 SVM算法:背景2 SVM算法思想3. Hard-SVM算法4. Soft-Margin SVM算法5. Kernel SVM算法6. SVM小结 经典分类算法——SVM算法 1 SVM算法:背景 二维分类问题是一个经典的机器学习问题...
  • 分类算法:One Class SVM

    千次阅读 2021-07-15 00:55:31
    安全检测常用算法有:Isolation Forest,One-Class Classification等,孤立森林参见另一篇,今天主要介绍One-Class Classification单分类算法。 一,单分类算法简介  One Class Learning 比较经典的算法是One-...
  • 【聚类】聚类算法和分类算法总结

    千次阅读 2018-08-24 07:54:31
    原博文: 聚类算法的种类: 基于划分聚类算法(partition clustering) k-means: 是一种典型的划分聚类... K-Means算法的扩展,采用简单匹配方法来度量分类型数据的相似度 k-prototypes: 结合了K-Mea...
  • 常见分类算法应用范围/数据要求

    千次阅读 2019-10-28 19:58:08
    单一的分类算法:决策树、贝叶斯、人工神经网络、K-近邻、支持向量机和基于关联规则的分类,HMM 组合分类算法:Bagging和Boosting k-近邻(kNN,k-Nearest Neighbors)算法 找出与未知样本x距离最近的k个训练样本,看...
  • 传统图像分类算法总结

    千次阅读 2021-04-11 13:34:06
    这里写自定义目录标题传统图像分类算法的原理(1) 数据集的处理(2)图像特征提取(3)训练分类器(4)图像分类 图像分类,顾名思义,就是输入一张图像,输出对该图像内容分类的描述的问题。它是计算机视觉的核心...
  • 浅谈分类算法原理

    万次阅读 2018-09-10 15:23:21
    二、分类算法用来解决什么问题 人群分类,新闻分类,query分类,商品分类,网页分类,垃圾邮件过滤,网页排序 三、有哪些分类算法(不保证完全,会不断补充) 1. Naive Bayesian Mode 朴素贝叶斯模型 最...
  • 回归问题和分类问题的本质一样,都是针对一个输入做出一个输出预测,其区别在于输出变量的类型。 分类问题是指,给定一个新的模式,根据训练集推断它所对应的类别(如:+1,-1),是一种定性输出,也叫离散变量预测...
  • 【机器学习】——分类算法小结

    千次阅读 2019-05-13 23:49:49
    一、分类算法简介 (1)决策树 决策树是用于分类和预测的主要技术之一,决策树学习是以实例为基础的归纳学习算法,它着眼于从一组无次序、无规则的实例中推理出以决策树表示的分类规则。构造决策树的目的是找出...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 679,458
精华内容 271,783
关键字:

分类算法

友情链接: gamlss.dist_1.7-0.tar.gz