本文共 2597 字,大约阅读时间需要 8 分钟。
在学习完nlp预处理TF-IDF和Word2Vec之后,终于要进入模型的学习和使用啦。
【任务 3.1】LR+SVM 时常: 2天
使用下面模型对数据进行分类(包括:模型构建&调参&性能评估),并截图F1评分的结果。
1)逻辑回归(LR)模型,学习理论并用Task2的特征实践
2)支持向量机(SVM) 模型,学习理论并用Task2的特征实践
首先我们来了解一下逻辑回归(Logistic Regression)。逻辑回归不是回归,是用来解决分类任务的。二分类问题的概率与自变量之间的关系图形往往是一个S型曲线,如下图所示,采用的Sigmoid函数实现。
这里我们可以定义函数为:
函数的定义域为全体实数,值域在[0,1]之间,x轴在0点对应的结果为0.5。当x取值足够大的时候,可以看成0或1两类问题,大于0.5可以认为是1类问题,反之是0类问题,而刚好是0.5,则可以划分至0类或1类。由此可见,我们可以使用逻辑回归来解决二分了问题。
但是我们的数据是多分类的,1-19 共19种label。为了适应我们的label,我们需要将逻辑回归扩展到多分类上。因此,让其适应多分类问题,损失函数就不能再笼统地只考虑二分类非1就0的损失,而是具体考虑每个样本标记的损失。这种方法叫做softmax回归,即使用softmax来实现logistic回归的多分类版本。更深入的理解,详见参考文献。
接下来我们简单地了解SVM支持向量机。SVM是一个大的概念,可以用于分类和回归任务。SVC是SVM的一种类型,用于分类任务;而SVR是另外一种类型,用于回归任务。详细的公式见下图,需要一定的数学基础:
逻辑回归和SVM都是在数据挖掘及机器学习中非常常用的模型方法,在Python中都已经得到很好地封装,只需要简单地调用就好,方法中有不少的参数,还需要进一步的学习。详见参考文献。
接下来介绍一下,模型的评估方法F1-Score。F1方法是结合了Precision和Recall评估的一种较好的模型评估方法。可以更加客观地反映出模型的性能。F1公式如下所示:
当β=1时,称为F1-score,这时,精确率和召回率都很重要,权重相同。当有些情况下,我们认为精确率更重要些,那就调整β的值小于1,如果我们认为召回率更重要些,那就调整β的值大于1。
举个例子:癌症检查数据样本有10000个,其中10个数据祥本是有癌症,其它是无癌症。假设分类模型在无癌症数据9990中预测正确了9980个,在10个癌症数据中预测正确了9个,此时真阳=9,真阴=9980,假阳=10,假阴=1。其实,在这个场景里,我们会比较关心地是癌症患者到底有没有预测准确,因为将一个癌症患者预测为无癌症,本身是一件非常危险的事情,会耽误患者宝贵的治疗时间。根据公式,我们可以得出:
Accuracy = (9+9980) /10000=99.89% Precision=9/19+10)= 47.36% F1-score=2×(47.36% × 90%)/(1×47.36%+90%)=62.07% 最后,我们贴出代码,供大家参考学习,有问题欢迎留言,会及时回复。import pandas as pdfrom sklearn.model_selection import train_test_splitfrom sklearn.feature_extraction.text import TfidfVectorizerimport gensimimport timeimport pickleimport numpy as npimport csv,sysfrom sklearn import svmfrom sklearn.metrics import accuracy_score, precision_score, recall_score, f1_scorefrom sklearn.linear_model import LogisticRegression# read datadf = pd.read_csv('data/train_set.csv', nrows=5000)df.drop(columns='article', inplace=True)# # observe data# print(df['class'].value_counts(normalize=True, ascending=False))# TF-IDFvectorizer = TfidfVectorizer(ngram_range=(1, 2), min_df=3, max_df=0.9, sublinear_tf=True)vectorizer.fit(df['word_seg'])x_train = vectorizer.transform(df['word_seg'])# split training set and validation setpredictor = ['word_seg']x_train, x_validation, y_train, y_validation = train_test_split(x_train, df['class'], test_size=0.2)clf = svm.LinearSVC(C=5, dual=False)clf = LogisticRegression(C=120, dual=True)clf.fit(x_train, y_train)y_prediction = clf.predict(x_validation)label = []for i in range(1, 20): label.append(i)f1 = f1_score(y_validation, y_prediction, labels=label, average='micro')print('The F1 Score: ' + str("%.2f" % f1))
LR模型结果:
SVM模型结果:
参考文献:
1. CSDN
2. 博客园 Google-Boy
3. sklearn.svm 官方文档
4. sklearn.linear_model 官方文档
5. CSDN
转载地址:http://yluii.baihongyu.com/