基于深度学习的简单二分类(招聘信息的真假)

招聘数据真假分类

此次机器学习课程大作业-招聘数据真假分类,是一个二分类问题。训练集中共有14304个样本,每个样本有18个特征,目标是判断不含有标签的招聘信息的真假性。
利用Pandas读取训练集和测试集后,进行数据预处理,检查并修正数据中的错误值,补充缺失值,通过使用sklearn中的TfidfVectorizer构建词汇表(特征词表)时考虑了词语文档频次,可以通过设置min_df和max_df来实现通过文档频次进行特征选择。之后,对离散型特征进行特征工程处理,对连续型特征进行特征缩放(归一化)。建立多种机器学习模型(如:逻辑回归、支持向量机、集成学习、朴素贝叶斯),和基于pytorch的深度学习模型。最后,完成测试集的预测,并生成各个模型对应的结果文件。

关键词:真假分类 机器学习 模型对比 深度学习。

一、问题介绍

招聘信息的真假性进行判断,实质上为一个二分类问题,即招聘为真,招聘为假。数据集大小为14304,数据共计14个特征,目标是预测该样本是否为虚假招聘信息(是虚假信息则为1,反之为0)。
选择合适的机器学习算法,用以预测测试集中的真假,最后根据recall_score(召回率),f1_score来评价模型的准确性。

二、算法概述

在实验中,我运用了以下4类机器学习算法(logistic回归,svc支持向量集,朴素贝叶斯,XBGoost)和深度学习算法,对比测试各类算法在测试集中的分类效果,最后找出可以找出最适合本问题的算法。

2.1 Logistic Regression

logistic回归是一种广义线性回归(generalized linear model),因此与多重线性回归分析有很多相同之处。它们的模型形式基本上相同,都具有 w‘x+b,其中w和b是待求参数,其区别在于他们的因变量不同,多重线性回归直接将w‘x+b作为因变量,即y =w‘x+b,而logistic回归则通过函数L将w‘x+b对应一个隐状态p,p =L(w‘x+b),然后根据p与1-p的大小决定因变量的值。如果L是logistic函数,就是logistic回归,如果L是多项式函数就是多项式回归。
logistic回归的因变量可以是二分类的,也可以是多分类的,但是二分类的更为常用,也更加容易解释,多类可以使用softmax方法进行处理。实际中最为常用的就是二分类的logistic回归。
● 优点:计算代价不高,易于理解和实现。
● 缺点:容易欠拟合,分类精度可能不高。
● 适用类型:数值型、标称型。

2.2 SVC

支持向量机SVM理论中,有DPS系统提供支持向量机分类功能,其中包含C-SVC和V-SVC。
工作原理:根据输入的数据不同可做不同的模型。通过寻求结构化风险最小来提高学习机泛化能力,实现经验风险和置信范围的最小化,从而达到在统计样本量较少的情况下,亦能获得良好统计规律的目的。
优点: 
    (1)使用核函数可以向高维空间进行映射
    (2)使用核函数可以解决非线性的分类
    (3)分类思想很简单,就是将样本与决策面的间隔最大化
    (4)分类效果较好。
缺点: 
(1)SVM算法对大规模训练样本难以实施
    (2)用SVM解决多分类问题存在困难
(3) 对缺失数据敏感,对参数和核函数的选择敏感。
适用范围:数值型、标称型。

2.3 朴素贝叶斯

朴素贝叶斯分类是贝叶斯分类中最简单,也是常见的一种分类方法。

在机器学习的分类问题的应用中,朴素贝叶斯分类器的训练过程就是基于训练集 D 来估计类先验概率 P© ,并为每个属性估计条件概率 P(xi | c) 。这里就需要使用极大似然估计 (maximum likelihood estimation, 简称 MLE) 来估计相应的概率。
● 优点:朴素贝叶斯算法假设了数据集属性之间是相互独立的,因此算法的逻辑性十分简单,并且算法较为稳定,当数据呈现不同的特点时,朴素贝叶斯的分类性能不会有太大的差异。
● 缺点:数据集属性的独立性在很多情况下是很难满足的,因为数据集的属性之间往往都存在着相互关联,如果在分类过程中出现这种问题,会导致分类的效果大大降低。

2.4 集成学习(XGBoost)

XGBoost 是对梯度提升算法的改进,求解损失函数极值时使用了牛顿法,将损失函数泰勒展开到二阶,另外损失函数中加入了正则化项。训练时的目标函数由两部分构成,第一部分为梯度提升算法损失,第二部分为正则化项。损失函数定义为

其中n为训练函数样本数,l是对单个样本的损失,假设它为凸函数, 为模型对训练样本的预测值, 为训练样本的真实标签值。正则化项定义了模型的复杂程度:

其中, 和 为人工设置的参数,w为决策树所有叶子节点值形成的向量,T为叶子节点数。

2.5 pytorch深度学习框架

利用pytorch快速搭建神经网络。即利用torch.nn以及torch.optim库来快捷搭建一个简单的神经网络来实现二分类功能。
使用方法:利用pytorch已经包装好的库(torch.nn)来快速搭建神经网络结构。
利用已经包装好的包含各种优化算法的库(torch.optim)来优化神经网络中的参数,如权值参数w和阈值参数b。

2.6深度学习和传统机器学习区别及优势

1、传统的需要人工去提取特征、但是深度学习不需要进行特征提取。
2、传统的机器学习表达能力有限,深度学习表达能力强。
3、深度学习适合处理大数据,而数据量比较小的时候,用传统机器学习方法也许更合适。
4、时间维度上传统的机器学习一般训练时间短,深度学习时间长,但是深度学习一旦将模型训练好,预测就快了。

三、实验过程和结果分析

3.1 数据集分析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.1.1 不确定数据分析

经过对数据的初步筛选可以看出在title、location、 department、salary_range、company_profile、description、requirements、benefits、Telecommuting、has_company_logo、has_questions、employment_type、required_experience、required_education、industry、function这15属性中,
均存在不确定的数据。

3.1.2 特征分析

以下为各特征对应的数据类型值,连续数据标记为continuous,离散特征和文本特征将其所有分类列出。
title:Midlands Level 2 and 3 DGV NVQ Assessors,Customer Success Manager…
location:GB, BIR, Midlands, US, CA, Gardena…
department:Engineering, Creative, Services, Sales, Marketing…
salary_range:continuous
company_profile: Established on the principles that full time education is not for everyone, Adventure Cow (that’s us!) builds interactive books – stories…
description:As a NVQ Assessor you will be supporting learners who are undertaking a NVQ, We are activity searching for a Senior Financial Analyst to support the organization…
requirements:Remuneration:Competitive, dependant on candidate experience with a generous bonus element, If interested, send work samples!..

benefits:The potential to change the way of learning for millions of users, Remuneration:Competitive, dependant on candidate experience with a generous bonus element
telecommuting:yes , no;
has_company_logo:yes , no
has_questions:yes , no;
employment_type:Temporary, Full-time, Other, Part-time;
required_experience:Mid-Senior level, Entry level, Associate, Not Applicable
required_education:Bachelor’s Degree, Some College Coursework Completed, High School or equivalent, Unspecified…
industry:Logistics and Supply Chain, Financial Services, Computer Software, Information Technology and Services…
function:Engineering, Customer Service, Information Technology, Marketing…

连续特征为:salary_range,job_id.
离散特征为:title、location、 department、salary_range、company_profile、description、requirements、benefits、Telecommuting、has_company_logo、has_questions、employment_type、required_experience、required_education、industry、function
可以得出连续特征共2个,离散特征和文本特征共16个

3.2 导入数据

利用pandas库自带的read_csv函数导入训练集和测试集。

3.3 数据预处理

  1. 判断数据中是否有空值,如果有,利用fillna函数将空值对应特征数据的众数来代替。判断数据中是否有?缺失值,如果有,先将所有?转换为空值,然后利用fillna函数将空值对应特征数据的众数来代替。
  2. 然后使用TfidfVectorizer将数据中的文本信息进行向量化表示。
  3. 将标签值’真’,’假’,转换为对应的0,1变量。
  4. 将原数据修改后得到新的Dataframe
    在这里插入图片描述

3.4 数据分析

由于最后使用的是深度学习框架,因此没有对拆分特征元素。直接按照613个特征进行权重赋值,然后进行神经网络训练,通过loss.backward()反馈,进行反向惩罚,从而达到一个较好的效果。可以查看初始未处理数据的0,1分布

3.5 特征工程

利用sklearn.feature_extraction.text中的TfidfVectorizer,将离散文本特征进行进行特征词赋予权值,该权值会减少常见词,提高不常见词。将15种文本特征和离散特征通过变成807向量维度特征。
通过波士顿房价预测的借鉴使用
for i in range(613):
plt.subplot(13,2,i+1)
plt.scatter(x_data[:,i],y_data,s=10)
plt.show()
print(np.corrcoef(x_data[:i]),y_data)
调用numpy中的corrcoef()函数得到每个特征和真假性的相关系数矩阵,最后筛选出613个相关性高的特征。
注:由于特征过多只筛选了部分可视化图片

3.6 特征缩放

1.由于提供的数据只有14307,同时是一个非均匀分类问题,正样本比负样本少很多,因此采用过采样,欠采样,StratifiedKFold的方式进行采样,从而增加‘fraudulent’ = 1的样本数。
2.利用sklearn.preprocessing中的MinMaxScaler类将处理好的数据特征进行归一化处理,减小某些特征向量值过大的影响,从而导致产生过拟合的影响。

3.7 模型生成

通过sklearn库导入上述提到的5类机器学习模型和一类深度学习模型

from xgboost import XGBClassifier#XGBoost
from sklearn.model_selection import GridSearchCV#网格搜索调参器
from sklearn import linear_model #logistics回归
from sklearn.naive_bayes import GaussianNB          #朴素贝叶斯
from sklearn.svm import SVC                         #SVM
import torch#导入pytroch
import torch.nn as nn #神经网络模块
import torch.nn.functional as F #模型

神经网络

class Net(nn.Module):
#初始化
    def __init__(self):
        super(Net,self).__init__()
        self.fc1 = nn.Linear(613,10)
        self.fc2 = nn.Linear(10,2)
#前向传播
    def forward(self,x):
        if not isinstance(x, torch.FloatTensor):
            x = torch.FloatTensor(x)
        x = self.fc1(x)
        x = F.relu(x)
        x = self.fc2(x)
        return x
#接受输入并预测类(0或1)
    def predict(self,x):
        pred = F.softmax(self.forward(x))
        ans = []
        for t in pred:
            if t[0]>t[1]:
                ans.append(0)
            else:
                ans.append(1)
        return torch.tensor(ans)

该网络包含一个输入层,一个中间层,一个输出层,中间层包含 10 个神经元,使用的激活函数是 relu。当然,中间层的神经元越多,分类效果一般越好,但这个 10 层的网络对于我们的样本数据已经足够。

3.8 结果分析

3.8.1 模型准确度分析

通过自己将训练集按照8:2(9:1)的比例重新划分训练集和分层验证集之后,测试了各模型的recall_score和f1_score

在这里插入图片描述

3.8.2 交叉验证调整合适的超参

由于运行时间关系,此处只选择XGBoost的代码进行分析。
model = XGBClassifier()
learning_rate = [0.0001, 0.001, 0.01, 0.1, 0.2, 0.3]
param_grid = dict(learning_rate=learning_rate)
kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=7)
grid_search = GridSearchCV(model, param_grid, scoring=“neg_log_loss”, n_jobs=-1, cv=kfold)
grid_result = grid_search.fit(new_x_train, y_train)

使用StratifiedKFold模块对数据集进行拆分9:1,然后使用gridSearchCV(网格搜索)自动对学习率参数进行调节,然后将较好的模型进行输出。

在这里插入图片描述
由结果可以看出,当lr=0.2的时候效果最好,对应的准确度最高,此时就能确定一个较为合适的超参,其他超参的确定同样可以采用交叉验证的方式。

3.8.3 测试集预测结果分析

因为结果中是只含0 / 1的数据,现在利用np.sum对结果求和,统计1个个数(即招聘信息为假的结果)
在这里插入图片描述
由训练集可知招聘信息为假的723个,总训练集个数14235人,占比5.07%。如果训练集和测试集是出于同分布的数据,那么测试集数据中招聘信息为假的占比越接近5.07%,则说明预测的效果就可能更好。
则初步估计效果排名如下:

  1. Pytorch optim.Adam ,Pytorch optim.SGD
  2. Graidentboost Classifier
  3. GaussianNB Classifier
  4. xgboost Classifier
  5. SVM Classifier
  6. Logistic Regression
  7. GaussianNB Classifier
    注:估计基于数据的实际分布情况,具体效果还需要根据实际的测量值为准
    深度学习visdom图
    在这里插入图片描述
    在这里插入图片描述
  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值