刚学完SVM的理论部分,感觉没有老师带着写代码练手,还是发虚。
参照之前的线性回归部分代码,改下模型试验下。
前面 部分跟之前一样,就不贴了。还是文本分词后,用TFIDF矩阵。
因为多分类的问题,svm的参数需要decision_function_shape='ovr',如果不设置会报错。
模型主要参数有:
C超参数:
对于训练集来说,其误差越小,但是很容易发生过拟合;C越小,则允许有更多的训练集误分类,相当于soft margin
核函数:
kernel :可选线性、rbf 等。rbf就是当数据在低维空间中不可分割的时候,可以尝试将它们映射到高维空间,通过核函数来进行这样的映射操作。
gama 也可以指定
这个参数很多,速度明显比之前的逻辑回顾慢了很多。之前的2W条数据,我本机跑10多分钟就可以了。换成svm的rbf模式,要跑半小时。
如果我参照网上的大神的帖子去走网格查询。
from sklearn.model_selection import GridSearchCV
# 屏蔽警告信息
import warnings
warnings.filterwarnings("ignore")
# 最优超参数组合列表
params = [
{'kernel': ['rbf'], 'C': [1, 10, 100, 100], 'gamma':[1, 0.1, 0.01, 0.001]}
]
model = GridSearchCV(svm.SVC(probability=True,decision_function_shape='ovr'),
params,
refit=True,
return_train_score=True, # 后续版本需要指定True才有score方法
cv=5)
model.fit(X_train, y_train)
# GridSearchCV的属性
print('Attrabutes:vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv')
print('cv_results_:',model.cv_results_.keys())
print('Desc:',model.cv_results_['params'][2], model.cv_results_['mean_train_score'][2],
model.cv_results_['mean_test_score'][2],model.cv_results_['rank_test_score'][2])
print('best_estimator_:',model.best_estimator_)
print('best_params_:',model.best_params_)
print('best_params_:', model.cv_results_['params'][model.best_index_])
print('best_score_:',model.best_score_)
print('scorer_:',model.scorer_)
print('n_splits_:',model.n_splits_)
这个我本机跑了一个多小时都没出结果。太慢了。
后面打算用Java版本的libsvm试试。