(文章最后有全部源代码)

一、实验要求

1.1实验目的
1)理解分类任务;
2)考察学生对数据预处理步骤的理解,强化预处理的重要性;
3)基模型可以调用已有的包,训练学生熟悉数据挖掘的基本框架;
4)学会多维度的对模型进行评估以及模型中参数的讨论。

1.2数据集
1)新闻文本分类为中文数据集,需要进行一定的预处理,包括分词,去停用词等;图像数据集可根据情况自行处理。
2)数据中的其他问题可自行酌情处理;
数据说明:自行划分 train 和 test,一般按 7:3 划分。

1.3实验环境
开发环境:Python 3.7( jieba、pandas、numpy、sklearn、matplotlib.pyplot)

1.4方法要求
1)要有针对数据特点的预处理步骤,包括去停用词,降维等;
2)原则上不限制模型,决策树,NB,NN,SVM,random forest 均可,且不限于上述方法。
3)文本可采用 BOW,主题模型以及词向量等多种表示方式,图像数据集可采用 LBP,HOG,SURF 等特征表示方式。

1.5结果要求
1)实现一个或多个基本分类模型,并计算其评估指标如准确率,召回率等
2)对模型中的关键参数,(如决策树中停止分裂条件,NN 中层数等参数)进行不同范围的取值,讨论参数的最佳取值范围。
3)对比分析不同的特征表示方法对结果的影响。
4)若对同一数据采用两种或多种模型进行了分类,对多种模型结果进行对比,以评估模型对该数据集上分类任务的适用性。

二、实验内容

2.1数据预处理
对在停用词表中的分词进行过滤操作:
def pre_treating(para):
words = jieba.cut(str(para))#分词
words = [word for word in words if len(word)>1]
words = [word for word in words if word not in stopWords]
return words

对数据集(训练集和测试集)中的无用分词删除,只保留可能有用的分词:
for name in classname:
data[name][‘words’]= data[name][‘content’].apply(pre_treating)
test[name][‘words’]= data[name][‘content’].apply(pre_treating)

将标签加入属性中:
i = 0;
for name in classname:
data[name][‘flag’] = i
test[name][‘flag’] = i
i += 1;

2.2词频统计
汇集所有表的内容:
result = data[classname[0]]
testdata = test[classname[0]]
for name in classname[1:]:
result = result.append(data[name])
testdata = testdata.append(data[name])

统计800个频率最高的词组:
topWordNum = 800
items = result[‘words’].values.tolist()
words = []
for item in items:
words.extend(item)
wordCount = pd.Series(words).value_counts()[0:topWordNum]
wordCount = wordCount.index.values.tolist()

2.3将词组转换为向量
将词组转为向量,此处向量的数为高频词出现次数:
def wordsToVec(words):
vec = map(lambda word:words.count(word),wordCount)
vec = list(vec)
return vec

将向量添加到汇集的结果中,并去除表中无用的部分:
result[‘vec’] = result[‘words’].apply(wordsToVec)
result = result.drop([‘content’],axis=1)
result = result.drop([‘channelName’],axis=1)

testdata[‘vec’] = testdata[‘words’].apply(wordsToVec)
testdata = testdata.drop([‘content’],axis=1)
testdata = testdata.drop([‘channelName’],axis=1)

2.4随机森林方法
将标签和向量转换为x,y的值:
xTrain = result[‘vec’].tolist()
yTrain = result[‘flag’].tolist()
xTest = testdata[‘vec’].tolist()
yTest = testdata[‘flag’].tolist()

随机森林方法:
def get_rf_ascore(my_para):

clf = RandomForestClassifier(n_estimators=my_para)
clf.fit(xTrain, yTrain)y_pre = clf.predict(xTest)
y_test = np.array(yTest)
y_pre = np.array(y_pre)score = accuracy_score(y_test, y_pre)
return score

def get_rf_rscore(my_para):

clf = RandomForestClassifier(n_estimators=my_para)
clf.fit(xTrain, yTrain)y_pre = clf.predict(xTest)
y_test = np.array(yTest)
y_pre = np.array(y_pre)score = recall_score(y_test, y_pre,average = 'macro')
return score

2.5决策树方法
使用 sklearn 函数包来实现决策树方法。分类随机森林对应的类DecisionTreeClassifier。实验代码如下:
def get_dt_ascore(my_para):

clf = tree.DecisionTreeClassifier(max_depth=my_para)
clf.fit(xTrain, yTrain)y_pre = clf.predict(xTest)
y_test = np.array(yTest)
y_pre = np.array(y_pre)score = accuracy_score(y_test, y_pre)
return score

def get_dt_rscore(my_para):

clf = tree.DecisionTreeClassifier(max_depth=my_para)
clf.fit(xTrain, yTrain)y_pre = clf.predict(xTest)
y_test = np.array(yTest)
y_pre = np.array(y_pre)score = recall_score(y_test, y_pre,average = 'macro')

return score

2.6随机森林结果显示
rfaScore = [ ]
rfrScore = [ ]
estimator = np.arange(1, 20, 1)

for i in estimator:
temp_ascore = get_rf_ascore(i)
temp_rscore = get_rf_rscore(i)
rfaScore.append(temp_ascore)
rfrScore.append(temp_rscore)

plt.plot(rfaScore,color=‘red’)
plt.plot(rfrScore,color=‘green’)
plt.xlabel(‘estimator’)
plt.ylabel(‘testDepth’)
plt.show()

2.7决策树方法结果显示
dtaScore = [ ]
dtrScore = [ ]
testDepth = np.arange(1, 100, 1)

for i in testDepth:
temp_ascore = get_dt_ascore(i)
temp_rscore = get_dt_rscore(i)
dtaScore.append(temp_ascore)
dtrScore.append(temp_rscore)

plt.plot(dtaScore,color=‘yellow’)
plt.plot(dtrScore,color=‘blue’)
plt.ylabel(‘score’)
plt.xlabel(‘testDepth’)
plt.show()

三、实验分析和总结

3.1实验分析

子树的数量 n_estimators 从 1 到 20,系统评分所示。从图中可以看出,在1到20范围内,随着子树数量的增加,模型评分随之增加,分类预测的准确率、回归率随之提高。至于20棵子树之后的评分趋势,则应该进行额外的实验来验证。(红色的是准确率,绿色的是召回率)

决策树最大深度 max_depth 从 1 到 100,系统评分所⽰。从图中可以
看出,在 1 到 100 范围内,随着树的最大深度的增加,模型评分随之增加,分
类预测的准确率随之提高。至于深度大于 100 的评分趋势,则应该进行额外的
实验来验证。(黄色的是准确率,蓝色的是召回率)
3.2实验总结
通过本次实验,我熟悉了sklearn包中几个模型的使用。这些模型在学术科研中得到广泛使用。通过上网查阅资料,我学习了对中文文本的预处理,即停用词的过滤。此外,还加深了对随机森林算法的理解,通过 sklearn 包实现算法的训练与预测,我对于数据挖掘和python的使用有了更深的理解,在python的使用上更加得心应手,通过实验,让我再次感受到python的便捷性。

源代码

NB

import pandas as pd
import re
import jieba
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score
from sklearn.metrics import recall_score#读取训练集
data = pd.read_excel("train.xlsx", encoding = 'utf-8')
test = pd.read_excel("test.xlsx", encoding = 'utf-8')#去除没有标签的样本
index = data['channelName'].notnull()
data = data[index]
index = data['title'].notnull()
data = data[index]
index = test['channelName'].notnull()
test = test[index]
#print(news)#去标点
re_obj = re.compile(r"['~`!#$%^&*()_+-=|\';:/.,?><~·!@#¥%……&*()——+-=“:’;、。,?》《{}':【】《》‘’“”\s]+")
def get_stopword():s = set()with open('中文停用词表.txt', encoding = 'utf-8') as f:for line in f:s.add(line.strip())return s
stopword = get_stopword()def remove_stopword(words):return [word for word in words if word not in stopword]
def Data_preprocessing(text):text = re_obj.sub("", text)text = jieba.lcut(text)text = remove_stopword(text)return " ".join(text)data['title'] = data['title'].apply(Data_preprocessing)
test['title'] = test['title'].apply(Data_preprocessing)#标签映射
dic = {'财经' : 0, '房产' : 1, '教育' : 2, '科技' : 3, '军事' : 4, '汽车' : 5, '体育' : 6, '游戏' : 7, '娱乐' : 8, '养生健康' : 9, '历史' : 10, '搞笑' : 11, '旅游' : 12, '母婴' : 13}
data['channelName'] = data['channelName'].map(dic)
test['channelName'] = test['channelName'].map(dic)
#print(news['channelName'].value_counts())x_train = data['title']
y_train = data['channelName']
x_test = test['title']
y_test = test['channelName']#ngram_range词组切分的长度范围  string类型  取前5000个  线性缩放
vectorizer = TfidfVectorizer(ngram_range=(1,2), analyzer='word', max_features=30000, sublinear_tf=True)
vectorizer.fit(x_train)
#学习原始文档中所有标记的词汇词典
model = MultinomialNB(alpha=0.001)
model.fit(vectorizer.transform(x_train), y_train)yPred = model.predict(x_test)
yTest = np.array(y_test)
yPred = np.array(yPred)

rum

import pandas as pd
import jieba
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn import tree
from sklearn.metrics import accuracy_score
from sklearn.metrics import recall_score
import matplotlib.pyplot as pltwith open('中文停用词表.txt','r',encoding='utf-8')as f:stopWords = [line.strip('\n') for line in f.readlines()]stopWords += '\n'data = pd.read_excel('train.xlsx',sheet_name=None)
test = pd.read_excel('test.xlsx',sheet_name=None)
classname = ['财经','房产','教育','科技','军事','汽车','体育','游戏','娱乐','养生健康','历史','搞笑','旅游','母婴']#对在停用词表中的分词进⾏过滤操作
def pre_treating(para):words = jieba.cut(str(para))#分词words = [word for word in words if len(word)>1]words = [word for word in words if word not in stopWords]return words#对数据集(训练集和测试集)中的无用分词删除,只保留可能有用的分词。
for name in classname:data[name]['words'] = data[name]['content'].apply(pre_treating)test[name]['words'] = data[name]['content'].apply(pre_treating)i = 0;
#将标签加入属性中
for name in classname:data[name]['flag'] = itest[name]['flag'] = ii += 1;#print(data[name])result = data[classname[0]]
testdata = test[classname[0]]
for name in classname[1:]:result = result.append(data[name])testdata = testdata.append(data[name])
#print(result)topWordNum = 800
items = result['words'].values.tolist()
words = []
for item in items:words.extend(item)
#统计800个频率最高的词组
wordCount = pd.Series(words).value_counts()[0:topWordNum]
#去除频率。仅获取词组
wordCount = wordCount.index.values.tolist()def wordsToVec(words):#将词组转为向量,此处向量的数为高频词出现次数vec = map(lambda word:words.count(word),wordCount)vec = list(vec)return vecresult['vec'] = result['words'].apply(wordsToVec)
result = result.drop(['content'],axis=1)
result = result.drop(['channelName'],axis=1)testdata['vec'] = testdata['words'].apply(wordsToVec)
testdata = testdata.drop(['content'],axis=1)
testdata = testdata.drop(['channelName'],axis=1)xTrain = result['vec'].tolist()
yTrain = result['flag'].tolist()
xTest = testdata['vec'].tolist()
yTest = testdata['flag'].tolist()def get_rf_ascore(my_para):#随机森林⽅法clf = RandomForestClassifier(n_estimators=my_para)clf.fit(xTrain, yTrain)y_pre = clf.predict(xTest)y_test = np.array(yTest)y_pre = np.array(y_pre)score = accuracy_score(y_test, y_pre)return scoredef get_rf_rscore(my_para):clf = RandomForestClassifier(n_estimators=my_para)clf.fit(xTrain, yTrain)y_pre = clf.predict(xTest)y_test = np.array(yTest)y_pre = np.array(y_pre)score = recall_score(y_test, y_pre,average = 'macro')return score#调参及结果展⽰
rfaScore = [ ]
rfrScore = [ ]
estimator = np.arange(1, 20, 1)for i in estimator:temp_ascore = get_rf_ascore(i)temp_rscore = get_rf_rscore(i)rfaScore.append(temp_ascore)rfrScore.append(temp_rscore)plt.plot(rfaScore,color='red')
plt.plot(rfrScore,color='green')
plt.xlabel('estimator')
plt.ylabel('score')
plt.show()

run

import pandas as pd
import jieba
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn import tree
from sklearn.metrics import accuracy_score
from sklearn.metrics import recall_score
import matplotlib.pyplot as pltwith open('中文停用词表.txt','r',encoding='utf-8')as f:stopWords = [line.strip('\n') for line in f.readlines()]stopWords += '\n'data = pd.read_excel('train.xlsx',sheet_name=None)
test = pd.read_excel('test.xlsx',sheet_name=None)
classname = ['财经','房产','教育','科技','军事','汽车','体育','游戏','娱乐','养生健康','历史','搞笑','旅游','母婴']#对在停用词表中的分词进⾏过滤操作
def pre_treating(para):words = jieba.cut(str(para))#分词words = [word for word in words if len(word)>1]words = [word for word in words if word not in stopWords]return words#对数据集(训练集和测试集)中的无用分词删除,只保留可能有用的分词。
for name in classname:data[name]['words'] = data[name]['content'].apply(pre_treating)test[name]['words'] = data[name]['content'].apply(pre_treating)i = 0;
#将标签加入属性中
for name in classname:data[name]['flag'] = itest[name]['flag'] = ii += 1;#print(data[name])result = data[classname[0]]
testdata = test[classname[0]]
for name in classname[1:]:result = result.append(data[name])testdata = testdata.append(data[name])
#print(result)topWordNum = 800
items = result['words'].values.tolist()
words = []
for item in items:words.extend(item)
#统计800个频率最高的词组
wordCount = pd.Series(words).value_counts()[0:topWordNum]
#去除频率。仅获取词组
wordCount = wordCount.index.values.tolist()def wordsToVec(words):#将词组转为向量,此处向量的数为高频词出现次数vec = map(lambda word:words.count(word),wordCount)vec = list(vec)return vecresult['vec'] = result['words'].apply(wordsToVec)
result = result.drop(['content'],axis=1)
result = result.drop(['channelName'],axis=1)testdata['vec'] = testdata['words'].apply(wordsToVec)
testdata = testdata.drop(['content'],axis=1)
testdata = testdata.drop(['channelName'],axis=1)xTrain = result['vec'].tolist()
yTrain = result['flag'].tolist()
xTest = testdata['vec'].tolist()
yTest = testdata['flag'].tolist()def get_dt_ascore(my_para):clf = tree.DecisionTreeClassifier(max_depth=my_para)clf.fit(xTrain, yTrain)y_pre = clf.predict(xTest)y_test = np.array(yTest)y_pre = np.array(y_pre)score = accuracy_score(y_test, y_pre)return scoredef get_dt_rscore(my_para):clf = tree.DecisionTreeClassifier(max_depth=my_para)clf.fit(xTrain, yTrain)y_pre = clf.predict(xTest)y_test = np.array(yTest)y_pre = np.array(y_pre)score = recall_score(y_test, y_pre,average = 'macro')return scoredtaScore = [ ]
dtrScore = [ ]
testDepth = np.arange(1, 100, 1)for i in testDepth:temp_ascore = get_dt_ascore(i)temp_rscore = get_dt_rscore(i)dtaScore.append(temp_ascore)dtrScore.append(temp_rscore)plt.plot(dtaScore,color='yellow')
plt.plot(dtrScore,color='blue')
plt.ylabel('score')
plt.xlabel('testDepth')
plt.show()

合肥工业大学宣城校区数据挖掘实验 分类任务相关推荐

  1. 合肥工业大学宣城校区计算方法 实验二

    1实验目的和要求 实验目的: (1)熟悉复化梯形方法.复化Simpson方法.梯形递推算法.龙贝格算法: (2)能编程实现复化梯形方法.复化Simpson方法.梯形递推算法.龙贝格算法: (3)理解并 ...

  2. 合肥工业大学宣城校区计算方法 实验一

    1实验目的和要求 实验目的:理解拉格朗日插值算法及牛顿插值算法的程序实现方法. 程序任务: 1)依据课本18页图1-3编程实现拉格朗日插值算法,并完成54页课后习题6. 注:分别以三个小题目中给出的条 ...

  3. 合肥工业大学宣城java实验报告,(合肥工业大学宣城校区JAVA作业问答题.doc

    (合肥工业大学宣城校区JAVA作业问答题 第一章 1.Java 语言有哪些特点? 答:Java 语言的特点有:简单性.面向对象技术.分布性.健壮性.安全性.体系结构中立.可移植性.解释执行.高性能.多 ...

  4. 合肥工业大学计算机与信息学院学生会宗旨,合肥工业大学宣城校区第一届学生会成立大会召开...

    11月1日晚,合肥工业大学宣城校区第一届学生会成立大会在宣城校区教学一号楼116室召开.宣城校区党委书记.管委会主任陈朝阳,党委副书记.管委会副主任蒋传东,管委会副主任胡学钢,综合办公室主任霍效忠.学 ...

  5. 合肥工业大学宣城校区计算机大赛,初赛公示_2020年全国高校计算机能力挑战赛...

    姓名 学校 奖项 彭正元 重庆大学 西南赛区 一等奖 肖念昕 阜阳师范大学 华东赛区 一等奖 鲁兆成 山东财经大学 华东赛区 一等奖 杨志杰 西北师范大学 西北赛区 一等奖 韩宇博 河南大学 华中赛区 ...

  6. 合肥工业大学宣城校区计算机大赛,合肥工业大学宣城校区“建行杯”计算机设计大赛 颁奖典礼举行...

    4月11日下午,合肥工业大学宣城校区"建行杯"计算机设计大赛颁奖典礼在教学楼114室举行.宣城校区领导陈朝阳.田作淳.蒋传东.胡学钢及各部门负责人.各系部主任,学校教务部副教务长张 ...

  7. 合肥工业大学宣城校区计算机大赛,合工大宣城校区学子!全国冠军!

    原标题:合工大宣城校区学子!全国冠军! 4月18日至21日,2019国家机器人发展论坛暨RoboCup机器人世界杯中国赛在浙江省绍兴市举行. 我校代表队夺得足球仿真2D项目全国冠军(一等奖),这是我校 ...

  8. 合肥工业大学宣城校区Java技术实验二 基于GUI的网络通信程序设计

    一.实验目的 1.掌握Java中GUI程序的编写,包括事件监听机制. 2.掌握Java的网络通信编程,ServerSocket,Socket类的使用. 3.掌握Java中多线程的编程,Thread类, ...

  9. 合肥工业大学宣城校区2020年-2021年第一(大四上)学期物联网工程专业资料汇总(含课件、个人实验报告、实验代码、课设报告等)

      蒟蒻已经把所有文件都上传到GitHub和百度网盘(验证码:h3e8,解压密码:lssb520)上了,可以自行下载.包含的课程有:<信息安全技术>.<公益活动>.<实习 ...

最新文章

  1. 干货 | 只有100个标记数据,如何精确分类400万用户评论?
  2. ssh登录慢,等待时间长的问题
  3. django orm 操作符
  4. spring+quartz 完整例子
  5. JavaWeb --第三章 HTTP协议详解
  6. 北京集训:20180310
  7. python怎么放音乐_python怎么播放音乐
  8. [设计模式] ------ 适配器模式
  9. java中标准封装结构_java中的构造,封装
  10. 3-2-ServletConfig
  11. 什么是立即执行函数,有什么作用?
  12. 通过二进制方式安装innobackupex
  13. 2.5 分类模型评估指标—AUC与ROC及绘制混淆矩阵与ROC曲线
  14. python生成器的实现及原理
  15. 解决小键盘灯不亮的方法
  16. Mysql入门实战上
  17. 证件照处理工具,软件虽小,但是功能强大!(证件照工具,都用得上)
  18. 遗传算法(geatpy)
  19. 经典圣诞老人题----同步与互斥
  20. LeetCode #1088. Confusing Number II

热门文章

  1. 三天后通过了新必应申请,微软最终还是赢得了一切╮( ̄▽ ̄)╭
  2. 服务器光驱装系统教程图解,图文解析win7系统光驱装系统的具体步骤
  3. kali重启网卡,kali重启网卡命令
  4. 什么类型乳腺癌不复发_大数据告诉你,哪些乳腺癌患者不容易复发?
  5. 兄弟帮忙解决ASP验证码问题,解决好送上2个QQ币当感谢!
  6. 无广告的视频二维码生成教程(组图介绍)
  7. C语言结构体指针初始化(转)
  8. 9、Linux 用户管理
  9. 数字调制系统工作原理_浙江红警系统马路警示灯工作原理近期行情
  10. CSDN日报190314:我能够入职世界顶尖的卡巴斯基,却被国内的安全公司拒之门外