大作业
期末大作业:boston房价预测与中文文本分类
一、boston房价预测
1. 读取数据集
2. 训练集与测试集划分
3. 线性回归模型:建立13个变量与房价之间的预测模型,并检测模型好坏。
4. 多项式回归模型:建立13个变量与房价之间的预测模型,并检测模型好坏。
5. 比较线性模型与非线性模型的性能,并说明原因。
二、中文文本分类
按学号未位下载相应数据集。
147:财经、彩票、房产、股票、
258:家居、教育、科技、社会、时尚、
0369:时政、体育、星座、游戏、娱乐
分别建立中文文本分类模型,实现对文本的分类。基本步骤如下:
1.各种获取文件,写文件
2.除去噪声,如:格式转换,去掉符号,整体规范化
3.遍历每个个文件夹下的每个文本文件。
4.使用jieba分词将中文文本切割。
中文分词就是将一句话拆分为各个词语,因为中文分词在不同的语境中歧义较大,所以分词极其重要。
可以用jieba.add_word('word')增加词,用jieba.load_userdict('wordDict.txt')导入词库。
维护自定义词库
5.去掉停用词。
维护停用词表
6.对处理之后的文本开始用TF-IDF算法进行单词权值的计算
7.贝叶斯预测种类
8.模型评价
9.新文本类别预测
处理过程中注意:
- 实验过程中文件遍历从少量到多量,调试无误后再处理全部文件
- 判断文件大小决定读取方法
- 注意保存中间结果,以免每次从头读取文件重复处理
- 内存不足时进行分批处理
- 利用数组的保存np.save('x1.npy',x1)与数组的读取np.load('x1.npy')和数组的拼接np.concatenate((x1,x2),axis=0)
- 及时用 del(x1) 释放大块内存,用gc.collect()回收内存。
一、boston房价预测
##导包 from sklearn.datasets import load_boston from sklearn.model_selection import train_test_split ##读取数据集 boston = load_boston() #查看key值 boston.keys() print('data值为:',boston.data) print('target值为:',boston.target) print('feature_names值为:',boston.feature_names) print('此数据集的描述为:',boston.DESCR)



##训练集与测试集的划分 x_train,x_test,y_train,y_test = train_test_split(boston.data,boston.target,test_size=0.3) ##建立线性回归模型:建立13个变量与房价之间的预测模型 from sklearn.linear_model import LinearRegression lineR = LinearRegression() lineR.fit(x_train,y_train) w = lineR.coef_ #斜率 b = lineR.intercept_ #截距 print('斜率为:',w) print('截距为:',b) ##检测模型的好坏 from sklearn.metrics import regression y_pred = lineR.predict(x_test) #计算模型的预测值 print('模型预测的均方误差为:',regression.mean_squared_error(y_test,y_pred)) print('模型预测的平均绝对误差为:',regression.mean_absolute_error(y_test,y_pred)) #计算模型的预测准确率 print('模型预测的准确率为:',lineR.score(x_test,y_test)) # #图形化显示 # import matplotlib.pyplot as plt # x=boston.data[:,12].reshape(-1,1) # y=boston.target # plt.figure(figsize=(10,6)) #指定显示图大小 # plt.scatter(x,y) # from sklearn.linear_model import LinearRegression # lineR=LinearRegression() # lineR.fit(x,y) # y_pred=lineR.predict(x) # plt.plot(x,y_pred,'g') #散点图 # print(lineR.coef_,lineR.intercept_) # plt.show()

##建立多项式回归模型:建立13个变量与房价之间的预测模型 #多项式化 from sklearn.preprocessing import PolynomialFeatures poly = PolynomialFeatures(degree=2) x_poly_train = poly.fit_transform(x_train) x_poly_test = poly.transform(x_test) #建模 lp = LinearRegression() lp.fit(x_poly_train,y_train) #预测 y_poly_pred = lp.predict(x_poly_test) ##检测模型的好坏 #计算模型的预测值 print('模型预测的均方误差为:',regression.mean_squared_error(y_test,y_poly_pred)) print('模型预测的平均绝对误差:',regression.mean_absolute_error(y_test,y_poly_pred)) #计算模型预测的准确率 print('模型预测的准确率为:',lp.score(x_poly_test,y_test))

线性模型与非线性模型的性能比较:
非线性模型(即多项式回归模型)比线性模型相对来说更好一点。因为多项式回归模型是一条平滑的曲线,而线性模型的一条直线,从图形上可以看出,曲线比直线更加贴合散点的分布形状,灵活性更强,并且从模型的预测值中可以看出,多项式回归模型的误差比线性模型的误差要小。
因此,非线性模型比线性模型能更真实的表现实际情况。
二、中文文本分类
##导包 import os import numpy as np import sysimport jieba ##预处理 #导入停用词文本 with open(r'stopsCN.txt',encoding = 'utf-8') as f: stopwords = f.read().split('\n') def preprocessing(tokens): #去掉非字母以及汉字的字符 tokens = ''.join([token for token in tokens if token.isalpha()]) #jieba分词 tokens = [token for token in jieba.cut(tokens,cut_all=True) if len(token) >= 2 ] #去掉停用词 tokens = ''.join([token for token in tokens if token not in stopwords]) return tokens ##读取文件 path = 'D:\\Desktop\\258' sortList = [] #新建存放新闻类别的列表 tokenList = [] #新建存放新闻内容的列表 ##遍历文件 for root,dirs,files in os.walk(path): # print(root) #当前目录路径 # print(dirs) #当前目录下所有子目录 # print(files) #当前路径下所有非目录子文件 for f in files: fn = os.path.join(root,f) #拼接每个文件路径 size = os.path.getsize(fn) #获取每个文件大小 print(fn,size) with open(fn,encoding='utf-8') as f: content = f.read() #获取当前目录下所有子目录(即新闻类别标签),并对新闻进行处理 sort = fn.split('\\')[-2] sortList.append(sort) #填充新闻类别列表 tokenList.append(preprocessing(content)) #填充新闻内容列表 print('新闻内容:',tokenList[0:10]) print('类别内容:',sortList[0:30])



#导包 from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.model_selection import train_test_split from sklearn.naive_bayes import GaussianNB,MultinomialNB from sklearn.model_selection import cross_val_score from sklearn.metrics import classification_report # 划分训练集和测试集 x_train,x_test,y_train,y_test = train_test_split(tokenList,sortList,test_size=0.2,stratify=sortList) ##对处理之后的文本开始用TF-IDF算法进行单词权值的计算 # 以TfidfVectorizer的方式建立转化为特征向量,此种方式可以提高不同词语的辨别度 vectorizer = TfidfVectorizer() X_train = vectorizer.fit_transform(x_train) X_test = vectorizer.transform(x_test) # 用多项式朴素贝叶斯建立模型,因为特征的分布部分是多元离散值 mnb = MultinomialNB() module = mnb.fit(X_train, y_train) #预测 y_pred = module.predict(X_test) #计算模型准确率 scores=cross_val_score(mnb,X_train,y_train,cv=5) print("Accuracy:%.3f"%scores.mean()) #模型主要分类指标的文本报告 print("classification_report:\n",classification_report(y_pred,y_test))



浙公网安备 33010602011771号