当前位置: 移动技术网 > IT编程>脚本编程>Python > 荐 python机器学习之SVM分类预测电芯状态

荐 python机器学习之SVM分类预测电芯状态

2020年07月14日  | 移动技术网IT编程  | 我要评论

最近给公司做电芯状态分类,边搞边学了下数据处理和svm分类模型训练与调用

华丽的分割线------------------------------------------------------------
引入几个库:

import pandas as pd
from sklearn.model_selection import train_test_split#分割训练集和测试集前自动打散数据
from sklearn.preprocessing import Normalizer#归一化库函数
from sklearn.svm import SVR
import joblib
import matplotlib.pyplot as plt# 引入MATLAB相似绘图库,make_classification生成三元分类模型数据

首先,最重要的就是数据集了,这里先引用公司测量的数据样本,大约200个

#第一步 读取数据
#先定义下,将数据标签转换为数值
def dianxin_type(s):
    it = {'低压': 0, '正常': 1, '过压': 2}
    return it[s]

dianxin = pd.read_excel("F:\数据处理\数据\电芯数据\dianxin.xls",encoding='utf-8',header =0,converters={5: dianxin_type})#完整数据 header=0去掉了表头

第二步,进行数据切片,取需要的行或者列:
用到iloc函数,[行开始:行结束;列开始:列结束]

#第二步 数据切片
x = dianxin.iloc[:,1:5]#取数据集的前4列为数据值
y = dianxin.iloc[:,-1]#后1列为数据标签
print("数据\n=",x)
print("数据标签\n=",y)

具体如下:
在这里插入图片描述
#第三步 划分训练集和测试集,(70%与30%)

#第三步 划分训练集和测试集
x_train,x_test,y_train,y_test = train_test_split(x,y,random_state = 0,train_size = 0.3)

其中,#test_size:样本占比,如果是整数的话就是样本的数量
#random_state:是随机数的种子。
#随机数种子:其实就是该组随机数的编号,在需要重复试验的时候,保证得到一组一样的随机数。

比如你每次都填1,其他参数一样的情况下得到的随机数组是一样的。但填0或不填,每次都会不一样。

#第四步:数据预处理:
数据预处理有很多方法,这里使用的比较简单的归一化:

#第四步 数据预处理,这里用的归一化
Normalizer().fit_transform(x_train)
Normalizer().fit_transform(x_test)

print("训练集=\n",x_train)
print("测试集=\n",x_test)

#第5步,配置支持向量机
这里用的线性核函数linear,当然还可以用多项式核函数poly和rbf核函数,这里的精度我们用show_accuracy函数来比较出来

#第5步,线性核函数配置支持向量机svr
linear_svr = SVR(kernel = "linear")
#训练模型(用训练集将svr模型训练好)
linear_svr.fit(x_train,y_train)
#预测测试结果
linear_svr_y_predict = linear_svr.predict(x_test)#y_hat

print("\n训练集精度:",linear_svr.score(x_train, y_train))   # 精度
y_hat = linear_svr.predict(x_train)
show_accuracy(y_hat, y_train, '训练集')
print("\n测试集精度:",linear_svr.score(x_test, y_test))
y_hat = linear_svr.predict(x_test)
show_accuracy(y_hat, y_test, '测试集')

打印如下:
在这里插入图片描述

#第六步,模型训练好了,当然要保存模型了(保存在.py文件的同一目录下),留着下次调用

#第6步 训练模型保存

joblib.dump(linear_svr, "dianxin_model_SVR.m")

#第7步,调用训练模型,这里是在同一py文件里调用

#第7步 调用训练模型
clf = joblib.load("dianxin_model_SVR.m")

#第8步,引入新数据(没有数据标签)来套用学习到的clf模型进行分类:

#第8步 用模型进行新数据分类
dianxin_new = pd.read_excel("F:\数据处理\数据\电芯数据\dianxin_new.xls",encoding='utf-8',header =0)
dianxin_new = dianxin_new.sample(frac=1)#由于新数据是实际策略出来的 有点规律 这里将它打乱

#第9步 新数据分类

test_x = dianxin_new.iloc[:,1:5]#取数据集的前4列为数据值

print("新数据\n=",test_x)

test_y = clf.predict(test_x)#新数据经模型训练得到新标签分类
print("新数据电芯状态=\n",test_y)

test_x['电芯状态'] = test_y
print("新数据分类成功=\n",test_x)
plt.plot(test_y)
plt.legend(['0:low_Ubat,1:average,2:high_Ubat'])
plt.show()

plt图如下:
在这里插入图片描述
750多个数据 看起来有点乱:
0:电芯低压
1:电芯正常
2:电芯过压

分类完成,目前做的还是很简单,后面将在此基础上对大量数据进行分类,支持向量机适用于小样本的分类出来,后续或将调用其他机器学习算法。。。。。。

完整代码如下:

# -*- coding:utf-8 -*-
# 电芯状态识别svm
# 是最强的冰哥
from pandas import DataFrame
import pandas as pd
from matplotlib import pyplot as plt
import matplotlib
from sklearn import preprocessing
from sklearn import datasets
from sklearn.model_selection import train_test_split#分割训练集和测试集前自动打散数据
from sklearn import svm
from sklearn.preprocessing import Normalizer#归一化库函数
import numpy as np
from sklearn.svm import SVR
import joblib
import matplotlib.pyplot as plt# 引入MATLAB相似绘图库,make_classification生成三元分类模型数据


#第一步 读取数据
#先定义下,将数据标签转换为数值
def dianxin_type(s):
    it = {'低压': 0, '正常': 1, '过压': 2}
    return it[s]

dianxin = pd.read_excel("F:\数据处理\数据\电芯数据\dianxin.xls",encoding='utf-8',header =0,converters={5: dianxin_type})#完整数据 header=0去掉了表头

def show_accuracy(y_hat, y_test, param):
    pass
#第二步 数据切片
x = dianxin.iloc[:,1:5]#取数据集的前4列为数据值
y = dianxin.iloc[:,-1]#后1列为数据标签
print("数据\n=",x)
print("数据标签\n=",y)

#第三步 划分训练集和测试集
x_train,x_test,y_train,y_test = train_test_split(x,y,random_state = 0,train_size = 0.3)
#test_size:样本占比,如果是整数的话就是样本的数量
#random_state:是随机数的种子。
#随机数种子:其实就是该组随机数的编号,在需要重复试验的时候,保证得到一组一样的随机数。
# 比如你每次都填1,其他参数一样的情况下得到的随机数组是一样的。但填0或不填,每次都会不一样。

#第四步 数据预处理,这里用的归一化
Normalizer().fit_transform(x_train)
Normalizer().fit_transform(x_test)


print("训练集=\n",x_train)
print("测试集=\n",x_test)

#第5步,线性核函数配置支持向量机svr
linear_svr = SVR(kernel = "linear")
#训练模型(用训练集将svr模型训练好)
linear_svr.fit(x_train,y_train)
#预测测试结果
linear_svr_y_predict = linear_svr.predict(x_test)#y_hat

print("\n训练集精度:",linear_svr.score(x_train, y_train))   # 精度
y_hat = linear_svr.predict(x_train)
show_accuracy(y_hat, y_train, '训练集')
print("\n测试集精度:",linear_svr.score(x_test, y_test))
y_hat = linear_svr.predict(x_test)
show_accuracy(y_hat, y_test, '测试集')

#也可以用多项式、rbf配置核函数
#poly_svr = SVR(kernel="poly") #多项式配置
#rbf_svr = SVR(kernel="rbf")   #rbf配置

#第6步 训练模型保存

joblib.dump(linear_svr, "dianxin_model_SVR.m")
#第7步 调用训练模型
clf = joblib.load("dianxin_model_SVR.m")

#第8步 用模型进行新数据分类
dianxin_new = pd.read_excel("F:\数据处理\数据\电芯数据\dianxin_new.xls",encoding='utf-8',header =0)
dianxin_new = dianxin_new.sample(frac=1)#由于新数据是实际策略出来的 有点规律 这里将它打乱

def show_accuracy_new(y_hat_new, y_test_new, param):
    pass
#第9步 新数据分类
test_x = dianxin_new.iloc[:,1:5]#取数据集的前4列为数据值

print("新数据\n=",test_x)

test_y = clf.predict(test_x)#新数据经模型训练得到新标签分类
print("新数据电芯状态=\n",test_y)

test_x['电芯状态'] = test_y
print("新数据分类成功=\n",test_x)
plt.plot(test_y)
plt.legend(['0:low_Ubat,1:average,2:high_Ubat'])
plt.show()

本文地址:https://blog.csdn.net/weixin_45776027/article/details/107325707

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网