#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2021/12/31 15:01
# @Author  : @linlianqin
# @Site    : 
# @File    : paths.py
# @Software: PyCharm
# @description:

import os

abs_path = os.path.dirname(__file__)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2021/12/31 13:29
# @Author  : @linlianqin
# @Site    : 
# @File    : dataProcess.py
# @Software: PyCharm
# @description:

'''
从excel中加载数据集

2-271751:0
271752-714002:1
714003-1022609:2
1022610-1048576:3

等级为0数据集:271750
等级为1数据集:442250
等级为2数据集:308606
等级为3数据集:25966

取100000数据集作为训练数据
等级为0数据集:25000
等级为1数据集:25000
等级为2数据集:25000
等级为3数据集:25000

'''

from pandas import read_excel, DataFrame
import numpy as np
from sklearn import model_selection


# 加载模型
def loaddatasets(xlsPath):
	data = read_excel(xlsPath, None)  # 读取数据,设置None可以生成一个字典,字典中的key值即为sheet名字,此时不用使用DataFram,会报错
	sheetNames = data.keys()  # 获取所有sheet的名称

	for sheetName in sheetNames:
		pd_data = DataFrame(read_excel(xlsPath, sheetName))  # 获得每一个sheet中的内容
		# print(np.array(sh_data))
		# 将panda对象转换为numpy.array数组形式
		np_data = np.array(pd_data)
		#  去掉表头
		np_data = np_data[1:, :]
		# 指标:第1-16列; 等级:第17列
		datas = np_data[:, :16]  ## 数据
		levels = np_data[:, -1]  ## 标签
		return datas, levels

# 切割数据集
def split_datas(datas, labels, random_state=1, train_size=0.75, test_size=0.25):
	train_data, test_data, train_label, test_label = model_selection.train_test_split(datas,
	                                                                                  labels,
	                                                                                  random_state=random_state,
	                                                                                  # 作用是通过随机数来随机取得一定量得样本作为训练样本和测试样本
	                                                                                  train_size=train_size,
	                                                                                  test_size=test_size)
	return train_data.astype(float), test_data.astype(float), train_label.astype(int), test_label.astype(int)


if __name__ == '__main__':
	from paths import abs_path

	xlspath = abs_path + "\\data\\min_datas.xlsx"
	datas, levels = loaddatasets(xlspath)
	print(len(datas) == len(levels))
	print("共有训练集:", len(levels))
	for index, data in enumerate(datas):
		print(index, data, levels[index])
	print(len(datas) == len(levels))
	print("共有训练集:", len(levels))
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2021/12/31 16:56
# @Author  : @linlianqin
# @Site    : 
# @File    : svm_.py
# @Software: PyCharm
# @description:

'''
将数据集输入到SVM模型中进行训练得到训练好的模型
'''

# 导入模块
from sklearn import svm
import numpy as np
import sklearn
import joblib

from dataProcess import loaddatasets
from paths import abs_path

# 归一化
def normalize(x):
	return (x - np.min(x))/(np.max(x) - np.min(x))

# 将数据集按照比例划分为训练集和测试集
def split_datas(datas,labels,random_state=1,train_size=0.75,test_size=0.25):
	train_data, test_data, train_label, test_label = sklearn.model_selection.train_test_split(datas,
	                                                                                          labels,
	                                                                                          random_state=random_state,
	                                                                                          # 作用是通过随机数来随机取得一定量得样本作为训练样本和测试样本
	                                                                                          train_size = train_size,
	                                                                                          test_size = test_size)
	return train_data.astype(float), test_data.astype(float), train_label.astype(int), test_label.astype(int)

# 训练
def train(train_data,  train_label,gamma, C, decision_function_shape='ovr', kernel='rbf',max_iter = 100):
	# 获取一个支持向量机模型
	predictor = svm.SVC(gamma='scale', C=C, decision_function_shape=decision_function_shape, kernel=kernel,max_iter=max_iter,probability=True)
	# 把数据丢进去
	predictor.fit(train_data, train_label)
	return predictor

# 预测
def predict(predictor,test_data, test_label):
	# 预测结果
	result = predictor.predict(test_data)
	# 准确率估计
	accurancy = np.sum(np.equal(result, test_label)) / len(test_label)
	return result,accurancy

# 保存模型
def save_model(predictor,model_save_path):
	# 模型保存
	joblib.dump(predictor, model_save_path)

# 调用模型
def load_model(model_path):
	SVM_model = joblib.load(model_path)
	return SVM_model

# 调用模型进行检测
def load_model_to_predict(model,data):
	## 将向量输入模型中进行检测
	predictLabel = model.predict(data)
	# print("预测值:", predictLabel[0])
	predictProb = model.predict_proba(data)
	# print("概率:", predictProb[0][predictLabel[0]])
	return predictLabel,predictProb


def main():
	xlspath = abs_path+"\\data\\min_datas.xlsx"
	print("加载数据集")
	datas,labels = loaddatasets(xlspath)
	print("数据集大小:", len(datas))

	print("划分数据集为训练集和测试集")
	train_data, test_data, train_label, test_label = split_datas(datas, labels)
	print(train_label.shape)
	# 归一化
	train_data = normalize(train_data)
	test_data = normalize(test_data)
	print("训练集大小:",len(train_data),"测试集大小:",len(test_data))

	print("开始训练......")
	model = train(train_data,train_label, gamma=0.5,C=1, decision_function_shape='ovr', kernel='rbf')
	print("训练结束......")

	_,train_accuracy = predict(model,train_data,train_label)
	print("训练集的正确率为:",train_accuracy)
	_,test_accuracy = predict(model,test_data,test_label)
	print("测试集的正确率为:",test_accuracy)

	print("保存模型:svm_%.2f.m"%(train_accuracy))
	save_model(model,abs_path+"\\data\\svm_%.2f.m"%(train_accuracy))

if __name__ == '__main__':
	main()

	# ###########################测试调用模型进行检测################################
	# xlspath =abs_path+"\\data\\min_datas.xlsx"
	# datas,labels = loaddatasets(xlspath)
	# train_data, test_data, train_label, test_label = split_datas(datas, labels)
	# model = load_model(abs_path+"\\resourses\\svm_0.79.m")
	# for index,data in enumerate(test_data):
	# 	data = [data]
	# 	print("-----------------------检测第%d个样本--------------------------"%index)
	# 	predictLabel,predictProb = load_model_to_predict(model,data)
	# 	print("预测值:", predictLabel[0])
	# 	print("预测概率:", predictProb[0][predictLabel[0]])
	# 	print("实际值:",test_label[index])

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐