精华内容
下载资源
问答
  • 华盛顿大学机器学习:我的机器学习项目涉及回归,分类和聚类
  • 机器学习两大典型任务,一个是回归,一个是分类,本文将总结分类项目内容。 收集数据集并选择合适的特征 选择度量模型性能的指标 度量分类模型的指标和回归的指标有很大的差异,首先是因为分类问题本身的因变量...

    参考:开源项目:机器学习集成学习与模型融合(基于python)
    Github链接

    机器学习两大典型任务,一个是回归,一个是分类,本文将总结分类项目内容。

    1. 收集数据集并选择合适的特征

    2. 选择度量模型性能的指标
      度量分类模型的指标和回归的指标有很大的差异,首先是因为分类问题本身的因变量是离散变量,因此像定义回归的指标那样,单单衡量预测值和因变量的相似度可能行不通。其次,在分类任务中,我们对于每个类别犯错的代价不尽相同,例如:我们将癌症患者错误预测为无癌症和无癌症患者错误预测为癌症患者,在医院和个人的代价都是不同的。为此需要有评价指标。

    在这里插入图片描述
    TP(True Positives): 被分为正样本,并且分对了
    FP (False Positives) : : 被分为正样本,并且分错了
    TN(True Negatives): 被分为负样本,而且分对了
    FN(False Negatives): 被分为负样本,但是分错了

    –准确率:分类正确的样本数占总样本的比例,即Accuracy=(TP+TN)/(TP+TN+FP+FN);
    –精度:预测为正且分类正确的样本占预测值为正的比例,即Precision=TP/(TP+FP)
    –召回率:预测为正且分类正确的样本占类别为正的比例,即Recall = TP/(TP+TP)
    –ROC曲线:以假阳率为横轴,真阳率为纵轴画出来的曲线,曲线下方面积越大越好。

    1. 选择具体的模型并进行训练
      逻辑回归虽然名字里带“回归”,但是它实际上是一种分类方法,主要用于两分类问题,利用Logistic函数(或称为Sigmoid函数),自变量取值范围为(-INF, INF),自变量的取值范围为(0,1)
      在这里插入图片描述
      LR分类器(Logistic Regression Classifier)目的就是从训练数据特征学习出一个0/1分类模型。
    展开全文
  • 前言:之前答应一个朋友介绍一下机器学习项目的基本流程,就以一个短文本分类项目为示例,介绍一下在面对机器学习项目时的基本解决思路,因为不是专业的算法工程师,所以有疏漏之处请大家多多见谅。同时由于这是一个...

    一:前言

    之前答应一个朋友介绍一下机器学习项目的基本流程,就以一个短文本分类项目为示例,介绍一下在面对机器学习项目时的基本解决思路,因为不是专业的算法工程师,所以有疏漏之处请大家多多见谅。同时由于这是一个内部比赛项目,所以数据无法公开,但是代码会分享在git上,代码写的也很一般,请大家多多理解。

    二:题目

    为了减少公司售后服务的人力投入,相关部门做了售后智能机器人,主要通过用户的问题得到他的意图所属类别,但是现有的方案对用户提问问题的类别识别准确率较低,需要研究更为优化的方案提升问题类别识别准确率。出题方提供的数据集如下,大概22w条数据,已知存在大量脏数据,问题和所属类别中间用\t分隔。


    同时提供2w条预测数据,预测数据只有用户的问题,需要去预测这2w条问题所属的类别。

    在本题中,评价标准是优先比较问题识别总的准确率,准确率相同比较类别24的召回率(查准率和查全率的加和平均)。

    三:解决思路

    1.判断题目类别

    机器学习项目有(分类/回归/聚类)三大类问题,分类就是训练集已知样本和对应的类别,然后去预测新的样本类别;回归就是相当于分类中的离散值类别变成连续值;聚类就是训练集中没有类别,需要通过聚类算法去找到对应类别。

    本道题是一个典型的分类的问题,由于用户所提的问题都很短,所以是一个短文本分类问题,确定好问题之后,下面就是去搜集对应的资料了。

    2.搜集资料

    一般来说现有的问题学术界都已经给出了解决方案,所以可以通过关键词(短文本分类/Text Classfication)去搜索(百度/中国知网/Google Scholar),通过查阅资料可以知道解决短文本分类有以下几种常见的解决方案:

    (1)通过TF-IDF算法生成每个短文本的特征向量,然后使用传统分类算法去训练模型,通过模型去预测新数据的类别。

    (2)通过Word2Vec算法生成每个短文本的特征向量,然后使用CNN卷积神经网络进行模型训练,通过模型去预测新数据的类别。

    (3)通过Word2Vec算法生成每个短文本的特征向量,然后使用CNN进行文本语义相似度分析,通过文本相似度判断所属类别。

    3.确认方案

    由于刚开始做的时候对该类型项目不熟悉,所以就采用了第一种最传统的做法,简单高效学习成本低。下面概述的就是基于第一种方案,该方案效果较优,但可拓展性差,后面会做详细说明。

    4.数据探查

    在实际项目中,样本分布不均匀和样本质量低下都是常见的问题,分布不均匀反映在不同类别的训练样本数量呈几十到上百倍的差距,样本质量低下反映的是大量样本类别标错/样本特征值缺失/样本特征值错误等问题。通过人工探查和数据分析得到如下的结论:


    5.数据处理

    数据处理有两方面工作:

    (1)首先要使用分词工具对样本进行切词,并过滤掉停用词(停用词就是类似标点符号/转折词/语气词这些词汇,因为本方案采用的是TF-IDF方法,是基于词频逆文本的方案,所以不需要这些语气转折词),并针对过滤掉停用词为空的样本标记为“闲聊”类别。

    (2)使用TF-IDF提取各类别的关键词,然后进行近义词拓展,得到每个类别的关键词,如果训练集中某类别的样本不包含对应的类别关键词,就将该样本过滤(因为用户提问的问题都是很直白的,比如酒店类型的问题中一般都会包含订房/退房/改签等,所以可以认为不包含对应类别的关键词但是属于该类别的样本就是脏样本,这种方式是基于规则的,通过该方式过滤了30%的脏样本,人工check之后发现效果过滤很好)。


    6.数据平衡

    数据不平衡是机器学习项目中最常遇见的问题,容易造成过拟合,业界也有很多解决方案,本方案采用了最简单的随机过采样方式,针对实验预测效果不佳的类别进行过采样。


    7.特征工程

    特征工程在正常的机器学习项目中属于最重要的一环,比如你有n个样本,那你要构造出m个特征(m范围一般几百到几千,以购物为例,用户过去1/2/3/4/5/6/7天的购买数就是7维特征了,这种项目就需要根据业务去构建合适的特征),这样一个n*m的矩阵就可以作为输入去训练模型了。由于本文是短文本分类的问题,直接使用TF-IDF通过字典构造特征的,并不需要人为干预,所以在这里特征工程就不是重点要说的了。使用TF-IDF为文本构造向量,维度设定为1w维,特征向量矩阵如下(因为维度太高,所以无法使用Smote算法进行过采样,也无法使用K-means进行样本过滤,所以建议还是使用Word2Vec生成几百维向量,方便拓展,但是毕竟这种方法好理解,作为练手完全可以)。


    8.模型选择

    因为这是个分类问题,所以采用分类算法,业界常用逻辑回归/xgboost/gbdt/随机森林等,在进行模型训练时,一般要选择百分之80数据作为训练集,百分之20数据作为测试集,用训练集去训练模型,用测试集去测试模型的好坏,这样可以通过测试集的结果进行调参。为了防止模型抖动,一般会每次使用不同的不相交的百分之20数据作为测试集,剩下的数据作为训练集,取平均测试结果作为模型的预测结果,这种方式叫做五折(100/20)交叉验证,当然你也可以采用任意折交叉验证,这个视经验而定。如果训练了不同的模型,可以将多个模型结果进行融合,模型融合有bagging/stacking/blending等方法,本文方案也尝试了加权方式的模型融合,但是发现效果没有直接使用随机森林方法好,可能是参数没调好,最后因为时间原因还是采用速度快且效果明显的随机森林算法。下图分别表示各模型效果以及随机森林算法在各个子类别上的效果(在实验中发现某些样本数少的类别预测效果明显低于平均值,这个时候可以针对这些类别进行过采样或者单独预测)。


    9.预测结果

    最后用模型去预测,得到预测数据集的类别,和出题方给的真实类别进行比对,得出该模型预测结果总体准确率为百分之91%,类别24的f1值为0.98。


    10.总结与反思

    本文采用了传统的机器学习方法对短文本进行分类,容易理解且方便上手,但是采用TF-IDF算法生成的向量维度太高,无法进行有效拓展,如果采用Word2Vec方法,向量维度可以降低到几百维,这时可以使用K-means算法对样本进行聚类,对距离类别中心点较远的样本点进行过滤,同样可以采用Smote算法进行采样,有效的解决了脏样本过滤和类别不平衡的问题,降低了模型过拟合的风险。由于工作方向和时间的原因,没有进一步实现解决该问题的CNN方案。

    四:代码地址

    代码中敏感信息有删减,希望大家见谅,仅供参考

    https://github.com/pengjiapeng/hackathon



    展开全文
  • 端到端机器学习In this article, we will go through a classification problem that involves classifying a review as either positive or negative. The reviews used here are the reviews made by customers on...

    端到端机器学习

    In this article, we will go through a classification problem that involves classifying a review as either positive or negative. The reviews used here are the reviews made by customers on a service ABC.

    在本文中,我们将讨论分类问题,该问题涉及将评论分为正面还是负面。 此处使用的评论是客户在ABC服务上所做的评论。

    数据收集与预处理 (Data Collection and Pre-processing)

    The data used in this particular project were scraped from the web and data cleaning done in this notebook.

    该特定项目中使用的数据是从Web上抓取的,并且在此笔记本中完成了数据清理。

    After we scraping the data was saved to a .txt file and here is an example of one line of the file (to represent one data point)

    在我们抓取数据之后,将其保存到一个.txt file ,以下是该文件的一行示例(代表一个数据点)

    {'socialShareUrl': 'https://www.abc.com/reviews/5ed0251025e5d20a88a2057d', 'businessUnitId': '5090eace00006400051ded85', 'businessUnitDisplayName': 'ABC', 'consumerId': '5ed0250fdfdf8632f9ee7ab6', 'consumerName': 'May', 'reviewId': '5ed0251025e5d20a88a2057d', 'reviewHeader': 'Wow - Great Service', 'reviewBody': 'Wow. Great Service with no issues.  Money was available same day in no time.', 'stars': 5}

    The data point is a dictionary and we are interested in the reviewBody and stars.

    数据点是字典,我们对reviewBodystars感兴趣。

    We will categorize the reviews as follows

    我们将对评论进行如下分类

    1 and 2 - Negative
    3 - Neutral
    4 and 5 - Positive

    At the moment of data collection, there were 36456 reviews on the site. The data is highly imbalanced: 94% of the total reviews are positive, 4% are negative and 2% are neutral. In this project, we will fit different Sklearn models on the imbalanced data and also on balanced data (dropping positive excesses so that we have the same number of positive and negative reviews.)

    收集数据时,网站上有36456条评论。 数据高度不平衡:总评论中有94%是正面的,4%是负面的,2%是中立的。 在此项目中,我们将在不平衡数据和平衡数据上使用不同的Sklearn模型(删除正的过剩量,以便我们获得相同数量的正面和负面评论。)

    Below is a plot showing the composition of the data:

    以下是显示数据组成的图:

    Image for post
    Fig 2: Data composition (Source: Author)
    图2:数据组成(来源:作者)

    In Fig 2 and the figures above, we can see that the data is highly imbalanced. Could this be a sign of a problem? We shall see.

    在图2和上面的图中,我们可以看到数据高度不平衡。 这可能是问题的征兆吗? 我们将会看到。

    Let's start by importing necessary packages and also define the class Review that we will use to categorize a given review message

    让我们从导入必要的程序包开始,并定义Review类,我们将使用该类对给定的评论消息进行分类

    Here, we will load the data and use the Review class to categorize the review message as positive, negative or neutral

    在这里,我们将加载数据并使用Review类将评论消息分类为肯定,否定或中性

    Wow. Great Service with no issues.  Money was available same day in no time.POSITIVE

    将数据分为训练和测试集 (Split Data into Training and Test Set)

    Size of train set:  25519
    Size of train set: 10937

    Before we continue further, we need to understand the concept of Bag-of-Words.

    在继续进行之前,我们需要了解单词袋的概念

    言语袋 (Bag-of-Words)

    [link] [link]

    [ 链接 ] [ 链接 ]

    As we know, a computer only understands numbers and therefore we need to convert the review messages we have into a list of numbers using bag-of-words model.

    众所周知,计算机只能理解数字,因此我们需要使用词袋模型将已有的评论消息转换为数字列表。

    A bag-of-words is a representation of text that describes the occurrence of words within a document. It involves two things: A vocabulary of known words. A measure of the presence of known words.

    词袋是描述文档中单词出现的文本表示。 它涉及两件事:已知单词的词汇表度量已知单词的存在

    The bag-of-words model is a supporting model used in document classification where the (frequency of) occurrence of each word is used as a feature for training a classifier.

    词袋模型是在文档分类中使用的支持模型,其中每个单词的出现频率用作训练分类器的功能。

    Example:

    例:

    Consider these two reviews

    考虑这两项评论

    • Excellent Services by the ABC remit team.Recommend.

      ABC汇款团队的优质服务。推荐。
    • Bad Services. Transaction delayed for three days.Don’t recommend.

      不良服务。 交易延迟了三天,不推荐。

    From the above two sentences, we can derive the following dictionary

    从以上两个句子中,我们可以得出以下字典

    [Excellent, Services, by, the, ABC, remit, team, recommend, bad, transaction, delayed, for, three, days, don’t]

    [优秀,服务,由ABC,汇款,团队,推荐,差,交易,延迟,三天不]

    We now tokenize this dictionary to generate the following two data points that can now be used to train the classifier

    现在,我们对该词典进行标记化,以生成以下两个数据点,这些数据点现在可用于训练分类器

    Image for post
    Fig 3 (Source: Author)
    图3(来源:作者)

    In python, tokenization is done as follows

    在python中,标记化操作如下

    ['abc', 'bad', 'by', 'days', 'delayed', 'don', 'excellent', 'for', 'recommend', 'remit', 'services', 'team', 'the', 'three', 'transaction'][[1 0 1 0 0 0 1 0 1 1 1 1 1 0 0]
    [0 1 0 1 1 1 0 1 1 0 1 0 0 1 1]]

    Now that we understand the concept of Bag-of-Words, lets now apply that knowledge on our train_x and test_x

    既然我们已经了解了词袋的概念,那么现在就将该知识应用于train_xtest_x

    在不平衡数据中训练模型 (Training the Models in Imbalanced data)

    At this point, we have the vectors that we can use to fit the models and we can go ahead and do just that

    至此,我们有了可用于拟合模型的向量,我们可以继续进行操作

    Support Vector Machine

    支持向量机

    Review Message:  easy efficient  first class
    Actual: POSITIVE
    Prediction: ['POSITIVE']
    Image for post
    Fig 4: Confusion matrix resulting from fitting SVM (Source: Author)
    图4:因拟合SVM而产生的混淆矩阵(来源:作者)

    Other models trained includes Ensemble Random Forest, Naive Bayes, Decision Tree and Logistic Regression. A link to the full code.

    训练的其他模型包括集成随机森林,朴素贝叶斯,决策树和逻辑回归。 完整代码的链接

    不平衡数据的模型性能评估 (Evaluation of Model Performance on Imbalanced data)

    1. Accuracy

      准确性

    The models were evaluated using accuracy metric and the results were as follows

    使用精度度量对模型进行评估,结果如下

    Image for post
    Fig 5 : Performance of the models on imbalanced data (Source: Author)
    图5:模型在不平衡数据上的性能(来源:作者)

    We are getting an accuracy of 90%, is that right or there’s something wrong? The answer is, there is something wrong.

    我们的准确率达到90% ,是对还是错? 答案是,有什么问题。

    The data is imbalanced and using accuracy as an evaluation metric is not a good idea. Below is the distribution in the categories

    数据不平衡,使用准确性作为评估指标不是一个好主意。 以下是类别中的分布

    ----------TRAIN SET ---------------
    Positive reviews on train set: 23961 (93.89%)
    Negative reviews on train set: 1055 (4.13%)
    Neutral reviews on train set: 503 (1.97%)
    ----------TEST SET ---------------
    Positive reviews on test set: 10225 (93.48%)
    Negative reviews on test set: 499 (4.56%)
    Neutral reviews on test set: 213 (1.95%)

    What happens if the classifier predicts all positive reviews correctly and none for negative and neutral reviews in the test set? The classifier will attain an accuracy of 93.48%!!!!!!

    如果分类器正确地预测了所有正面评价,而对于测试集中的负面评价和中性评价则没有预测,会发生什么呢? 分类器将达到93.48%的精度!

    This means that our model will be 93.48% accurate and we will think that the model is good but in reality, the model “just knows best” how the predict one class (positive reviews). In fact, from Fig 4, SVM predicted no neutral review at all

    这意味着我们的模型将达到93.48%的准确度,并且我们会认为该模型很好,但是实际上,该模型“最清楚”如何预测一个类别(积极评论)。 实际上,从图4可以看出,SVM完全没有中立的预测

    To understand this problem further, let us introduce another metric: F1 score, and use it to evaluate our models.

    为了进一步了解这个问题,让我们介绍另一个指标: F1得分,并用它来评估我们的模型。

    2. F1 Score

    2. F1得分

    The F1 score is the harmonic mean of the precision and recall Wikipedia.

    F1分数是精确度和召回率Wikipedia的调和平均值。

    Image for post

    Precision and recall measures how well the model correctly classifies the positive cases and the negative cases. Read more here.

    精确度和召回率可衡量模型对阳性病例和阴性病例进行正确分类的程度。 在这里阅读更多。

    When we evaluate our models on this metric the result is as follows

    当我们根据该指标评估模型时,结果如下

    Image for post
    Fig 6(Table) : F1 scores for different classifiers (Source: Author)
    图6(表):不同分类器的F1得分(来源:作者)
    Image for post
    Fig 7(Plot) : F1 scores for different classifiers (Source: Author)
    图7(图):不同分类器的F1得分(来源:作者)

    From Fig 6 and Fig 7, we now know that the models are very good in classifying positive reviews and poor in predicting negative and neutral reviews.

    从图6和图7,我们现在知道模型在对正面评论进行分类方面非常好,而对负面评论和中立评论的预测则很差。

    处理平衡数据 (Working with Balanced Data)

    As a way of balancing the data we decided to randomly drop some positive reviews so that we use evenly-distributed reviews on training the model. This time round we are training the model on 1055 positive reviews and 1055 negative reviews. We are also dropping the neutral class.

    为了平衡数据,我们决定随机删除一些肯定的评论,以便在训练模型时使用分布均匀的评论。 这次,我们将在1055个正面评论和1055个负面评论上训练模型。 我们也放弃中立阶级。

    Image for post
    Fig 8: Distribution of balanced data (Source: Author)
    图8:平衡数据的分布(来源:作者)

    (You can also consider using oversampling techniques to fix the problem of imbalanced data)

    (您也可以考虑使用过采样技术来解决数据不平衡的问题)

    After training the models we ended up with the following results

    训练模型后,我们得出以下结果

    Image for post
    Fig 9: Model accuracies on balanced data (Source: Author)
    图9:平衡数据上的模型精度(来源:作者)

    SVM attains the best result of 88.9% accuracy and upon checking the F1 score (below) we can now realize that the models predicts negative reviews as good as positive ones.

    SVM达到88.9%的最佳准确性,通过检查F1分数(如下),我们现在可以意识到模型预测的负面评论与正面评论一样好。

    Image for post
    Fig 10(Table) : F1 Scores for different classifiers (Source: Author)
    图10(表):不同分类器的F1得分(来源:作者)
    Image for post
    Fig 11(plot): F1 scores for different classifiers (Source: Author)
    图11(图):不同分类器的F1得分(来源:作者)

    If we look at the confusion matrix showing the results of SVM we notice that the model is good in predicting both classes

    如果我们看一下显示SVM结果的混淆矩阵,我们会注意到该模型可以很好地预测两个类

    Image for post
    Fig 12: Confusion matrix generated using SVM results
    图12:使用SVM结果生成的混淆矩阵

    Find the full code here

    这里找到完整的代码

    结论 (Conclusion)

    After going through this project I hope you were able to learn that:

    完成此项目后,我希望您能够学到:

    • Fitting a model or models on an imbalanced data might (in most cases it does) lead to undesirable results.

      在不平衡的数据上拟合一个或多个模型可能(在大多数情况下确实如此)会导致不良结果。
    • Accuracy is not a good metric when dealing with imbalanced data.

      处理不平衡数据时,准确性不是一个好的指标。
    • Most of the work is done in the pre-processing stage.

      大多数工作是在预处理阶段完成的。

    Thank you for reading :-)

    感谢您的阅读:-)

    翻译自: https://towardsdatascience.com/end-to-end-machine-learning-project-reviews-classification-60666d90ec19

    端到端机器学习

    展开全文
  • 在本文中,我们将讨论一个分类问题,该问题涉及到将评论分为正面或负面。这里使用的评论是客户在ABC服务上所做的评论。 数据收集和预处理 在这个项目中使用的数据是从网上爬来的,数据清理在这个Notebook上完成:...

    作者|Kiprono Elijah Koech 编译|VK 来源|Towards Data Science

    在本文中,我们将讨论一个分类问题,该问题涉及到将评论分为正面或负面。这里使用的评论是客户在ABC服务上所做的评论。

    数据收集和预处理

    在这个项目中使用的数据是从网上爬来的,数据清理在这个Notebook上完成:https://github.com/kipronokoech/Reviews-Classification/blob/master/data_collection.ipynb

    在我们抓取数据后被保存到一个.txt文件中,下面是一行文件的例子(代表一个数据点)

    {'socialShareUrl': 'https://www.abc.com/reviews/5ed0251025e5d20a88a2057d', 'businessUnitId': '5090eace00006400051ded85', 'businessUnitDisplayName': 'ABC', 'consumerId': '5ed0250fdfdf8632f9ee7ab6', 'consumerName': 'May', 'reviewId': '5ed0251025e5d20a88a2057d', 'reviewHeader': 'Wow - Great Service', 'reviewBody': 'Wow. Great Service with no issues.  Money was available same day in no time.', 'stars': 5}

    数据点是一个字典,我们对reviewBody和stars感兴趣。

    我们将把评论分类如下

    1 and 2 - Negative
    3 - Neutral
    4 and 5 - Positive

    在收集数据时,网站上有36456条评论。数据高度不平衡:94%的评论是正面的,4%是负面的,2%是中性的。在这个项目中,我们将在不平衡的数据和平衡的数据上拟合不同的Sklearn模型(我们去掉一些正面评论,这样我们就有相同数量的正面和负面评论。)

    下图显示了数据的组成:

    在上图中,我们可以看到数据是高度不平衡的。

    让我们从导入必要的包开始,并定义将用于对给定的评论进行分类的类Review

    #导入包
    import numpy as np
    import random
    import matplotlib.pyplot as plt
    from sklearn.model_selection import train_test_split
    from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
    from sklearn.metrics import f1_score #f1分数,一种评价指标
    import ast #将字符串转换为字典
    from IPython.display import clear_output
    from sklearn import svm #支持向量机分类器
    from sklearn.metrics import confusion_matrix
    from sklearn.linear_model import LogisticRegression #导入 logistic regression
    from sklearn.tree import DecisionTreeClassifier #导入 Decision tree
    from sklearn.naive_bayes import GaussianNB
    from sklearn.ensemble import RandomForestClassifier
    import pandas as pd
    import seaborn as sb
    
    
    # 将评论分为正面、负面或中性
    class Review:
        def __init__(self, text, score):
            self.text = text
            self.score = score
            self.sentiment = self.get_sentiment()
    
        def get_sentiment(self):
            if self.score <= 2:
                return "NEGATIVE"
            elif self.score == 3: 
                return "NEUTRAL"
            else: #4或5分
                return "POSITIVE"

    在这里,我们将加载数据并使用Review类将评论分类为正面、反面或中性

    # 大部分清理是在数据web爬取期间完成的
    # Notebook 链接
    # https://github.com/kipronokoech/Reviews-Classification/blob/master/data_collection.ipynb
    reviews = []
    with open("./data/reviews.txt") as fp:
        for index,line in enumerate(fp):
            # 转换为字典
            review = ast.literal_eval(line)
            #对评论进行分类并将其附加到reviews中
            reviews.append(Review(review['reviewBody'], review['stars']))
    
    # 打印出reviews[0]的情绪类别和文本
    print(reviews[0].text)
    print(reviews[0].sentiment)
    Wow. Great Service with no issues.  Money was available same day in no time.
    
    POSITIVE

    将数据拆分为训练集和测试集

    # 70%用于训练,30%用于测试
    training, test = train_test_split(reviews, test_size=0.30, random_state=42)
    
    # 定义X和Y
    train_x,train_y = [x.text for x in training],[x.sentiment for x in training]
    test_x,test_y = [x.text for x in test],[x.sentiment for x in test]
    
    print("Size of train set: ",len(training))
    print("Size of train set: ",len(test))
    Size of train set:  25519
    Size of train set:  10937

    在我们继续下一步之前,我们需要理解词袋的概念。

    词袋

    正如我们所知,一台计算机只理解数字,因此我们需要使用词袋模型将我们收到的评论信息转换成一个数字列表。

    词袋是一种文本表示形式。它包括两个方面:已知单词的词汇与已知单词存在程度的度量。

    词袋模型是一种用于文档分类的支持模型,其中每个词的出现频率作为训练分类器的特征。

    例子:

    考虑这两个评论

    • Excellent Services by the ABC remit team.Recommend.
    • Bad Services. Transaction delayed for three days.Don’t recommend.

    从以上两句话中,我们可以得出以下词典

    [Excellent, Services, by, the, ABC, remit, team, recommend, bad, transaction, delayed, for, three, days, don’t]

    我们现在将这个字典标记化以生成以下两个数据点,这些数据点现在可以用来训练分类器

    在python中,标记化的实现如下

    # 导入用于向量化的库
    from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
    
    # sklearn上的向量化——简单的例子
    corpus = [
        "Excellent Services by the ABC remit team.Recommend.",
        "Bad Services. Transaction delayed for three days.Don't recommend."]
    vectorizer = CountVectorizer()
    X = vectorizer.fit_transform(corpus)
    #print(X) #这是一个矩阵
    print(vectorizer.get_feature_names()) # 字典
    print(X.toarray())#显然是一个矩阵,每一行都是每个句子的标记值
    ['abc', 'bad', 'by', 'days', 'delayed', 'don', 'excellent', 'for', 'recommend', 'remit', 'services', 'team', 'the', 'three', 'transaction']
    [[1 0 1 0 0 0 1 0 1 1 1 1 1 0 0]
     [0 1 0 1 1 1 0 1 1 0 1 0 0 1 1]]

    现在我们已经理解了词袋的概念,现在让我们将这些知识应用到我们的训练和测试中

    vectorizer = TfidfVectorizer()
    train_x_vectors = vectorizer.fit_transform(train_x)
    test_x_vectors = vectorizer.transform(test_x)

    在不平衡数据中训练模型

    现在,我们拥有了向量,我们可以用来拟合模型,我们可以这样做

    支持向量机

    #训练支持向量机分类器
    clf_svm = svm.SVC(kernel='linear')
    
    clf_svm.fit(train_x_vectors, train_y)
    #基于SVM的随机预测
    
    i = np.random.randint(0,len(test_x))
    print("Review Message: ",test_x[i])
    print("Actual: ",test_y[i])
    print("Prediction: ",clf_svm.predict(test_x_vectors[i]))
    
    #支持向量机的混淆矩阵——你可以有其他分类器的混淆矩阵
    labels = ["NEGATIVE","NEUTRAL","POSITIVE"]
    pred_svm = clf_svm.predict(test_x_vectors)
    cm =confusion_matrix(test_y,pred_svm)
    
    df_cm = pd.DataFrame(cm, index=labels, columns=labels)
    
    sb.heatmap(df_cm, annot=True, fmt='d')
    plt.title("Confusion matrix from SVM [Imbalanced]")
    plt.savefig("./plots/confusion.png")
    Review Message:  easy efficient  first class
    Actual:  POSITIVE
    Prediction:  ['POSITIVE']

    训练的其他模型包括随机森林、朴素贝叶斯、决策树和Logistic回归。

    完整代码的链接:https://github.com/kipronokoech/Reviews-Classification

    基于不平衡数据的模型性能评估

    1. 准确度

    利用准确度对模型进行了评估,结果如下

    我们得到了90%的准确率,是正确还是有问题?答案是,出了点问题。

    数据是不平衡的,使用准确度作为评估指标不是一个好主意。以下是各类别的分布情况

    ----------TRAIN SET ---------------
    Positive reviews on train set: 23961 (93.89%)
    Negative reviews on train set: 1055 (4.13%)
    Neutral reviews on train set: 503 (1.97%)
    
    ----------TEST SET ---------------
    Positive reviews on test set: 10225 (93.48%)
    Negative reviews on test set: 499 (4.56%)
    Neutral reviews on test set: 213 (1.95%)

    如果分类器正确地预测了测试集中所有的正面评价,而没有预测到负面和中性评论,会发生什么?该分类器的准确率可达93.48%!!!!!!

    这意味着我们的模型将是93.48%的准确率,我们会认为模型是好的,但实际上,模型“只知道”如何预测一类(正面评价)。事实上,根据我们的结果,我们的支持向量机预测根本没有中性评论

    为了进一步理解这个问题,让我们引入另一个指标:F1分数,并用它来评估我们的模型。

    1. F1分数

    F1分数是精确和召回率的调和平均值。

    精确性和召回率衡量模型正确区分正面案例和负面案例的程度。

    当我们根据这个指标评估我们的模型时,结果如下

    从图中,我们现在知道这些模型在对正面评论进行分类时非常好,而在预测负面评论和中性评论方面则很差。

    使用平衡数据

    作为平衡数据的一种方法,我们决定随机删除一些正面评论,以便我们在训练模型时使用均匀分布的评论。这一次,我们正在训练1055个正面评论和1055个负面评论的模型。我们放弃中性评论。

    (你也可以考虑使用过采样技术来解决数据不平衡的问题)

    在训练了模型之后,我们得到了以下结果

    支持向量机的最佳结果是88.9%的准确率,在检查F1分数(如下)后,我们现在可以意识到模型预测负面评价和正面评价一样好。

    如果我们看一下显示支持向量机结果的混淆矩阵,我们会注意到该模型在预测两个类方面都很好

    在这里找到完整的代码:https://github.com/kipronokoech/Reviews-Classification

    结论

    在完成这个项目后,我希望你能够了解到:

    1. 在不平衡的数据上拟合一个或多个模型可能(在大多数情况下确实如此)会导致不良结果。

    2. 在处理不平衡数据时,准确度不是一个好的衡量标准。

    3. 大部分工作是在预处理阶段完成的。

    感谢阅读

    原文链接:https://towardsdatascience.com/end-to-end-machine-learning-project-reviews-classification-60666d90ec19

    欢迎关注磐创AI博客站: http://panchuang.net/

    sklearn机器学习中文官方文档: http://sklearn123.com/

    欢迎关注磐创博客资源汇总站: http://docs.panchuang.net/

    展开全文
  • 项目针对鸢尾花进行分类项目中的数据集是含鸢尾花的三个亚属的分类信息,通过机器学习算法生成一个模型,自动分类新数据到这三个亚属的某一个中。一、数据集特点分析此项目中使用的鸢尾花数据集是一个非常容易...
  • 项目建立的过程中,实践是掌握机器学习的最佳手段。在实践过程中,通过实际操作加深对分类和回归问题的每一个步骤的理解,达到学习机器学习的目的。预测模型项目模板不能只通过阅读来掌握机器学习的技能,需要进行...
  • 项目针对鸢尾花进行分类项目中的数据集是含鸢尾花的三个亚属的分类信息,通过机器学习算法生成一个模型,自动分类新数据到这三个亚属的某一个中。一、数据集特点分析此项目中使用的鸢尾花数据集是一个非常容易...
  • 文章目录朴素贝叶斯小项目——识别作者SVM小项目——识别作者决策树小项目...参见文章 机器学习(1)——贝叶斯网络分类算法 最后一部分 SVM小项目——识别作者 参见 文章 机器学习——SVM 决策树小项目——识别作...
  • 机器学习项目实战

    2020-09-10 11:22:12
    各个行业各种机器学习算法的应用实战,项目列表: 回归应用:波士顿房价预测 回归应用:葡萄酒质量和时间的关系 逻辑回归:银行用户流失预测 逻辑回归:糖尿病预测项目 KNN:鸢尾花分类 KNN:水果分类 神经网络:...
  • 一、机器学习项目的步骤 二、项目的数据集 1、数据集介绍 2、数据集链接 3、数据集下载 (1)进入网站,单击Data Folder (2)单击如下四个文件下载 三、项目分析 四、项目步骤 1、安装Python和Scipy平台 ...
  • 本周机器学习项目的主要目标在于引入概率模型。之前内容使用函数来描述模型,本周则侧重于从概率角度描述机器学习。概率与统计几乎是整个机器学习最重要的基础,甚至可能是深度学习之后新一代机器学习模型的基础。...
  • 机器学习项目流程

    2019-10-06 10:26:59
    原文出处:机器学习项目流程 原文作者:wxquare 1. 理解实际问题,抽象为机器学习能处理的数学问题 理解实际业务场景问题是机器学习的第一步,机器学习中特征工程和模型训练都是非常费时...参考机器学习分类...
  • 项目建立的过程中,实践是掌握机器学习的最佳手段。在实践过程中,通过实际操作加深对分类和回归问题的每一个步骤的理解,达到学习机器学习的目的。不能只通过阅读来掌握机器学习的技能,需要进行大量的练习。本文...
  • 打算更新一个小的系列,不定期更新,但是题目定为《每周一个机器学习项目》,主要偏重于深度学习内容,穿插一些传统的机器学习算法的理论和实现。没有什么特色,也没有什么噱头,甚至于名字都很普通。主要是想用...
  • 机器学习开源项目

    2018-11-27 09:04:06
    图1:在GitHub上用Python语言机器学习项目,图中颜色所对应的Bob, Iepy, Nilearn, 和NuPIC拥有最高的价值   1. Scikit-learn www.github.com/scikit-learn/scikit-learn Scikit-learn 是基于Scipy为机器学习...
  • 机器学习分类猫狗It’s been 3 weeks since I had started my 6 week ML project and I’m feeling very happy that I was able to do quite a lot of stuff and learn new things from this project. It is always ...
  • 用于后续分类模型的训练】项目系列文章请查看:机器学习项目之照片分拣01:项目概述机器学习项目之照片分拣02:创建照片分类数据集(本文)机器学习项目之照片分拣03:训练照片分类模型机器学习项目之照片分拣04:预测...
  • 机器学习基础-使用sklearn构建分类项目一、数据集与特征二、选择合适的性能指标三、模型训练逻辑回归线性判别分析朴素贝叶斯决策树支持向量机总结 一、数据集与特征 使用sklearn中的乳腺癌数据集 from sklearn ...
  • 机器学习项目实践

    2018-07-19 20:40:00
    项目建立的过程中,实践是掌握机器学习的最佳手段。在实践过程中,通过实际操作加深对分类和回归问题的每一个步骤的理解,达到学习机器学习的目的。 预测模型项目模板 不能只通过阅读来掌握机器学习的技能,...
  • ## 收支分类 转类别特征 sz_id_inf['cat1'] = sz_id_inf['cat1'].astype('category').cat.codes ## sz_id g2 类别编码 train test 保持一致的编码 transaction_history = transaction_history.sort_values(['id',...
  • 欢迎关注、推广和宣传内容目录:机器学习项目实战——新闻分类任务机器学习项目实战——新闻分类任务数据的读取及预处理删除停用词词云关键字提取LDA: 主题模型贝叶斯分类机器学习项目实战——新闻分类任务采用文本...
  • 项目建立的过程中,实践是掌握机器学习的最佳手段。在实践过程中,通过实际操作加深对分类和回归问题的每一个步骤的理解,达到学习机器学习的目的。预测模型项目模板不能只通过阅读来掌握机器学习的技能,需要进行...
  • 3.1 机器学习 - 机器学习项目案例

    千次阅读 2020-02-19 20:55:53
    机器学习 - 岭回归、决策树、逻辑回归、贝叶斯分类和随机森林分类
  • 表情符号_匹配 ESSEC机器学习课程的人脸检测和情感分类项目
  • 机器学习项目 - 垃圾邮件分类

    千次阅读 2019-01-07 22:48:03
    一, 数据清洗  (1),先做数据清洗,清洗过的数据被称之为"干净数据";  具体过程为-》要结合业务场景来判断哪些特征是值得被提取的,  如果自身对业务场景并不熟悉,可以咨询或者请教身边经验丰富的...
  • 机器学习用于项目Cognoma 该存储库托管了针对Project Cognoma的机器学习代码和讨论(请参阅 )。 注意:此存储库不再是Web应用程序的最新信息 可在找到为网站用户提供的生产笔记本。 该存储库将用于继续的数据探索...

空空如也

空空如也

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

机器学习分类项目