期末大作业

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()

 

部分结果:

 

最终结果:

 

 

 

 

 

  

posted @ 2018-12-22 11:02  W梨涡浅笑  阅读(274)  评论(0)    收藏  举报