文本分类大体被我分为4类,链接如下:
根据距离来分类。给定一个K值,在待分类的样本点中找到已经分类的K个点,K中哪一类越多,则就将其分为哪一类。 别人说的是近朱者赤近墨者黑,我的理解就是我距离你越近,则我属于你的置信概率就越大。
具体参考资料: python机器学习之 K-邻近算法(GitHub) Python之Sklearn使用教程 K最近邻算法(KNN)—sklearn+python实现 机器学习(一)——K-近邻(KNN)算法 机器学习之KNN算法 机器学习算法与Python实践之(一)k近邻(KNN)
它是基于概率来进行分类的。 分类决策:若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 朴素贝叶斯的三个常用模型:高斯、多项式、伯努利 朴素贝叶斯理论推导与三种常见模型
找到一个最好的分类平面将两类的数据分隔开来,是一种基于监督学习的二分类方法。
如果数据线性可分,则就找到一个分类平面将两类数据分隔开。此时可以找到很多的分类平面,最后输入新的样本,分类效果不可能完全是一样的,有好有坏的,我们当然想要找到的是分类效果最好的那一个平面。刚开始讲的找到任意一个分类平面将两类数据分隔开就可以了,这是感知机。我们想要在多个分类平面中找到一个最优的是支持向量机,用支持向量来帮助我们找到最优的那个平面。如果数据在低维平面不可分,但是在高维平面中可分,则可以利用核函数将数据映射到高维空间中。常用的核函数有linear, rbf, poly, sigmoid核函数,在我的毕业论文中也是对这几个核函数所得的分类结果进行比较。再如果,数据即使被映射到高维空间了也仍旧不可分。则就降低我们对分类平面的要求,给将分类平面往中间移动一点,这就是所谓的松弛变量,在加上松弛平面的外面的都可以算作是分类正确。这样平移了之后相当于是缩小了两个分类平面的间隔。剩下的有关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))下一节,指路文本分类(四)–分类好坏的评价