期末大作业
1. 读取数据集
2. 训练集与测试集划分
3. 线性回归模型:建立13个变量与房价之间的预测模型,并检测模型好坏。
4. 多项式回归模型:建立13个变量与房价之间的预测模型,并检测模型好坏。
5. 比较线性模型与非线性模型的性能,并说明原因。
代码:
# 多元线性回归模型 from sklearn.datasets import load_boston from sklearn.model_selection import train_test_split # 波士顿房价数据集 data = load_boston() # 划分数据集 x_train, x_test, y_train, y_test = train_test_split(data.data,data.target,test_size=0.3) # 建立多元线性回归模型 from sklearn.linear_model import LinearRegression lr = LinearRegression() lr.fit(x_train,y_train) print("多元线性:") print('\n多元线性系数',lr.coef_,"\n多元线性截距",lr.intercept_) # 检测模型好坏 from sklearn.metrics import regression y_predict = lr.predict(x_test) # 计算模型的预测指标 print("多元线性预测的均方误差:", regression.mean_squared_error(y_test,y_predict)) print("多元线性预测的平均绝对误差:", regression.mean_absolute_error(y_test,y_predict)) # 打印模型的分数 print("多元线性模型的分数:",lr.score(x_test, y_test)) # 多元多项式回归模型 # 多项式化 from sklearn.preprocessing import PolynomialFeatures poly2 = PolynomialFeatures(degree=2) #最高为2次方 x_poly_train = poly2.fit_transform(x_train) # x_poly_test = poly2.transform(x_test) # 建立模型 lrp = LinearRegression() lrp.fit(x_poly_train, y_train) # 预测 y_predict2 = lrp.predict(x_poly_test) # 检测模型好坏 # 计算模型的预测指标 print("------------------------------------------------------------------------------------") print("多元多项式:") print("\n多元多项式预测的均方误差:", regression.mean_squared_error(y_test,y_predict2)) print("多元多项式预测的平均绝对误差:", regression.mean_absolute_error(y_test,y_predict2)) # 打印模型的分数 print("多元多项式模型的分数:",lrp.score(x_poly_test, y_test))
运行结果:
性能比较:多项式模型性能比较好,在本例中,离散程度有些大,多项式模型是一条平滑的曲线,可以尽可能的去拟合数据,均方误差、平均绝对误差也比较小,模型的分数比较高
原因:线性模型是可以用曲线拟合样本,但是分类的决策边界一定是直线的,例如logistics模型。
二、中文文本分类
代码:
import os import jieba path = r'F:\大三\du\期末大作业\147' print(path) # with open(r'C:\Users\s2009\Desktop\stopsCN.txt', encoding='utf-8') as f: # line=f.readline().strip() # while line: # linestr=line.split(" ") # print(linestr) # line=f.readline().strip() with open(r'F:\大三\du\stopsCN.txt', encoding='utf-8') as f: stopwords = f.read().split('\n') #print(stopwords) def pre_process (txts): txts = "".join([txt for txt in txts if txt.isalpha()]) # 去掉非字母汉字的字符 # 去掉停用词 txts = " ".join([txt for txt in txts if txt not in stopwords]) #把特殊符号替换成空格 # 结巴分词 txts = [txt for txt in jieba.cut(txts,cut_all=True) if len(txt) >=2] #把文本分割成2个以上的词语 return txts #利用for循环语句把特殊符号替换成空格 # result = "" # for i in txts: # if i not in stopwords: # result=result+i+" " # return result txtList = [] #生成空的文本列表 tarList = [] #类别列表 # 用os.walk获取需要的变量,并拼接文件路径再遍历每一个文件 #root是当前正在遍历的这个文件夹的本身地址,dirs,files是一个list,dirs内容是该文件夹中所有的目录的名字,files内容是该文件夹中所有的文件 #root是F:\大三\杜云梅\期末大作业\147;ddirs是财经,彩票,房产,股票,files是21万个txt文件 for root,dirs,files in os.walk(path): for f in files: filepath = os.path.join(root,f) with open(filePath, encoding='utf-8') as f: ct = f.read() # 获取类别,并处理 target = filePath.split('\\')[-2] #分割后的倒数第2个元素,也就是:财经,彩票,房产,股票 tarList.append(target) #把各类别追加到干净的tarList = []列表 txtList.append(pre_process(ct)) #把预处理过后的文本追加到干净的txtList = [] 列表 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(txtList,tarList,test_size=0.2,stratify=tarList) print(x_train) # 对数据标准化和转换,转化为特征向量,用TfidfVectorizer的方式建立特征向量。 vect = TfidfVectorizer() X_train = vect.fit_transform(x_train) #对部分X训练集数据先拟合,找到这部分的整体指标后,用transform进行转换,实现数据的标准化、归一化 X_test = vect.transform(x_test) #对X测试集进行转化,注:必须用fit_transform再用transform,如果直接用程序会报错,如果 # 建立模型,朴素贝叶斯,因为样本特征的a分布大部分是多元离散值 mulNB = MultinomialNB() module = mulNB.fit(X_train, y_train) #拟合x,y训练集数据 #进行预测 y_predict = module.predict(X_test) #预测测试集 #验证模型在训练集上的稳定性,输出5个预测精度,把初始训练样本分成5份,其中4份用作训练集,1份用作评估集,一共可以对分类器做k次训练,并且得到k个训练结果。 scores=cross_val_score(mulNB,X_test,y_test,cv=5) print("精确度:%.3f"%scores.mean())# 输出模型精确度 print("评估报告:\n",classification_report(y_predict,y_test))# 输出模型评估报告 # 比较预测结果和实际结果 import collections import matplotlib.pyplot as plt from pylab import mpl mpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定字体 mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题 # 计算测试集和预测集各类别下的文件个数 testSum = collections.Counter(y_test) predSum = collections.Counter(y_predict) print('实际数量:',testSum,'\n', '预测数量', predSum) # 建立标签列表,实际结果列表,预测结果列表, lableList = list(testSum.keys()) #各类别名称 testList = list(testSum.values()) #实际结果列表 predictList = list(predSum.values()) #预测结果列表 x = list(range(len(lableList))) #类别长度 print("各类别:",lableList,'\n',"实际结果:",testList,'\n',"预测结果:",predictList) # 数据可视化 #创建图形 plt.figure(figsize=(7,5),frameon=False) #指定figure的宽7,高5 total_width, n = 0.6, 2 width = total_width / n plt.bar(x, testList, width=width,label='实际',fc = 'g') #测试集的柱状图 #x轴的位置序列,一般采用range函数产生一个序列 for i in range(len(x)): x[i] = x[i] + width plt.bar(x, predictList,width=width,label='预测',tick_label = lableList,fc='b') #预测集柱状图 plt.grid()#设置网格线 plt.title('实际和预测的对比',fontsize=14)#设置标题 #设置坐标轴标签 plt.xlabel('x轴',fontsize=14) plt.ylabel('y轴',fontsize=14) #标签位置 plt.legend(loc="upper left",fontsize =14) #设置刻度标签参数大小 plt.tick_params(labelsize=15) plt.show()
部分结果:




最终结果:



浙公网安备 33010602011771号