数据竞赛-“达观杯”文本智能处理-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,yi∈Y={−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. 21∥w∥2yi(w⋅xi+b)−1⩾0,i=1,2,⋯,N
求解最优解
w
∗
,
b
∗
w^{*}, b^{*}
w∗,b∗
(2)由此得到分离超平面:
w
∗
⋅
x
+
b
∗
=
0
w^{*} \cdot x+b^{*}=0
w∗⋅x+b∗=0
分类决策函数
f
(
x
)
=
sign
(
w
∗
⋅
x
+
b
∗
)
f(x)=\operatorname{sign}\left(w^{*} \cdot x+b^{*}\right)
f(x)=sign(w∗⋅x+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))