数据竞赛-“达观杯”文本智能处理-Day4:LR+SVM学习及实践

数据竞赛-“达观杯”文本智能处理-Day4:LR+SVM学习及实践

使用下面模型对数据进行分类(包括:模型构建&调参&性能评估),并截图F1评分的结果

1)逻辑回归(LR)模型,学习理论并用Task2的特征实践

2)支持向量机(SVM) 模型,学习理论并用Task2的特征实践

参考资料

1)https://github.com/Heitao5200/DGB/blob/master/model/model_code/LR_data_w_tfidf.py

2)https://github.com/Heitao5200/DGB/blob/master/model/model_code/SVM_data_w_tfidf.py

一. 理论学习

1.逻辑回归(LR)

LR在【Datawhale-初级算法梳理】小组中有学习过,笔记见此处

2.支持向量机(SVM)

a) 简介

支持向量机(support vector machines, SVM)是一种二类分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器,间隔最大使它有别于感知机;支持向量机还包括核技巧,这使它成为实质上的非线性分类器。SVM的的学习策略就是间隔最大化,可形式化为一个求解凸二次规划的问题,也等价于正则化的合页损失函数的最小化问题。SVM的的学习算法就是求解凸二次规划的最优化算法。

b) 算法

SVM算法(线性可分支持向量机学习算法一一最大间隔法)
输入:线性可分训练数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯   , ( x N , y N ) } ​ T=\left\{\left(x_{1}, y_{1}\right),\left(x_{2}, y_{2}\right), \cdots,\left(x_{N}, y_{N}\right)\right\}​ T={(x1,y1),(x2,y2),,(xN,yN)},其中, x i ∈ ​ x_{i} \in​ xi X = R n , y i ∈ Y = { − 1 , + 1 } , i = 1 , 2 , ⋯   , N ​ \mathcal{X}=\mathbf{R}^{n}, \quad y_{i} \in \mathcal{Y}=\{-1,+1\}, \quad i=1,2, \cdots, N​ X=Rn,yiY={1,+1},i=1,2,,N
输出:最大间隔分离超平面和分类决策函数.

(1) 构造并求解约束最优化问题:
min ⁡ … , b 1 2 ∥ w ∥ 2  s.t.  y i ( w ⋅ x i + b ) − 1 ⩾ 0 , i = 1 , 2 , ⋯   , N \begin{array}{cl}{\min _{\ldots, b}} & {\frac{1}{2}\|w\|^{2}} \\ {\text { s.t. }} & {y_{i}\left(w \cdot x_{i}+b\right)-1 \geqslant 0, \quad i=1,2, \cdots, N}\end{array} min,b s.t. 21w2yi(wxi+b)10,i=1,2,,N
求解最优解 w ∗ , b ∗ w^{*}, b^{*} w,b

(2)由此得到分离超平面:
w ∗ ⋅ x + b ∗ = 0 w^{*} \cdot x+b^{*}=0 wx+b=0
分类决策函数
f ( x ) = sign ⁡ ( w ∗ ⋅ x + b ∗ ) f(x)=\operatorname{sign}\left(w^{*} \cdot x+b^{*}\right) f(x)=sign(wx+b)

c) SVM的特点和不足

特点:非线性映射是SVM方法的理论基础,SVM利用内积核函数代替向高维空间的非线性映射; 对特征空间划分的最优超平面是SVM的目标,最大化分类边际的思想是SVM方法的核心; 支持向量是SVM的训练结果,在SVM分类决策中起决定作用的是支持向量;少数的支持向量决定了样本结果,这使得算法有较高的“鲁棒”性。它属于凸优化问题,所以局部最优一定是全局最优解。

不足

1、SVM对于大样本数据训练难以实施,由于SVM是借助二次规划来求解支持向量的,从而涉及到m阶矩阵的计算,从而消耗了很大的空间和时间。针对上述问题的改进方法为SMO算法。

2、经典的SVM只给出了二分类的算法,但实际中更多的是多分类问题,所以我们一般通过构造多个二分类支持向量机的组合来解决。主要有一对多模式,一对一模式和SVM决策树。

3、对缺失数据敏感,对参数和核函数的选择敏感,对于一个实际问题来说,核函数的选取带有一定的经验性,并没有一个合理的解释,所以在不同的领域还是没有很好的方法来解决核函数的选取问题。

二. 实践

逻辑回归LR

print ("----------程序开始运行!!!------------")
import pickle
import pandas as pd
import time
from sklearn.externals import joblib
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import  train_test_split
time_start = time.time()

data_path = 'new_data/'
feature_path = 'feature/'
model_path = 'model/'
result_path = 'result/'

"""=====================================================================================================================
0 读取特征
"""
print("0 读取特征")
data_fp = open(feature_path + "data_w_tfidf.pkl", 'rb')
x_train, y_train, x_test = pickle.load(data_fp)

xTrain, xTest, yTrain, yTest = train_test_split(x_train, y_train, test_size=0.30, random_state=531)

"""=====================================================================================================================
1 模型训练
"""
print("模型训练")
lr = LogisticRegression(C=120,dual=True)
lr.fit(x_train,y_train)

"""=====================================================================================================================
2 保存模型
"""
print('2 保存模型')
joblib.dump(lr, model_path + "LR(120)_data_w_tfidf.m")


"""=====================================================================================================================
3 预测结果 
"""
print("预测结果")
y_test = lr.predict(x_test)


"""=====================================================================================================================
4 保存结果 
"""
print("保存结果")
y_test = [i+1 for i in y_test.tolist()]
df_result = pd.DataFrame({'id':range(5000),'class':y_test})

df_result.to_csv(result_path + 'LR(c120)_data_w_tfidf.csv',index=False)

time_end = time.time()
print('共耗时:{:.2f}min'.format((time_start-time_end)/60))

支持向量机SVM

print ("----------程序开始运行!!!------------")
import pickle
import pandas as pd
import time
from sklearn import svm
from sklearn.externals import joblib
from sklearn.metrics import accuracy_score
from sklearn.model_selection import  train_test_split
time_start = time.time()

data_path = 'new_data/'
feature_path = 'feature/'
model_path = 'model/'
result_path = 'result/'
"""=====================================================================================================================
0 读取特征
"""
print("0 读取特征")
data_fp = open(feature_path  + "data_w_tfidf.pkl", 'rb')
x_train, y_train, x_test = pickle.load(data_fp)

xTrain, xTest, yTrain, yTest = train_test_split(x_train, y_train, test_size=0.30, random_state=531)

"""=====================================================================================================================
1 模型训练
"""
print("模型训练")
# clf = joblib.load('linearsvm_model_Tfid.1.m')
clf = svm.LinearSVC(C=5,dual=False)
clf.fit(x_train,y_train)

"""=====================================================================================================================
2 保存模型
"""
print('2 保存模型')
joblib.dump(clf, model_path + "SVM(c5)_data_w_tfidf.m")


"""=====================================================================================================================
3 预测结果 
"""
print("预测结果")
y_test = clf.predict(x_test)

"""=====================================================================================================================
4 保存结果 
"""
print("保存结果")
y_test = [i+1 for i in y_test.tolist()]
df_result = pd.DataFrame({'id':range(5000),'class':y_test})
df_result.to_csv(result_path + 'SVM(c5)_data_w_tfidf.csv',index=False)

time_end = time.time()
print('共耗时:{:.2f}min'.format((time_start-time_end)/60))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值