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