其他分享
首页 > 其他分享> > svm文本分类

svm文本分类

作者:互联网

1.SVM应用场景

文本分类、图像识别、主要二分类领域

2.SVM的优缺点

SVM优点
1、解决小样本下机器学习问题。
2、解决非线性问题。
3、无局部极小值问题。(相对于神经网络等算法)
4、可以很好的处理高维数据集。
5、泛化能力比较强。

SVM缺点
1、对于核函数的高维映射解释力不强,尤其是径向基函数。
2、对缺失数据敏感

3.SVM sklearn 参数学习

首先介绍下与核函数相对应的参数:
1)对于线性核函数,没有专门需要设置的参数
2)对于多项式核函数,有三个参数。-d用来设置多项式核函数的最高次项次数,也就是公式中的d,默认值是3。-g用来设置核函数中的gamma参数设置,也就是公式中的gamma,默认值是1/k(特征数)。-r用来设置核函数中的coef0,也就是公式中的第二个r,默认值是0。
3)对于RBF核函数,有一个参数。-g用来设置核函数中的gamma参数设置,也就是公式中gamma,默认值是1/k(k是特征数)。
4)对于sigmoid核函数,有两个参数。-g用来设置核函数中的gamma参数设置,也就是公式中gamma,默认值是1/k(k是特征数)。-r用来设置核函数中的coef0,也就是公式中的第二个r,默认值是0。

具体来说说**rbf核函数中C和gamma **:

SVM模型有两个非常重要的参数C与gamma。其中 C是惩罚系数,即对误差的宽容度。c越高,说明越不能容忍出现误差,容易过拟合。C越小,容易欠拟合。C过大或过小,泛化能力变差
gamma是选择RBF函数作为kernel后,该函数自带的一个参数。隐含地决定了数据映射到新的特征空间后的分布,gamma越大,支持向量越少,gamma值越小,支持向量越多。支持向量的个数影响训练与预测的速度。
这里面大家需要注意的就是gamma的物理意义,大家提到很多的RBF的幅宽,它会影响每个支持向量对应的高斯的作用范围,从而影响泛化性能。我的理解:如果gamma设的太大,方差会很小,方差很小的高斯分布长得又高又瘦, 会造成只会作用于支持向量样本附近,对于未知样本分类效果很差,存在训练准确率可以很高,(如果让方差无穷小,则理论上,高斯核的SVM可以拟合任何非线性数据,但容易过拟合)而测试准确率不高的可能,就是通常说的过训练;而如果设的过小,则会造成平滑效应太大,无法在训练集上得到特别高的准确率,也会影响测试集的准确率。

4.利用SVM模型结合 Tf-idf 算法进行文本分类

# -*- coding: utf-8 -*-

from sklearn.model_selection import train_test_split
from gensim.models.word2vec import Word2Vec
import numpy as np
import pandas as pd
import jieba
from sklearn.externals import joblib
from sklearn.svm import SVC
import sys


def load_file_and_preprocessing():
	neg = pd.read_excel('data/neg.xls', header=None, index=None)
	pos = pd.read_excel('data/pos.xls', header=None, index=None)
	
	cw = lambda x: list(jieba.cut(x))
	pos['words'] = pos[0].apply(cw)
	neg['words'] = neg[0].apply(cw)
	
	# print pos['words']
	# use 1 for positive sentiment, 0 for negative
	y = np.concatenate((np.ones(len(pos)), np.zeros(len(neg))))
	
	# 切割训练集和测试集
	x_train, x_test, y_train, y_test = train_test_split(np.concatenate((pos['words'], neg['words'])), y, test_size=0.2)
	
	np.save('data/y_train.npy', y_train)
	np.save('data/y_test.npy', y_test)
	return x_train, x_test


def build_sentence_vector(text, size, imdb_w2v):
	vec = np.zeros(size).reshape((1, size))
	count = 0.
	for word in text:
		try:
			vec += imdb_w2v[word].reshape((1, size))
			count += 1.
		except KeyError:
			continue
	if count != 0:
		vec /= count
	return vec


# 计算词向量
def get_train_vecs(x_train, x_test):
	n_dim = 300
	# 初始化模型和词表
	imdb_w2v = Word2Vec(size=n_dim, min_count=10)
	imdb_w2v.build_vocab(x_train)
	
	# 在评论训练集上建模(可能会花费几分钟)
	imdb_w2v.train(x_train)
	
	train_vecs = np.concatenate([build_sentence_vector(z, n_dim, imdb_w2v) for z in x_train])
	# train_vecs = scale(train_vecs)
	
	np.save('data/train_vecs.npy', train_vecs)
	print(train_vecs.shape)
	# 在测试集上训练
	imdb_w2v.train(x_test)
	imdb_w2v.save('data/w2v_model.pkl')
	# Build test tweet vectors then scale
	test_vecs = np.concatenate([build_sentence_vector(z, n_dim, imdb_w2v) for z in x_test])
	# test_vecs = scale(test_vecs)
	np.save('data/test_vecs.npy', test_vecs)
	print(test_vecs.shape)


def get_data():
	train_vecs = np.load('data/train_vecs.npy')
	y_train = np.load('data/y_train.npy')
	test_vecs = np.load('data/test_vecs.npy')
	y_test = np.load('data/y_test.npy')
	return train_vecs, y_train, test_vecs, y_test


def svm_train(train_vecs, y_train, test_vecs, y_test):
	clf = SVC(kernel='rbf', verbose=True)
	clf.fit(train_vecs, y_train)
	joblib.dump(clf, 'data/svm_model.pkl')
	print(clf.score(test_vecs, y_test))


def get_predict_vecs(words):
	n_dim = 300
	imdb_w2v = Word2Vec.load('data/w2v_model.pkl')
	# imdb_w2v.train(words)
	train_vecs = build_sentence_vector(words, n_dim, imdb_w2v)
	# print train_vecs.shape
	return train_vecs


def svm_predict(string):
	words = jieba.lcut(string)
	words_vecs = get_predict_vecs(words)
	clf = joblib.load('data/svm_model.pkl')
	
	result = clf.predict(words_vecs)
	
	if int(result[0]) == 1:
		print(string, ' positive')
	else:
		print(string, ' negative')


if __name__ == '__main__':
	##对输入句子情感进行判断
	string = '电池充完了电连手机都打不开.简直烂的要命.真是金玉其外,败絮其中!连5号电池都不如'
	# string='牛逼的手机,从3米高的地方摔下去都没坏,质量非常好'
	svm_predict(string)

 

标签:svm,分类,w2v,np,train,vecs,test,文本,data
来源: https://blog.csdn.net/zaishijizhidian/article/details/89365733