文本分类(三)--对已经处理好的数据使用KNN、Naive Bayes、SVM分类方法

文本分类大体被我分为4类,链接如下:


注:所有的数据已经经过minmaxscaler 标准化为【0,1】区间的值,

4.使用分类方法

KNN

根据距离来分类。给定一个K值,在待分类的样本点中找到已经分类的K个点,K中哪一类越多,则就将其分为哪一类。
别人说的是近朱者赤近墨者黑,我的理解就是我距离你越近,则我属于你的置信概率就越大。

具体参考资料:
python机器学习之 K-邻近算法(GitHub)
Python之Sklearn使用教程
K最近邻算法(KNN)—sklearn+python实现
机器学习(一)——K-近邻(KNN)算法
机器学习之KNN算法
机器学习算法与Python实践之(一)k近邻(KNN)

Naive Nayes

它是基于概率来进行分类的。
分类决策:若p(y=1|x)>p(y=-1|x),则分为正类,否则分为负类。
sklearn中有三个关于bayes的训练模型,GaussNB,MultinominalNB,BernoulliNB。其实都是朴素贝叶斯,只不过他们假定样本的特征的分布不同而已,分别是高斯正态分布,多项式分布,伯努利分布。
使用MultinomialNB时出现了这样的问题:解决python中出现非正定“Input X must be non-negative”的问题,说明样本之间存在着强烈的相关关系,解决:删掉这个模型即可。
注意:这里均使用的是朴素贝叶斯分类模型,假定样本特征之间相互独立。
具体参考资料:
基于Naive Bayes算法的文本分类
python机器学习库sklearn——朴素贝叶斯分类器
python贝叶斯分类器GaussianNB
朴素贝叶斯的三个常用模型:高斯、多项式、伯努利
朴素贝叶斯理论推导与三种常见模型

SVM

找到一个最好的分类平面将两类的数据分隔开来,是一种基于监督学习的二分类方法。

  1. 如果数据线性可分,则就找到一个分类平面将两类数据分隔开。此时可以找到很多的分类平面,最后输入新的样本,分类效果不可能完全是一样的,有好有坏的,我们当然想要找到的是分类效果最好的那一个平面。刚开始讲的找到任意一个分类平面将两类数据分隔开就可以了,这是感知机。我们想要在多个分类平面中找到一个最优的是支持向量机,用支持向量来帮助我们找到最优的那个平面。
  2. 如果数据在低维平面不可分,但是在高维平面中可分,则可以利用核函数将数据映射到高维空间中。常用的核函数有linear, rbf, poly, sigmoid核函数,在我的毕业论文中也是对这几个核函数所得的分类结果进行比较。
  3. 再如果,数据即使被映射到高维空间了也仍旧不可分。则就降低我们对分类平面的要求,给将分类平面往中间移动一点,这就是所谓的松弛变量,在加上松弛平面的外面的都可以算作是分类正确。这样平移了之后相当于是缩小了两个分类平面的间隔。

剩下的有关SVM模型的具体原理算法步骤自己去看底下这几篇,再自己多补充几篇博客,看多了,差不多就能够理解其中的意思了。我自己呢,没有及具体去想模型是是怎么证明的,我只关心算法的每一步是什么,怎么实现的,有什么用,重点在于上下每一步之间的联系于转折。因为在涉及到算法描述的时候,需要我明确地将这些东西写出来,具体怎么原理是什么没有仔细关注(数学上面的证明)。不过我想,如果以后要搞这个方面的话,自己推倒肯定是必不可少的,况且我是一个数学系的学生啊,咱不能够给整个系的丢脸。
具体的参考资料:
绝对通俗易懂SVM的理解,大白话
Svm算法原理及实现
数据挖掘领域十大经典算法之—SVM算法(超详细附代码)
【机器学习】支持向量机SVM及实例应用
文本分类与SVM
分类算法SVM(支持向量机)
支持向量机SVM通俗理解(python代码实现)
svm算法 最通俗易懂讲解
解密SVM系列(三):SMO算法原理与实战求解
SVM支持向量机入门及数学原理
Python中的支持向量机SVM的使用(有实例)

相关代码

k_nearest_neighbor.py

# -*- coding:utf-8 -*-
"""
文档执行步骤:
1、获取数据--将数据向量化--获取需要处理的矩阵--并且与y类别相对应
2、引用knn对象,使用对象自带的分类方法
3、将数据分为训练数据+测试数据,来检测分类器的分类效果
    (1)要注意归一化处理
    (2)使用交叉验证的方法,来使分类器更为精确
"""

import jieba
from sklearn import metrics,preprocessing
from data_preprocessed_final import get_preprocessed     
max_f = 200
def find_best_k(max_f):
    x_train,x_test,y_train,y_test=get_preprocessed()
    from sklearn.neighbors import KNeighborsClassifier
    # 寻找最好的k
    best_k=-1
    best_score=0
    for i in range(1,11):
        knn_clf=KNeighborsClassifier(n_neighbors=i) # 继承一个类,传入参数k值为i
        knn_clf.fit(x_train,y_train) # 调用类中的方法fit----训练模型
        scores=knn_clf.score(x_test,y_test) # 模型得分
        y_pred = knn_clf.predict(x_test) # 预测
        if scores>best_score:
            best_score=scores
            best_k=i
            best_y_pred = y_pred
            
    # 评价报告,有accuracy, precision, recall, f1-score
    print(metrics.classification_report(y_test,best_y_pred))        
    print('最好的k为:%d,最好的得分为:%.4f'%(best_k,best_score)) 
    # 计算分类错误的个数
    def calc_error(y_test,x_predic):
        temp = [y_t for y_t,y_p in zip(y_test,x_predic) if y_t != y_p]
        return len(temp)
    class_error_num_1 = calc_error(y_test,best_y_pred)
    print('Error Num:--------',class_error_num_1)  
    return (best_k,best_score)

find_best_k(max_f)

naive_bayes.py
解释:把假定特征服从多项式分布的注释了,因为出现了这个问题python中出现非正定“Input X must be non-negative”的问题
在训练MultinomialNB分类器时出现 “ValueError: Input X must be non-negative”
在使用max_features进行维度控制就不会出现这个问题,利用主成分分析会有。

import re,jieba
import numpy as np
from sklearn.naive_bayes import GaussianNB,MultinomialNB,BernoulliNB
from sklearn import metrics
from data_preprocessed_final import get_preprocessed
from sklearn import preprocessing

# 导入数据
x_train,x_test,y_train,y_test=get_preprocessed()
clf_1 = GaussianNB()# 继承类
# clf_2 = MultinomialNB()
clf_3 = BernoulliNB()


clf_1 = clf_1.fit(x_train, y_train) # 进行拟合,训练得到模型
# clf_2 = clf_2.fit(x_train, y_train) # 进行拟合
clf_3 = clf_3.fit(x_train, y_train) # 进行拟合

y_pred_1=clf_1.predict(x_test)# 进行预测
# y_pred_2=clf_2.predict(x_test)# 进行预测
y_pred_3=clf_3.predict(x_test)# 进行预测

print(metrics.classification_report(y_test,y_pred_1))
# print(metrics.classification_report(y_test,y_pred_2))
print(metrics.classification_report(y_test,y_pred_3))
def calc_error(y_test,x_predic):
    temp = [y_t for y_t,y_p in zip(y_test,x_predic) if y_t != y_p]
    return len(temp)

print(metrics.confusion_matrix(y_test,y_pred_1))
# print(metrics.confusion_matrix(y_test,y_pred_2))
print(metrics.confusion_matrix(y_test,y_pred_3))
"""
confusion的形式为:
分类错误数量error_num = FP + FN
[[TN FP]
[FN TP]]
"""

svm.py

from sklearn import metrics
from sklearn import svm
from data_preprocessed_final import get_preprocessed
# 导入数据
x_train,x_test,y_train,y_test=get_preprocessed()
# 继承类,传入不同的核函数
clf_1 = svm.SVC(C=1, kernel='rbf', gamma=20, decision_function_shape='ovr') # 使用rbf径向基函数来讲低维数据转化为高维数据,使其可分
clf_2 = svm.SVC(C=1, kernel='linear', gamma=20, decision_function_shape='ovr')
clf_3 = svm.SVC(C=1, kernel='poly', gamma=20, decision_function_shape='ovr')
clf_4 = svm.SVC(C=1, kernel='sigmoid', gamma=20, decision_function_shape='ovr')

# 对应不同的核函数, 拟合
clf_1.fit(x_train, y_train)
clf_2.fit(x_train, y_train)
clf_3.fit(x_train, y_train)
clf_4.fit(x_train, y_train)

# 预测
y_pred_1 = clf_1.predict(x_test)
y_pred_2 = clf_2.predict(x_test)
y_pred_3 = clf_3.predict(x_test)
y_pred_4 = clf_4.predict(x_test)

# 分类评估
print(metrics.classification_report(y_test,y_pred_1))
print(metrics.classification_report(y_test,y_pred_2))
print(metrics.classification_report(y_test,y_pred_3))
print(metrics.classification_report(y_test,y_pred_4))

# 混淆矩阵
print(metrics.confusion_matrix(y_test,y_pred_1))
print(metrics.confusion_matrix(y_test,y_pred_2))
print(metrics.confusion_matrix(y_test,y_pred_3))
print(metrics.confusion_matrix(y_test,y_pred_4))

下一节,指路文本分类(四)–分类好坏的评价

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值