技术分享

本文技术路线

  1. IPA模型
  2. 一次无监督训练(LDA)
  3. 两次有监督训练(SVM和集成神经网络分类) %E6%96%87%E7%AB%A0%E5%A4%84%E7%90%86%E6%B5%81%E7%A8%8B.png

本文工作截图

%E6%9C%AC%E6%96%87%E7%BB%93%E6%9E%9C.png

民宿满意度截图

%E6%83%85%E6%84%9F%E5%8D%A0%E6%AF%94.png

机器学习分类的一般流程

svm%E5%88%86%E7%B1%BB%E6%B5%81%E7%A8%8B.png

集成模型思想

对测试集中的任意一条数据,都可能会存在一个模型,其在该数据上的效果比众多模型的平均效果要好,而不同的模型可能在不同的数据上取得很好的效果。如果对任意一条数据,都有一个模型的效果表现非常突出,那么将所有模型预测结果组合平均以后,这个平均模型在大部分数据上的效果就会比任意一个单体模型强。

单一SVM分类架构

SVM%E4%B8%80%E8%88%AC%E6%B5%81%E7%A8%8B.png

本文SVM集成架构

信息增益(Information Gain,简称IG),文本分类中IG是针对于一个个的特征(词t)重要性而言,整个系统中某些文本有t和整个系统中都没t 的时候信息量各是多少,两者的差值就是这个特征t给系统带来的信息量,即信息增益 。

%E6%88%90%E5%AF%B9%E7%9A%84%E5%BC%B1%E5%88%86%E7%B1%BB%E5%99%A8%E7%BB%84%E5%90%88.png

单一神经网络分类架构

%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C%E5%88%86%E7%B1%BB.png

本文神经网络集成架构

%E9%9B%86%E6%88%90%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C%E7%BB%93%E6%9E%84.png

SVM分类原理

svm%E5%88%86%E7%B1%BB.png

svm%E5%88%86%E5%89%B2%E8%B6%85%E5%B9%B3%E9%9D%A2.png

SVM 文本分类实例

新闻分类任务

%E6%A0%B7%E6%9C%AC%E5%88%86%E7%B1%BB.png

流程

  1. 加载文本
  2. 词向量化
  3. 训练模型
  4. 模型评估
  5. 模型保存
  6. 模型预测

加载文本

In [1]:
# 读取文件
import jieba
jieba.setLogLevel(20)
X_train,Y_train = [],[]
for data in open('txt/txt_set/train.txt','r',encoding='utf-8').readlines():
    label,txt = data.split('\t')[0].strip(),data.split('\t')[1].strip()
    Y_train.append(label)
    X_train.append('\t'.join(jieba.cut(txt,cut_all=False,HMM=True)))
print(X_train[0])
print(Y_train[0])
马晓旭	意外	受伤	让	国奥	警惕	 	无奈	大雨	格外	青睐	殷家	军	记者	傅亚雨	沈阳	报道	 	来到	沈阳	,	国奥队	依然	没有	摆脱	雨水	的	困扰	。	7	月	31	日	下午	6	点	,	国奥队	的	日常	训练	再度	受到	大雨	的	干扰	,	无奈	之下	队员	们	只	慢跑	了	25	分钟	就	草草收场	。	31	日	上午	10	点	,	国奥队	在	奥体中心	外场	训练	的	时候	,	天	就是	阴沉沉	的	,	气象预报	显示	当天	下午	沈阳	就	有	大雨	,	但	幸好	队伍	上午	的	训练	并	没有	受到	任何	干扰	。	下午	6	点	,	当	球队	抵达	训练场	时	,	大雨	已经	下	了	几个	小时	,	而且	丝毫	没有	停下来	的	意思	。	抱	着	试一试	的	态度	,	球队	开始	了	当天	下午	的	例行	训练	,	25	分钟	过去	了	,	天气	没有	任何	转好	的	迹象	,	为了	保护	球员	们	,	国奥队	决定	中止	当天	的	训练	,	全队	立即	返回	酒店	。	在	雨	中	训练	对	足球队	来说	并	不是	什么	稀罕	事	,	但	在	奥运会	即将	开始	之前	,	全队	变得	“	娇贵	”	了	。	在	沈阳	最后	一周	的	训练	,	国奥队	首先	要	保证	现有	的	球员	不再	出现意外	的	伤病	情况	以免	影响	正式	比赛	,	因此	这一	阶段	控制	训练	受伤	、	控制	感冒	等	疾病	的	出现	被	队伍	放在	了	相当	重要	的	位置	。	而	抵达	沈阳	之后	,	中	后卫	冯萧霆	就	一直	没有	训练	,	冯萧霆	是	7	月	27	日	在	长春	患上	了	感冒	,	因此	也	没有	参加	29	日	跟	塞尔维亚	的	热身赛	。	队伍	介绍	说	,	冯萧霆	并	没有	出现	发烧	症状	,	但	为了	安全	起	见	,	这	两天	还是	让	他	静养	休息	,	等	感冒	彻底	好	了	之后	再	恢复	训练	。	由于	有	了	冯萧霆	这个	例子	,	因此	国奥队	对雨中	训练	就	显得	特别	谨慎	,	主要	是	担心	球员	们	受凉	而	引发	感冒	,	造成	非战斗	减员	。	而	女足	队员	马晓旭	在	热身赛	中	受伤	导致	无缘	奥运	的	前科	,	也	让	在	沈阳	的	国奥队	现在	格外	警惕	,	“	训练	中	不断	嘱咐	队员	们	要	注意	动作	,	我们	可	不能	再出	这样	的	事情	了	。	”	一位	工作人员	表示	。	从	长春	到	沈阳	,	雨水	一路	伴随	着	国奥队	,	“	也	邪	了	,	我们	走	到	哪儿	雨	就	下	到	哪儿	,	在	长春	几次	训练	都	被	大雨	给	搅和	了	,	没想到	来	沈阳	又	碰到	这种	事情	。	”	一位	国奥	球员	也	对	雨水	的	“	青睐	”	有些	不解	。
体育

词向量化

In [2]:
# 抽取特征,建立词向量模型
from sklearn.feature_extraction.text import TfidfVectorizer
#使用tf-idf词向量模型
vectorizer = TfidfVectorizer()
# 开始训练词向量模型
vectorizer.fit_transform(X_train)
# 保存词向量模型
from sklearn.externals import joblib
joblib.dump(vectorizer,'model/tf-idf_vectorizer')
Out[2]:
['model/tf-idf_vectorizer']
In [3]:
# 使用模型转化为词向量
# 加载模型
from sklearn.externals import joblib
vectorizer = joblib.load('model/tf-idf_vectorizer')
# 将文本,转化为词向量
X_train = vectorizer.fit_transform(X_train)
# 开始划分数据集
from sklearn.model_selection import train_test_split
# 自动按照标签进行比例分配
X_train,Y_train,X_test,Y_test = train_test_split(X_train,Y_train,test_size=0.2,random_state=23)
In [4]:
# 输出训练集属性
print(X_train.toarray())
print(X_train.shape)
print(X_test)
print(len(X_test))
print(Y_train.toarray())
print(Y_train.shape)
print(Y_test)
print(len(Y_test))
[[0.         0.         0.         ... 0.         0.04502997 0.        ]
 [0.         0.01500904 0.         ... 0.         0.         0.01500904]
 [0.         0.         0.         ... 0.         0.         0.        ]
 ...
 [0.         0.         0.         ... 0.         0.         0.        ]
 [0.         0.         0.         ... 0.         0.         0.        ]
 [0.         0.         0.         ... 0.         0.         0.        ]]
(32, 4346)
['体育', '财经', '财经', '财经', '财经', '体育', '体育', '财经', '体育', '体育', '财经', '体育', '财经', '体育', '体育', '财经', '体育', '体育', '体育', '财经', '体育', '财经', '体育', '财经', '财经', '财经', '财经', '体育', '财经', '体育', '财经', '体育']
32
[[0. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 0. 0.]
 ...
 [0. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 0. 0.]]
(8, 4346)
['体育', '财经', '体育', '财经', '财经', '财经', '体育', '体育']
8

训练模型

In [5]:
# 训练
from sklearn.svm import SVC
# 启用概率训练
clf=SVC(probability=True)
clf.fit(X_train,X_test)
Out[5]:
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
  decision_function_shape='ovr', degree=3, gamma='auto', kernel='rbf',
  max_iter=-1, probability=True, random_state=None, shrinking=True,
  tol=0.001, verbose=False)

模型评估

In [6]:
# 预测评估
from sklearn.metrics import accuracy_score
from sklearn import metrics
y_pre = clf.predict(Y_train)
print('acc :{}'.format(metrics.accuracy_score(Y_test,y_pre)))
print("Precision, Recall and F1-Score...")
categories=['体育' ,'财经']
# 规定为先是y_true,后面是y_pre.先写目标值,后面写预测值
print(metrics.classification_report(Y_test, y_pre, target_names=categories))
# # 混淆矩阵
print("Confusion Matrix...")
cm = metrics.confusion_matrix(Y_test,y_pre)
print(cm)
acc :1.0
Precision, Recall and F1-Score...
             precision    recall  f1-score   support

         体育       1.00      1.00      1.00         4
         财经       1.00      1.00      1.00         4

avg / total       1.00      1.00      1.00         8

Confusion Matrix...
[[4 0]
 [0 4]]

模型保存

In [7]:
# 保存模型
from sklearn.externals import joblib
joblib.dump(clf,'model/svm_txt_model.pkl')
Out[7]:
['model/svm_txt_model.pkl']

模型预测

In [8]:
# 预处理
import jieba
from sklearn.externals import joblib
txt = '小牛vs湖人前瞻Ⅰ:科比带伤当擒牛先锋 看这组对抗新浪体育讯北京时间5月2日消息,洛杉矶湖人队必须要利用好他们的身高优势来争取再一次跻身西部决赛。明天湖人队将迎来与达拉斯小牛队的西部半决赛第一场,在科比-布莱恩特脚踝有伤的情况下,湖人队内线球员必须有更好的发挥。内线拥有保罗-加索尔和安德鲁-拜纳姆,再加上替补席上的拉玛尔-奥多姆,他们三人是湖人队实现两连冠的功臣之一,很少有球队能够在内线与湖人队抗衡。不过这一次西部半决赛的对手小牛队有所不同,他们拥有足够的高度,加索尔清楚未来两周将遇到更多的挑战。“我们总是在内线占据优势,包括身高和技术,不过现在我们要面对更多的挑战,”加索尔说道,“预计这将是一个对抗激烈的系列赛,因为双方都有足够的高度,我不知道赛况会多惨烈,但可以确信的是比赛一定很激烈。”加索尔和诺维茨基的内线对抗将成为比赛的一大看点,他们对位的结果会影响系列赛的走势。湖人队首轮陷入苦战,这与加索尔的低迷不无关系,西班牙人场均只有13.5分和6.8个篮板,他的球风“偏软”也再次遭到跑轰,明天与诺维茨基遭遇,加索尔必须要强硬起来。诺维茨基则是小牛队晋级的头号功臣,他首轮场均27.3分和7.8个篮板,球队需要他保持好的进攻状态。拜纳姆的价值在首轮得到充分体现,他是球队的第二得分手和篮板王,他在内线的出色表现填补了加索尔低迷的空缺。不过,拜纳姆的对手也换成了泰森-钱德勒和布兰顿-海伍德,他们在身高上与拜纳姆相仿,湖人队中锋间面临考验。脚踝伤势依旧影响着科比,他已经缺席了几天的训练,今天也没有进行场上练习,这让菲尔-杰克逊也不禁担心他的状态,“我也不清楚科比的状态如何。”作为联盟最出色的球员,科比懂得如何调整好状态,相信他会在首战用表现去证明一切。如果湖人队想要主场赢球,他们就需要替补球员有更好的发挥,马特-巴恩斯、香农-布朗、史蒂夫-布雷克要在攻守中都发挥作用。与黄蜂队交锋时,湖人队首战就丢掉了主场优势,现在对手换成小牛队,卫冕冠军不能再有任何闪失,他们要在第一场就拿出全部战力去争取胜利。虽然曾遭到开拓者队的逆转,但小牛队迅速调整在2平后连赢两场晋级,杰森-特里给诺维茨基足够的进攻支持,他将是球队在洛杉矶的主攻点之一,替补出场的他在进攻中更出彩,而不是把力气花在和湖人队球员打嘴仗上。杰森-基德不容忽视,这位老将首轮发挥了重要作用,他不仅能组织好球队的进攻,他的三分球也是球队有力的得分武器。肖恩-马里昂、佩贾-斯托贾科维奇都是小牛队极有威胁的进攻点,特别是马里昂的运动力将给湖人队的防线带来不小的冲击。常规赛湖人队两胜小牛队占优,季后赛历史上他们也曾三次淘汰对手晋级,并且在主场他们拥有对阵小牛队10胜0负的不败纪录,科比要率队把不败延续下去。预计双方首发阵容湖人队:费舍尔、科比、阿泰斯特、加索尔、拜纳姆小牛队:基德、史蒂文森、马里昂、诺维茨基、钱德勒(Melody)'
input_txt = jieba.cut(txt,cut_all=False,HMM=True)
predict_data = '\t'.join(input_txt)
# print(cut_data)
# 加载词向量模型,转化词向量
vectorizer = joblib.load('model/tf-idf_vectorizer')
vec_data = vectorizer.transform([predict_data])
# 打印待测数据属性
print(vec_data.toarray())
print(vec_data.shape)
[[0. 0. 0. ... 0. 0. 0.]]
(1, 4346)
In [11]:
# 加载分类模型,开始预测
clf = joblib.load('model/svm_txt_model.pkl')
y_pre = clf.predict(vec_data.toarray())
print('待预测标签:{}'.format(clf.classes_))
y_prob = clf.predict_proba(vec_data.toarray())
print('预测结果:{},概率矩阵:{}'.format(y_pre,y_prob))
待预测标签:['体育' '财经']
预测结果:['体育'],概率矩阵:[[0.55056736 0.44943264]]