内容:
使用下面模型对数据进行分类(包括:模型构建&调参&性能评估),并截图F1评分的结果
1)逻辑回归(LR)模型,学习理论并用于特征实践
2)支持向量机(SVM) 模型,学习理论并用于特征实践
1. 逻辑回归(LR)模型
逻辑回归也被称为对数几率回归,算法名虽然叫做逻辑回归,但是该算法是分类算法,个人认为这是因为逻辑回归用了和回归类似的方法来解决了分类问题。
逻辑回归模型是一种分类模型,用条件概率分布的形式表示 P(Y|X)P(Y|X),这里随机变量 X 取值为 n 维实数向量,例如x=(x(1),x(2),…,x(n))x=(x(1),x(2),…,x(n)),Y 取值为 0 或 1。即:
上式被称为sigmoid函数,其函数图像如下:
我们可以看到,sigmoid函数的取值范围为[0,1]。相应地,g(z)的值有着特殊含义,它表示对于输入x分类结果为类别1和类别0的概率。
代码实现:
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()
"""====================================================================================================================
0 读取特征
"""
print("0 读取特征")
data_fp = open( "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,"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('LR(c120)_data_w_tfidf.csv',index=False)
time_end = time.time()
print('共耗时:{:.2f}min'.format((time_end-time_start)/60))
2. 支持向量机(SVM)模型
SVM中最关键的思想之一就是引入和定义了“间隔”这个概念。这个概念本身很简单,以二维空间为例,就是点到分类直线之间的距离。假设直线为y=wx+b,那么只要使所有正分类点到该直线的距离与所有负分类点到该直线的距离的总和达到最大,这条直线就是最优分类直线。这样,原问题就转化为一个约束优化问题,可以直接求解。这叫做硬间隔最大化,得到的SVM模型称作硬间隔支持向量机。
在实际应用中,我们得到的数据并不总是完美的线性可分的,其中可能会有个别噪声点,他们错误的被分类到了其他类中。如果将这些特异的噪点去除后,可以很容易的线性可分。但是,我们对于数据集中哪些是噪声点却是不知道的,如果以之前的方法进行求解,会无法进行线性分开。是不是就没办法了呢?假设在y=x+1直线上下分为两类,若两类中各有对方的几个噪点,在人的眼中,仍然是可以将两类分开的。这是因为在人脑中是可以容忍一定的误差的,仍然使用y=x+1直线分类,可以在最小误差的情况下进行最优的分类。
同样的道理,我们在SVM中引入误差的概念,将其称作“松弛变量”。通过加入松弛变量,在原距离函数中需要加入新的松弛变量带来的误差,这样,最终的优化目标函数变成了两个部分组成:距离函数和松弛变量误差。这两个部分的重要程度并不是相等的,而是需要依据具体问题而定的,因此,我们加入权重参数C,将其与目标函数中的松弛变量误差相乘,这样,就可以通过调整C来对二者的系数进行调和。如果我们能够容忍噪声,那就把C调小,让他的权重降下来,从而变得不重要;反之,我们需要很严格的噪声小的模型,则将C调大一点,权重提升上去,变得更加重要。通过对参数C的调整,可以对模型进行控制。这叫做软间隔最大化,得到的SVM称作软间隔支持向量机。
SVM最基本的应用是分类。 求解最优的分类面,然后用于分类。
最优分类面的定义:
对于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()
"""=====================================================================================================================
0 读取特征
"""
print("0 读取特征")
data_fp = open("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("1 模型训练")
# 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,"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('SVM(c5)_data_w_tfidf.csv',index=False)
time_end = time.time()
print('共耗时:{:.2f}min'.format((time_end-time_start)/60))