热门关键词: xxx as ORDER BY 1# as
在本文中,我们将讨论一个分类问题,该问题涉及到将评论分为正面或负面。这里使用的评论是客户在ABC服务上所做的评论。数据收集和预处置惩罚在这个项目中使用的数据是从网上爬来的,数据清理在这个Notebook上完成。
在我们抓取数据后被生存到一个.txt文件中,下面是一行文件的例子(代表一个数据点){'socialShareUrl': '/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 - Negative3 - Neutral4 and 5 - Positive在收集数据时,网站上有36456条评论。数据高度不平衡:94%的评论是正面的,4%是负面的,2%是中性的。
在这个项目中,我们将在不平衡的数据宁静衡的数据上拟合差别的Sklearn模型(我们去掉一些正面评论,这样我们就有相同数量的正面和负面评论。)下图显示了数据的组成:在上图中,我们可以看到数据是高度不平衡的。让我们从导入须要的包开始,并界说将用于对给定的评论举行分类的类Review#导入包import numpy as npimport randomimport matplotlib.pyplot as pltfrom sklearn.model_selection import train_test_splitfrom sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizerfrom sklearn.metrics import f1_score #f1分数,一种评价指标import ast #将字符串转换为字典from IPython.display import clear_outputfrom sklearn import svm #支持向量机分类器from sklearn.metrics import confusion_matrixfrom sklearn.linear_model import LogisticRegression #导入 logistic regressionfrom sklearn.tree import DecisionTreeClassifier #导入 Decision treefrom sklearn.naive_bayes import GaussianNBfrom sklearn.ensemble import RandomForestClassifierimport pandas as pdimport 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 链接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和Ytrain_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: 25519Size 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 classActual: POSITIVEPrediction: ['POSITIVE']训练的其他模型包罗随机森林、朴素贝叶斯、决议树和Logistic回归。基于不平衡数据的模型性能评估准确度使用准确度对模型举行了评估,效果如下我们获得了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分数,并用它来评估我们的模型。F1分数F1分数是准确和召回率的和谐平均值。
准确性和召回率权衡模型正确区分正面案例和负面案例的水平。当我们凭据这个指标评估我们的模型时,效果如下从图中,我们现在知道这些模型在对正面评论举行分类时很是好,而在预测负面评论和中性评论方面则很差。
使用平衡数据作为平衡数据的一种方法,我们决议随机删除一些正面评论,以便我们在训练模型时使用匀称漫衍的评论。这一次,我们正在训练1055个正面评论和1055个负面评论的模型。我们放弃中性评论。
(你也可以思量使用过采样技术来解决数据不平衡的问题)在训练了模型之后,我们获得了以下效果支持向量机的最佳效果是88.9%的准确率,在检查F1分数(如下)后,我们现在可以意识到模型预测负面评价和正面评价一样好。如果我们看一下显示支持向量机效果的混淆矩阵,我们会注意到该模型在预测两个类方面都很好结论在完成这个项目后,我希望你能够相识到:在不平衡的数据上拟合一个或多个模型可能(在大多数情况下确实如此)会导致不良效果。在处置惩罚不平衡数据时,准确度不是一个好的权衡尺度。
大部门事情是在预处置惩罚阶段完成的。
本文来源:米6体育官网app下载手机端-www.vvjiang.com