基于机器学习的刑事案件分类技术(论文复现)

115 阅读5分钟

基于机器学习的刑事案件分类技术(论文复现)

本文所涉及所有资源均在传知代码平台可获取

概述

文本分类用计算机用一定的分类标准进行自动分类标记。本文应用了朴素贝叶斯、KNN邻近算法、SVM支持向量机、序列神经网络、XGboost分类算法分别进行了训练和预测,然后进行对比。本项目旨在采用机器学习方法对大量刑事案件判决书进行学习的基础上,实现给定案情的案件可能的判决进行预测,以下为部分源数据的信息:

在这里插入图片描述

算法简述

朴素贝叶斯分类器:这是一种基于贝叶斯定理的概率分类器,它假设特征之间相互独立,适用于处理大量特征的数据集。

K最近邻(KNN)算法:这是一种基于实例的学习算法,通过查找测试数据点的K个最近邻居来进行分类。

支持向量机(SVM):这是一种监督学习算法,通过找到数据点之间的最优边界来区分不同的类别。

序列神经网络:这类神经网络能够处理序列数据,适用于文本数据的序列特征,可以捕捉到词语之间的依赖关系。

XGBoost分类算法:这是一种基于梯度提升决策树的算法,它在许多数据集上都表现出了卓越的性能。

演示效果

在爬取大量案件数据集的基础上,然后通过Excel进行清洗数据等预处理环节。通过tfidf逆词频进行词向量化,然后选择了5中不同方法对数据集进行预测,逐步提升模型预测结果。

在这里插入图片描述

AUC召回曲线如下:

在这里插入图片描述

核心逻辑

在首先加载好数据集,一共有两列,一列为文本,另外一列为标签列,也就是对应的罪名标签。因为数据集为中文文本,所以要将这里应用了python的jieba库,将文本进行并行分词:

在这里插入图片描述

然后用tfidf对词频进行向量化,这个环节里面还要用到停用词对无无意义的词语进行过滤:

stwlist=[line.strip() for line in open('stopwords.txt','r',encoding='utf-8').readlines()]
tfv = TfidfVectorizer(min_df=3, max_df=0.5, max_features=None,
                      ngram_range=(1, 2), use_idf=True,
                      smooth_idf=True, stop_words=stwlist)
tfv.fit(list(xtrain) + list(xvalid))
xtrain_tfv =  tfv.transform(xtrain) 
xvalid_tfv = tfv.transform(xvalid)

这是朴素贝叶斯分类器的应用:

#利用提取的TFIDF特征来fitNaive Bayes
clf = MultinomialNB()
clf.fit(xtrain_tfv, ytrain)
predictions = clf.predict_proba(xvalid_tfv)

使用朴素贝叶斯分类器对数据进行训练和预测,这里的准确率是43.66%,logloss函数是2.107,学习时间是0.42秒。模型在验证数据集上的分类准确性相对较低,还有很大的改进空间。

KNN邻近算法:

knn=KNeighborsClassifier(n_neighbors=7)
knn.fit(xtrain_tfv,ytrain)
predictions = knn.predict_proba(xvalid_tfv)

这里的n_neighbors设置n_neighbors=7 表示 KNeighborsClassifier 将选择与新样本最近的 7个邻居进行投票,得出的结果:准确率为56.10%,logloss为6.698 SVM支持向量机:

svd = decomposition.TruncatedSVD(n_components=120)
svd.fit(xtrain_tfv)
xtrain_svd = svd.transform(xtrain_tfv)
xvalid_svd = svd.transform(xvalid_tfv)

#对从SVD获得的数据进行缩放
scl = preprocessing.StandardScaler()
scl.fit(xtrain_svd)
xtrain_svd_scl = scl.transform(xtrain_svd)

clft = SVC(C=1.0, probability=True) 
clft.fit(xtrain_svd_scl, ytrain)
predictions = clft.predict_proba(xvalid_svd_scl)

这里通过使用 SVD 对 TF-IDF 特征进行降维,将原始高维的文本特征转换为更低维的特征表示。这样做的好处是,降低了特征空间的维度,减少了计算和存储开销,并且可能提高了 SVM 模型的性能。降维后的特征通过缩放,使其具有相同的尺度,以确保 SVM 算法能够更好地学习和分类数据,然后得到的准确率为:72.99%,logloss函数为1.015,学习时间为9.93秒,可以看出这是一个比较好的模型了,已经能到达72.99%的准确率而且对应的数据损失度量比较好。 XGBoost:

clfttt = xgb.XGBClassifier(max_depth=7, n_estimators=200, colsample_bytree=0.8, 
                        subsample=0.8, nthread=10, learning_rate=0.1)
clfttt.fit(xtrain_tfv.tocsc(), ytrain)

创建一个XGBoost分类器clfttt,并设置了一些参数,如最大树深度max_depth为7,估计器数量n_estimators为200,列采样比例colsample_bytree为0.8,子采样比例subsample为0.8,线程数量nthread为10,学习率learning_rate为0.1。然后给出的结果非常好,准确度有93.66%,logloss函数只有0.287, 序列网络:

model = Sequential()

model.add(Dense(512, input_dim=135426, activation='relu'))
model.add(Dropout(0.5))
model.add(BatchNormalization())

model.add(Dense(512, activation='relu'))
model.add(Dropout(0.5))
model.add(BatchNormalization())

model.add(Dense(36))
model.add(Activation('softmax'))

# 调整优化器和学习率
optimizer = SGD(learning_rate=0.01, momentum=0.9)
model.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['accuracy'])

然后定义了一个Sequential模型,并添加了多个全连接层(Dense),使用relu激活函数。模型的输入维度为132644,输出维度为38,对应38个分类标签。在每个全连接层之间添加了Dropout层和BatchNormalization层,以防止过拟合并加速训练过程。定义了优化器SGD,将损失函数设置为categorical_crossentropy,用于多分类问题。然后通过调用compile方法编译模型

最后得到各分类器的结果如下: 得到罪行分类的AUC召回曲线如下所示:

在这里插入图片描述

得到罚款金额的AUC召回曲线如下所示:

在这里插入图片描述

得到刑期的AUC召回曲线如下所示:

在这里插入图片描述

使用方式

在anaconda的jupyter notebook里面运行即可。里面附带个人爬取的2007年到2020年4098份刑事案件数据集,罪名标签多达35项。还有罚款金额和刑期的数据集,有兴趣的可以调整算法进一步地训练分类器。

文章代码资源点击附件获取