文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
1.模型输入
对特征提取后的样本进行抽样,抽取80%作为训练样本,剩下的20%作为测试样本,用于水质评价检验。其数据抽样代码如代码清单9-1所示。
代码清单9-1 数据抽样代码
#-*- coding: utf-8 -*- import pandas as pd inputfile = '../data/moment.csv' #数据文件 data = pd.read_csv(inputfile, encoding = 'gbk') #读取数据,指定编码为gbk data = data.as_matrix() from random import shuffle #引入随机函数 shuffle(data) #随机打乱数据 data_train = data[:int(0.8*len(data)), :] #选取前80%为训练数据 data_test = data[int(0.8*len(data)):, :] #选取前20%为测试数据
代码详见:demo/code/svm.py
本案例采用支持向量机作为水质评价分类模型,模型的输入包括两部分,一部分是训练样本的输入,另一部分是建模参数的输入。各参数说明如表9-3所示。
表9-3 预测模型输入变量
其中,1~9为输入的特征,我们发现特征的取值范围都在0~1之间,也就是说,如果直接输入SVM模型的话,彼此之间区分度会比较小,因此,我们不妨将所有特征都统一乘以一个适当的常数k,从而提高区分度和准确率。常数k的选取不能过大也不能过小,过小导致区分度较低,模型精确度差,较大则容易导致模型在训练样本中过拟合(如k=1000时,在训练样本准确率为100%,在测试样本准确率不到20%),总的来说,k过大过小都会导致测试样本的准确率下降,所以可以根据测试准确率来选择k的最优值。
经过反复测试,本次建模中k的最优值大约为30,因此,我们将输入的特征统一乘以30,然后建立支持向量机模型,代码如代码清单9-2所示。
代码清单9-2 构建支持向量机模型代码(接9-1)
#构造特征和标签 x_train = data_train[:, 2:]*30 #放大特征 y_train = data_train[:, 0].astype(int) x_test = data_test[:, 2:]*30 #放大特征 y_test = data_test[:, 0].astype(int) #导入模型相关的函数,建立并且训练模型 from sklearn import svm model = svm.SVC() model.fit(x_train, y_train) import pickle pickle.dump(model, open('../tmp/svm.model', 'wb')) #最后一句保存模型,以后可以通过下面语句重新加载模型: #model = pickle.load(open('../tmp/svm.model', 'rb')) #导入输出相关的库,生成混淆矩阵 from sklearn import metrics cm_train = metrics.confusion_matrix(y_train, model.predict(x_train)) #训练样本的混 淆矩阵 cm_test = metrics.confusion_matrix(y_test, model.predict(x_test)) #测试样本的混淆矩阵 #保存结果 pd.DataFrame(cm_train, index = range(1, 6), columns = range(1, 6)).to_excel(outputfile1) pd.DataFrame(cm_test, index = range(1, 6), columns = range(1, 6)).to_excel(output- file2)
代码详见:demo/code/svm.py
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论