机器学习分类实例——SVM(修改)/Decision Tree/Naive Bayes

机器学习分类实例——SVM(修改)/Decision Tree/Naive Bayes

20180427-28笔记、30总结

已经5月了,毕设告一段落了,该准备论文了。前天开会老师说,希望我以后做关于语义分析那一块内容,会议期间还讨论了学姐的知识图谱的知识推理内容,感觉也挺有趣的,但是感觉应该会比较复杂。有时间的话希望对这块了解一下。其实吧,具体怎么展示我还是不太清楚。。。

大概就是图表那个样子。我先做一个出来,让老师看看,两个礼拜写论文。24/25答辩,6月就可以去浪哈哈哈哈哈哈。

一、工作

工作主要是三个部分——修改SVM部分的代码(精简)、绘制图表、修改DT和NBY的代码

1.修改SVM部分的代码

由于需要将预测三个标签的分数,一次打印出来。所以需要分别训练三个模型并一次将预测文本输入三个模型进行预测。

那么就是:


    x = vec[:,:-3]
    y = vec[:,-3]
    y2=vec[:,-2]
    y3=vec[:,-1]

    f = open("examout.txt","r")
    newl =f.read()
    newl=list(map(str,newl.strip().split(‘,‘)))
    newv = np.array(newl)
    new_test_x = newv[:]

#    模型1
    train_x,test_x,train_y,test_y = train_test_split(x,y,test_size=0.2)
    clf1 = SVC(kernel=‘linear‘,C=0.4)
    clf1.fit(train_x,train_y)
    pred_y = clf1.predict(test_x)
    new_pred_y1 = clf1.predict(new_test_x.reshape(1,-1))
    npy1=int(new_pred_y1[0])

#   模型2
    train_x2,test_x2,train_y2,test_y2 = train_test_split(x,y2,test_size=0.2)
    clf2= SVC(kernel=‘linear‘,C=0.4)
    clf2.fit(train_x2,train_y2)
    pred_y2 = clf2.predict(test_x2)
    new_pred_y2 = clf2.predict(new_test_x.reshape(1,-1))
    npy2=int(new_pred_y2[0])

#   模型3
    train_x3,test_x3,train_y3,test_y3 = train_test_split(x,y3,test_size=0.2)
    clf3= SVC(kernel=‘linear‘,C=0.4)
    clf3.fit(train_x3,train_y3)
    pred_y3 = clf3.predict(test_x3)
    new_pred_y3 = clf3.predict(new_test_x.reshape(1,-1))
    npy3=int(new_pred_y3[0])

这样就得到了3个模型。

在上次代码中,我们通过函数classification_report(test_y,pred_y)可以得到模型的精确率、召回率及F1值。

             (precision    recall  f1-score)   support

          1       0.88      0.93      0.90       187
          2       0.00      0.00      0.00        11
          3       0.15      0.18      0.17        11
          4       0.00      0.00      0.00         7
          5       0.00      0.00      0.00         2

avg / total       0.76      0.81      0.78       218

在这里,三个模型分别对应不同的(precision、recall、f1-score),我们希望获取上表最后一排的值,最后绘制成一张表,就像这样:

那么问题来了,如何获得classification_report()中的值呢。有两种办法:

  • (1)将内容输出到文本,然后再从文本读取
  • (2)读取print输出流

两种办法我都试过了,第一种方法比较熟悉,所以一下就写完了:

    ff = open("crout.txt","w")
    ff.write(classification_report(test_y,pred_y))
    ff.close()
    ff2=open("crout.txt","r")
    cr=[]
    for line in ff2.readlines():
        cr.append(list(map(str,line.strip().split(‘,‘))))
    ss =str(cr[8]) #把最后一列整列打印出来[‘avg / total       0.89      0.92      0.90       218‘]

    #运用正则表达式找出小数
    fs1=[]
    for i in range(3):
        s = re.findall("\d+(\.\d+)?",ss)[i]
        s=‘0‘+s
        s=float(s)
        fs1.append(s)
    print (fs1)

很明显,上面3个模型,就需要3个文本,写来写去的,感觉又麻烦又low...所以这种方式看看就好。这时候我们用print输出流,来解决获取数值的问题。我通过百度,在百度知道中看到了答案——如何获取python print语句打印到console的值

把原来的代码精简一些,用函数表示,别写在程序主体位置

class TextArea(object):
    def __init__(self):
        self.buffer = []
    def write(self, *args, **kwargs):
        self.buffer.append(args)  

def mf(L=[]):
    for i in range(90):
        s = re.findall("\d+(\.\d+)?",l)[i]
        s=‘0‘+s
        s=float(s)
        #通过观察,在正则表达式获取的小数中,所需要三个模型的P/R/F值分别位于26~28、56~58、86~88位置上,将其加入L中即可
        if i>=26 and i<=28 or i>=56 and i<=58 or i>=86 and i<=88:
            L.append(s)
    return L

再写函数主体:

    stdout = sys.stdout
    sys.stdout = TextArea()
    print(classification_report(test_y,pred_y))
    print(classification_report(test_y2,pred_y2))
    print(classification_report(test_y3,pred_y3))

    text_area, sys.stdout = sys.stdout, stdout  

    l=str(text_area.buffer)
    L=[]
    L=mf(L)
    #结果L=[0.76, 0.81, 0.78, 0.91, 0.94, 0.92, 0.73, 0.75, 0.74]
    fs1=[]
    fs2=[]
    fs3=[]
    LL=range(9)
    for i in LL[:9:3]:
        fs1.append(L[i])
        fs2.append(L[i+1])
        fs3.append(L[i+2])

2.绘制图表

在这里我们得到了每个模型的precision、recall、f1-score值(分别存在fs1,fs2,fs3中),以及预测文本的预测结果npy1、npy2、npy3三个分数。

(1)预测图表

x = np.arange(3)
data = [npy1, npy2, npy3]

labels = [‘民主制度‘, ‘民主自由‘, ‘民主监督‘]
plt.ylim(ymax=5.5, ymin=0)
plt.ylabel("评分")
plt.title("预测")
plt.bar(x, data,alpha=0.9,tick_label=labels)
plt.show()

结果:

这样直观多了,上回是只给了一个“5”的评分,这样三个都能得到了。

(2)precision、recall、f1-score值模型对比

total_width, n = 0.6, 3
x = np.arange(n)
width = total_width / n
x = x - (total_width - width) / 2
plt.ylim(ymax=1.3, ymin=0)
plt.bar(x, fs1,alpha=0.8, width=width, label=‘Precision‘)
plt.bar(x + width, fs2,alpha=0.8, width=width, label=‘Recall‘,tick_label = labels)
plt.bar(x + 2 * width, fs3, alpha=0.8,width=width, label=‘F1-score‘)
plt.legend()
plt.show()

得到如下结果:

3.修改DT和NBY的代码

(1) Decision Tree

决策树的代码和SVM完全一样的,就是函数名字不一样。在这里直接看结果就好了:

嗯...准确率挺高不错。

(2) Naive Bayes

朴素贝叶斯在代码上,和SVM也是一样的,但是在预测的时候,有个地方报错了

 new_pred_y1 = clf.predict(new_test_x.reshape(1,-1))

报错:

TypeError: ufunc ‘subtract‘ did not contain a loop with signature matching types dtype(‘<U32‘) dtype(‘<U32‘) dtype(‘<U32‘)

怎么回事呢,原来是需要将new_test_x转为float64.

参考python TypeError: ufunc ‘subtract‘ did not contain a loop with signature matching typesdtype(‘S32‘)

只要在原来的代码加上一句转换就可以了:

    new_test_x = new_test_x.astype(‘float64‘)
    new_pred_y1 = clf.predict(new_test_x.reshape(1,-1))

那么我们来看看结果:

贝叶斯效果就比较差了。。。民主制度的准确率最低,预测效果最不好。但是给的文本,对民主制度的评分还是最高,预测效果还行。

二、总结反思

三、接下来的任务

  • 人工选取一些测试集,测试在评分误差为±1的情况下,准确率是多少。之前测了一些,是在训练集中选取的一些帖子,准确率达到了95%,虽然很高但是不准。
  • 学习论文撰写。

原文地址:https://www.cnblogs.com/cafe3165/p/8973309.html

时间: 2025-01-03 16:29:02

机器学习分类实例——SVM(修改)/Decision Tree/Naive Bayes的相关文章

转载:算法杂货铺——分类算法之决策树(Decision tree)

作者:张洋 算法杂货铺——分类算法之决策树(Decision tree) 2010-09-19 16:30 by T2噬菌体, 44346 阅读, 29 评论, 收藏, 编辑 3.1.摘要 在前面两篇文章中,分别介绍和讨论了朴素贝叶斯分类与贝叶斯网络两种分类算法.这两种算法都以贝叶斯定理为基础,可以对分类及决策问题进行概率推断.在这一篇文章中,将讨论另一种被广泛使用的分类算法——决策树(decision tree).相比贝叶斯算法,决策树的优势在于构造过程不需要任何领域知识或参数设置,因此在实际

机器学习算法实践:决策树 (Decision Tree)(转载)

前言 最近打算系统学习下机器学习的基础算法,避免眼高手低,决定把常用的机器学习基础算法都实现一遍以便加深印象.本文为这系列博客的第一篇,关于决策树(Decision Tree)的算法实现,文中我将对决策树种涉及到的 算法进行总结并附上自己相关的实现代码.所有算法代码以及用于相应模型的训练的数据都会放到GitHub上(https://github.com/PytLab/MLBox). 本文中我将一步步通过MLiA的隐形眼镜处方数集构建决策树并使用Graphviz将决策树可视化. 决策树学习 决策树

机器学习---朴素贝叶斯分类器(Machine Learning Naive Bayes Classifier)

朴素贝叶斯分类器是一组简单快速的分类算法.网上已经有很多文章介绍,比如这篇写得比较好:https://blog.csdn.net/sinat_36246371/article/details/60140664.在这里,我按自己的理解再整理一遍. 在机器学习中,我们有时需要解决分类问题.也就是说,给定一个样本的特征值(feature1,feature2,...feauren),我们想知道该样本属于哪个分类标签(label1,label2,...labeln).即:我们想要知道该样本各个标签的条件概

机器学习技法(11)--Gradient Boosted Decision Tree

AdaBoost D Tree有了新的权重的概念. 现在的优化目标,如何进行优化呢? 不更改算法的部门,而想办法在输入的数据方面做修改. 权重的意义就是被重复取到的数据的次数.这样的话,根据权重的比例进行重复的抽样.最后的结果也和之前一样能够表达权重的意义在里面了. 在一个fully grown tree的情况下: 应对办法: 如果剪枝剪到极限的时候: 就是AdaBoost Stump. 在AdaBoost中: 有阴影的部分就是用来投票决定G最终结果的.这个方程式延伸一下: 对他们这样投票的过程

机器学习笔记之朴素贝叶斯(Naive Bayes)原理

为什么叫朴素贝叶斯? 朴素是指特征条件独立:贝叶斯是指基于贝叶斯定理. $x=\frac{{-b}\pm\sqrt{b^2-4ac}}{2a}$ $p(y=c_k|x)=\dfrac{\prod_{i=1}^{M}p(x^i|y=c_k)p(y=c_k)}{\sum_kp(y=c_k)\prod_{i=1}^{M}P(x^i|y=c_k)}$....(2) $$ % MathType!MTEF!2!1!+-% feaagKart1ev2aaatCvAUfeBSjuyZL2yd9gzLbvyNv2

CART分类与回归树与GBDT(Gradient Boost Decision Tree)

一.CART分类与回归树 资料转载: http://dataunion.org/5771.html Classification And Regression Tree(CART)是决策树的一种,并且是非常重要的决策树,属于Top Ten Machine Learning Algorithm.顾名思义,CART算法既可以用于创建分类树(Classification Tree),也可以用于创建回归树(Regression Tree).模型树(Model Tree),两者在建树的过程稍有差异.CAR

机器学习实战之第三章 决策树(Decision Tree)

第3章 决策树 <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=default"></script> 决策树 概述 决策树(Decision Tree)算法主要用来处理分类问题,是最经常使用的数据挖掘算法之一. 决策树 场景 一个叫做 "二十个问题" 的游戏,游戏的规则很简单:参与游戏的一

机器学习(二)之决策树(Decision Tree)

Contents 理论基础 熵 信息增益 算法实现 Python 模型的保存与读取 总结 理论基础 决策树(Decision Tree, DT):决策树是一种基本的分类与回归方法.由于模型呈树形结构,可以看做是if-then规则的集合,具有一定的可读性,可视化效果好. 决策树的建立包括3个步骤:特征选择.决策树生成和决策树的修剪. 模型的建立实际上就是通过某种方式,递归地选择最优的特征,并通过数据的划分,将无序的数据变得有序. 因此,在构造决策树时,第一个需要解决的问题就是如何确定出哪个特征在划

机器学习中的算法:决策树模型组合之GBDT(Gradient Boost Decision Tree)

[转载自:http://www.cnblogs.com/LeftNotEasy/archive/2011/03/07/random-forest-and-gbdt.html] 前言 决策树这种算法有着很多良好的特性,比如说训练时间复杂度较低,预测的过程比较快速,模型容易展示(容易将得到的决策树做成图片展示出来)等.但是同时,单决策树又有一些不好的地方,比如说容易over-fitting,虽然有一些方法,如剪枝可以减少这种情况,但是还是不够的. 模型组合(比如说有Boosting,Bagging等